gsp 4 роки тому
батько
коміт
a1f0fc558c

BIN
Document/05 FIB自动化分析接口文档V3.0_1.7.xlsx


+ 1 - 9
HOZProject/FormHOZMain.cs

@@ -205,15 +205,7 @@ namespace HOZProject
                 m_MeasureFile.MParam.IsonlyEDSForDebug = Convert.ToBoolean(ConfigurationManager.AppSettings["IsonlyEDSForDebug"]);
                 // add by zjx 2020-12-18 为了测试只做能谱部分 end
 
-                var p = m_MeasureFile.MParam;
-               p. FindCrossMagnification = p.Location_Magnification / 3;
-                if (p.SampleName == "3") p.FindCrossMagnification = 400;
-                if (p.SampleName == "4")p. FindCrossMagnification = 300;
-                if (p.SampleName == "5")p. FindCrossMagnification = 300;
-                if (p.FindCrossMagnification < 200)
-                {
-                    p.FindCrossMagnification = 200;
-                }
+
 
                 m_Ms = new Measure(ConfigurationManager.AppSettings["WebServerIP"].ToString(),
                      ConfigurationManager.AppSettings["WebServerPort"].ToString(),

+ 42 - 21
MeasureThread/Focus.cs

@@ -50,6 +50,17 @@ namespace MeasureThread
 
             return true;
         }
+        public bool SetWorkingDistance(float newWdInMilimeter)
+        {
+            
+            if (!iSEM.SetWorkingDistance(newWdInMilimeter/1000))//5.1mm  单位是米
+            {
+                log.Error("测量线程报错:重新设置到标准工作距离失败。", false);
+                return false;
+            }
+            return true;
+        }
+     
         public bool DoFocusByNewMagnification(float newMag)
         {
             log.Warn("开始自动对焦!");
@@ -71,8 +82,7 @@ namespace MeasureThread
 
             // set the window of focusing.
             iSEM.SetReduced(prm.reduceWindowPos.X, prm.reduceWindowPos.Y, (int)prm.reduceWinWidth, (int)prm.reduceWinHeight);
-
-            iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");//
+            iSEM.CmdFocusScanSpeed("CMD_SCANRATE4");//
             if (prm.IfAutoBrightnessAndContrast)
             {
                 iSEM.SetAutoBright(100);
@@ -80,7 +90,7 @@ namespace MeasureThread
                 iSEM.SetAutoContrast(100);
                 Thread.Sleep(200);
                 iSEM.SetAutoVideoBrightnessAndContrast();
-                Thread.Sleep(6000);
+                Thread.Sleep(10000);//adjust the brightness and contrast automaticaly 10 second
                 iSEM.SetAutoVideoOff();
             }
             else
@@ -92,7 +102,10 @@ namespace MeasureThread
                 iSEM.SetContrast(prm.contrast);//30.0f
                 Thread.Sleep(200);
             }
-            bool ifStig=false;
+
+         
+
+            bool ifStig =false;
             if (newMag > 5000)
             {
                 ifStig = true;
@@ -113,14 +126,14 @@ namespace MeasureThread
 
 
         }
-        public bool DoFocus()
+        public bool DoFocusBySetMainParameter()
         {
             log.Warn("开始自动对焦!");
             //set voltage and SemIprobe
-            bool mRet_VoltageFlag = iSEM.SetSEMVoltage(prm.voltage);
-            Thread.Sleep(500);
-           bool mRet_ElecFlag = iSEM.SetSEMIPROBE(prm.Iprobe / 1000000000);
-            Thread.Sleep(500);
+           // bool mRet_VoltageFlag = iSEM.SetSEMVoltage(prm.voltage);
+           // Thread.Sleep(500);
+           //bool mRet_ElecFlag = iSEM.SetSEMIPROBE(prm.Iprobe / 1000000000);
+           // Thread.Sleep(500);
             // set magnification
             bool mRetMag=iSEM.SetMagnification(prm.mag);
             
@@ -135,6 +148,7 @@ namespace MeasureThread
            float offsetWd = Math.Abs(prm.workingDis - wd*1000);
             if (offsetWd > 3)//如果相差3mm以上,则重新设置,否则不动
             {
+                log.Info("工作距离相差" + offsetWd + "mm");
                 if (!iSEM.SetWorkingDistance(prm.workingDis / 1000))
                 {
 
@@ -142,11 +156,11 @@ namespace MeasureThread
                 }
 
             }
-     
+
             // set the window of focusing.
-            iSEM.SetReduced(prm .reduceWindowPos.X, prm.reduceWindowPos.Y, (int)prm.reduceWinWidth, (int)prm .reduceWinHeight);
+            iSEM.SetReduced(prm.reduceWindowPos.X, prm.reduceWindowPos.Y, (int)prm.reduceWinWidth, (int)prm.reduceWinHeight);
 
-            iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");//
+            iSEM.CmdFocusScanSpeed("CMD_SCANRATE4");//
             if (prm.IfAutoBrightnessAndContrast)
             {
                 iSEM.SetAutoBright(100);
@@ -154,7 +168,7 @@ namespace MeasureThread
                 iSEM.SetAutoContrast(100);
                 Thread.Sleep(200);
                 iSEM.SetAutoVideoBrightnessAndContrast();
-                Thread.Sleep(6000);
+                Thread.Sleep(10000);
                 iSEM.SetAutoVideoOff();
             }
             else
@@ -166,6 +180,7 @@ namespace MeasureThread
                 iSEM.SetContrast(prm.contrast);//30.0f
                 Thread.Sleep(200);
             }
