SmartSEM.cs 19 KB

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