SmartSEM.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Runtime.InteropServices;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. using APILib;
  8. using System.Threading;
  9. namespace SmartSEMControl
  10. {
  11. public class SmartSEM
  12. {
  13. #region 参数
  14. //放大缩小
  15. private String AP_MAG = "AP_MAG";
  16. //焦距
  17. private String AP_WD = "AP_WD";
  18. //亮度
  19. private String AP_BRIGHTNESS = "AP_BRIGHTNESS";
  20. //对比度
  21. private String AP_CONTRAST = "AP_CONTRAST";
  22. //消像散X轴
  23. private String AP_STIG_X = "AP_STIG_X";
  24. //消像散Y轴
  25. private String AP_STIG_Y = "AP_STIG_Y";
  26. //角度补偿
  27. private String AP_TILT_ANGLE = "AP_TILT_ANGLE";
  28. //X轴移动到
  29. private String AP_STAGE_GOTO_X = "AP_STAGE_GOTO_X";
  30. //Y轴移动到
  31. private String AP_STAGE_GOTO_Y = "AP_STAGE_GOTO_Y";
  32. //Scan Rotate角度
  33. private String AP_SCANROTATION = "AP_SCANROTATION";
  34. //像素大小
  35. private String AP_PIXEL_SIZE = "AP_PIXEL_SIZE";
  36. //X轴坐标
  37. private String AP_STAGE_AT_X = "AP_STAGE_AT_X";
  38. //Y轴坐标
  39. private String AP_STAGE_AT_Y = "AP_STAGE_AT_Y";
  40. //Z轴坐标
  41. private String AP_STAGE_AT_Z = "AP_STAGE_AT_Z";
  42. //T轴坐标
  43. private String AP_STAGE_AT_T = "AP_STAGE_AT_T";
  44. //R轴坐标
  45. private String AP_STAGE_AT_R = "AP_STAGE_AT_R";
  46. //M轴坐标
  47. private String AP_STAGE_AT_M = "AP_STAGE_AT_M";
  48. #endregion
  49. #region 命令
  50. //开启电压
  51. private String CMD_BEAM_ON = "CMD_BEAM_ON";
  52. //关闭电压
  53. private String CMD_EHT_OFF = "CMD_EHT_OFF";
  54. #endregion
  55. #region APILib
  56. private Api CZEMApi = new Api();
  57. private Boolean m_bInitialised = false;
  58. private long lrt = 0;
  59. #endregion
  60. #region 设备初始化
  61. /// <summary>
  62. /// 设备初始化
  63. /// </summary>
  64. /// <returns>return:true or false</returns>
  65. public Boolean Init()
  66. {
  67. lrt = CZEMApi.Initialise("");
  68. if(lrt!=0)
  69. {
  70. m_bInitialised = false;
  71. return false;
  72. }
  73. else
  74. {
  75. m_bInitialised = true;
  76. return true;
  77. }
  78. }
  79. #endregion
  80. #region 关闭设备
  81. /// <summary>
  82. /// 关闭设备
  83. /// </summary>
  84. /// <returns>true or false</returns>
  85. public Boolean UnInit()
  86. {
  87. if (m_bInitialised)
  88. {
  89. lrt = CZEMApi.ClosingControl();
  90. if (lrt != 0)
  91. {
  92. return false;
  93. }
  94. else
  95. {
  96. m_bInitialised = false;
  97. return true;
  98. }
  99. }
  100. else
  101. {
  102. return false;
  103. }
  104. }
  105. #endregion
  106. #region 读参数函数
  107. private Boolean ReadParams(String str_param,ref float value)
  108. {
  109. if (m_bInitialised)
  110. {
  111. object varfloat = new VariantWrapper((float)0.0f);
  112. lrt = CZEMApi.Get(str_param, ref varfloat);
  113. if (lrt != 0)
  114. {
  115. return false;
  116. }
  117. else
  118. {
  119. value = Convert.ToSingle(varfloat);
  120. return true;
  121. }
  122. }
  123. else
  124. {
  125. return false;
  126. }
  127. }
  128. #endregion
  129. #region 写参数函数
  130. private Boolean WriteParams(String str_param, float value)
  131. {
  132. if (m_bInitialised)
  133. {
  134. //先取范围
  135. object varMin = new VariantWrapper((float)0.0f);
  136. object varMax = new VariantWrapper((float)0.0f);
  137. lrt = CZEMApi.GetLimits(str_param, ref varMin, ref varMax);
  138. if (lrt != 0)
  139. {
  140. return false;
  141. }
  142. if (value <= Convert.ToSingle(varMax) && value >= Convert.ToSingle(varMin))
  143. {
  144. object varFloat = new VariantWrapper(value);
  145. lrt = CZEMApi.Set(str_param, ref varFloat);// set value
  146. if (lrt != 0)
  147. {
  148. return false;
  149. }
  150. return true;
  151. //这里是写入后读取判断值是否写入,也可以在事件1中捕获返回值
  152. //object varfloat = new VariantWrapper((float)0.0f);
  153. ////object varStr = new VariantWrapper("");
  154. //lrt = CZEMApi.Get(strPara, ref varfloat);
  155. //if (lrt != 0)
  156. //{
  157. // ReportError(lrt, "Set Value", strPara);
  158. // return;
  159. //}
  160. //lblgetValue.Text = Convert.ToDecimal(varfloat).ToString();
  161. }
  162. else
  163. {
  164. return false;
  165. }
  166. }
  167. else
  168. {
  169. return false;
  170. }
  171. }
  172. #endregion
  173. #region 执行命令
  174. private Boolean ExecuteCmd(String cmd)
  175. {
  176. if (m_bInitialised)
  177. {
  178. lrt = CZEMApi.Execute(cmd);// execute command
  179. if (lrt != 0)
  180. {
  181. return false;
  182. }
  183. else
  184. {
  185. return true;
  186. }
  187. }
  188. else
  189. {
  190. return false;
  191. }
  192. }
  193. #endregion
  194. #region 放大缩小
  195. /// <summary>
  196. /// 读取缩放倍数
  197. /// </summary>
  198. /// <returns>true:float or false:NaN</returns>
  199. public float GetMagnification()
  200. {
  201. float ret = 0;
  202. if(ReadParams(AP_MAG, ref ret))
  203. {
  204. return ret;
  205. }
  206. else
  207. {
  208. return float.NaN;
  209. }
  210. }
  211. /// <summary>
  212. /// 设置缩放倍数
  213. /// </summary>
  214. /// <param name="set">倍数</param>
  215. /// <returns>true or false</returns>
  216. public Boolean SetMagnification(float set)
  217. {
  218. return WriteParams(AP_MAG, set);
  219. }
  220. #endregion
  221. #region 焦距
  222. /// <summary>
  223. /// 读取工作距离
  224. /// </summary>
  225. /// <returns>true:float or false:NaN</returns>
  226. public float GetWorkingDistance()
  227. {
  228. float ret = 0;
  229. if (ReadParams(AP_WD, ref ret))
  230. {
  231. return ret;
  232. }
  233. else
  234. {
  235. return float.NaN;
  236. }
  237. }
  238. /// <summary>
  239. /// 设置焦距
  240. /// </summary>
  241. /// <param name="set">焦距</param>
  242. /// <returns>true or false</returns>
  243. public Boolean SetWorkingDistance(float set)
  244. {
  245. return WriteParams(AP_WD, set);
  246. }
  247. #endregion
  248. #region 亮度
  249. /// <summary>
  250. /// 读取亮度
  251. /// </summary>
  252. /// <returns>true:float or false:NaN</returns>
  253. public float GetBrightness()
  254. {
  255. float ret = 0;
  256. if (ReadParams(AP_BRIGHTNESS, ref ret))
  257. {
  258. return ret;
  259. }
  260. else
  261. {
  262. return float.NaN;
  263. }
  264. }
  265. /// <summary>
  266. /// 设置亮度
  267. /// </summary>
  268. /// <param name="set">亮度</param>
  269. /// <returns>true or false</returns>
  270. public Boolean SetBrightness(float set)
  271. {
  272. return WriteParams(AP_BRIGHTNESS, set);
  273. }
  274. #endregion
  275. #region 对比度
  276. /// <summary>
  277. /// 读取对比度
  278. /// </summary>
  279. /// <returns>true:float or false:NaN</returns>
  280. public float GetContrast()
  281. {
  282. float ret = 0;
  283. if (ReadParams(AP_CONTRAST, ref ret))
  284. {
  285. return ret;
  286. }
  287. else
  288. {
  289. return float.NaN;
  290. }
  291. }
  292. /// <summary>
  293. /// 设置对比度
  294. /// </summary>
  295. /// <param name="set">对比度</param>
  296. /// <returns>true or false</returns>
  297. public Boolean SetContrast(float set)
  298. {
  299. return WriteParams(AP_CONTRAST, set);
  300. }
  301. #endregion
  302. #region 消像散
  303. /// <summary>
  304. /// 读取消像散X
  305. /// </summary>
  306. /// <returns>true:float or false:NaN</returns>
  307. public float GetAstigmatismX()
  308. {
  309. float ret = 0;
  310. if (ReadParams(AP_STIG_X, ref ret))
  311. {
  312. return ret;
  313. }
  314. else
  315. {
  316. return float.NaN;
  317. }
  318. }
  319. /// <summary>
  320. /// 读取消像散Y
  321. /// </summary>
  322. /// <returns>true:float or false:NaN</returns>
  323. public float GetAstigmatismY()
  324. {
  325. float ret = 0;
  326. if (ReadParams(AP_STIG_Y, ref ret))
  327. {
  328. return ret;
  329. }
  330. else
  331. {
  332. return float.NaN;
  333. }
  334. }
  335. /// <summary>
  336. /// 设置消像散X
  337. /// </summary>
  338. /// <param name="set">对比度</param>
  339. /// <returns>true or false</returns>
  340. public Boolean SetAstigmatismX(float set)
  341. {
  342. return WriteParams(AP_STIG_X, set);
  343. }
  344. /// <summary>
  345. /// 设置消像散Y
  346. /// </summary>
  347. /// <param name="set">对比度</param>
  348. /// <returns>true or false</returns>
  349. public Boolean SetAstigmatismY(float set)
  350. {
  351. return WriteParams(AP_STIG_Y, set);
  352. }
  353. #endregion
  354. #region 角度补偿
  355. /// <summary>
  356. /// 读取角度补偿
  357. /// </summary>
  358. /// <returns>true:float or false:NaN</returns>
  359. public float GetTiltAngle()
  360. {
  361. float ret = 0;
  362. if (ReadParams(AP_TILT_ANGLE, ref ret))
  363. {
  364. return ret;
  365. }
  366. else
  367. {
  368. return float.NaN;
  369. }
  370. }
  371. /// <summary>
  372. /// 设置角度补偿
  373. /// </summary>
  374. /// <param name="set">角度补偿</param>
  375. /// <returns>true or false</returns>
  376. public Boolean SetTiltAngle(float set)
  377. {
  378. return WriteParams(AP_TILT_ANGLE, set);
  379. }
  380. #endregion
  381. #region 抓取图像
  382. /// <summary>
  383. /// 抓取图像
  384. /// </summary>
  385. /// <returns>true:float or false:NaN</returns>
  386. public Boolean GrabImage(String filename,short type)
  387. {
  388. if (m_bInitialised)
  389. {
  390. lrt = CZEMApi.Grab(0, 0, 1024, 768, type, filename);
  391. if (lrt != 0)
  392. {
  393. return false;
  394. }
  395. else
  396. {
  397. return true;
  398. }
  399. }
  400. else
  401. {
  402. return false;
  403. }
  404. }
  405. #endregion
  406. #region Scan Rotate角度接口
  407. /// <summary>
  408. /// 获取Scan Rotate角度接口
  409. /// </summary>
  410. /// <returns>true:float or false:NaN</returns>
  411. public float GetScanRotation()
  412. {
  413. float ret = 0;
  414. if (ReadParams(AP_SCANROTATION, ref ret))
  415. {
  416. return ret;
  417. }
  418. else
  419. {
  420. return float.NaN;
  421. }
  422. }
  423. /// <summary>
  424. /// 设置Scan Rotate角度接口
  425. /// </summary>
  426. /// <param name="set">角度补偿</param>
  427. /// <returns>true or false</returns>
  428. public Boolean SetScanRotation(float set)
  429. {
  430. return WriteParams(AP_SCANROTATION, set);
  431. }
  432. #endregion
  433. #region 像素读取PixelSize
  434. /// <summary>
  435. /// 获取Pixel Size 接口,只读
  436. /// </summary>
  437. /// <returns>true:float or false:NaN</returns>
  438. public float GetPixelSize()
  439. {
  440. float ret = 0;
  441. if (ReadParams(AP_PIXEL_SIZE, ref ret))
  442. {
  443. return ret;
  444. }
  445. else
  446. {
  447. return float.NaN;
  448. }
  449. }
  450. #endregion
  451. #region 开启电压
  452. public Boolean CmdOpenVoltage()
  453. {
  454. return ExecuteCmd(CMD_BEAM_ON);
  455. }
  456. #endregion
  457. #region 关闭电压
  458. public Boolean CmdCloseVoltage()
  459. {
  460. return ExecuteCmd(CMD_EHT_OFF);
  461. }
  462. #endregion
  463. }
  464. }