Browse Source

1.add measure thread.2. hardware connect. 3. work folder

HaoShuang 5 years ago
parent
commit
033e3fda55
2 changed files with 165 additions and 10 deletions
  1. 3 0
      MeasureData/MeasureFile.cs
  2. 162 10
      MeasureThread/Measure.cs

+ 3 - 0
MeasureData/MeasureFile.cs

@@ -9,8 +9,11 @@ using System.Threading.Tasks;
 
 
 namespace MeasureData
 namespace MeasureData
 {
 {
+    
     public class MeasureFile
     public class MeasureFile
     {
     {
+        public const string UNTITLED_FILE_NAME = "Untitled";
+
         #region 内容
         #region 内容
         //文件名
         //文件名
         private string m_fileName;
         private string m_fileName;

+ 162 - 10
MeasureThread/Measure.cs

@@ -8,6 +8,7 @@ using System.Linq;
 using System.Text;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading.Tasks;
 
 
+
 using SmartSEMControl;
 using SmartSEMControl;
 using MeasureData;
 using MeasureData;
 
 
@@ -44,8 +45,8 @@ namespace MeasureThread
         }
         }
 
 
         //线程状态
         //线程状态
-        private ThreadState m_ThreadStatus;
-        public ThreadState ThreadStatus
+        private ThreadStatus m_ThreadStatus;
+        public ThreadStatus TStatus
         {
         {
             get { return this.m_ThreadStatus; }
             get { return this.m_ThreadStatus; }
             set { this.m_ThreadStatus = value; }
             set { this.m_ThreadStatus = value; }
@@ -59,29 +60,180 @@ namespace MeasureThread
 
 
         //HWND m_hWnd;
         //HWND m_hWnd;
 
 
-        //COTSHardwareMgrPtr m_pHardwareMgr;
-
         //构造函数
         //构造函数
         public Measure()
         public Measure()
         {
         {
         }
         }
 
 
-        //初始化测量业务
-        public bool InitMeas(MeasureFile a_measureFile, List<CutHole> a_listMeasuableHoles)
+        //初始化测量业务, 读测量文件,判断是否有可测试的切孔
+        public bool InitMeas(MeasureFile a_measureFile)
         {
         {
-            return false;
+            m_measureFile = a_measureFile;
+            List<CutHole> listHoles = m_measureFile.ListCutHole;
+
+            foreach (CutHole h in listHoles )
+            {
+                if (h.SWITCH == true)
+                {
+                    m_cutHoles.Add(h);
+                }
+            }
+
+            if(m_cutHoles.Count == 0)
+                return false;
+
+            return true;
         }
         }
 
 
-        //初始化测量业务
-        public bool InitMeas(MeasureFile a_measureFile)
+        //测量流程
+        public void DoMeasure()
         {
         {
+            //创建线程的测量状态的更新
+            this.TStatus.ComputeTime(THREAD_TIME_TYPE.START);
+
+            //将这个开始时间传递给主界面
+
+            //检查硬件连接是否正常
+            if (!ConnectHardware())
+            {
+                return;
+            }
+
+            //设置工作文件夹
+            if (!SetWorkingFolderStr())
+            {
+                return;
+            }
+
+            //第一个孔的测试
+            FirstHole();
+            //非第一个孔的测试
+            OtherHole();
+        }
+
+        //检查硬件连接是否正常
+        public bool ConnectHardware()
+        {
+            //返回硬件的连接状态
+            return iSEM.ConnectStatus();            
+        }
+
+        //设置工作文件夹
+        public bool SetWorkingFolderStr()
+        {
+            //获取工作文件路径
+            string pathName = m_measureFile.FilePath;
+
+            //判断工作文件路径是否为空或无效
+            if (string.IsNullOrEmpty(pathName))
+            {
+                return false;
+            }
+            //文件未保存
+            else if (pathName.CompareTo(MeasureFile.UNTITLED_FILE_NAME) == 0)
+            {
+                return false;
+            }
+
+            //获取工作文件所在文件夹
+            string folder = System.IO.Path.GetDirectoryName(pathName);
+            if (string.IsNullOrEmpty(folder))
+            {
+                return false;
+            }
+
+            WorkingFolder += @"\\";
+
             return false;
             return false;
         }
         }
 
 
         //第一个孔的测试过程
         //第一个孔的测试过程
         public void FirstHole()
         public void FirstHole()
         {
         {
-            
+            //12.根据样品类型参数确定是否需要PT沉积,控制PT针插入
+
+            //13.自动定位切割
+            {
+                //1.控制SEM放大600X
+                //2.控制SEM自动对焦、亮度、对比度
+                //3.设置SEM进行角度补偿54度
+                //4.控制SEM拍照
+                //5.保存照片
+                {
+                    //1. 创建目录
+                    //2. 设置图片名称
+                    //3. 保存图片1
+                }
+                //6.设置FIB拍照参数——扫描时间、束流等
+                //7.控制FIB自动亮度、对比度
+                //8.控制FIB拍照
+                //9.保存照片
+                {
+                    //1. 设置图片名称
+                    //2. 保存图片2
+                }
+                //10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
+                //11.自动工具样品类型参数确定是否需要PT沉积
+                {
+                    //1. 根据客户PT沉积坐标控制FIB调整到中心位置
+                    //2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
+                    //3. 根据坐标进行PT沉积
+                }
+                //12.根据梯形坐标控制FIB调整到中心位置
+                //13.验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确
+                //14.保存样品1第1号孔中心位置6轴坐标1 XYZMRT到数据库,保存客户返回值信息到数据库
+            }
+            //14.自动控制FIB切割
+            {
+                //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
+                //2.控制FIB进行切割
+                //3.控制FIB拍照600X
+                //4.保存图片
+                {
+                    //1.设置图片名称
+                    //2.保存图片3
+                }
+                //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
+                //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
+            }
+            //15.根据样品类型决定是否撤出PT针
+            //16.自动调整SEM找到切割位置
+            {
+                //1.控制SEM放大到300倍
+                //2.控制SEM自动对焦、亮度、对比度-接口
+                //3.控制SEM拍照
+                //4.将照片传给客户,获取偏移坐标,以及偏移角度
+                //5.根据坐标控制SEM移动到切孔位置,居中
+                //6.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
+            }
+            //17.自动控制SEM拍截面照
+            {
+                //1.控制SEM放大到指定参数大小范围,6000x
+                //2.控制SEM自动对焦、消像散、亮度、对比度
+                //3.设置SEM角度补偿cos36度
+                //4.控制SEM拍照
+                //5.保存照片4
+                //6.将照片传给客户,获取偏移坐标
+                //7.根据坐标控制SEM移动到分析位置
+                //8.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
+                //9.控制SEM平行校正,并记录校正前初始值
+                //10.控制SEM放大到指定参数大小范围
+                //11.控制SEM自动对焦、消像散、亮度、对比度
+                //12.控制SEM对分析位置拍照
+                //13.保存照片
+                //14.控制SEM取消电子束校正,回到初始值
+            }
+            //18.自动层高分析
+            {
+                //1.获取SEM Pixel Size给客户传入参数
+                //2.将照片传给客户,客户进行层高分析(返回分析后的图像、相对坐标、分辨率、各层编号以及各层对应的层高数据),如果客户自行出分析报告则无需返回数据
+            }
+            //19.自动能谱分析
+            {
+                //1. 确定能谱位置
+                //2. 控制牛津打能谱
+                //3. 能谱分析——面扫+线扫描
+            }
         }
         }
 
 
         //非第一个孔的测试过程
         //非第一个孔的测试过程