SmartSEM.cs 23 KB

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