浏览代码

edit measure thread

HaoShuang 5 年之前
父节点
当前提交
cb9813571d
共有 1 个文件被更改,包括 121 次插入30 次删除
  1. 121 30
      MeasureThread/Measure.cs

+ 121 - 30
MeasureThread/Measure.cs

@@ -32,11 +32,12 @@ namespace MeasureThread
         static FactoryHardware factorySEM = FactoryHardware.Instance;
         ISEMControl iSEM = factorySEM.ISEM;
 
-        const String ImageName1 = @"ImageSEM600X.tif"; //传给客户
-        const String ImageName2 = @"ImageFIB600X1.tif";//传给客户
+        const String ImageName1 = @"ImageSEM600X.tif"; //传给客户,作水平校正
+        const String ImageName2 = @"ImageFIB600X1.tif";//传给客户,找到切割点
         const String ImageName3 = @"ImageFIB600X2.tif";
-        const String ImageName4 = @"ImageSEM300X.tif";//传给客户
-        const String ImageName5 = @"ImageSEM6000X.tif";//传给客户
+        const String ImageName4 = @"ImageSEM300X.tif";//传给客户,找到已经切割点
+        const String ImageName5 = @"ImageSEM6000X.tif";//传给客户,水平校正
+        const String ImageName6 = @"ImageSEMMag.tif";//传给客户,测量层高
 
         const float fMin = (float)0.0000002; //单位是米
 
@@ -130,15 +131,29 @@ namespace MeasureThread
             //检查硬件连接是否正常
             if (!ConnectHardware())
             {
+                this.TStatus.ComputeTime(THREAD_TIME_TYPE.STOPPED);
                 return;
             }
 
             //设置工作文件夹
             if (!SetWorkingFolderStr())
             {
+                this.TStatus.ComputeTime(THREAD_TIME_TYPE.STOPPED);
                 return;
             }
 
+            float[] firstPosition;
+            for (int i = 0; i < m_cutHoles.Count; i++)
+            {
+                if (i == 0)
+                {
+                    firstPosition = iSEM.GetStagePosition();
+                }
+                else
+                {
+
+                }
+            }
             //第一个孔的测试
             FirstHole();
             //非第一个孔的测试
@@ -182,7 +197,7 @@ namespace MeasureThread
         }
 
         //第一个孔的测试过程
-        public void FirstHole()
+        public bool FirstHole()
         {
             MeasureData.CutHole firstHole = m_cutHoles[0];
             //12.根据样品类型参数确定是否需要PT沉积,控制PT针插入
@@ -190,7 +205,7 @@ namespace MeasureThread
             {
                 if (!iSEM.InsertPT())
                 {
-                    return;
+                    return false;
                 }
             }
 
@@ -199,7 +214,7 @@ namespace MeasureThread
                 //1.控制SEM放大600X
                 if (!iSEM.SetMagnification(600))
                 {
-                    return;
+                    return false;
                 }
 
                 //2.控制SEM自动对焦、亮度、对比度
@@ -213,13 +228,13 @@ namespace MeasureThread
                 }
                 else
                 {
-                    return;
+                    return false;
                 }
 
                 //3.设置SEM进行角度补偿54度
                 if (!TiltCorrection(54))
                 {
-                    return;
+                    return false;
                 }
 
                 //4.控制SEM拍照
@@ -231,7 +246,7 @@ namespace MeasureThread
                     String fileName1 = WorkingFolder + ImageName1;
                     if (!GetImage(ImageMode.SEM, fileName1))
                     {
-                        return;
+                        return false;
                     }
                 }
 
@@ -246,7 +261,7 @@ namespace MeasureThread
                     String fileName2 = WorkingFolder + ImageName2;
                     if (!GetImage(ImageMode.FIB, fileName2))
                     {
-                        return;
+                        return false;
                     }
                 }
 
@@ -264,7 +279,7 @@ namespace MeasureThread
                 //12.根据梯形坐标控制FIB调整到中心位置
                 if (!iSEM.MoveStageXY(x0, y0))
                 {
-                    return;
+                    return false;
                 }
 
                 //13.验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确
@@ -272,7 +287,7 @@ namespace MeasureThread
                 float y1 = iSEM.GetStageAtY();
                 if (Math.Abs(x0 - x1) > fMin && Math.Abs(y0 - y1) > fMin)
                 {
-                    return;
+                    return false;
                 }
 
                 //14.保存样品1第1号孔中心位置6轴坐标1 XYZMRT到数据库,保存客户返回值信息到数据库
@@ -291,7 +306,7 @@ namespace MeasureThread
                     String fileName3 = WorkingFolder + ImageName3;
                     if (!GetImage(ImageMode.FIB, fileName3))
                     {
-                        return;
+                        return false;
                     }
                 }
                 //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
@@ -303,7 +318,7 @@ namespace MeasureThread
             {
                 if (!iSEM.OutputPT())
                 {
-                    return;
+                    return false;
                 }
             }
 
@@ -312,7 +327,7 @@ namespace MeasureThread
                 //1.控制SEM放大到300倍
                 if (!iSEM.SetMagnification(300))
                 {
-                    return;
+                    return false;
                 }
                 //2.控制SEM自动对焦、亮度、对比度-接口
                 if (FocusMode == FMode.Manual)
@@ -325,14 +340,14 @@ namespace MeasureThread
                 }
                 else
                 {
-                    return;
+                    return false;
                 }
 
                 //3.控制SEM拍照
                 String fileName4 = WorkingFolder + ImageName4;
                 if (!GetImage(ImageMode.SEM, fileName4))
                 {
-                    return;
+                    return false;
                 }
                 //4.将照片传给客户,获取偏移坐标,以及偏移角度
                 float x4 = 0, y4 = 0;
