SmartSEM.cs 31 KB

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