+          
             bool ifStig = false;
             if (prm.mag > 5000)
             {
@@ -197,16 +212,22 @@ namespace MeasureThread
         //角度补偿
         public bool TiltCorrection(float a_fAngle)
         {
-            if (!iSEM.SetTiltAngleOn())
-            {
-                return false;
-            }
-            Thread.Sleep(200);
-            //恢复原始状态
-            if (!iSEM.SetTiltAngle(a_fAngle))
+            float a = iSEM.GetTiltAngle();
+            if (a != a_fAngle)
             {
-                return false;
+                if (!iSEM.SetTiltAngleOn())
+                {
+                    return false;
+                }
+                Thread.Sleep(200);
+                //恢复原始状态
+                if (!iSEM.SetTiltAngle(a_fAngle))
+                {
+                    return false;
+                }
+                Thread.Sleep(200);
             }
+           
             return true;
         }
         //执行自动对焦

+ 1 - 1
MeasureThread/IFocus.cs

@@ -9,7 +9,7 @@ namespace MeasureThread
 {
     interface IFocus
     {
-        bool DoFocus();
+        bool DoFocusBySetMainParameter();
         bool DoFocusByNewMagnification(float newMag);
         void setFocusParam(Focusparam param);
     }

+ 33 - 0
MeasureThread/Locate.cs

@@ -247,6 +247,13 @@ namespace MeasureThread
                     break;
                 }
             }
+            Thread.Sleep(200);
+            iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");
+            //add by sun 2020-12-15 拍截面图调用蔡司接口时,要保证扫描速度5以上,自动亮度对比度功能关闭 end
+            Thread.Sleep(200);
+            float cycle_time = iSEM.GetCycleTime();
+            Thread.Sleep(100 + Convert.ToInt32(cycle_time));
+           
             return true;
         }
         public bool MoveRAxis(float value)
@@ -264,7 +271,14 @@ namespace MeasureThread
                     break;
                 }
             }
+            Thread.Sleep(200);
+            iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");//CmdFocusRate(5);
+            //add by sun 2020-12-15 拍截面图调用蔡司接口时,要保证扫描速度5以上,自动亮度对比度功能关闭 end
+            Thread.Sleep(200);
+            float cycle_time = iSEM.GetCycleTime();
+            Thread.Sleep(100 + Convert.ToInt32(cycle_time));
             return true;
+          
 
         }
 
@@ -293,7 +307,14 @@ namespace MeasureThread
                     break;
                 }
             }
+            Thread.Sleep(200);
+            iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");//CmdFocusRate(5);
+            //add by sun 2020-12-15 拍截面图调用蔡司接口时,要保证扫描速度5以上,自动亮度对比度功能关闭 end
+            Thread.Sleep(200);
+            float cycle_time = iSEM.GetCycleTime();
+            Thread.Sleep(100 + Convert.ToInt32(cycle_time));
             return true;
+           
         }
 
         //移动到像素位置,这里要靠移动样品台实现,当位移量小于3um时,不予移动
@@ -522,7 +543,14 @@ namespace MeasureThread
             
              MoveToPixByMoveStage();
             Thread.Sleep(200);
+            Thread.Sleep(200);
+            iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");//CmdFocusRate(5);
+            //add by sun 2020-12-15 拍截面图调用蔡司接口时,要保证扫描速度5以上,自动亮度对比度功能关闭 end
+            Thread.Sleep(200);
+            float cycle_time = iSEM.GetCycleTime();
+            Thread.Sleep(100 + Convert.ToInt32(cycle_time));
             return true;
+           
 
         }
 
@@ -537,6 +565,11 @@ namespace MeasureThread
             this.prm.PixelSize_Y_cur = pixelSize_Y_cur;
              MoveToPix();
             Thread.Sleep(200);
+            iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");//CmdFocusRate(5);
+            //add by sun 2020-12-15 拍截面图调用蔡司接口时,要保证扫描速度5以上,自动亮度对比度功能关闭 end
+            Thread.Sleep(200);
+            float  cycle_time = iSEM.GetCycleTime();
+            Thread.Sleep(100 + Convert.ToInt32(cycle_time));
             return true;
         }
         public LocateParam GetParam()

+ 197 - 231
MeasureThread/Measure.cs

@@ -441,12 +441,7 @@ namespace MeasureThread
         public Boolean key_stop = false;
         FibWork m_FibWork;
         PTWork m_PTWork;
-        //String focus_path = "";
-        //String FIBfocus_path = "";
-        //String StigX_path = "";
-        //String StigY_path = "";
-        //String EDS_path = "";
-        //String data_path = "";
+
 
         //int m_nWorkHoleNo = -1;
         public ThreadStatusEventArgs GetArgs()
@@ -514,6 +509,17 @@ namespace MeasureThread
         {
             log.Info("进入初始化函数");
             m_measureFile = a_measureFile;
+
+            var p = m_measureFile.MParam;
+            p.FindCrossMagnification = p.Location_Magnification / 3;
+            if (p.SampleName == "3") p.FindCrossMagnification = 400;
+            if (p.SampleName == "4") p.FindCrossMagnification = 300;
+            if (p.SampleName == "5") p.FindCrossMagnification = 300;
+            if (p.FindCrossMagnification < 200)
+            {
+                p.FindCrossMagnification = 200;
+            }
+
             List<CutHole> listHoles = m_measureFile.ListCutHole;
 
             foreach (CutHole h in listHoles)
@@ -617,42 +623,14 @@ namespace MeasureThread
                     continue;
                 }
 
