SmartSEM.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726
  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. //Z轴移动到
  33. private String AP_STAGE_GOTO_Z = "AP_STAGE_GOTO_Z";
  34. //T轴移动到
  35. private String AP_STAGE_GOTO_T = "AP_STAGE_GOTO_T";
  36. //R轴移动到
  37. private String AP_STAGE_GOTO_R = "AP_STAGE_GOTO_R";
  38. //M轴移动到
  39. private String AP_STAGE_GOTO_M = "AP_STAGE_GOTO_M";
  40. //Scan Rotate角度
  41. private String AP_SCANROTATION = "AP_SCANROTATION";
  42. //像素大小
  43. private String AP_PIXEL_SIZE = "AP_PIXEL_SIZE";
  44. //X轴坐标
  45. private String AP_STAGE_AT_X = "AP_STAGE_AT_X";
  46. //Y轴坐标
  47. private String AP_STAGE_AT_Y = "AP_STAGE_AT_Y";
  48. //Z轴坐标
  49. private String AP_STAGE_AT_Z = "AP_STAGE_AT_Z";
  50. //T轴坐标
  51. private String AP_STAGE_AT_T = "AP_STAGE_AT_T";
  52. //R轴坐标
  53. private String AP_STAGE_AT_R = "AP_STAGE_AT_R";
  54. //M轴坐标
  55. private String AP_STAGE_AT_M = "AP_STAGE_AT_M";
  56. #endregion
  57. #region 命令
  58. //开启电压
  59. private String CMD_BEAM_ON = "CMD_BEAM_ON";
  60. //关闭电压
  61. private String CMD_EHT_OFF = "CMD_EHT_OFF";
  62. #endregion
  63. #region APILib
  64. private Api CZEMApi = new Api();
  65. private Boolean m_bInitialised = false;
  66. private long lrt = 0;
  67. #endregion
  68. #region 设备初始化
  69. /// <summary>
  70. /// 设备初始化
  71. /// </summary>
  72. /// <returns>return:true or false</returns>
  73. public Boolean Init()
  74. {
  75. #if ROMOTE
  76. lrt = CZEMApi.InitialiseRemoting();
  77. #else
  78. lrt = CZEMApi.Initialise("");
  79. #endif
  80. if (lrt != 0)
  81. {
  82. m_bInitialised = false;
  83. return false;
  84. }
  85. else
  86. {
  87. m_bInitialised = true;
  88. return true;
  89. }
  90. }
  91. #endregion
  92. #region 设备远程初始化
  93. /// <summary>
  94. /// 设备远程初始化
  95. /// </summary>
  96. /// <returns>return:true or false</returns>
  97. public Boolean InitRemoting()
  98. {
  99. lrt = CZEMApi.InitialiseRemoting();
  100. if (lrt != 0)
  101. {
  102. m_bInitialised = false;
  103. return false;
  104. }
  105. else
  106. {
  107. m_bInitialised = true;
  108. return true;
  109. }
  110. }
  111. #endregion
  112. #region 关闭设备
  113. /// <summary>
  114. /// 关闭设备
  115. /// </summary>
  116. /// <returns>true or false</returns>
  117. public Boolean UnInit()
  118. {
  119. if (m_bInitialised)
  120. {
  121. lrt = CZEMApi.ClosingControl();
  122. if (lrt != 0)
  123. {
  124. return false;
  125. }
  126. else
  127. {
  128. m_bInitialised = false;
  129. return true;
  130. }
  131. }
  132. else
  133. {
  134. return false;
  135. }
  136. }
  137. #endregion
  138. #region 读参数函数
  139. private Boolean ReadParams(String str_param, ref float value)
  140. {
  141. if (m_bInitialised)
  142. {
  143. object varfloat = new VariantWrapper((float)0.0f);
  144. lrt = CZEMApi.Get(str_param, ref varfloat);
  145. if (lrt != 0)
  146. {
  147. return false;
  148. }
  149. else
  150. {
  151. value = Convert.ToSingle(varfloat);
  152. return true;
  153. }
  154. }
  155. else
  156. {
  157. return false;
  158. }
  159. }
  160. #endregion
  161. #region 写参数函数
  162. private Boolean WriteParams(String str_param, float value)
  163. {
  164. if (m_bInitialised)
  165. {
  166. //先取范围
  167. object varMin = new VariantWrapper((float)0.0f);
  168. object varMax = new VariantWrapper((float)0.0f);
  169. lrt = CZEMApi.GetLimits(str_param, ref varMin, ref varMax);
  170. if (lrt != 0)
  171. {
  172. return false;
  173. }
  174. if (value <= Convert.ToSingle(varMax) && value >= Convert.ToSingle(varMin))
  175. {
  176. object varFloat = new VariantWrapper(value);
  177. lrt = CZEMApi.Set(str_param, ref varFloat);// set value
  178. if (lrt != 0)
  179. {
  180. return false;
  181. }
  182. return true;
  183. //这里是写入后读取判断值是否写入,也可以在事件1中捕获返回值
  184. //object varfloat = new VariantWrapper((float)0.0f);
  185. ////object varStr = new VariantWrapper("");
  186. //lrt = CZEMApi.Get(strPara, ref varfloat);
  187. //if (lrt != 0)
  188. //{
  189. // ReportError(lrt, "Set Value", strPara);
  190. // return;
  191. //}
  192. //lblgetValue.Text = Convert.ToDecimal(varfloat).ToString();
  193. }
  194. else
  195. {
  196. return false;
  197. }
  198. }
  199. else
  200. {
  201. return false;
  202. }
  203. }
  204. #endregion
  205. #region 执行命令
  206. private Boolean ExecuteCmd(String cmd)
  207. {
  208. if (m_bInitialised)
  209. {
  210. lrt = CZEMApi.Execute(cmd);// execute command
  211. if (lrt != 0)
  212. {
  213. return false;
  214. }
  215. else
  216. {
  217. return true;
  218. }
  219. }
  220. else
  221. {
  222. return false;
  223. }
  224. }
  225. #endregion
  226. #region 放大缩小
  227. /// <summary>
  228. /// 读取缩放倍数
  229. /// </summary>
  230. /// <returns>true:float or false:NaN</returns>
  231. public float GetMagnification()
  232. {
  233. float ret = 0;
  234. if (ReadParams(AP_MAG, ref ret))
  235. {
  236. return ret;
  237. }
  238. else
  239. {
  240. return float.NaN;
  241. }
  242. }
  243. /// <summary>
  244. /// 设置缩放倍数
  245. /// </summary>
  246. /// <param name="set">倍数</param>
  247. /// <returns>true or false</returns>
  248. public Boolean SetMagnification(float set)
  249. {
  250. return WriteParams(AP_MAG, set);
  251. }
  252. #endregion
  253. #region 焦距
  254. /// <summary>
  255. /// 读取工作距离
  256. /// </summary>
  257. /// <returns>true:float or false:NaN</returns>
  258. public float GetWorkingDistance()
  259. {
  260. float ret = 0;
  261. if (ReadParams(AP_WD, ref ret))
  262. {
  263. return ret;
  264. }
  265. else
  266. {
  267. return float.NaN;
  268. }
  269. }
  270. /// <summary>
  271. /// 设置焦距
  272. /// </summary>
  273. /// <param name="set">焦距</param>
  274. /// <returns>true or false</returns>
  275. public Boolean SetWorkingDistance(float set)
  276. {
  277. return WriteParams(AP_WD, set);
  278. }
  279. #endregion
  280. #region 亮度
  281. /// <summary>
  282. /// 读取亮度
  283. /// </summary>
  284. /// <returns>true:float or false:NaN</returns>
  285. public float GetBrightness()
  286. {
  287. float ret = 0;
  288. if (ReadParams(AP_BRIGHTNESS, ref ret))
  289. {
  290. return ret;
  291. }
  292. else
  293. {
  294. return float.NaN;
  295. }
  296. }
  297. /// <summary>
  298. /// 设置亮度
  299. /// </summary>
  300. /// <param name="set">亮度</param>
  301. /// <returns>true or false</returns>
  302. public Boolean SetBrightness(float set)
  303. {
  304. return WriteParams(AP_BRIGHTNESS, set);
  305. }
  306. #endregion
  307. #region 对比度
  308. /// <summary>
  309. /// 读取对比度
  310. /// </summary>
  311. /// <returns>true:float or false:NaN</returns>
  312. public float GetContrast()
  313. {
  314. float ret = 0;
  315. if (ReadParams(AP_CONTRAST, ref ret))
  316. {
  317. return ret;
  318. }
  319. else
  320. {
  321. return float.NaN;
  322. }
  323. }
  324. /// <summary>
  325. /// 设置对比度
  326. /// </summary>
  327. /// <param name="set">对比度</param>
  328. /// <returns>true or false</returns>
  329. public Boolean SetContrast(float set)
  330. {
  331. return WriteParams(AP_CONTRAST, set);
  332. }
  333. #endregion
  334. #region 消像散
  335. /// <summary>
  336. /// 读取消像散X
  337. /// </summary>
  338. /// <returns>true:float or false:NaN</returns>
  339. public float GetAstigmatismX()
  340. {
  341. float ret = 0;
  342. if (ReadParams(AP_STIG_X, ref ret))
  343. {
  344. return ret;
  345. }
  346. else
  347. {
  348. return float.NaN;
  349. }
  350. }
  351. /// <summary>
  352. /// 读取消像散Y
  353. /// </summary>
  354. /// <returns>true:float or false:NaN</returns>
  355. public float GetAstigmatismY()
  356. {
  357. float ret = 0;
  358. if (ReadParams(AP_STIG_Y, ref ret))
  359. {
  360. return ret;
  361. }
  362. else
  363. {
  364. return float.NaN;
  365. }
  366. }
  367. /// <summary>
  368. /// 设置消像散X
  369. /// </summary>
  370. /// <param name="set">对比度</param>
  371. /// <returns>true or false</returns>
  372. public Boolean SetAstigmatismX(float set)
  373. {
  374. return WriteParams(AP_STIG_X, set);
  375. }
  376. /// <summary>
  377. /// 设置消像散Y
  378. /// </summary>
  379. /// <param name="set">对比度</param>
  380. /// <returns>true or false</returns>
  381. public Boolean SetAstigmatismY(float set)
  382. {
  383. return WriteParams(AP_STIG_Y, set);
  384. }
  385. #endregion
  386. #region 角度补偿
  387. /// <summary>
  388. /// 读取角度补偿
  389. /// </summary>
  390. /// <returns>true:float or false:NaN</returns>
  391. public float GetTiltAngle()
  392. {
  393. float ret = 0;
  394. if (ReadParams(AP_TILT_ANGLE, ref ret))
  395. {
  396. return ret;
  397. }
  398. else
  399. {
  400. return float.NaN;
  401. }
  402. }
  403. /// <summary>
  404. /// 设置角度补偿
  405. /// </summary>
  406. /// <param name="set">角度补偿</param>
  407. /// <returns>true or false</returns>
  408. public Boolean SetTiltAngle(float set)
  409. {
  410. return WriteParams(AP_TILT_ANGLE, set);
  411. }
  412. #endregion
  413. #region 抓取图像
  414. /// <summary>
  415. /// 抓取图像
  416. /// </summary>
  417. /// <returns>true:float or false:NaN</returns>
  418. public Boolean GrabImage(String filename, short type)
  419. {
  420. if (m_bInitialised)
  421. {
  422. lrt = CZEMApi.Grab(0, 0, 1024, 768, type, filename);
  423. if (lrt != 0)
  424. {
  425. return false;
  426. }
  427. else
  428. {
  429. return true;
  430. }
  431. }
  432. else
  433. {
  434. return false;
  435. }
  436. }
  437. #endregion
  438. #region SEM移动接口
  439. /// <summary>
  440. /// 返回样品台坐标数组
  441. /// </summary>
  442. /// <returns>Lenght=6</returns>
  443. public float[] GetStagePosition()
  444. {
  445. object retx = new VariantWrapper((float)0.0f);
  446. object rety = new VariantWrapper((float)0.0f);
  447. object retz = new VariantWrapper((float)0.0f);
  448. object rett = new VariantWrapper((float)0.0f);
  449. object retr = new VariantWrapper((float)0.0f);
  450. object retm = new VariantWrapper((float)0.0f);
  451. float[] ret = new float[6];
  452. if (m_bInitialised)
  453. {
  454. CZEMApi.GetStagePosition(ref retx, ref rety, ref retz, ref rett, ref retr, ref retm);
  455. ret[0] = Convert.ToSingle(retx);
  456. ret[1] = Convert.ToSingle(rety);
  457. ret[2] = Convert.ToSingle(retz);
  458. ret[3] = Convert.ToSingle(rett);
  459. ret[4] = Convert.ToSingle(retr);
  460. ret[5] = Convert.ToSingle(retm);
  461. }
  462. else
  463. {
  464. ret[0] = float.NaN;
  465. ret[1] = float.NaN;
  466. ret[2] = float.NaN;
  467. ret[3] = float.NaN;
  468. ret[4] = float.NaN;
  469. ret[5] = float.NaN;
  470. }
  471. return ret;
  472. }
  473. /// <summary>
  474. /// SEM位置 X轴
  475. /// </summary>
  476. /// <returns>true:float or false:NaN</returns>
  477. public float GetStageAtX()
  478. {
  479. float ret = 0;
  480. if (ReadParams(AP_STAGE_AT_X, ref ret))
  481. {
  482. return ret;
  483. }
  484. else
  485. {
  486. return float.NaN;
  487. }
  488. }
  489. /// <summary>
  490. /// SEM位置 Y轴
  491. /// </summary>
  492. /// <returns>true:float or false:NaN</returns>
  493. public float GetStageAtY()
  494. {
  495. float ret = 0;
  496. if (ReadParams(AP_STAGE_AT_Y, ref ret))
  497. {
  498. return ret;
  499. }
  500. else
  501. {
  502. return float.NaN;
  503. }
  504. }
  505. /// <summary>
  506. /// SEM位置 Z轴
  507. /// </summary>
  508. /// <returns>true:float or false:NaN</returns>
  509. public float GetStageAtZ()
  510. {
  511. float ret = 0;
  512. if (ReadParams(AP_STAGE_AT_Z, ref ret))
  513. {
  514. return ret;
  515. }
  516. else
  517. {
  518. return float.NaN;
  519. }
  520. }
  521. /// <summary>
  522. /// SEM位置 T轴
  523. /// </summary>
  524. /// <returns>true:float or false:NaN</returns>
  525. public float GetStageAtT()
  526. {
  527. float ret = 0;
  528. if (ReadParams(AP_STAGE_AT_T, ref ret))
  529. {
  530. return ret;
  531. }
  532. else
  533. {
  534. return float.NaN;
  535. }
  536. }
  537. /// <summary>
  538. /// SEM位置 R轴
  539. /// </summary>
  540. /// <returns>true:float or false:NaN</returns>
  541. public float GetStageAtR()
  542. {
  543. float ret = 0;
  544. if (ReadParams(AP_STAGE_AT_R, ref ret))
  545. {
  546. return ret;
  547. }
  548. else
  549. {
  550. return float.NaN;
  551. }
  552. }
  553. /// <summary>
  554. /// SEM位置 M轴
  555. /// </summary>
  556. /// <returns>true:float or false:NaN</returns>
  557. public float GetStageAtM()
  558. {
  559. float ret = 0;
  560. if (ReadParams(AP_STAGE_AT_M, ref ret))
  561. {
  562. return ret;
  563. }
  564. else
  565. {
  566. return float.NaN;
  567. }
  568. }
  569. /// <summary>
  570. /// SEM位置 X轴
  571. /// </summary>
  572. /// <param name="set">X轴移动坐标</param>
  573. /// <returns></returns>
  574. public Boolean SetStageGotoX(float set)
  575. {
  576. return WriteParams(AP_STAGE_GOTO_X, set);
  577. }
  578. /// <summary>
  579. /// SEM位置 Y轴
  580. /// </summary>
  581. /// <param name="set">Y轴移动坐标</param>
  582. /// <returns></returns>
  583. public Boolean SetStageGotoY(float set)
  584. {
  585. return WriteParams(AP_STAGE_GOTO_Y, set);
  586. }
  587. /// <summary>
  588. /// SEM位置 Z轴
  589. /// </summary>
  590. /// <param name="set">Y轴移动坐标</param>
  591. /// <returns></returns>
  592. public Boolean SetStageGotoZ(float set)
  593. {
  594. return WriteParams(AP_STAGE_GOTO_Z, set);
  595. }
  596. /// <summary>
  597. /// SEM位置 T轴
  598. /// </summary>
  599. /// <param name="set">Y轴移动坐标</param>
  600. /// <returns></returns>
  601. public Boolean SetStageGotoT(float set)
  602. {
  603. return WriteParams(AP_STAGE_GOTO_T, set);
  604. }
  605. /// <summary>
  606. /// SEM位置 R轴
  607. /// </summary>
  608. /// <param name="set">Y轴移动坐标</param>
  609. /// <returns></returns>
  610. public Boolean SetStageGotoR(float set)
  611. {
  612. return WriteParams(AP_STAGE_GOTO_R, set);
  613. }
  614. /// <summary>
  615. /// SEM位置 M轴
  616. /// </summary>
  617. /// <param name="set">M轴移动坐标</param>
  618. /// <returns></returns>
  619. public Boolean SetStageGotoM(float set)
  620. {
  621. return WriteParams(AP_STAGE_GOTO_M, set);
  622. }
  623. #endregion
  624. #region Scan Rotate角度接口
  625. /// <summary>
  626. /// 获取Scan Rotate角度接口
  627. /// </summary>
  628. /// <returns>true:float or false:NaN</returns>
  629. public float GetScanRotation()
  630. {
  631. float ret = 0;
  632. if (ReadParams(AP_SCANROTATION, ref ret))
  633. {
  634. return ret;
  635. }
  636. else
  637. {
  638. return float.NaN;
  639. }
  640. }
  641. /// <summary>
  642. /// 设置Scan Rotate角度接口
  643. /// </summary>
  644. /// <param name="set">角度补偿</param>
  645. /// <returns>true or false</returns>
  646. public Boolean SetScanRotation(float set)
  647. {
  648. return WriteParams(AP_SCANROTATION, set);
  649. }
  650. #endregion
  651. #region 像素读取PixelSize
  652. /// <summary>
  653. /// 获取Pixel Size 接口,只读
  654. /// </summary>
  655. /// <returns>true:float or false:NaN</returns>
  656. public float GetPixelSize()
  657. {
  658. float ret = 0;
  659. if (ReadParams(AP_PIXEL_SIZE, ref ret))
  660. {
  661. return ret;
  662. }
  663. else
  664. {
  665. return float.NaN;
  666. }
  667. }
  668. #endregion
  669. #region 开启电压
  670. public Boolean CmdOpenVoltage()
  671. {
  672. return ExecuteCmd(CMD_BEAM_ON);
  673. }
  674. #endregion
  675. #region 关闭电压
  676. public Boolean CmdCloseVoltage()
  677. {
  678. return ExecuteCmd(CMD_EHT_OFF);
  679. }
  680. #endregion
  681. }
  682. }