Explorar el Código

更新测量线程和韩工的测量XML文档

@wang_qi0307 hace 5 años
padre
commit
3521ce8f16
Se han modificado 3 ficheros con 466 adiciones y 246 borrados
  1. 28 32
      HOZProject/MeasureXML/MeasureStructXml.xml
  2. 420 205
      MeasureThread/Measure.cs
  3. 18 9
      WebManager/WebResult.cs

+ 28 - 32
HOZProject/MeasureXML/MeasureStructXml.xml

@@ -2,43 +2,39 @@
 <MeasureList>
   <MeasureFlow Name="测量流程">
       <Step Index="0" Name="" Code="1-0" IsData="False" Type="Pt" Title="PT沉积" Details="自动根据样品类型参数确定是否需要PT沉积"></Step>
-      <Step Index="1" Name="" Code="1-1" IsData="False" Type="Photo" Title="移动至切割位置" Details="自动定位切割位置"></Step>
+      <Step Index="1" Name="" Code="1-1" IsData="False" Type="State" Title="移动至切割位置" Details="自动定位切割位置"></Step>
       <Step Index="2" Name="" Code="1-2" IsData="False" Type="Photo" Title="设置放大倍数" Details="控制SEM放大倍数"></Step>
       <Step Index="3" Name="" Code="1-3" IsData="True" Type="Photo" Title="自动对焦" Details="控制SEM自动对焦、亮度、对比度"></Step>
       <Step Index="4" Name="" Code="1-4" IsData="False" Type="Photo" Title="角度补偿" Details="设置SEM进行角度补偿"></Step>
-      <Step Index="5" Name="" Code="1-5" IsData="True" Type="Photo" Title="拍照" Details="控制SEM对分析位置拍照"></Step>
-      <Step Index="6" Name="" Code="1-6" IsData="False" Type="Photo" Title="保存照片" Details="保存照片"></Step>
-      <Step Index="7" Name="" Code="1-7" IsData="False" Type="FIB" Title="FIB拍照参数" Details="设置FIB拍照参数-扫描时间、束流等"></Step>
-      <Step Index="8" Name="" Code="1-8" IsData="False" Type="FIB" Title="FIB设置参数" Details="控制FIB自动亮度、对比度"></Step>
-      <Step Index="9" Name="" Code="1-9" IsData="False" Type="FIB" Title="FIB拍照" Details=""></Step>
-      <Step Index="10" Name="" Code="1-10" IsData="False" Type="Photo" Title="保存照片" Details="保存照片"></Step>
-      <Step Index="11" Name="" Code="1-11" IsData="True" Type="Photo" Title="显示照片" Details="将照片传给客户,返回梯形位置坐标,及样品类型参数"></Step>
-      <Step Index="12" Name="" Code="1-12" IsData="False" Type="Pt" Title="PT沉积" Details="自动根据样品类型参数确定是否需要PT沉积"></Step>
-      <Step Index="13" Name="" Code="1-13" IsData="False" Type="FIB" Title="FIB调整到中心位置" Details="根据梯形坐标控制FIB调整到中心位置"></Step>
-      <Step Index="14" Name="" Code="1-14" IsData="False" Type="Photo" Title="验证移动准确性" Details="验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确"></Step>
-      <Step Index="15" Name="" Code="1-15" IsData="False" Type="Photo" Title="保存信息" Details="保存切孔位置坐标,保存客户返回值信息"></Step>
+      <Step Index="5" Name="" Code="1-5" IsData="True" Type="Photo" Title="拍照保存照片" Details="控制SEM对分析位置拍照保存照片"></Step>
+      <Step Index="6" Name="" Code="1-6" IsData="False" Type="FIB" Title="切换到FIB模式" Details="切换到FIB模式"></Step>
+      <Step Index="7" Name="" Code="1-7" IsData="True" Type="FIB" Title="FIB拍照保存照片" Details="FIB拍照保存照片"></Step>
+      <Step Index="8" Name="" Code="1-8" IsData="True" Type="Stage" Title="样品台移动到指定位置" Details="将照片传给客户,返回梯形位置坐标,及样品类型参数"></Step>
+      <Step Index="9" Name="" Code="1-9" IsData="False" Type="Stage" Title="验证移动位置" Details="验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确"></Step>
+      <Step Index="10" Name="" Code="1-10" IsData="False" Type="Photo" Title="PT沉积" Details="根据配置文件进行PT沉积"></Step>
+      <Step Index="11" Name="" Code="1-11" IsData="True" Type="Position" Title="保存六轴坐标" Details="将六轴坐标保存到数据库中"></Step>
 