-                log.Warn("测量线程:测试第" + currHoleNo.ToString() + "个分析点。", true);           
-
-                log.Warn("测量线程:分析点" + currHole.HoleName + "开始测量。", true);
+                log.Warn("测量线程:第"+ currHoleNo.ToString() + "分析点,名称:"  + currHole.HoleName + " 开始测量。", true);
 
-                currHole.START = DateTime.Now;               
+                currHole.START = DateTime.Now;
                 currHole.STATE = State.InProcess;
                 SendCutHoleMsg(((int)currHole.STATE).ToString(), currHole.HoleName);
-
-                log.Warn("测量线程:控制样品台至样品分析点位置(R,X,Y,Z) = (" + currHole.Position.R.ToString() + ","
-                    + currHole.Position.X.ToString() + ","
-                    + currHole.Position.Y.ToString() + ","
-                    + currHole.Position.Z.ToString() + ")", true);
-
-                #region 坐标恢复
-                
-                Locate lo = new Locate(iSEM);
-                lo.LocateCutHolePosition(currHole,MParam.Tilt);
-
-                if (key_stop)
-                {
-                    
-                    log.Info("停止键被按下", true);
-                    return;
-                }
-                arg.HoleName = currHole.HoleName;
-                arg.State = true;
-                arg.Message = "样品台移动到观测点:" + currHole.HoleName + "的位置成功。";
-                SendMsg("0-0");
-
-                   
-                #endregion
-
-                    //开始测量
-                    if (!HoleMeasure(currHole))
-                    {
-                   
+                //开始测量
+                if (!HoleMeasure(currHole))
+                    {                   
                         currHole.STATE = State.Failed;
                         currHole.END = DateTime.Now;
                         m_measureFile.Save();
@@ -664,9 +642,9 @@ namespace MeasureThread
                 currHole.END = DateTime.Now;
                 m_measureFile.Save();
                 SendCutHoleMsg(((int)currHole.STATE).ToString(), currHole.HoleName);
+
                 if (key_stop)
                 {
-
                     log.Error("用户停止测量");                    
                     break;
                 }
@@ -695,15 +673,15 @@ namespace MeasureThread
           
             float px = 0;
             int state = 1;
-            log.Info("测量线程:13.自动定位、沉积-功能自动定位电压" + MParam.Location_Voltage.ToString() + "自动定位放大倍数" + MParam.Location_Magnification.ToString(), true);
+            log.Info("测量线程:FIB自动定位放大倍数" + MParam.Location_Magnification.ToString(), true);
             Thread.Sleep(200);
-            //1.控制SEM放大600X
-            if (!iSEM.SetSEMVoltage(MParam.Location_Voltage))
-            {
+            ////1.控制SEM放大600X
+            //if (!iSEM.SetSEMVoltage(MParam.Location_Voltage))
+            //{
 
-                log.Error("测量线程报错:13.自动定位、沉积-自动定位电压" + MParam.Location_Voltage.ToString() + "控制失败", false);
-                return false;
-            }
+            //    log.Error("测量线程报错:13.自动定位、沉积-自动定位电压" + MParam.Location_Voltage.ToString() + "控制失败", false);
+            //    return false;
+            //}
             Thread.Sleep(200);
             
             if (!m_focuse.SetMagnification(MParam.Location_Magnification))
@@ -742,21 +720,7 @@ namespace MeasureThread
                 log.Info("停止键按下。", true);
                 return false;
             }
-            //8.控制FIB拍照
-            //9.保存照片======更改路径
-            //20201103,FIB使用定位的放大倍数
-            String fileName2 = currHole.data_path + "\\" +currHole.HoleName + "_" + MParam.Location_Magnification.ToString("0") + "_" + ImageName2;
-            //判断是否停止进程
-            if (key_stop)
-            {
-                log.Info("停止键按下。", true);
-                return false;
-            }
-
-          
-               
-                    
-
+     
             Thread.Sleep(200);
             iSEM.SetAutoBright(100);
             Thread.Sleep(200);
@@ -770,10 +734,9 @@ namespace MeasureThread
 
 
 
-            //拍照前改变速度,延时
-
+            //8.控制FIB拍照
             Thread.Sleep(200);
-
+            String fileName2 = currHole.data_path + "\\" + currHole.HoleName + "_" + MParam.Location_Magnification.ToString("0") + "_" + ImageName2;
             m_photo.GetParam().Mag = MParam.Location_Magnification;
             m_photo.GetParam().savePath = fileName2;
             if (!m_photo.TakePhoto())
@@ -821,12 +784,6 @@ namespace MeasureThread
                 log.Error("测量线程报错:自动定位图像接口返回0", false);
                 return false;
             }
-            //判断是否停止进程
-            if (key_stop)
-            {
-                log.Info("停止键按下", true);
-                return false;
-            }
 
            
 
@@ -906,7 +863,7 @@ namespace MeasureThread
                 return false;
             }
             Thread.Sleep(1000);
-
+            mArgSend.SendArgumentToScreen("3-0", "SEM模式切换成功");
             return true;
         }
 