@@ -341,12 +356,12 @@ namespace MeasureThread
                 //5.根据坐标控制SEM移动到切孔位置,居中
                 if (!iSEM.MoveStageXY(x4, y4))
                 {
-                    return;
+                    return false;
                 }
 
                 if (!iSEM.SetScanRotation(angle))
                 {
-                    return;
+                    return false;
                 }
 
                 //6.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
@@ -354,7 +369,7 @@ namespace MeasureThread
                 float y5 = iSEM.GetStageAtY();
                 if (Math.Abs(x5 - x4) > fMin && Math.Abs(y5 - y4) > fMin)
                 {
-                    return;
+                    return false;
                 }
             }
             //17.自动控制SEM拍截面照
@@ -362,7 +377,7 @@ namespace MeasureThread
                 //1.控制SEM放大到指定参数大小范围,6000x
                 if (!iSEM.SetMagnification(6000))
                 {
-                    return;
+                    return false;
                 }
                 //2.控制SEM自动对焦、消像散、亮度、对比度
                 if (FocusMode == FMode.Manual)
@@ -375,12 +390,12 @@ namespace MeasureThread
                 }
                 else
                 {
-                    return;
+                    return false;
                 }
                 //3.设置SEM角度补偿cos36度
                 if (!TiltCorrection(36))
                 {
-                    return;
+                    return false;
                 }
 
                 //4.控制SEM拍照
@@ -388,17 +403,17 @@ namespace MeasureThread
                 String fileName5 = WorkingFolder + ImageName5;
                 if (!GetImage(ImageMode.SEM, fileName5))
                 {
-                    return;
+                    return false;
                 }
                 //6.将照片传给客户,获取偏移坐标
                 float x6 = 0, y6 = 0;
                 float angle1 = 0;
-                float mage = 0;
+                float mage = 10000;
 
                 //7.根据坐标控制SEM移动到分析位置
                 if (!iSEM.MoveStageXY(x6, y6))
                 {
-                    return;
+                    return false;
                 }
                 //8.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
 
@@ -406,25 +421,62 @@ namespace MeasureThread
                 float y7 = iSEM.GetStageAtY();
                 if (Math.Abs(x6 - x7) > fMin && Math.Abs(y6 - y7) > fMin)
                 {
-                    return;
+                    return false;
                 }
 
                 //9.控制SEM平行校正,并记录校正前初始值
+                float foldAnagle = iSEM.GetScanRotation();
+                if (foldAnagle == float.NaN)
+                {
+                    return false;
+                }
+
                 if (!iSEM.SetScanRotation(angle1))
                 {
-                    return;
+                    return false;
                 }
-                
+
                 //10.控制SEM放大到指定参数大小范围
+                if (!iSEM.SetMagnification(mage))
+                {
+                    return false;
+                }
 
                 //11.控制SEM自动对焦、消像散、亮度、对比度
+                if (FocusMode == FMode.Manual)
+                {
+                    //弹出手动对焦的窗口
+                }
+                else if (FocusMode == FMode.Auto)
+                {
+                    //调用自动对焦模块
+                }
+                else
+                {
+                    return false;
+                }
+
                 //12.控制SEM对分析位置拍照
+                String fileName6 = WorkingFolder + ImageName6;
+                if (!GetImage(ImageMode.SEM, fileName6))
+                {
+                    return false;
+                }
                 //13.保存照片
                 //14.控制SEM取消电子束校正,回到初始值
+
+                if (!iSEM.SetScanRotation(foldAnagle))
+                {
+                    return false;
+                }
             }
             //18.自动层高分析
             {
                 //1.获取SEM Pixel Size给客户传入参数
+                if (iSEM.GetPixelSize() == float.NaN)
+                {
+                    return false;
+                }
                 //2.将照片传给客户,客户进行层高分析(返回分析后的图像、相对坐标、分辨率、各层编号以及各层对应的层高数据),如果客户自行出分析报告则无需返回数据
             }
             //19.自动能谱分析
@@ -433,11 +485,50 @@ namespace MeasureThread
                 //2. 控制牛津打能谱
                 //3. 能谱分析——面扫+线扫描
             }
+
+            return true;
         }
 
         //非第一个孔的测试过程
         public void OtherHole()
         {
+            for (int i = 1; i < m_cutHoles.Count; i++)
+            {
+                CutHole currentHole = m_cutHoles[i];
+                //1. 初始化
+                {
+                    //1. 设置FIB解冻:先读取状态,如果冻结则进行解冻
+                    //读取图像冻结状态
+                    float ffrozen = iSEM.GetImageFrozen();
+                    if (ffrozen == float.NaN)
+                    {
+                        return;
+                    }
+
+                    //2. 调节样品1号孔的样品台6轴坐标
+                    //3. 将样品1号孔坐标2存入数据库
+                    //4. 控制样品台T轴归0,R轴变为坐标1、Z/M轴作为坐标2保存不变
+                    if (!iSEM.SetStageGotoT(0))
+                    {
+                        return;
+                    }
+
+                    //5. 获取光镜2号孔XY坐标
+                    //6. 根据光镜坐标控制样品台移动
+                    //7. 控制样品台,调整T轴54度、M/Z/R轴不变
+                }
+                //2. 定位切割
+                {
+                    //1. 拉直操作
+                    {
+                        //1.1 控制SEM进行拍照
+                        //1.2 图片传给客户,返回偏移角度
+                        //1.3 根据返回角度,控制样品台转动
+                    }
+                    //2. 与1号孔13步相同
+                }
+                //3. 以后步骤与1号孔以后步骤一致
+            }
         }
 
         //角度补偿