Measure.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. //时间:20200610
  2. //作者:郝爽
  3. //功能:测量线程
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using SmartSEMControl;
  10. using MeasureData;
  11. namespace MeasureThread
  12. {
  13. public class Measure
  14. {
  15. //全局只有一个fatorySEM
  16. static FactoryHardware factorySEM = FactoryHardware.Instance;
  17. ISEMControl iSEM = factorySEM.ISEM;
  18. //测量文件
  19. private MeasureFile m_measureFile;
  20. public MeasureFile MeasureFile
  21. {
  22. get { return this.m_measureFile; }
  23. set { this.m_measureFile = value; }
  24. }
  25. //测量的切割孔
  26. private List<MeasureData.CutHole> m_cutHoles;
  27. public List<MeasureData.CutHole> cutHoles
  28. {
  29. get { return this.m_cutHoles; }
  30. set { this.m_cutHoles = value; }
  31. }
  32. //工作文件夹
  33. private string m_WorkingFolder;
  34. public string WorkingFolder
  35. {
  36. get { return this.m_WorkingFolder; }
  37. set { this.m_WorkingFolder = value; }
  38. }
  39. //线程状态
  40. private ThreadStatus m_ThreadStatus;
  41. public ThreadStatus TStatus
  42. {
  43. get { return this.m_ThreadStatus; }
  44. set { this.m_ThreadStatus = value; }
  45. }
  46. //// SEM data general
  47. //CSEMDataGnrPtr m_pSEMDataGnr;
  48. ////MeasureAppFormName
  49. //CString m_strMAppFormName;
  50. //HWND m_hWnd;
  51. //构造函数
  52. public Measure()
  53. {
  54. }
  55. //初始化测量业务, 读测量文件,判断是否有可测试的切孔
  56. public bool InitMeas(MeasureFile a_measureFile)
  57. {
  58. m_measureFile = a_measureFile;
  59. List<CutHole> listHoles = m_measureFile.ListCutHole;
  60. foreach (CutHole h in listHoles )
  61. {
  62. if (h.SWITCH == true)
  63. {
  64. m_cutHoles.Add(h);
  65. }
  66. }
  67. if(m_cutHoles.Count == 0)
  68. return false;
  69. return true;
  70. }
  71. //测量流程
  72. public void DoMeasure()
  73. {
  74. //创建线程的测量状态的更新
  75. this.TStatus.ComputeTime(THREAD_TIME_TYPE.START);
  76. //将这个开始时间传递给主界面
  77. //检查硬件连接是否正常
  78. if (!ConnectHardware())
  79. {
  80. return;
  81. }
  82. //设置工作文件夹
  83. if (!SetWorkingFolderStr())
  84. {
  85. return;
  86. }
  87. //第一个孔的测试
  88. FirstHole();
  89. //非第一个孔的测试
  90. OtherHole();
  91. }
  92. //检查硬件连接是否正常
  93. public bool ConnectHardware()
  94. {
  95. //返回硬件的连接状态
  96. return iSEM.ConnectStatus();
  97. }
  98. //设置工作文件夹
  99. public bool SetWorkingFolderStr()
  100. {
  101. //获取工作文件路径
  102. string pathName = m_measureFile.FilePath;
  103. //判断工作文件路径是否为空或无效
  104. if (string.IsNullOrEmpty(pathName))
  105. {
  106. return false;
  107. }
  108. //文件未保存
  109. else if (pathName.CompareTo(MeasureFile.UNTITLED_FILE_NAME) == 0)
  110. {
  111. return false;
  112. }
  113. //获取工作文件所在文件夹
  114. string folder = System.IO.Path.GetDirectoryName(pathName);
  115. if (string.IsNullOrEmpty(folder))
  116. {
  117. return false;
  118. }
  119. WorkingFolder += @"\\";
  120. return false;
  121. }
  122. //第一个孔的测试过程
  123. public void FirstHole()
  124. {
  125. //12.根据样品类型参数确定是否需要PT沉积,控制PT针插入
  126. //13.自动定位切割
  127. {
  128. //1.控制SEM放大600X
  129. //2.控制SEM自动对焦、亮度、对比度
  130. //3.设置SEM进行角度补偿54度
  131. //4.控制SEM拍照
  132. //5.保存照片
  133. {
  134. //1. 创建目录
  135. //2. 设置图片名称
  136. //3. 保存图片1
  137. }
  138. //6.设置FIB拍照参数——扫描时间、束流等
  139. //7.控制FIB自动亮度、对比度
  140. //8.控制FIB拍照
  141. //9.保存照片
  142. {
  143. //1. 设置图片名称
  144. //2. 保存图片2
  145. }
  146. //10.将照片传给客户,返回梯形位置坐标,及样品类型参数(是否需要PT沉积,PT坐标位置,PT宽度、PT高度、梯形上、下边及深度、扫描时间、束流、样品放大倍数1、样品放大倍数2等切割参数)
  147. //11.自动工具样品类型参数确定是否需要PT沉积
  148. {
  149. //1. 根据客户PT沉积坐标控制FIB调整到中心位置
  150. //2. 验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否一定正确
  151. //3. 根据坐标进行PT沉积
  152. }
  153. //12.根据梯形坐标控制FIB调整到中心位置
  154. //13.验证移动准确性:获取当前FIB中心位置坐标,与客户返回坐标对比,验证是否移动正确
  155. //14.保存样品1第1号孔中心位置6轴坐标1 XYZMRT到数据库,保存客户返回值信息到数据库
  156. }
  157. //14.自动控制FIB切割
  158. {
  159. //1.根据参数设置FIB草率时间(使图清晰),设置梯形上下边及深度、设置束流
  160. //2.控制FIB进行切割
  161. //3.控制FIB拍照600X
  162. //4.保存图片
  163. {
  164. //1.设置图片名称
  165. //2.保存图片3
  166. }
  167. //5.验证切割准确性:与切割前对比,如果对比误差大,则停止自动执行,进行报警
  168. //6.设置FIB解冻:先读取状态,如果冻结状态则进行解冻
  169. }
  170. //15.根据样品类型决定是否撤出PT针
  171. //16.自动调整SEM找到切割位置
  172. {
  173. //1.控制SEM放大到300倍
  174. //2.控制SEM自动对焦、亮度、对比度-接口
  175. //3.控制SEM拍照
  176. //4.将照片传给客户,获取偏移坐标,以及偏移角度
  177. //5.根据坐标控制SEM移动到切孔位置,居中
  178. //6.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
  179. }
  180. //17.自动控制SEM拍截面照
  181. {
  182. //1.控制SEM放大到指定参数大小范围,6000x
  183. //2.控制SEM自动对焦、消像散、亮度、对比度
  184. //3.设置SEM角度补偿cos36度
  185. //4.控制SEM拍照
  186. //5.保存照片4
  187. //6.将照片传给客户,获取偏移坐标
  188. //7.根据坐标控制SEM移动到分析位置
  189. //8.验证移动准确性:获取当前SEM中心位置坐标,与客户返回坐标对比,验证是否移动正确
  190. //9.控制SEM平行校正,并记录校正前初始值
  191. //10.控制SEM放大到指定参数大小范围
  192. //11.控制SEM自动对焦、消像散、亮度、对比度
  193. //12.控制SEM对分析位置拍照
  194. //13.保存照片
  195. //14.控制SEM取消电子束校正,回到初始值
  196. }
  197. //18.自动层高分析
  198. {
  199. //1.获取SEM Pixel Size给客户传入参数
  200. //2.将照片传给客户,客户进行层高分析(返回分析后的图像、相对坐标、分辨率、各层编号以及各层对应的层高数据),如果客户自行出分析报告则无需返回数据
  201. }
  202. //19.自动能谱分析
  203. {
  204. //1. 确定能谱位置
  205. //2. 控制牛津打能谱
  206. //3. 能谱分析——面扫+线扫描
  207. }
  208. }
  209. //非第一个孔的测试过程
  210. public void OtherHole()
  211. {
  212. }
  213. }
  214. }