@@ -918,34 +875,34 @@ namespace MeasureThread
         {
             float x2 = 0, y2 = 0;
             int state = 0;
-            //切换到SEM模式
-            if (!iSEM.CmdFIBModeSEM())
-            {
+            ////切换到SEM模式
+            //if (!iSEM.CmdFIBModeSEM())
+            //{
                 
-                log.Error("测量线程报错:" + arg.Message, false);
-                return false;
-            }
-            Thread.Sleep(1000);
+            //    log.Error("测量线程报错:" + arg.Message, false);
+            //    return false;
+            //}
+            //Thread.Sleep(1000);
 
-            mArgSend.SendArgumentToScreen("3-0", "SEM模式切换成功");
+            
             
           
-            //判断是否停止进程
-            if (key_stop)
-            {
-                log.Info("停止键按下", true);
-                return false;
-            }
+            ////判断是否停止进程
+            //if (key_stop)
+            //{
+            //    log.Info("停止键按下", true);
+            //    return false;
+            //}
 
-            //1.控制SEM放大到300倍
-            log.Info("电压设置:" + MParam.Location_Voltage.ToString("0.0"));
-            if (!iSEM.SetSEMVoltage(MParam.Location_Voltage))
-            {
+            
+            //log.Info("电压设置:" + MParam.Location_Voltage.ToString("0.0"));
+            //if (!iSEM.SetSEMVoltage(MParam.Location_Voltage))
+            //{
                
-                log.Error("测量线程报错:" + arg.Message, false);
-                return false;
-            }
-            Thread.Sleep(200);
+            //    log.Error("测量线程报错:" + arg.Message, false);
+            //    return false;
+            //}
+            //Thread.Sleep(200);
 
 
             if (key_stop)
@@ -955,7 +912,7 @@ namespace MeasureThread
             }
             String fileName4 = currHole.data_path + "\\" + MParam.Firm + "-" + MParam.FindCrossMagnification.ToString("0") + "-" +currHole.HoleName + "-" + ImageName4;
             //add by zjx 2020-12-21 根据客户的需求修改图片的名称 end
-            log.Info("fileName4====================" + fileName4, true);
+            log.Info("fileName4=" + fileName4, true);
             float mag = MParam.FindCrossMagnification;
            
             m_photo.GetParam().Mag = mag;
@@ -996,41 +953,37 @@ namespace MeasureThread
                 log.Info("fileName10====================" + fileName10, true);
                 m_photo.GetParam().savePath = fileName10;
                 
-                if (!m_photo.TakePhoto())
-                {
+                //if (!m_photo.TakePhoto())
+                //{
                     
-                    log.Error("测量线程报错:找到已切割的位置拍照失败", false);
-                }
+                //    log.Error("测量线程报错:找到已切割的位置拍照失败", false);
+                //}
 
 
-                if (hand_intervene == 1)
-                {
-                    MessageBox.Show("Web返回数据移动是否正确?\n如果错误请手动移动到指定位置后按确认", "确认消息", MessageBoxButtons.OK);
-                }
+                //if (hand_intervene == 1)
+                //{
+                //    MessageBox.Show("Web返回数据移动是否正确?\n如果错误请手动移动到指定位置后按确认", "确认消息", MessageBoxButtons.OK);
+                //}
             }
             else
             {
                
-                if (hand_intervene == 1)
-                {
-                    if (DialogResult.Yes != MessageBox.Show("网络参数State返回为0。\n是否继续操作?。", "确认消息", MessageBoxButtons.YesNo))
-                    {
-                        return false;
-                    }
-                }
-                else
-                {
-                    return false;
-                }
+                //if (hand_intervene == 1)
+                //{
+                //    if (DialogResult.Yes != MessageBox.Show("网络参数State返回为0。\n是否继续操作?。", "确认消息", MessageBoxButtons.YesNo))
+                //    {
+                //        return false;
+                //    }
+                //}
+                //else
+                //{
+                //    return false;
+                //}
                 log.Error("测量线程报错:" + arg.Message, false);
                 return false;
             }
             //判断是否停止进程
-            if (key_stop)
-            {
-                log.Info("停止键按下", true);
-                return false;
-            }
+ 
 
             return true;
         }
@@ -1063,11 +1016,11 @@ namespace MeasureThread
                 workingDis = 5.0f,
 
             };
-            if (MParam.Is_Photograph == false)
-            {
+            //if (MParam.Is_Photograph == false)
+            //{
 
-                fprm.tiltCorrAngle = MParam.Correction_Angle;
-            }
+            //    fprm.tiltCorrAngle = MParam.Correction_Angle;
+            //}
             //add by sun 2020-12-17 解决3大类样品FIB下亮度过白导致无法识别问题
             float m_TempBrightness;
             float m_TempContrast;
@@ -1087,7 +1040,7 @@ namespace MeasureThread
             fprm.brightness = m_TempBrightness;
             fprm.contrast = m_TempContrast;
             m_focuse.setFocusParam(fprm);
-            m_focuse.DoFocus();
+            m_focuse.DoFocusBySetMainParameter();
 
 
 
@@ -1105,7 +1058,7 @@ namespace MeasureThread
             //add by zjx 2020-12-21 根据客户的需求修改图片的名称
             String fileName5 = currHole.data_path + "\\" + MParam.Firm + "-" + MParam.Photograph_Magnification.ToString("0") + "-" + currHole.HoleName + "-" + ImageName5;
             //add by zjx 2020-12-21 根据客户的需求修改图片的名称 end 
