|
@@ -20,12 +20,23 @@ namespace MeasureThread
|
|
|
Auto
|
|
Auto
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ public enum ImageMode
|
|
|
|
|
+ {
|
|
|
|
|
+ FIB,
|
|
|
|
|
+ SEM
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
public class Measure
|
|
public class Measure
|
|
|
{
|
|
{
|
|
|
//全局只有一个fatorySEM
|
|
//全局只有一个fatorySEM
|
|
|
static FactoryHardware factorySEM = FactoryHardware.Instance;
|
|
static FactoryHardware factorySEM = FactoryHardware.Instance;
|
|
|
ISEMControl iSEM = factorySEM.ISEM;
|
|
ISEMControl iSEM = factorySEM.ISEM;
|
|
|
|
|
|
|
|
|
|
+ const String ImageName1 = @"ImageSEM600X.tif";
|
|
|
|
|
+ const String ImageName2 = @"ImageFIB600X.tif";
|
|
|
|
|
+
|
|
|
|
|
+ const float fMin = (float)0.0000002; //单位是米
|
|
|
|
|
+
|
|
|
//测量文件
|
|
//测量文件
|
|
|
private MeasureFile m_measureFile;
|
|
private MeasureFile m_measureFile;
|
|
|
public MeasureFile MeasureFile
|
|
public MeasureFile MeasureFile
|
|
@@ -209,30 +220,58 @@ namespace MeasureThread
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
//4.控制SEM拍照
|
|
//4.控制SEM拍照
|
|
|
- Boolean GrabImage(String filename, short xoff, short yoff, short width, short height, short type);
|
|
|
|
|
//5.保存照片
|
|
//5.保存照片
|
|
|
{
|
|
{
|
|
|
//1. 创建目录,已经完成
|
|
//1. 创建目录,已经完成
|
|
|
//2. 设置图片名称
|
|
//2. 设置图片名称
|
|
|
//3. 保存图片1
|
|
//3. 保存图片1
|
|
|
|
|
+ String fileName1 = WorkingFolder + ImageName1;
|
|
|
|
|
+ if (!GetImage(ImageMode.SEM, fileName1))
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
//6.设置FIB拍照参数——扫描时间、束流等
|
|
//6.设置FIB拍照参数——扫描时间、束流等
|
|
|
//7.控制FIB自动亮度、对比度
|
|
//7.控制FIB自动亮度、对比度
|
|
|
|
|
+
|
|
|
//8.控制FIB拍照
|
|
//8.控制FIB拍照
|
|
|
//9.保存照片
|
|
//9.保存照片
|
|
|
{
|
|
{
|
|
|
//1. 设置图片名称
|
|
//1. 设置图片名称
|
|
|
//2. 保存图片2
|
|
//2. 保存图片2
|
|
|
|
|
+ String fileName1 = WorkingFolder + ImageName2;
|
|
|
|
|
+ if (!GetImage(ImageMode.FIB, fileName1))
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
//10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
|
|
//10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
|
|
|
|
|
+
|
|
|
//11.自动工具样品类型参数确定是否需要PT沉积
|
|
//11.自动工具样品类型参数确定是否需要PT沉积
|
|
|
{
|
|
{
|
|
|
//1. 根据客户PT沉积坐标控制FIB调整到中心位置
|
|
//1. 根据客户PT沉积坐标控制FIB调整到中心位置
|
|
|
//2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
|
|
//2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
|
|
|
//3. 根据坐标进行PT沉积
|
|
//3. 根据坐标进行PT沉积
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ //模拟为客户返回的坐标值
|
|
|
|
|
+ float x0 = 0, y0 = 0;
|
|
|
//12.根据梯形坐标控制FIB调整到中心位置
|
|
//12.根据梯形坐标控制FIB调整到中心位置
|
|
|
|
|
+ if (!iSEM.MoveStageXY(x0, y0))
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
//13.验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确
|
|
//13.验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确
|
|
|
|
|
+ float x1 = iSEM.GetStageAtX();
|
|
|
|
|
+ float y1 = iSEM.GetStageAtY();
|
|
|
|
|
+ if (Math.Abs(x0 - x1) > fMin && Math.Abs(y0 - y1) > fMin)
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
//14.保存样品1第1号孔中心位置6轴坐标1 XYZMRT到数据库,保存客户返回值信息到数据库
|
|
//14.保存样品1第1号孔中心位置6轴坐标1 XYZMRT到数据库,保存客户返回值信息到数据库
|
|
|
}
|
|
}
|
|
|
//14.自动控制FIB切割
|
|
//14.自动控制FIB切割
|
|
@@ -352,14 +391,71 @@ namespace MeasureThread
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- //SEM拍图
|
|
|
|
|
- public bool GetSEMImage()
|
|
|
|
|
|
|
+ //拍图
|
|
|
|
|
+ public bool GetImage(ImageMode a_mode, String a_fileName)
|
|
|
{
|
|
{
|
|
|
//1. 图像解冻
|
|
//1. 图像解冻
|
|
|
- //2. 确认是SEM图像
|
|
|
|
|
|
|
+ float foldFrozen = iSEM.GetImageFrozen();
|
|
|
|
|
+ if (foldFrozen == float.NaN)
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (!iSEM.ImageLive())
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //2. 确认图像模式
|
|
|
|
|
+ if (ImageMode.SEM == a_mode)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!iSEM.CmdFIBModeSEM())
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (ImageMode.FIB == a_mode)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!iSEM.CmdFIBModeFIB())
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
//3. 获取分辨率
|
|
//3. 获取分辨率
|
|
|
|
|
+ int[] ImageSize = iSEM.GetImageStore();
|
|
|
|
|
+ if (ImageSize[0] == 0 || ImageSize[1] == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ short width = (short)ImageSize[0];
|
|
|
|
|
+ short height = (short)ImageSize[1];
|
|
|
|
|
+
|
|
|
//4. 抓图
|
|
//4. 抓图
|
|
|
- Boolean GrabImage(String filename, short xoff, short yoff, short width, short height, short type);
|
|
|
|
|
|
|
+ if (!iSEM.GrabImage(a_fileName, 0, 0, width, height, 0))
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //5. 恢复初始状态
|
|
|
|
|
+ if (foldFrozen == 0)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!iSEM.ImageLive())
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else if (foldFrozen == 1)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!iSEM.ImageFrozen())
|
|
|
|
|
+ {
|
|
|
|
|
+ return false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|