-      <Step Index="16" Name="" Code="1-16" IsData="True" Type="FIB" Title="设置FIB参数" Details="根据参数设置FIB扫描时间(使图清晰),设置梯形上下边及深度、设置束流等"></Step>
-      <Step Index="17" Name="" Code="1-17" IsData="False" Type="FIB" Title="FIB进行切割" Details="控制FIB进行切割"></Step>
-      <Step Index="18" Name="" Code="1-18" IsData="False" Type="FIB" Title="设置FIB放大倍数" Details="控制SEM放大倍数"></Step>
-      <Step Index="19" Name="" Code="1-19" IsData="False" Type="Photo" Title="保存照片" Details="保存照片"></Step>
-      <Step Index="20" Name="" Code="1-20" IsData="False" Type="Photo" Title="验证移动准确性" Details="验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比"></Step>
-      <Step Index="21" Name="" Code="1-21" IsData="False" Type="Photo" Title="设置放大倍数" Details="控制SEM放大倍数"></Step>
-      <Step Index="22" Name="" Code="1-22" IsData="False" Type="FIB" Title="设置FIB解冻" Details="设置FIB解冻:先读取状态,如果冻结状态则进行解冻"></Step>
-      <Step Index="23" Name="" Code="1-23" IsData="False" Type="Pt" Title="拔出PT针" Details="根据样品类型决定是否撤出PT针"></Step>
+      <Step Index="12" Name="" Code="1-12" IsData="False" Type="FIB" Title="FIB进行切割" Details="控制FIB进行切割"></Step>
+      <Step Index="13" Name="" Code="1-13" IsData="False" Type="FIB" Title="设置FIB放大倍数" Details="控制SEM放大倍数"></Step>
+      <Step Index="14" Name="" Code="1-14" IsData="False" Type="Photo" Title="保存照片" Details="保存照片"></Step>
+      <Step Index="15" Name="" Code="1-15" IsData="False" Type="Photo" Title="验证移动准确性" Details="验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比"></Step>
+      <Step Index="16" Name="" Code="1-16" IsData="False" Type="State" Title="FIB切割状态" Details="FIB切割成功或失败"></Step>
+    
+      <Step Index="17" Name="" Code="1-17" IsData="False" Type="Pt" Title="拔出PT针" Details="根据样品类型决定是否撤出PT针"></Step>
 
-      <Step Index="24" Name="" Code="1-24" IsData="False" Type="Photo" Title="设置放大倍数" Details="控制SEM放大倍数"></Step>
-      <Step Index="25" Name="" Code="1-25" IsData="True" Type="Photo" Title="自动对焦" Details="控制SEM自动对焦、亮度、对比度"></Step>
-      <Step Index="26" Name="" Code="1-26" IsData="True" Type="Photo" Title="拍照" Details="控制SEM对分析位置拍照"></Step>
-      <Step Index="27" Name="" Code="1-27" IsData="True" Type="Photo" Title="显示照片" Details="获取偏移坐标,以及偏移角度"></Step>
-      <Step Index="28" Name="" Code="1-28" IsData="False" Type="Photo" Title="移动到切孔位置" Details="根据坐标控制SEM移动到切孔位置,居中"></Step>
-      <Step Index="29" Name="" Code="1-29" IsData="False" Type="Photo" Title="验证移动准确性" Details="验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确"></Step>
-
-      <Step Index="30" Name="" Code="1-30" IsData="False" Type="Photo" Title="设置放大倍数" Details="控制SEM放大到指定参数大小范围"></Step>
-      <Step Index="31" Name="" Code="1-31" IsData="True" Type="Photo" Title="自动对焦" Details="控制SEM自动对焦、消像散、亮度、对比度"></Step>
-      <Step Index="32" Name="" Code="1-32" IsData="False" Type="Photo" Title="角度补偿" Details="设置SEM角度补偿"></Step>
-      <Step Index="33" Name="" Code="1-33" IsData="True" Type="Photo" Title="保存照片" Details="设置图片名称、保存图片"></Step>
-      <Step Index="34" Name="" Code="1-34" IsData="True" Type="Photo" Title="显示照片" Details="获取偏移坐标"></Step>
+      <Step Index="18" Name="" Code="1-18" IsData="False" Type="Photo" Title="设置放大倍数" Details="控制SEM放大倍数"></Step>
+      <Step Index="19" Name="" Code="1-19" IsData="True" Type="Photo" Title="自动对焦" Details="控制SEM自动对焦、亮度、对比度"></Step>
+      <Step Index="20" Name="" Code="1-20" IsData="True" Type="Photo" Title="拍照显示照片" Details="控制SEM对分析位置拍照"></Step>
+      <Step Index="21" Name="" Code="1-21" IsData="False" Type="Photo" Title="移动到切孔位置" Details="根据坐标控制SEM移动到切孔位置,居中"></Step>
+      <Step Index="22" Name="" Code="1-22" IsData="False" Type="Photo" Title="调整角度" Details="调整角度"></Step>
+      <Step Index="23" Name="" Code="1-23" IsData="False" Type="Photo" Title="验证移动准确性" Details="验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确"></Step>
+      <Step Index="24" Name="" Code="1-24" IsData="False" Type="State" Title="自动调整SEM找切割位置" Details="自动调整SEM找切割位置"></Step>
+    
+      <Step Index="25" Name="" Code="1-25" IsData="False" Type="Photo" Title="设置放大倍数" Details="控制SEM放大到指定参数大小范围"></Step>
+      <Step Index="26" Name="" Code="1-26" IsData="True" Type="Photo" Title="自动对焦" Details="控制SEM自动对焦、消像散、亮度、对比度"></Step>
+      <Step Index="27" Name="" Code="1-27" IsData="False" Type="Photo" Title="角度补偿" Details="设置SEM角度补偿"></Step>
+      <Step Index="28" Name="" Code="1-28" IsData="True" Type="Photo" Title="保存照片" Details="设置图片名称、保存图片"></Step>
+      <Step Index="29" Name="" Code="1-29" IsData="True" Type="Photo" Title="获取坐标并移动到对应位置" Details="获取坐标并移动到对应位置"></Step>
       <Step Index="35" Name="" Code="1-35" IsData="False" Type="Photo" Title="移动到分析位置" Details="根据坐标控制SEM移动到分析位置"></Step>
       <Step Index="36" Name="" Code="1-36" IsData="False" Type="Photo" Title="验证移动准确性" Details="验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确"></Step>
 