-            log.Info("fileName5====================" + fileName5, true);
+            log.Info("fileName5=" + fileName5, true);
            
 
 
@@ -1115,8 +1068,7 @@ namespace MeasureThread
             {
                 Mag = MParam.Photograph_Magnification,
                  savePath=fileName5,
-                  //scanSpeed=MParam.ScanSpeedHigh,
-                  //scanSpeedAfter=MParam.ScanSpeedNormal,
+
             };
 
             m_photo.SetPhotoParam(phop);
@@ -1145,7 +1097,7 @@ namespace MeasureThread
                 int direction = 0;
 
                 ImagePro.Img_Center_Position_OffsetAngle_Direction(fileName5, Convert.ToInt32(MParam.SampleName), MParam.Firm, out degree, out direction, out state);
-                log.Info("测量线程:2000倍===拍照角度移动,输入图像" + fileName5 + "输出角度为" + degree.ToString() + "输出方向为" + direction.ToString() + "返回值为" + state.ToString(), true);
+                log.Info("测量线程:2000倍 拍照角度移动,输入图像" + fileName5 + "输出角度为" + degree.ToString() + "输出方向为" + direction.ToString() + "返回值为" + state.ToString(), true);
                 log.Info("样品" + currHole.HoleNo.ToString() + "计算切割面区域的角度=" + degree.ToString(), true);
                 //接口返回像素,*pixelsize,得到坐标点。判断移动方式
                 if (state == 1)
@@ -1179,22 +1131,30 @@ namespace MeasureThread
 
                 Thread.Sleep(200);
 
-                //12拍照
-                //String fileName6 = data_path + "\\" + currHole.HoleName + "_" + MParam.Photograph_Magnification.ToString("0") + "_" + ImageName6;
-                //add by zjx 2020-12-21 根据客户的需求修改图片的名称
-                String fileName6 =currHole.data_path + "\\" + MParam.Firm + "-" + MParam.Photograph_Magnification.ToString("0") + "-" + currHole.HoleName + "-" + ImageName6;
-                //add by zjx 2020-12-21 根据客户的需求修改图片的名称 end 
-                log.Info("fileName6====================" + fileName6, true);
+                String fileName6;
+                if (degree == 0)
+                {
+                    fileName6 = fileName5;
+                }
+                else
+                {
+                    //12拍照
+                    
+                    //add by zjx 2020-12-21 根据客户的需求修改图片的名称
+                    fileName6 =currHole.data_path + "\\" + MParam.Firm + "-" + MParam.Photograph_Magnification.ToString("0") + "-" + currHole.HoleName + "-" + ImageName6;
+                    //add by zjx 2020-12-21 根据客户的需求修改图片的名称 end 
+                    log.Info("fileName6=" + fileName6, true);
                
 
-                m_photo.GetParam().savePath = fileName6;
-                if (!m_photo.TakePhoto())
-                {
-                    log.Error("测量线程报错:" + arg.Message, false);
-                    return false;
+                    m_photo.GetParam().savePath = fileName6;
+                    if (!m_photo.TakePhoto())
+                    {
+                        log.Error("测量线程报错:" + arg.Message, false);
+                        return false;
+                    }
                 }
 
-          
+
                 mArgSend.SendArgumentToScreen("3-9", "SEM拍照成功", fileName6);
                 if (key_stop)
                 {
@@ -1253,12 +1213,8 @@ namespace MeasureThread
                         + "," + ct0.Y.ToString() + ")", true);
 
                     Thread.Sleep(200);
-                    //add by sun 2020-12-15 拍截面图调用蔡司接口时,要保证扫描速度5以上,自动亮度对比度功能关闭
-                    iSEM.CmdFocusScanSpeed(MParam.ScanSpeedFocus);//CmdFocusRate(5);
-                    //add by sun 2020-12-15 拍截面图调用蔡司接口时,要保证扫描速度5以上,自动亮度对比度功能关闭 end
-                    Thread.Sleep(200);
-                    cycle_time = iSEM.GetCycleTime();
-                    Thread.Sleep(100 + Convert.ToInt32(cycle_time));
+                   
+
 
                     //循环升级对焦,每次放大3000倍
 
@@ -1283,7 +1239,7 @@ namespace MeasureThread
 
                         fprm.mag = curmag;
                         m_focuse.setFocusParam(fprm);
-                        m_focuse.DoFocus();
+                        m_focuse.DoFocusBySetMainParameter();
 
 
                     }
@@ -1311,7 +1267,7 @@ namespace MeasureThread
                             //移动到第一个点失败
                             log.Error("测量线程报错:移动到点(" + ct[n].X.ToString() + "," + ct[n].Y.ToString() + ")失败", false);
                         }
-                        Thread.Sleep(1000);
+                       
                         log.Info("测量线程:移动到第1个点( " + ct[n].X.ToString()
                             + "," + ct[n].Y.ToString() + ")", true);
                         #endregion
@@ -1323,18 +1279,16 @@ namespace MeasureThread
                         //add by zjx 2020-12-21 根据客户的需求修改图片的名称
                         String fileName7 =currHole. data_path + "\\" + MParam.Firm + "-" + mag[n].ToString() + "-" + currHole.HoleName + "-" + n.ToString() + "-" + ImageNameTwo_1;
                         //add by zjx 2020-12-21 根据客户的需求修改图片的名称 end 
