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