+ 420 - 205
MeasureThread/Measure.cs

@@ -517,13 +517,12 @@ namespace MeasureThread
             switch(step_code)
             {
                 //拍照
-                case "1-3":
-                case "1-9":
+                case "1-5":
+                case "1-7":
                 case "1-16":
                 case "1-24":
                     //电压、放大倍数、工作距离、位置信息、图片路径
                     arg.Picture_Information.Work_Voltage = iSEM.GetSEMVoltage();
-                    arg.Picture_Information.Work_Status = "SEM";
                     arg.Picture_Information.Work_Distance = iSEM.GetWorkingDistance();
                     arg.Picture_Information.Magnification = iSEM.GetMagnification();
                     break;
@@ -634,7 +633,7 @@ namespace MeasureThread
         public bool InsertPT()
         {
             string fn = m_ProgramFolder + "\\Macro\\" + MacoInsertPt;
-            SendMsg("调用宏插入PT针宏文件" + fn);
+            //SendMsg("调用宏插入PT针宏文件" + fn);
             iSEM.CMDMCFFilename(fn);
             //延时1s??
             Thread.Sleep(1000);
@@ -645,7 +644,7 @@ namespace MeasureThread
         public bool RetractPT()
         {
             string fn = m_ProgramFolder + "\\Macro\\" + MacoRetractPt;
-            SendMsg("调用宏撤出PT针宏文件" + fn);
+            //SendMsg("调用宏撤出PT针宏文件" + fn);
             iSEM.CMDMCFFilename(fn);
             //延时1s??
             Thread.Sleep(1000);
@@ -657,7 +656,7 @@ namespace MeasureThread
         {
             //执行PT沉积的ELY文件
             string fn = m_ProgramFolder + "\\Macro\\" + ElyDeposition;
-            SendMsg("执行PT沉积Ely文件:" + fn);
+            //SendMsg("执行PT沉积Ely文件:" + fn);
             if (!ExcuteEly(fn))
             {
                 return false;
@@ -680,7 +679,7 @@ namespace MeasureThread
         {
             //执行PT沉积的ELY文件
             string fn = m_ProgramFolder + "\\Macro\\" + ElyCrossSection;
-            SendMsg("执行FIB切割Ely文件:" + fn);
+            //SendMsg("执行FIB切割Ely文件:" + fn);
             if (!ExcuteEly(fn))
             {
                 return false;
@@ -699,30 +698,31 @@ namespace MeasureThread
             return true;
         }
 
+        //执行ELY文件的步骤
         public bool ExcuteEly(string a_filename)
         {
             //执行ELy文件有三个动作
             //1. 选择ELY文件
-            SendMsg("选择ELY文件");
+            //SendMsg("选择ELY文件");
             if (!iSEM.CmdFIBLoadELY(a_filename))
             {
-                SendMsg("选择ELY文件失败");
+                //SendMsg("选择ELY文件失败");
                 return false;
             }
             Thread.Sleep(1000);
             //2. 确认ELY文件
-            SendMsg("确认ELY文件");
+            //SendMsg("确认ELY文件");
             if (!iSEM.CmdFIBEXPOSUREELY())
             {
-                SendMsg("确认ELY文件失败");
+                //SendMsg("确认ELY文件失败");
                 return false;
             }
             Thread.Sleep(1000);
             //3. 执行ELY文件
-            SendMsg("执行ELY文件");
+            //SendMsg("执行ELY文件");
             if (!iSEM.CmdFIBSTARTELY())
             {
-                SendMsg("执行ELY文件失败");
+                //SendMsg("执行ELY文件失败");
                 return false;
             }
             Thread.Sleep(1000);
@@ -731,23 +731,26 @@ namespace MeasureThread
         }
 
         /// <summary>
-        ///13. 自动 定位功能
+        ///13. 自动 定位功能,沉积
         /// </summary>
         /// <returns></returns>
         public bool GetPoistion(Boolean isFirst)
         {
+            float x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
+            int state = 0;
             //SendMsg("自动定位");
             //13.自动定位切割
             {
                 //1.控制SEM放大600X
+                arg.State = "SEM";
                 if (!iSEM.SetMagnification(m_measureFile.MParam.Photograph_Magnification))
                 {
                     arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍失败";
-                    SendMsg("1-1");
+                    SendMsg("1-2");
                     return false;
                 }
                 arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍成功";
-                SendMsg("1-1");
+                SendMsg("1-2");
 
                 //2.控制SEM自动对焦、亮度、对比度
                 if (m_measureFile.MParam.FocusMode==1)//手动
@@ -755,13 +758,13 @@ namespace MeasureThread
                     if (DialogResult.Yes == MessageBox.Show("图像自动对焦已完成?", "确认消息", MessageBoxButtons.YesNo))
                     {
                         arg.Message = "自动对焦完成";
-                        SendMsg("1-2");
+                        SendMsg("1-3");
                         //return true;
                     }
                     else
                     {
                         arg.Message = "自动对焦失败";
-                        SendMsg("1-2");
+                        SendMsg("1-3");
                         return false;
                     }
                 }
@@ -782,120 +785,143 @@ namespace MeasureThread
                     if (!TiltCorrection(m_measureFile.MParam.Correction_Angle))
                     {
                         arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度失败";
-                        SendMsg("1-15");
+                        SendMsg("1-4");
                         return false;
                     }
                     arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度成功";
-                    SendMsg("1-15");
+                    SendMsg("1-4");
                     Thread.Sleep(5000);
                 }
 
                 //4.控制SEM拍照,5保存照片
                 String fileName1 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName1;
                 arg.Picture_Information.Picture_FullPath = fileName1;
+                arg.Picture_Information.Work_Status = "SEM";
                 if (!GetImage(ImageMode.SEM, fileName1))
                 {
                     arg.Message = "SEM拍照失败";
-                    SendMsg("1-3");
+                    SendMsg("1-5");
                     return false;
                 }
                 arg.Message = "SEM拍照成功";
-                SendMsg("1-3");
+                SendMsg("1-5");
                 Thread.Sleep(3000);
-                
-                //6.设置FIB拍照参数——扫描时间、束流等
-                //7.控制FIB自动亮度、对比度
-                SendMsg("切换FIB控制");
-                if (!iSEM.CmdFIBModeFIB())
-                {
-                    SendMsg("FIB模式切换失败");
-                    return false;
-                }
-
-                Thread.Sleep(10000);
 
-                //8.控制FIB拍照
-                //9.保存照片
-                SendMsg("FIB拍照");
+                //判断是否为仅拍照,不是则执行FIB操作
+                if (!m_MsParam.Is_Photograph)
                 {
-                    //1. 设置图片名称
-                    //2. 保存图片2
+                    //6.设置FIB拍照参数——扫描时间、束流等
+                    //7.控制FIB自动亮度、对比度
+                    if (!iSEM.CmdFIBModeFIB())
+                    {
+                        arg.Message = "FIB模式切换失败";
+                        SendMsg("1-6");
+                        return false;
+                    }
+                    arg.Message = "FIB模式切换成功";
+                    SendMsg("1-6");
+                    Thread.Sleep(10000);
+
+                    //8.控制FIB拍照
+                    //9.保存照片
                     String fileName2 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName2;
+                    arg.Picture_Information.Picture_FullPath = fileName1;
+                    arg.Picture_Information.Work_Status = "FIB";
                     if (!GetImage(ImageMode.FIB, fileName2))
                     {
-                        SendMsg("FIB拍照失败");
+                        arg.Message = "FIB拍照失败";
+                        SendMsg("1-7");
                         return false;
                     }
-
+                    arg.Message = "FIB拍照成功";
+                    SendMsg("1-7");
                     Thread.Sleep(3000);
-                }
-
-                //10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
-                SendMsg("调用识别位置");
-
-                if (DialogResult.Yes == MessageBox.Show("移动已完成?", "确认消息", MessageBoxButtons.YesNo))
-                {
-                    SendMsg("移动已完成");
-                    //return true;
-                }
-                else
-                {
-                    SendMsg("移动已失败");
-                    return false;
-                }
 
+                    //这里需要确认是否对FIB的参数进行设置:电压和放大倍数等
 
-                SendMsg("进行PT沉积");
-                //11.自动工具样品类型参数确定是否需要PT沉积
-                {
-                    //1. 根据客户PT沉积坐标控制FIB调整到中心位置
-                    //2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
-                    //3. 根据坐标进行PT沉积   
-                    if (!PTWork())
+                    //10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
+                    if (DialogResult.Yes == MessageBox.Show("是否手动移动样品台到指定位置?\n如果点击取消则会调用Web接口。", "确认消息", MessageBoxButtons.YesNo))
                     {
-                        SendMsg("PT沉积失败");
-                        return false;
+                        arg.Message = "样品台移动到指定位置";
+                        SendMsg("1-8");
+                    }
+                    else
+                    {
+                        wr.Img_Cut_Position(fileName2, m_MsParam.SampleName, m_MsParam.Firm, out x1, out y1, out x2, out y2, out state);
+                        if (state == 1)
+                        {
+                            //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
+                            if (!iSEM.MoveStageXY(x1, y1))
+                            {
+                                arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
+                                SendMsg("1-8");
+                                return false;
+                            }
+                            //判断是否移动完成
+                            while (true)
+                            {
+                                Thread.Sleep(5000);
+                                if (iSEM.GetStageIs() == 0)
+                                {
+                                    break;
+                                }
+                            }
+                            arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
+                            SendMsg("1-8");
+                        }
+                        else
+                        {
+                            arg.Message = "样品台移动失败";
+                            SendMsg("1-8");
+                            return false;
+                        }
                     }
 
-
+                    //11.自动工具样品类型参数确定是否需要PT沉积
+                    if (m_MsParam.PT)
+                    {
+                        //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
+                        //第10步已经移动好位置
+                        //2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
+                        x0 = iSEM.GetStageAtX();
+                        y0 = iSEM.GetStageAtY();
+                        if (Math.Abs(x0 - x1) > fMin && Math.Abs(y0 - y1) > fMin)
+                        {
+                            arg.Message = "目标位置(" + x0.ToString() + "," + y0.ToString() + ")移动失败";
+                            SendMsg("1-9");
+                            return false;
+                        }
+                        arg.Message = "目标位置(" + x0.ToString() + "," + y0.ToString() + ")移动成功";
+                        SendMsg("1-9");
+                        //3. 根据坐标进行PT沉积   
+                        if (!PTWork())
+                        {
+                            arg.Message = "PT沉积失败";
+                            SendMsg("1-10");
+                            return false;
+                        }
+                        arg.Message = "PT沉积成功";
+                        SendMsg("1-10");
+                    }
                 }
 
-
-                return true;
-                //模拟为客户返回的坐标值
-                float x0 = 0, y0 = 0;
-                SendMsg("移动到新(" + x0.ToString() + "," + y0.ToString() + ")位置失败");
-
                 //12.根据梯形坐标控制FIB调整到中心位置
-                if (!iSEM.MoveStageXY(x0, y0))
-                {
-                    SendMsg("移动到新(" + x0.ToString() + "," + y0.ToString() + ")位置失败");
-                    return false;
-                }
-
-                //电镜移动是有一个延时的操作的?
-
                 //13.验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确
-                float x1 = iSEM.GetStageAtX();
-                float y1 = iSEM.GetStageAtY();
-                if (Math.Abs(x0 - x1) > fMin && Math.Abs(y0 - y1) > fMin)
-                {
-                    SendMsg("目标位置(" + x0.ToString() + "," + y0.ToString() + ")移动失败");
-                    return false;
-                }
+                //以上两步已经将程序移动到11内部去做
 
                 //14.保存样品1第1号孔中心位置6轴坐标1 XYZMRT到数据库,保存客户返回值信息到数据库
                 float[] firstPosition = iSEM.GetStagePosition();
                 //这里要调用文件保存功能
-                SendMsg("坐标1(" + firstPosition[0].ToString() + ","
+                arg.Message = "坐标1(" + firstPosition[0].ToString() + ","
                     + firstPosition[1].ToString() + ","
                     + firstPosition[2].ToString() + ","
                     + firstPosition[3].ToString() + ","
                     + firstPosition[4].ToString() + ","
-                    + firstPosition[5].ToString() + ")");
+                    + firstPosition[5].ToString() + ")";
+                SendMsg("1-11");
             }
 
-            return false;
+            return true;
         }
 
         /// <summary>
@@ -905,38 +931,39 @@ namespace MeasureThread
         public bool FIBCross()
         {
             //14.自动控制FIB切割
+            //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
+            //2.控制FIB进行切割
+            //以上1、2步全部用ELY文件代替
+            if (!FIBWork())
             {
-                //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
-                //2.控制FIB进行切割
-                SendMsg("FIB切割");
-                if (!FIBWork())
-                {
-                    SendMsg("FIB切割失败");
-                    return false;
-                }
-
-                Thread.Sleep(5000);
+                arg.Message = "FIB切割失败";
+                SendMsg("1-12");
+                return false;
+            }
+            arg.Message = "FIB切割成功";
+            SendMsg("1-12");
+            
+            Thread.Sleep(5000);
 
-                //3.控制FIB拍照600X
-                //4.保存图片
-                {
-                    //1.设置图片名称
-                    //2.保存图片3
-                    WorkingFolder = m_measureFile.FilePath;
-                    String fileName3 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName3;
-                    SendMsg("SEM拍照存储到" + fileName3);
-                    if (!GetImage(ImageMode.FIB, fileName3))
-                    {
-                        SendMsg("FIB拍照失败");
-                        return false;
-                    }
+            //3.控制FIB拍照600X
+            //这里如何控制
+            //4.保存图片
+            String fileName3 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName3;
+            arg.Picture_Information.Picture_FullPath = fileName3;
+            arg.Picture_Information.Work_Status = "FIB";
+            if (!GetImage(ImageMode.FIB, fileName3))
+            {
+                arg.Message = "FIB拍照失败";
+                SendMsg("1-14"); 
+                return false;
+            }
+            arg.Message = "FIB拍照成功";
+            SendMsg("1-14");
 
-                    Thread.Sleep(3000);
-                }
-                //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
+            Thread.Sleep(3000);
+            //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
 
-                //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
-            }
+            //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
             return true;
         }
 
@@ -946,59 +973,252 @@ namespace MeasureThread
         /// <returns></returns>
         public bool FindCross()
         {
-            //16.自动调整SEM找到切割位置
+            float x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
+            float angle = 0;
+            int direction = 0;
+            int state = 0;
+            //1.控制SEM放大到300倍
+            arg.State = "SEM";
+            if (!iSEM.SetMagnification(m_measureFile.MParam.Photograph_Magnification))
+            {
+                arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍失败";
+                SendMsg("1-18");
+                return false;
+            }
+            arg.Message = "放大" + m_measureFile.MParam.Photograph_Magnification.ToString("0.0") + "倍成功";
+            SendMsg("1-18");
+            //2.控制SEM自动对焦、亮度、对比度-接口
+            if (m_measureFile.MParam.FocusMode == 1)//手动
             {
-                //1.控制SEM放大到300倍
-                if (!iSEM.SetMagnification(300))
+                if (DialogResult.Yes == MessageBox.Show("图像自动对焦已完成?", "确认消息", MessageBoxButtons.YesNo))
                 {
+                    arg.Message = "自动对焦完成";
+                    SendMsg("1-19");
+                    //return true;
+                }
+                else
+                {
+                    arg.Message = "自动对焦失败";
+                    SendMsg("1-19");
                     return false;
                 }
-                //2.控制SEM自动对焦、亮度、对比度-接口
-                if (MeasParam.FocusMode==1)
+            }
+            else if (m_measureFile.MParam.FocusMode == 2)//自有自动
+            {
+                //郝工增加自动对焦算法
+            }
+            else     //客户自动
+            {
+                //后期和客户对接接口
+                List<string> filenames = new List<string>();
+                String retfilename = wr.Img_Auto_Focus(filenames);
+            }
+
+            Thread.Sleep(5000);
+
+            //原来这里有3是角度补偿
+
+            //3.控制SEM拍照
+            String fileName4 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName4;
+            arg.Picture_Information.Picture_FullPath = fileName4;
+            arg.Picture_Information.Work_Status = "SEM";
+            if (!GetImage(ImageMode.SEM, fileName4))
+            {
+                arg.Message = "SEM拍照失败";
+                SendMsg("1-20");
+                return false;
+            }
+            arg.Message = "SEM拍照成功";
+            SendMsg("1-20");
+
+            Thread.Sleep(3000);
+            //4.将照片传给客户,获取偏移坐标,以及偏移角度
+            //5.根据坐标控制SEM移动到切孔位置,居中
+            //这里是否用到拉直操作,我没有加
+            if (DialogResult.Yes == MessageBox.Show("是否手动移动样品台到指定位置?\n如果点击取消则会调用Web接口。", "确认消息", MessageBoxButtons.YesNo))
+            {
+                arg.Message = "样品台移动到指定位置";
+                SendMsg("1-21");
+            }
+            else
+            {
+                wr.Img_Center_Position_OffsetAngle_Direction(fileName4, m_MsParam.SampleName, m_MsParam.Firm, out x1, out y1, out angle, out direction, out state);
+                if (state == 1)
                 {
-                    //弹出手动对焦的窗口
+                    //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
+                    if (!iSEM.MoveStageXY(x1, y1))
+                    {
+                        arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
+                        SendMsg("1-21");
+                        return false;
+                    }
+                    //判断是否移动完成
+                    while (true)
+                    {
+                        Thread.Sleep(5000);
+                        if (iSEM.GetStageIs() == 0)
+                        {
+                            break;
+                        }
+                    }
+                    arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
+                    SendMsg("1-21");
                 }
                 else
                 {
-                    //调用自动对焦模块
+                    arg.Message = "样品台移动失败";
+                    SendMsg("1-21");
+                    return false;
                 }
+            }
+
+            if (!iSEM.SetScanRotation(angle))
+            {
+                arg.Message = "调整角度失败";
+                SendMsg("1-22");
+                return false;
+            }
+            arg.Message = "调整角度成功";
+            SendMsg("1-22");
+
+
+            ////6.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
+            //float x5 = iSEM.GetStageAtX();
+            //float y5 = iSEM.GetStageAtY();
+            //if (Math.Abs(x5 - x4) > fMin && Math.Abs(y5 - y4) > fMin)
+            //{
+            //    return false;
+            //}
+
+            return true;
+        }
+
+        /// <summary>
+        /// 17.自动控制SEM拍截面照
+        /// </summary>
+        /// <returns></returns>
+        public bool ShotSection()
+        {
+            float x0 = 0, y0 = 0, x1 = 0, y1 = 0, x2 = 0, y2 = 0;
+            int state = 0;
+            //切换到SEM模式
+            if (!iSEM.CmdFIBModeSEM())
+            {
+                //SendMsg("SEM模式切换失败");
+                return false;
+            }
+            arg.State = "SEM";
+            Thread.Sleep(10000);
 
-                Thread.Sleep(5000);
+            //1、放大6000倍
+            if (!iSEM.SetMagnification(6000))
+            {
+                arg.Message = "放大倍数调整失败";
+                SendMsg("1-25");
+                return false;
+            }
+            arg.Message = "放大倍数调整成功";
+            SendMsg("1-25");
 
-                //3.控制SEM拍照
-                String fileName4 = WorkingFolder + ImageName4;
-                if (!GetImage(ImageMode.SEM, fileName4))
+            //2.控制SEM自动对焦、亮度、对比度-接口
+            if (m_measureFile.MParam.FocusMode == 1)//手动
+            {
+                if (DialogResult.Yes == MessageBox.Show("图像自动对焦已完成?", "确认消息", MessageBoxButtons.YesNo))
+                {
+                    arg.Message = "自动对焦完成";
+                    SendMsg("1-26");
+                    //return true;
+                }
+                else
                 {
+                    arg.Message = "自动对焦失败";
+                    SendMsg("1-26");
                     return false;
                 }
+            }
+            else if (m_measureFile.MParam.FocusMode == 2)//自有自动
+            {
+                //郝工增加自动对焦算法
+            }
+            else     //客户自动
+            {
+                //后期和客户对接接口
+                List<string> filenames = new List<string>();
+                String retfilename = wr.Img_Auto_Focus(filenames);
+            }
 
-                Thread.Sleep(3000);
-                //4.将照片传给客户,获取偏移坐标,以及偏移角度
-                float x4 = 0, y4 = 0;
-                float angle = 0;
+            //3、设置SEM补偿角度
+            if (!TiltCorrection(m_measureFile.MParam.Correction_Angle))
+            {
+                arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度失败";
+                SendMsg("1-27");
+                return false;
+            }
+            arg.Message = "设置SEM进行角度补偿" + m_measureFile.MParam.Correction_Angle.ToString("0") + "度成功";
+            SendMsg("1-27");
+            Thread.Sleep(5000);
+
+            //4、拍照,5、保存照片
+            String fileName5 = WorkingFolder + "\\" + m_nWorkHoleNo.ToString() + "Hole" + ImageName5;
+            arg.Picture_Information.Picture_FullPath = fileName5;
+            arg.Picture_Information.Work_Status = "SEM";
+            if (!GetImage(ImageMode.SEM, fileName5))
+            {
+                arg.Message = "SEM拍照失败";
+                SendMsg("1-28");
+                return false;
+            }
+            arg.Message = "SEM拍照成功";
+            SendMsg("1-28");
+            Thread.Sleep(3000);
 
-                //5.根据坐标控制SEM移动到切孔位置,居中
-                if (!iSEM.MoveStageXY(x4, y4))
+            //6、获取偏移坐标,7、移动到位
+            if (DialogResult.Yes == MessageBox.Show("是否手动移动样品台到指定位置?\n如果点击取消则会调用Web接口。", "确认消息", MessageBoxButtons.YesNo))
+            {
+                arg.Message = "样品台移动到指定位置";
+                SendMsg("1-29");
+            }
+            else
+            {
+               // wr.Img_Cut_Position(fileName5, m_MsParam.SampleName, m_MsParam.Firm, out x1, out y1, out x2, out y2, out state);
+                if (state == 1)
                 {
-                    return false;
+                    //1. 根据客户PT沉积坐标控制FIB调整到中心位置???????
+                    if (!iSEM.MoveStageXY(x1, y1))
+                    {
+                        arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
+                        SendMsg("1-29");
+                        return false;
+                    }
+                    //判断是否移动完成
+                    while (true)
+                    {
+                        Thread.Sleep(5000);
+                        if (iSEM.GetStageIs() == 0)
+                        {
+                            break;
+                        }
+                    }
+                    arg.Message = "移动到新(" + x1.ToString() + "," + y1.ToString() + ")位置失败";
+                    SendMsg("1-29");
                 }
-
-                if (!iSEM.SetScanRotation(angle))
+                else
                 {
+                    arg.Message = "样品台移动失败";
+                    SendMsg("1-8");
                     return false;
                 }
-
-                ////6.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
-                //float x5 = iSEM.GetStageAtX();
-                //float y5 = iSEM.GetStageAtY();
-                //if (Math.Abs(x5 - x4) > fMin && Math.Abs(y5 - y4) > fMin)
-                //{
-                //    return false;
-                //}
             }
+
+            //8、验证移动准确性
+
+            //9、
+
+
             return true;
         }
 
+
         public bool CommonWork()
         {
             SendMsg("插入PT针");
@@ -1152,7 +1372,7 @@ namespace MeasureThread
             MeasureData.CutHole firstHole = m_cutHoles[0];            
             
             //12.根据样品类型参数确定是否需要PT沉积,控制PT针插入
-            if (m_MsParam.PT == true)
+            if (m_MsParam.Is_Photograph == false && m_MsParam.PT == true)
             {
                 if (!InsertPT())
                 {
@@ -1165,93 +1385,88 @@ namespace MeasureThread
             }
 
             //13. 自动 定位功能
-            SendMsg("自动定位切割位置");
             if (!GetPoistion(true))
             {
-                SendMsg("自动定位切割位置失败");
+                arg.Message = "自动定位切割位置失败";
+                SendMsg("1-1");
                 return false;
             }
+            arg.Message = "自动定位切割位置成功";
+            SendMsg("1-1");
 
             //14.自动控制FIB切割
-            SendMsg("FIB切割");
-            if (!FIBCross())
+            if (m_MsParam.Is_Photograph == false && m_MsParam.PT == true)
             {
-                SendMsg("FIB切割失败");
-                return false;
+                if (!FIBCross())
+                {
+                    arg.Message = "FIB切割失败";
+                    SendMsg("1-16");
+                    return false;
+                }
+                arg.Message = "FIB切割成功";
+                SendMsg("1-16");
             }
-            //{
-            //    //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
-            //    //2.控制FIB进行切割
-
-            //    //3.控制FIB拍照600X
-            //    //4.保存图片
-            //    {
-            //        //1.设置图片名称
-            //        //2.保存图片3
-            //        String fileName3 = WorkingFolder + ImageName3;
-            //        if (!GetImage(ImageMode.FIB, fileName3))
-            //        {
-            //            return false;
-            //        }
-            //    }
-            //    //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
 
-            //    //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
-            //}
             //15.根据样品类型决定是否撤出PT针
-            if (m_MsParam.PT == true)
+            if(m_MsParam.Is_Photograph == false && m_MsParam.PT == true)
             {
                 if (!RetractPT())
                 {
                     arg.Message = "撤出PT针失败";
-                    SendMsg("1-23");
+                    SendMsg("1-17");
                     return false;
                 }
                 arg.Message = "撤出PT针成功";
-                SendMsg("1-23");
+                SendMsg("1-17");
             }
 
             // 16.找到切割位置
-            SendMsg("找到切割位置");
-
-            //17.自动控制SEM拍截面照
-            SendMsg("观测层高");
-
-            SendMsg("切换SEM控制");
-            if (!iSEM.CmdFIBModeSEM())
+            if(m_MsParam.Is_Photograph == false)
             {
-                SendMsg("SEM模式切换失败");
-                return false;
+                if (!FindCross())
+                {
+                    arg.Message = "找到切割位置失败";
+                    SendMsg("1-24");
+                    return false;
+                }
+                arg.Message = "找到切割位置成功";
+                SendMsg("1-24");
             }
 
-            Thread.Sleep(10000);
-
-            SendMsg("放大6000倍");
-            if (!iSEM.SetMagnification(6000))
+            //17.自动控制SEM拍截面照
+            if(m_MsParam.Is_Photograph == false)
             {
-                SendMsg("放大倍数调整失败");
-                return false;
+                if (!ShotSection())
+                {
+                    arg.Message = "自动控制SEM拍截面照失败";
+                    SendMsg("1-33");
+                    return false;
+                }
+                arg.Message = "自动控制SEM拍截面照成功";
+                SendMsg("1-33");
             }
 
-            if (DialogResult.Yes == MessageBox.Show("图像拍摄已完成?", "确认消息", MessageBoxButtons.YesNo))
-            {
-                SendMsg("拍摄照片完成");
-                //return true;
-            }
-            else
-            {
-                SendMsg("拍摄照片失败");
-                return false;
-            }
+            
 
-            SendMsg("图像校正36度");
-            //3.设置SEM角度补偿cos36度
-            if (!TiltCorrection(36))
-            {
-                return false;
-            }
+            //if (DialogResult.Yes == MessageBox.Show("图像拍摄已完成?", "确认消息", MessageBoxButtons.YesNo))
+            //{
+            //    SendMsg("拍摄照片完成");
+            //    //return true;
+            //}
+            //else
+            //{
+            //    SendMsg("拍摄照片失败");
+            //    return false;
+            //}
 
-            Thread.Sleep(3000);
+            //SendMsg("图像校正36度");
+            ////3.设置SEM角度补偿cos36度
+            //if (!TiltCorrection(36))
+            //{
+            //    return false;
+            //}
+
+            //Thread.Sleep(3000);
 
             string fn;
             //用宏抓一般图

+ 18 - 9
WebManager/WebResult.cs

@@ -135,8 +135,13 @@ namespace WebManager
         /// <param name="imagePath">图片路径</param>
         /// <param name="imageType">孔类型</param>
         /// <param name="firm">厂家类型</param>
+        /// <param name="offsetx1">切割点相对于原点坐标左上角x值</param>
+        /// <param name="offsetx2">切割点相对于原点坐标左上角y值</param>
+        /// <param name="offsety1">切割点相对于原点坐标右上角x值</param>
+        /// <param name="offsety2">切割点相对于原点坐标右上角y值</param>
+        /// <param name="state">返回状态</param>
         /// <returns>json字符串</returns>
-        public void Img_Cut_Position(String imagePath, int imageType, String firm, out double offsetx, out double offsety, out int state)
+        public void Img_Cut_Position(String imagePath, String imageType, String firm, out float offsetx1, out float offsety1, out float offsetx2, out float offsety2, out int state)
         {
             try
             {
@@ -157,15 +162,19 @@ namespace WebManager
             {
                 JObject jname = JObject.Parse(jret["img_name"].ToString());
                 JArray jlocation = JArray.Parse(jname["location"].ToString());
-                offsetx = Convert.ToDouble(jlocation[0].ToString());
-                offsety = Convert.ToDouble(jlocation[1].ToString());
+                offsetx1 = Convert.ToSingle(jlocation[0][0].ToString());
+                offsety1 = Convert.ToSingle(jlocation[0][1].ToString());
+                offsetx2 = Convert.ToSingle(jlocation[1][0].ToString());
+                offsety2 = Convert.ToSingle(jlocation[1][1].ToString());
                 state = Convert.ToInt32(jname["state"].ToString());
             }
             else
             {
                 state = 0;
-                offsetx = 0;
-                offsety = 0;
+                offsetx1 = 0;
+                offsety1 = 0;
+                offsetx2 = 0;
+                offsety2 = 0;
             }
         }
 
@@ -308,7 +317,7 @@ namespace WebManager
         /// </summary>
         /// <param name="imagePath">图片路径</param>
         /// <returns>json字符串</returns>
-        public void Img_Center_Position_OffsetAngle_Direction(String imagePath, int imageType, String firm, out double offsetx, out double offsety, out double degree, out int direction, out int state)
+        public void Img_Center_Position_OffsetAngle_Direction(String imagePath, String imageType, String firm, out float offsetx, out float offsety, out float degree, out int direction, out int state)
         {
             try
             {
@@ -329,10 +338,10 @@ namespace WebManager
             {
                 JObject jname = JObject.Parse(jret["img_name"].ToString());
                 JArray jlocation = JArray.Parse(jname["center"].ToString());
-                offsetx = Convert.ToDouble(jlocation[0].ToString());
-                offsety = Convert.ToDouble(jlocation[1].ToString());
+                offsetx = Convert.ToSingle(jlocation[0].ToString());
+                offsety = Convert.ToSingle(jlocation[1].ToString());
                 state = Convert.ToInt32(jname["state"].ToString());
-                degree = Convert.ToDouble(jname["degree"].ToString());
+                degree = Convert.ToSingle(jname["degree"].ToString());
                 direction = Convert.ToInt32(jname["direction"].ToString());
 
             }