-                        log.Info("fileName7====================" + fileName7, true);
+                        log.Info("fileName7=" + fileName7, true);
 
                        
                         
-                        log.Info("========测量线程:移动到第一个点位置完成!", true);
+                        log.Info("测量线程:移动到第一个点位置完成!", true);
 
                         m_photo.GetParam().savePath = fileName7;
                         m_photo.GetParam().Mag = mag[n];
                        
                        m_photo.TakePhoto();
-
-
                        
                         iSEM.CmdPixelScan();
                         Thread.Sleep(200);
@@ -1400,34 +1354,43 @@ namespace MeasureThread
             // add by zjx 2020-12-18 为了测试只做能谱部分
             if (MParam.IsonlyEDSForDebug == true)
             {
-                //add by sun 2020-12-17 不同样品电压、电流不一致,应设置灵活。123456类电压2000V电流200pA,7类5000V 500pA,能谱 7000V 500pA 
-                log.Warn("测量线程:第一孔=====设置拍照电压 123456类电压2000V电流200pA,7类5000V 500pA,能谱 7000V 500pA  目前是第 " + MParam.SampleName + " 类!", true);
-                if (!SetVoltageAndIPROBE())
+                //第一步:位置恢复
+                #region 第一步:坐标恢复
+                log.Info("测量线程:恢复样品分析点位置(R,X,Y,Z) = (" + currHole.Position.R.ToString() + ","
+                 + currHole.Position.X.ToString() + ","
+                 + currHole.Position.Y.ToString() + ","
+                 + currHole.Position.Z.ToString() + ")", true);
+                Locate lo = new Locate(iSEM);
+                lo.LocateCutHolePosition(currHole, MParam.Tilt);
+
+                if (key_stop)
                 {
-                    log.Error("测量线程:第一孔=====设置电压电流失败!目前是第 " + MParam.SampleName + " 类!", false);
+
+                    log.Info("停止键被按下", true);
                     return false;
                 }
-                //add by sun 2020-12-17 不同样品电压、电流不一致,应设置灵活。123456类电压2000V电流200pA,7类5000V 500pA,能谱 7000V 500pA end
+                arg.HoleName = currHole.HoleName;
+                arg.State = true;
+                arg.Message = "样品台移动到观测点:" + currHole.HoleName + "的位置成功。";
+                SendMsg("0-0");
 
-                //设置拉直的放大倍数
-                log.Info("测量线程:第一个孔的测试过程-设置SEM放大倍数为拉直放大倍数,放大倍数为" + MParam.Stretch_Magnification.ToString(), true);
-             
-                if (!m_focuse.SetMagnification(MParam.Stretch_Magnification))
+
+                #endregion
+                //第二步:设置电流电压
+                //add by sun 2020-12-17 不同样品电压、电流不一致,应设置灵活。123456类电压2000V电流200pA,7类5000V 500pA,能谱 7000V 500pA 
+                log.Warn("测量线程:设置拍照电压 123456类电压2000V电流200pA,7类5000V 500pA,能谱 7000V 500pA  目前是第 " + MParam.SampleName + " 类!", true);
+                if (!SetVoltageAndIPROBE())
                 {
-                    log.Error("测量线程报错:第一个孔的测试过程-设置SEM放大倍数为拉直放大倍数失败,放大倍数为" + MParam.Stretch_Magnification.ToString(), false);
-                   
+                    log.Error("测量线程:设置电压电流失败!目前是第 " + MParam.SampleName + " 类!", false);
                     return false;
-                }
-               
-                arg.Message = "拉直放大倍数设置成功!";
-                arg.State = true;
-                SendMsg("0-1");
+                }               
+              
                
 
-                //自动化流程-每个点都需要补偿54度
+                //第三步:自动化流程-每个点都需要补偿54度
                 if (MParam.Is_Photograph == false)
                 {
-                    log.Info("测量线程:第一个孔的测试过程-倾斜补偿角度为54度", true);
+                    log.Info("测量线程:倾斜补偿角度为54度", true);
                     if (!m_focuse. TiltCorrection(54.0f))
                     {
                         log.Error("测量线程报错:倾斜补偿角度为54度失败", false);
@@ -1436,7 +1399,7 @@ namespace MeasureThread
                     }
                     arg.Message = "角度补偿54度成功!";
                     arg.State = true;
-                    SendMsg("0-2");
+                    SendMsg("0-1");
                   
                     //判断是否停止进程
                     if (key_stop)
@@ -1446,16 +1409,28 @@ namespace MeasureThread
                     }
                 }
 
