SmartSEM.cs 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995
  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 : SEMControl
  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. //亮度目标
  23. private String AP_AUTO_BRIGHT = "AP_AUTO_BRIGHT";
  24. //对比度目标
  25. private String AP_AUTO_CONTRAST = "AP_AUTO_CONTRAST";
  26. //消像散X轴
  27. private String AP_STIG_X = "AP_STIG_X";
  28. //消像散Y轴
  29. private String AP_STIG_Y = "AP_STIG_Y";
  30. //角度补偿
  31. private String AP_TILT_ANGLE = "AP_TILT_ANGLE";
  32. //SEM移动X
  33. private String AP_BEAMSHIFT_X = "AP_BEAMSHIFT_X";
  34. //SEM移动Y
  35. private String AP_BEAMSHIFT_Y = "AP_BEAMSHIFT_Y";
  36. //X轴移动到
  37. private String AP_STAGE_GOTO_X = "AP_STAGE_GOTO_X";
  38. //Y轴移动到
  39. private String AP_STAGE_GOTO_Y = "AP_STAGE_GOTO_Y";
  40. //Z轴移动到
  41. private String AP_STAGE_GOTO_Z = "AP_STAGE_GOTO_Z";
  42. //T轴移动到
  43. private String AP_STAGE_GOTO_T = "AP_STAGE_GOTO_T";
  44. //R轴移动到
  45. private String AP_STAGE_GOTO_R = "AP_STAGE_GOTO_R";
  46. //M轴移动到
  47. private String AP_STAGE_GOTO_M = "AP_STAGE_GOTO_M";
  48. //Scan Rotate角度
  49. private String AP_SCANROTATION = "AP_SCANROTATION";
  50. //像素大小
  51. private String AP_PIXEL_SIZE = "AP_PIXEL_SIZE";
  52. //X轴坐标
  53. private String AP_STAGE_AT_X = "AP_STAGE_AT_X";
  54. //Y轴坐标
  55. private String AP_STAGE_AT_Y = "AP_STAGE_AT_Y";
  56. //Z轴坐标
  57. private String AP_STAGE_AT_Z = "AP_STAGE_AT_Z";
  58. //T轴坐标
  59. private String AP_STAGE_AT_T = "AP_STAGE_AT_T";
  60. //R轴坐标
  61. private String AP_STAGE_AT_R = "AP_STAGE_AT_R";
  62. //M轴坐标
  63. private String AP_STAGE_AT_M = "AP_STAGE_AT_M";
  64. #endregion
  65. #region 数字参数
  66. //Scan Rotate开关
  67. private String DP_SCAN_ROT = "DP_SCAN_ROT";
  68. //取消电子束校正
  69. private String DP_TILT_CORRECTION = "DP_TILT_CORRECTION";
  70. //自动亮度对比度
  71. private String DP_AUTO_VIDEO = "DP_AUTO_VIDEO";
  72. //图像解冻
  73. private String DP_FROZEN = "DP_FROZEN";
  74. //图像类型切换
  75. private String DP_DETECTOR_TYPE = "DP_DETECTOR_TYPE";
  76. #endregion
  77. #region 命令
  78. //开启电压
  79. private String CMD_BEAM_ON = "CMD_BEAM_ON";
  80. //关闭电压
  81. private String CMD_EHT_OFF = "CMD_EHT_OFF";
  82. //自动对焦1
  83. private String CMD_AUTO_FOCUS_COARSE = "CMD_AUTO_FOCUS_COARSE";
  84. //自动对焦2
  85. private String CMD_AUTO_FOCUS_FINE = "CMD_AUTO_FOCUS_FINE";
  86. //自动消像散
  87. private String CMD_AUTO_STIG = "CMD_AUTO_STIG";
  88. #endregion
  89. #region APILib
  90. private Api CZEMApi = new Api();
  91. private Boolean m_bInitialised = false;
  92. private long lrt = 0;
  93. #endregion
  94. #region 构造函数
  95. public SmartSEM()
  96. {
  97. Init();
  98. }
  99. #endregion
  100. #region 设备初始化
  101. /// <summary>
  102. /// 设备初始化
  103. /// </summary>
  104. /// <returns>return:true or false</returns>
  105. public Boolean Init()
  106. {
  107. #if ROMOTE
  108. lrt = CZEMApi.InitialiseRemoting();
  109. #else
  110. lrt = CZEMApi.Initialise("");
  111. #endif
  112. if (lrt != 0)
  113. {
  114. m_bInitialised = false;
  115. return false;
  116. }
  117. else
  118. {
  119. m_bInitialised = true;
  120. return true;
  121. }
  122. }
  123. #endregion
  124. #region 设备远程初始化
  125. /// <summary>
  126. /// 设备远程初始化
  127. /// </summary>
  128. /// <returns>return:true or false</returns>
  129. public Boolean InitRemoting()
  130. {
  131. lrt = CZEMApi.InitialiseRemoting();
  132. if (lrt != 0)
  133. {
  134. m_bInitialised = false;
  135. return false;
  136. }
  137. else
  138. {
  139. m_bInitialised = true;
  140. return true;
  141. }
  142. }
  143. #endregion
  144. #region 关闭设备
  145. /// <summary>
  146. /// 关闭设备
  147. /// </summary>
  148. /// <returns>true or false</returns>
  149. public Boolean Dispose()
  150. {
  151. if (m_bInitialised)
  152. {
  153. lrt = CZEMApi.ClosingControl();
  154. if (lrt != 0)
  155. {
  156. return false;
  157. }
  158. else
  159. {
  160. m_bInitialised = false;
  161. return true;
  162. }
  163. }
  164. else
  165. {
  166. return false;
  167. }
  168. }
  169. #endregion
  170. #region 读参数函数
  171. private Boolean ReadParams(String str_param, ref float value)
  172. {
  173. if (m_bInitialised)
  174. {
  175. object varfloat = new VariantWrapper((float)0.0f);
  176. lrt = CZEMApi.Get(str_param, ref varfloat);
  177. if (lrt != 0)
  178. {
  179. return false;
  180. }
  181. else
  182. {
  183. value = Convert.ToSingle(varfloat);
  184. return true;
  185. }
  186. }
  187. else
  188. {
  189. return false;
  190. }
  191. }
  192. #endregion
  193. #region 写模拟参数函数
  194. private Boolean WriteParams(String str_param, float value)
  195. {
  196. if (m_bInitialised)
  197. {
  198. //先取范围
  199. object varMin = new VariantWrapper((float)0.0f);
  200. object varMax = new VariantWrapper((float)0.0f);
  201. lrt = CZEMApi.GetLimits(str_param, ref varMin, ref varMax);
  202. if (lrt != 0)
  203. {
  204. return false;
  205. }
  206. if (value <= Convert.ToSingle(varMax) && value >= Convert.ToSingle(varMin))
  207. {
  208. object varFloat = new VariantWrapper(value);
  209. lrt = CZEMApi.Set(str_param, ref varFloat);// set value
  210. if (lrt != 0)
  211. {
  212. return false;
  213. }
  214. return true;
  215. //这里是写入后读取判断值是否写入,也可以在事件1中捕获返回值
  216. //object varfloat = new VariantWrapper((float)0.0f);
  217. ////object varStr = new VariantWrapper("");
  218. //lrt = CZEMApi.Get(strPara, ref varfloat);
  219. //if (lrt != 0)
  220. //{
  221. // ReportError(lrt, "Set Value", strPara);
  222. // return;
  223. //}
  224. //lblgetValue.Text = Convert.ToDecimal(varfloat).ToString();
  225. }
  226. else
  227. {
  228. return false;
  229. }
  230. }
  231. else
  232. {
  233. return false;
  234. }
  235. }
  236. #endregion
  237. #region 写数字参数函数
  238. private Boolean WriteDataParams(String str_param, float value)
  239. {
  240. if (m_bInitialised)
  241. {
  242. object varFloat = new VariantWrapper(value);
  243. lrt = CZEMApi.Set(str_param, ref varFloat);// set value
  244. if (lrt != 0)
  245. {
  246. return false;
  247. }
  248. return true;
  249. }
  250. else
  251. {
  252. return false;
  253. }
  254. }
  255. #endregion
  256. #region 执行命令
  257. private Boolean ExecuteCmd(String cmd)
  258. {
  259. if (m_bInitialised)
  260. {
  261. lrt = CZEMApi.Execute(cmd);// execute command
  262. if (lrt != 0)
  263. {
  264. return false;
  265. }
  266. else
  267. {
  268. return true;
  269. }
  270. }
  271. else
  272. {
  273. return false;
  274. }
  275. }
  276. #endregion
  277. #region 放大缩小
  278. /// <summary>
  279. /// 读取缩放倍数
  280. /// </summary>
  281. /// <returns>true:float or false:NaN</returns>
  282. public float GetMagnification()
  283. {
  284. float ret = 0;
  285. if(ReadParams(AP_MAG, ref ret))
  286. {
  287. return ret;
  288. }
  289. else
  290. {
  291. return float.NaN;
  292. }
  293. }
  294. /// <summary>
  295. /// 设置缩放倍数
  296. /// </summary>
  297. /// <param name="set">倍数</param>
  298. /// <returns>true or false</returns>
  299. public Boolean SetMagnification(float set)
  300. {
  301. return WriteParams(AP_MAG, set);
  302. }
  303. #endregion
  304. #region 焦距
  305. /// <summary>
  306. /// 读取工作距离
  307. /// </summary>
  308. /// <returns>true:float or false:NaN</returns>
  309. public float GetWorkingDistance()
  310. {
  311. float ret = 0;
  312. if (ReadParams(AP_WD, ref ret))
  313. {
  314. return ret;
  315. }
  316. else
  317. {
  318. return float.NaN;
  319. }
  320. }
  321. /// <summary>
  322. /// 设置焦距
  323. /// </summary>
  324. /// <param name="set">焦距</param>
  325. /// <returns>true or false</returns>
  326. public Boolean SetWorkingDistance(float set)
  327. {
  328. return WriteParams(AP_WD, set);
  329. }
  330. #endregion
  331. #region 亮度
  332. /// <summary>
  333. /// 读取亮度
  334. /// </summary>
  335. /// <returns>true:float or false:NaN</returns>
  336. public float GetBrightness()
  337. {
  338. float ret = 0;
  339. if (ReadParams(AP_BRIGHTNESS, ref ret))
  340. {
  341. return ret;
  342. }
  343. else
  344. {
  345. return float.NaN;
  346. }
  347. }
  348. /// <summary>
  349. /// 设置亮度
  350. /// </summary>
  351. /// <param name="set">亮度</param>
  352. /// <returns>true or false</returns>
  353. public Boolean SetBrightness(float set)
  354. {
  355. return WriteParams(AP_BRIGHTNESS, set);
  356. }
  357. #endregion
  358. #region 对比度
  359. /// <summary>
  360. /// 读取对比度
  361. /// </summary>
  362. /// <returns>true:float or false:NaN</returns>
  363. public float GetContrast()
  364. {
  365. float ret = 0;
  366. if (ReadParams(AP_CONTRAST, ref ret))
  367. {
  368. return ret;
  369. }
  370. else
  371. {
  372. return float.NaN;
  373. }
  374. }
  375. /// <summary>
  376. /// 设置对比度
  377. /// </summary>
  378. /// <param name="set">对比度</param>
  379. /// <returns>true or false</returns>
  380. public Boolean SetContrast(float set)
  381. {
  382. return WriteParams(AP_CONTRAST, set);
  383. }
  384. #endregion
  385. #region 自动亮度对比度
  386. /// <summary>
  387. /// 读取自动亮度对比度状态
  388. /// </summary>
  389. /// <returns>true:float or false:NaN</returns>
  390. public float GetAutoVideo()
  391. {
  392. float ret = 0;
  393. if (ReadParams(DP_AUTO_VIDEO, ref ret))
  394. {
  395. return ret;
  396. }
  397. else
  398. {
  399. return float.NaN;
  400. }
  401. }
  402. /// <summary>
  403. /// 设置自动亮度对比度状态
  404. /// </summary>
  405. /// <param name="set">0:off;1:B(亮度);2:C(对比度);3:BC</param>
  406. /// <returns>true or false</returns>
  407. public Boolean SetAutoVideo(float set)
  408. {
  409. return WriteDataParams(DP_AUTO_VIDEO, set);
  410. }
  411. #endregion
  412. #region 亮度目标
  413. /// <summary>
  414. /// 读取亮度目标
  415. /// </summary>
  416. /// <returns>true:float or false:NaN</returns>
  417. public float GetAutoBright()
  418. {
  419. float ret = 0;
  420. if (ReadParams(AP_AUTO_BRIGHT, ref ret))
  421. {
  422. return ret;
  423. }
  424. else
  425. {
  426. return float.NaN;
  427. }
  428. }
  429. /// <summary>
  430. /// 设置亮度目标
  431. /// </summary>
  432. /// <param name="set">亮度</param>
  433. /// <returns>true or false</returns>
  434. public Boolean SetAutoBright(float set)
  435. {
  436. return WriteParams(AP_AUTO_BRIGHT, set);
  437. }
  438. #endregion
  439. #region 对比度目标
  440. /// <summary>
  441. /// 读取对比度目标
  442. /// </summary>
  443. /// <returns>true:float or false:NaN</returns>
  444. public float GetAutoContrast()
  445. {
  446. float ret = 0;
  447. if (ReadParams(AP_AUTO_CONTRAST, ref ret))
  448. {
  449. return ret;
  450. }
  451. else
  452. {
  453. return float.NaN;
  454. }
  455. }
  456. /// <summary>
  457. /// 设置对比度目标
  458. /// </summary>
  459. /// <param name="set">对比度目标</param>
  460. /// <returns>true or false</returns>
  461. public Boolean SetAutoContrast(float set)
  462. {
  463. return WriteParams(AP_AUTO_CONTRAST, set);
  464. }
  465. #endregion
  466. #region 消像散
  467. /// <summary>
  468. /// 读取消像散X
  469. /// </summary>
  470. /// <returns>true:float or false:NaN</returns>
  471. public float GetAstigmatismX()
  472. {
  473. float ret = 0;
  474. if (ReadParams(AP_STIG_X, ref ret))
  475. {
  476. return ret;
  477. }
  478. else
  479. {
  480. return float.NaN;
  481. }
  482. }
  483. /// <summary>
  484. /// 读取消像散Y
  485. /// </summary>
  486. /// <returns>true:float or false:NaN</returns>
  487. public float GetAstigmatismY()
  488. {
  489. float ret = 0;
  490. if (ReadParams(AP_STIG_Y, ref ret))
  491. {
  492. return ret;
  493. }
  494. else
  495. {
  496. return float.NaN;
  497. }
  498. }
  499. /// <summary>
  500. /// 设置消像散X
  501. /// </summary>
  502. /// <param name="set">对比度</param>
  503. /// <returns>true or false</returns>
  504. public Boolean SetAstigmatismX(float set)
  505. {
  506. return WriteParams(AP_STIG_X, set);
  507. }
  508. /// <summary>
  509. /// 设置消像散Y
  510. /// </summary>
  511. /// <param name="set">对比度</param>
  512. /// <returns>true or false</returns>
  513. public Boolean SetAstigmatismY(float set)
  514. {
  515. return WriteParams(AP_STIG_Y, set);
  516. }
  517. #endregion
  518. #region 角度补偿
  519. /// <summary>
  520. /// 读取角度补偿
  521. /// </summary>
  522. /// <returns>true:float or false:NaN</returns>
  523. public float GetTiltAngle()
  524. {
  525. float ret = 0;
  526. if (ReadParams(AP_TILT_ANGLE, ref ret))
  527. {
  528. return ret;
  529. }
  530. else
  531. {
  532. return float.NaN;
  533. }
  534. }
  535. /// <summary>
  536. /// 设置角度补偿
  537. /// </summary>
  538. /// <param name="set">角度补偿</param>
  539. /// <returns>true or false</returns>
  540. public Boolean SetTiltAngle(float set)
  541. {
  542. Boolean ret = false;
  543. ret = WriteDataParams(DP_TILT_CORRECTION, 1);
  544. ret = WriteParams(AP_TILT_ANGLE, set);
  545. ret = WriteDataParams(DP_TILT_CORRECTION, 0);
  546. return ret;
  547. }
  548. #endregion
  549. #region 抓取图像
  550. /// <summary>
  551. /// 抓取图像
  552. /// </summary>
  553. /// <returns>true:float or false:NaN</returns>
  554. public Boolean GrabImage(String filename, short xoff,short yoff, short width,short height,short type)
  555. {
  556. if (m_bInitialised)
  557. {
  558. lrt = CZEMApi.Grab(xoff, yoff, width, height, type, filename);
  559. if (lrt != 0)
  560. {
  561. return false;
  562. }
  563. else
  564. {
  565. return true;
  566. }
  567. }
  568. else
  569. {
  570. return false;
  571. }
  572. }
  573. #endregion
  574. #region 图像解冻
  575. public Boolean Frozen(float set)
  576. {
  577. return WriteDataParams(DP_FROZEN, set);
  578. }
  579. #endregion
  580. #region 图像类型切换
  581. public Boolean DetectorType(float set)
  582. {
  583. return WriteDataParams(DP_DETECTOR_TYPE, set);
  584. }
  585. #endregion
  586. #region 电子束移动接口
  587. /// <summary>
  588. /// 获取电子束移动接口X
  589. /// </summary>
  590. /// <returns>true:float or false:NaN</returns>
  591. public float GetBeamShiftX()
  592. {
  593. float ret = 0;
  594. if (ReadParams(AP_BEAMSHIFT_X, ref ret))
  595. {
  596. return ret;
  597. }
  598. else
  599. {
  600. return float.NaN;
  601. }
  602. }
  603. /// <summary>
  604. /// 获取电子束移动接口Y
  605. /// </summary>
  606. /// <returns>true:float or false:NaN</returns>
  607. public float GetBeamShiftY()
  608. {
  609. float ret = 0;
  610. if (ReadParams(AP_BEAMSHIFT_Y, ref ret))
  611. {
  612. return ret;
  613. }
  614. else
  615. {
  616. return float.NaN;
  617. }
  618. }
  619. /// <summary>
  620. /// 设置电子束移动接口X
  621. /// </summary>
  622. /// <param name="set">X坐标</param>
  623. /// <returns>true or false</returns>
  624. public Boolean SetBeamShiftX(float set)
  625. {
  626. return WriteParams(AP_BEAMSHIFT_X, set);
  627. }
  628. /// <summary>
  629. /// 设置电子束移动接口Y
  630. /// </summary>
  631. /// <param name="set">X坐标</param>
  632. /// <returns>true or false</returns>
  633. public Boolean SetBeamShiftY(float set)
  634. {
  635. return WriteParams(AP_BEAMSHIFT_Y, set);
  636. }
  637. #endregion
  638. #region 样品台移动接口
  639. /// <summary>
  640. /// 返回样品台坐标数组
  641. /// </summary>
  642. /// <returns>Lenght=6</returns>
  643. public float[] GetStagePosition()
  644. {
  645. object retx = new VariantWrapper((float)0.0f);
  646. object rety = new VariantWrapper((float)0.0f);
  647. object retz = new VariantWrapper((float)0.0f);
  648. object rett = new VariantWrapper((float)0.0f);
  649. object retr = new VariantWrapper((float)0.0f);
  650. object retm = new VariantWrapper((float)0.0f);
  651. float[] ret = new float[6];
  652. if (m_bInitialised)
  653. {
  654. CZEMApi.GetStagePosition(ref retx, ref rety, ref retz, ref rett, ref retr, ref retm);
  655. ret[0] = Convert.ToSingle(retx);
  656. ret[1] = Convert.ToSingle(rety);
  657. ret[2] = Convert.ToSingle(retz);
  658. ret[3] = Convert.ToSingle(rett);
  659. ret[4] = Convert.ToSingle(retr);
  660. ret[5] = Convert.ToSingle(retm);
  661. }
  662. else
  663. {
  664. ret[0] = float.NaN;
  665. ret[1] = float.NaN;
  666. ret[2] = float.NaN;
  667. ret[3] = float.NaN;
  668. ret[4] = float.NaN;
  669. ret[5] = float.NaN;
  670. }
  671. return ret;
  672. }
  673. /// <summary>
  674. /// 样品台位置 X轴
  675. /// </summary>
  676. /// <returns>true:float or false:NaN</returns>
  677. public float GetStageAtX()
  678. {
  679. float ret = 0;
  680. if (ReadParams(AP_STAGE_AT_X, ref ret))
  681. {
  682. return ret;
  683. }
  684. else
  685. {
  686. return float.NaN;
  687. }
  688. }
  689. /// <summary>
  690. /// 样品台位置 Y轴
  691. /// </summary>
  692. /// <returns>true:float or false:NaN</returns>
  693. public float GetStageAtY()
  694. {
  695. float ret = 0;
  696. if (ReadParams(AP_STAGE_AT_Y, ref ret))
  697. {
  698. return ret;
  699. }
  700. else
  701. {
  702. return float.NaN;
  703. }
  704. }
  705. /// <summary>
  706. /// 样品台位置 Z轴
  707. /// </summary>
  708. /// <returns>true:float or false:NaN</returns>
  709. public float GetStageAtZ()
  710. {
  711. float ret = 0;
  712. if (ReadParams(AP_STAGE_AT_Z, ref ret))
  713. {
  714. return ret;
  715. }
  716. else
  717. {
  718. return float.NaN;
  719. }
  720. }
  721. /// <summary>
  722. /// 样品台位置 T轴
  723. /// </summary>
  724. /// <returns>true:float or false:NaN</returns>
  725. public float GetStageAtT()
  726. {
  727. float ret = 0;
  728. if (ReadParams(AP_STAGE_AT_T, ref ret))
  729. {
  730. return ret;
  731. }
  732. else
  733. {
  734. return float.NaN;
  735. }
  736. }
  737. /// <summary>
  738. /// 样品台位置 R轴
  739. /// </summary>
  740. /// <returns>true:float or false:NaN</returns>
  741. public float GetStageAtR()
  742. {
  743. float ret = 0;
  744. if (ReadParams(AP_STAGE_AT_R, ref ret))
  745. {
  746. return ret;
  747. }
  748. else
  749. {
  750. return float.NaN;
  751. }
  752. }
  753. /// <summary>
  754. /// 样品台位置 M轴
  755. /// </summary>
  756. /// <returns>true:float or false:NaN</returns>
  757. public float GetStageAtM()
  758. {
  759. float ret = 0;
  760. if (ReadParams(AP_STAGE_AT_M, ref ret))
  761. {
  762. return ret;
  763. }
  764. else
  765. {
  766. return float.NaN;
  767. }
  768. }
  769. /// <summary>
  770. /// 样品台位置 X轴
  771. /// </summary>
  772. /// <param name="set">X轴移动坐标</param>
  773. /// <returns></returns>
  774. public Boolean SetStageGotoX(float set)
  775. {
  776. return WriteParams(AP_STAGE_GOTO_X, set);
  777. }
  778. /// <summary>
  779. /// 样品台位置 Y轴
  780. /// </summary>
  781. /// <param name="set">Y轴移动坐标</param>
  782. /// <returns></returns>
  783. public Boolean SetStageGotoY(float set)
  784. {
  785. return WriteParams(AP_STAGE_GOTO_Y, set);
  786. }
  787. /// <summary>
  788. /// 样品台位置 Z轴
  789. /// </summary>
  790. /// <param name="set">Y轴移动坐标</param>
  791. /// <returns></returns>
  792. public Boolean SetStageGotoZ(float set)
  793. {
  794. return WriteParams(AP_STAGE_GOTO_Z, set);
  795. }
  796. /// <summary>
  797. /// 样品台位置 T轴
  798. /// </summary>
  799. /// <param name="set">Y轴移动坐标</param>
  800. /// <returns></returns>
  801. public Boolean SetStageGotoT(float set)
  802. {
  803. return WriteParams(AP_STAGE_GOTO_T, set);
  804. }
  805. /// <summary>
  806. /// 样品台位置 R轴
  807. /// </summary>
  808. /// <param name="set">Y轴移动坐标</param>
  809. /// <returns></returns>
  810. public Boolean SetStageGotoR(float set)
  811. {
  812. return WriteParams(AP_STAGE_GOTO_R, set);
  813. }
  814. /// <summary>
  815. /// 样品台位置 M轴
  816. /// </summary>
  817. /// <param name="set">M轴移动坐标</param>
  818. /// <returns></returns>
  819. public Boolean SetStageGotoM(float set)
  820. {
  821. return WriteParams(AP_STAGE_GOTO_M, set);
  822. }
  823. #endregion
  824. #region Scan Rotate角度接口
  825. /// <summary>
  826. /// 获取Scan Rotate角度接口
  827. /// </summary>
  828. /// <returns>true:float or false:NaN</returns>
  829. public float GetScanRotation()
  830. {
  831. float ret = 0;
  832. if (ReadParams(AP_SCANROTATION, ref ret))
  833. {
  834. return ret;
  835. }
  836. else
  837. {
  838. return float.NaN;
  839. }
  840. }
  841. /// <summary>
  842. /// 设置Scan Rotate角度接口
  843. /// </summary>
  844. /// <param name="set">角度补偿</param>
  845. /// <returns>true or false</returns>
  846. public Boolean SetScanRotation(float set)
  847. {
  848. Boolean ret = false;
  849. ret = WriteDataParams(DP_SCAN_ROT, 1);
  850. ret = WriteParams(AP_SCANROTATION, set);
  851. ret = WriteDataParams(DP_SCAN_ROT, 0);
  852. return ret;
  853. }
  854. #endregion
  855. #region 像素读取PixelSize
  856. /// <summary>
  857. /// 获取Pixel Size 接口,只读
  858. /// </summary>
  859. /// <returns>true:float or false:NaN</returns>
  860. public float GetPixelSize()
  861. {
  862. float ret = 0;
  863. if (ReadParams(AP_PIXEL_SIZE, ref ret))
  864. {
  865. return ret;
  866. }
  867. else
  868. {
  869. return float.NaN;
  870. }
  871. }
  872. #endregion
  873. #region 电子束校正设置
  874. /// <summary>
  875. /// 读取电子束校正状态
  876. /// </summary>
  877. /// <returns></returns>
  878. public float GetTiltCorrection()
  879. {
  880. float ret = 0;
  881. if (ReadParams(DP_TILT_CORRECTION, ref ret))
  882. {
  883. return ret;
  884. }
  885. else
  886. {
  887. return float.NaN;
  888. }
  889. }
  890. /// <summary>
  891. /// 设置电子束校正状态
  892. /// </summary>
  893. /// <param name="set"></param>
  894. /// <returns></returns>
  895. public Boolean SetTiltCorrection(float set)
  896. {
  897. return WriteDataParams(DP_TILT_CORRECTION, set);
  898. }
  899. #endregion
  900. #region 开启电压
  901. public Boolean CmdOpenVoltage()
  902. {
  903. return ExecuteCmd(CMD_BEAM_ON);
  904. }
  905. #endregion
  906. #region 关闭电压
  907. public Boolean CmdCloseVoltage()
  908. {
  909. return ExecuteCmd(CMD_EHT_OFF);
  910. }
  911. #endregion
  912. #region 自动对焦1
  913. public Boolean CmdAutoFocusCoarse()
  914. {
  915. return ExecuteCmd(CMD_AUTO_FOCUS_COARSE);
  916. }
  917. #endregion
  918. #region 自动对焦2
  919. public Boolean CmdAutoFocusFine()
  920. {
  921. return ExecuteCmd(CMD_AUTO_FOCUS_FINE);
  922. }
  923. #endregion
  924. #region 自动消像散
  925. public Boolean CmdAutoStig()
  926. {
  927. return ExecuteCmd(CMD_AUTO_STIG);
  928. }
  929. #endregion
  930. }
  931. }