|
@@ -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;
|
|
|
//用宏抓一般图
|