-                // 2是5/6类样品,不需要拉直
+                //第四步:拉直 ( 2是5/6类样品,不需要拉直
                 if (MParam.SampleName != "2")
                 {
-                    log.Warn("测量线程:第一个孔的测试过程-拉直操作开始!", true);
+                    //设置拉直的放大倍数
+                    log.Info("测量线程:设置SEM放大倍数为拉直放大倍数,放大倍数为" + MParam.Stretch_Magnification.ToString(), true);
+
+                    if (!m_focuse.SetMagnification(MParam.Stretch_Magnification))
+                    {
+                        log.Error("测量线程报错:设置SEM放大倍数为拉直放大倍数失败,放大倍数为" + MParam.Stretch_Magnification.ToString(), false);
+
+                        return false;
+                    }
+                    arg.Message = "拉直放大倍数设置成功!";
+                    arg.State = true;
+                    SendMsg("0-2");
+                    log.Warn("测量线程:拉直操作开始!", true);
                     if (!Straighten_Handle(currHole))
                     {
-                        log.Info("测量线程报错:第一个孔的测试过程-拉直操作失败。", true);
+                        log.Info("测量线程报错:拉直操作失败。", true);
                         return false;
                     }
-                    log.Info("测量线程:第一个孔的测试过程-拉直操作结束!", true);
+                    log.Info("测量线程:拉直操作结束!", true);
                     //判断是否停止进程
                     if (key_stop)
                     {
@@ -1480,9 +1455,8 @@ namespace MeasureThread
                     Thread.Sleep(200);
                 }
 
-                //13. 自动 定位功能 PT沉积 
-               
-                if (!MParam.Is_Photograph)
+                //第五步: 定位功能 PT沉积                
+                if (MParam.Is_Photograph==false)
                 {
                     log.Warn("测量线程:PIB切割自动定位开始!", true);
                     if (!GetFIBPoistion(currHole))
@@ -1506,7 +1480,7 @@ namespace MeasureThread
 
 
 
-                log.Info("测量线程:第一个孔的测试过程-自动定位结束!", true);
+                log.Info("测量线程:自动定位结束!", true);
                 //判断是否停止进程
                 if (key_stop)
                 {
@@ -1572,7 +1546,7 @@ namespace MeasureThread
                 //18.自动层高分析
                 if (MParam.Is_Photograph == false)
                 {
-                    log.Warn("测量线程:第一个孔的测试过程-18.自动层高分析开始", true);
+                    log.Warn("测量线程:18.自动层高分析开始", true);
                     float size = iSEM.GetPixelSize();
                     int state = 1;
                     ImagePro.Img_Measure_Height(limg_path, lsize, currHole.data_path + "\\", Convert.ToInt32(MParam.SampleName), MParam.Firm, out state);
@@ -1585,7 +1559,7 @@ namespace MeasureThread
                     arg.State = true;
                     arg.Message = "测量尺寸成功";
                     SendMsg("3-12");
-                    log.Info("测量线程:第一个孔的测试过程-18.自动层高分析结束!", true);
+                    log.Info("测量线程:18.自动层高分析结束!", true);
                 }
             }
             //add by zjx 2020-12-18 为了测试只做能谱部分 end
@@ -1596,9 +1570,9 @@ namespace MeasureThread
                
                 if (currHole.HoleNo + 1 == m_cutHoles.Count)//最后样品分析点才跑能谱
                 {
-                    log.Warn("测量线程:第一个孔的测试过程-19.能谱分析开始===" + MParam.EDS, true);
+                    log.Warn("测量线程:19.能谱分析开始===" + MParam.EDS, true);
                     EDS_Analysis(currHole);
-                    log.Info("测量线程:第一个孔的测试过程-19.能谱分析结束===" + MParam.EDS, true);
+                    log.Info("测量线程:19.能谱分析结束===" + MParam.EDS, true);
                 }
                
               
@@ -1614,23 +1588,12 @@ namespace MeasureThread
         //初始化拉直操作
         public bool Straighten_Handle(CutHole currHole)
         {
-            if (MParam.Tilt)
-            {
-                //倾斜样品台,SEM视野是黑色的
-                log.Info("测量线程:恢复到工作位置后重新调亮图像。", true);
-                if (!iSEM.SetWorkingDistance(currHole.Position.WD))//5.1mm
-                {
-                    log.Error("测量线程报错:重新设置到标准工作距离失败。", false);
-                    return false;
-                }
-                Thread.Sleep(7000); //自动亮度对比度使用
-
-            }
+            
 
             //1、自动对焦
             log.Info("测量线程:拉直操作前自动对焦开始", true);
-            
 
+           
             var p = new Focusparam();
 
             p.IfAutoBrightnessAndContrast = true;
@@ -1638,9 +1601,9 @@ namespace MeasureThread
             p.reduceWindowPos = new System.Drawing.Point(402, 128);
             p.reduceWinWidth = 400;
             p.reduceWinHeight = 400;
-            p.workingDis = currHole.Position.WD;
+          
             m_focuse.setFocusParam(p);
-            if (!m_focuse.DoFocusByNewMagnification(p.mag))    
+            if (!m_focuse.DoFocusByNewMagnification(MParam.Stretch_Magnification))
             {
                 log.Error("测量线程报错:拉直操作自动对焦失败,程序退出。", false);
               
@@ -1713,10 +1676,7 @@ namespace MeasureThread
                     log.Info("停止键按下", true);
                     return false;
                 }
-
-                //4、设置WD
-                iSEM.SetWorkingDistance(currHole.Position.WD);
-                Thread.Sleep(1000);
+             
             }
             arg.Message = "拉直操作完成";
             arg.State = true;
@@ -2096,10 +2056,6 @@ namespace MeasureThread
                 ifStig = false,
             };
           
-         
-
-          
-          
 
             log.Info("自动对焦开始!", true);
             
@@ -2145,19 +2101,22 @@ namespace MeasureThread
                 log.Info("测量线程:2000倍===拍照角度移动,输入图像" + fileName5 + "输出角度为" + degree.ToString() + "输出方向为" + direction.ToString() + "返回值为" + state.ToString(), true);
                 log.Info("样品" + currHole.HoleNo.ToString() + "计算切割面区域的角度=" + degree.ToString(), true);
                 //接口返回像素,*pixelsize,得到坐标点。判断移动方式
-                if (state == 1)
+                if (state == 1 )
                 {
-                    //梯形角度
-                    iSEM.SetScanRotationOn();
-                    Thread.Sleep(200);
-                    //20201128陈工要求,谭博返回角度*0.7
+                    if (Math.Abs(degree) > 0)
+                    {
+                        //梯形角度
+                        iSEM.SetScanRotationOn();
+                        Thread.Sleep(200);
+                        //20201128陈工要求,谭博返回角度*0.7
 
-                    iSEM.SetScanRotation(Convert.ToSingle(degree * 0.7));
-                    Thread.Sleep(200);
+                        iSEM.SetScanRotation(Convert.ToSingle(degree * 0.7));
+                        Thread.Sleep(200);
 
-                    arg.State = true;
-                    arg.Message = "图像接口返回角度为:" + degree.ToString();
-                    log.Info(arg.Message);
+                        arg.State = true;
+                        arg.Message = "图像接口返回角度为:" + degree.ToString();
+                        log.Info(arg.Message);
+                    }               
                   
 
                 }
@@ -2175,21 +2134,28 @@ namespace MeasureThread
                 }
 
                 Thread.Sleep(200);
+                String fileName6;
+                if (Math.Abs(degree) > 0)
+                {
+                    //add by zjx 2020-12-21 根据客户的需求修改图片的名称
+                     fileName6 = currHole.data_path + "\\EDS\\" + MParam.Firm + "-" + MParam.Photograph_Magnification.ToString("0") + "-" + currHole.HoleName + "-" + ImageName6;
+                    //add by zjx 2020-12-21 根据客户的需求修改图片的名称 end 
+                    log.Info("fileName6=" + fileName6, true);
+                    log.Info("纠正后拍照!");
+                    PhotoParam phoprm = new PhotoParam()
+                    {
+                        Mag = MParam.Photograph_Magnification,
+                        savePath = fileName6,
+                    };
 
-
-                //add by zjx 2020-12-21 根据客户的需求修改图片的名称
-                String fileName6 = currHole. data_path + "\\EDS\\" + MParam.Firm + "-" + MParam.Photograph_Magnification.ToString("0") + "-" + currHole.HoleName + "-" + ImageName6;
-                //add by zjx 2020-12-21 根据客户的需求修改图片的名称 end 
-                log.Info("fileName6=" + fileName6, true);
-                log.Info("纠正后拍照!");
-                PhotoParam phoprm = new PhotoParam()
+                    m_photo.SetPhotoParam(phoprm);
+                    m_photo.TakePhoto();
+                }
+                else
                 {
-                    Mag = MParam.Photograph_Magnification,
-                     savePath=fileName6,
-                };
+                    fileName6 = fileName5;
+                }
               
-                m_photo.SetPhotoParam(phoprm);
-                m_photo.TakePhoto();
                
                 if (key_stop)
                 {
@@ -2263,7 +2229,7 @@ namespace MeasureThread
                     log.Info("自动对焦1开始!", true);
                    
                     m_focuse.setFocusParam(fprm1);
-                    m_focuse.DoFocus();
+                    m_focuse.DoFocusBySetMainParameter();
 
 
                     log.Info("自动对焦2开始!", true);
@@ -2299,7 +2265,7 @@ namespace MeasureThread
                  
                  m_focuse.SetMagnification(mag[0]);
 
-                    m_photo.EnforceContrast();
+                   // m_photo.EnforceContrast();
 
                 log.Warn("EDS获取指定观测点图片,并打Xray");
                 DoEDS(currHole, 1);
@@ -2380,7 +2346,7 @@ namespace MeasureThread
             };
           
             m_focuse.setFocusParam(focusPrm);
-            m_focuse.DoFocus();
+            m_focuse.DoFocusBySetMainParameter();
 
             SendMsg("4-1");
             log.Warn("开始梯形移到视野中心!");

+ 6 - 4
MeasureThread/Photo.cs

@@ -67,13 +67,15 @@ namespace MeasureThread
             }
 
             iSEM.CmdFocusScanSpeed("CMD_SCANRATE5");//iSEM.CmdSaveRate();
-            Thread.Sleep(1000);
            
+            Thread.Sleep(200);
+            float cycle_time = iSEM.GetCycleTime();
+            Thread.Sleep(Convert.ToInt32(cycle_time) + 100);
 
             //拍照前改变速度,延时          
             iSEM.CmdLineScan();
             Thread.Sleep(200);
-            float cycle_time = iSEM.GetCycleTime();
+             cycle_time = iSEM.GetCycleTime();
             Thread.Sleep(Convert.ToInt32(cycle_time) + 100);
 
             if (!GetImage(prm.savePath))
@@ -85,8 +87,8 @@ namespace MeasureThread
             iSEM.CmdPixelScan();
             Thread.Sleep(200);
             iSEM.CmdFocusScanSpeed("CMD_SCANRATE4");//CmdFocusRate(4);
-            Thread.Sleep(500);
-
+            cycle_time = iSEM.GetCycleTime();
+            Thread.Sleep(Convert.ToInt32(cycle_time) + 100);
            
             return true;
         }