SmartSEM.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495
  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. //Scan Rotate角度
  33. private String AP_SCANROTATION = "AP_SCANROTATION";
  34. //像素大小
  35. private String AP_PIXEL_SIZE = "AP_PIXEL_SIZE";
  36. //X轴坐标
  37. private String AP_STAGE_AT_X = "AP_STAGE_AT_X";
  38. //Y轴坐标
  39. private String AP_STAGE_AT_Y = "AP_STAGE_AT_Y";
  40. //Z轴坐标
  41. private String AP_STAGE_AT_Z = "AP_STAGE_AT_Z";
  42. //T轴坐标
  43. private String AP_STAGE_AT_T = "AP_STAGE_AT_T";
  44. //R轴坐标
  45. private String AP_STAGE_AT_R = "AP_STAGE_AT_R";
  46. //M轴坐标
  47. private String AP_STAGE_AT_M = "AP_STAGE_AT_M";
  48. #endregion
  49. #region 命令
  50. //开启电压
  51. private String CMD_BEAM_ON = "CMD_BEAM_ON";
  52. //关闭电压
  53. private String CMD_EHT_OFF = "CMD_EHT_OFF";
  54. #endregion
  55. #region APILib
  56. private Api CZEMApi = new Api();
  57. private Boolean m_bInitialised = false;
  58. private long lrt = 0;
  59. #endregion
  60. #region 设备初始化
  61. /// <summary>
  62. /// 设备初始化
  63. /// </summary>
  64. /// <returns>return:true or false</returns>
  65. public Boolean Init()
  66. {
  67. //lrt = CZEMApi.Initialise("");
  68. lrt = CZEMApi.InitialiseRemoting();
  69. if (lrt!=0)
  70. {
  71. m_bInitialised = false;
  72. return false;
  73. }
  74. else
  75. {
  76. m_bInitialised = true;
  77. return true;
  78. }
  79. }
  80. #endregion
  81. #region 关闭设备
  82. /// <summary>
  83. /// 关闭设备
  84. /// </summary>
  85. /// <returns>true or false</returns>
  86. public Boolean UnInit()
  87. {
  88. if (m_bInitialised)
  89. {
  90. lrt = CZEMApi.ClosingControl();
  91. if (lrt != 0)
  92. {
  93. return false;
  94. }
  95. else
  96. {
  97. m_bInitialised = false;
  98. return true;
  99. }
  100. }
  101. else
  102. {
  103. return false;
  104. }
  105. }
  106. #endregion
  107. #region 读参数函数
  108. private Boolean ReadParams(String str_param,ref float value)
  109. {
  110. if (m_bInitialised)
  111. {
  112. object varfloat = new VariantWrapper((float)0.0f);
  113. lrt = CZEMApi.Get(str_param, ref varfloat);
  114. if (lrt != 0)
  115. {
  116. return false;
  117. }
  118. else
  119. {
  120. value = Convert.ToSingle(varfloat);
  121. return true;
  122. }
  123. }
  124. else
  125. {
  126. return false;
  127. }
  128. }
  129. #endregion
  130. #region 写参数函数
  131. private Boolean WriteParams(String str_param, float value)
  132. {
  133. if (m_bInitialised)
  134. {
  135. //先取范围
  136. object varMin = new VariantWrapper((float)0.0f);
  137. object varMax = new VariantWrapper((float)0.0f);
  138. lrt = CZEMApi.GetLimits(str_param, ref varMin, ref varMax);
  139. if (lrt != 0)
  140. {
  141. return false;
  142. }
  143. if (value <= Convert.ToSingle(varMax) && value >= Convert.ToSingle(varMin))
  144. {
  145. object varFloat = new VariantWrapper(value);
  146. lrt = CZEMApi.Set(str_param, ref varFloat);// set value
  147. if (lrt != 0)
  148. {
  149. return false;
  150. }
  151. return true;
  152. //这里是写入后读取判断值是否写入,也可以在事件1中捕获返回值
  153. //object varfloat = new VariantWrapper((float)0.0f);
  154. ////object varStr = new VariantWrapper("");
  155. //lrt = CZEMApi.Get(strPara, ref varfloat);
  156. //if (lrt != 0)
  157. //{
  158. // ReportError(lrt, "Set Value", strPara);
  159. // return;
  160. //}
  161. //lblgetValue.Text = Convert.ToDecimal(varfloat).ToString();
  162. }
  163. else
  164. {
  165. return false;
  166. }
  167. }
  168. else
  169. {
  170. return false;
  171. }
  172. }
  173. #endregion
  174. #region 执行命令
  175. private Boolean ExecuteCmd(String cmd)
  176. {
  177. if (m_bInitialised)
  178. {
  179. lrt = CZEMApi.Execute(cmd);// execute command
  180. if (lrt != 0)
  181. {
  182. return false;
  183. }
  184. else
  185. {
  186. return true;
  187. }
  188. }
  189. else
  190. {
  191. return false;
  192. }
  193. }
  194. #endregion
  195. #region 放大缩小
  196. /// <summary>
  197. /// 读取缩放倍数
  198. /// </summary>
  199. /// <returns>true:float or false:NaN</returns>
  200. public float GetMagnification()
  201. {
  202. float ret = 0;
  203. if(ReadParams(AP_MAG, ref ret))
  204. {
  205. return ret;
  206. }
  207. else
  208. {
  209. return float.NaN;
  210. }
  211. }
  212. /// <summary>
  213. /// 设置缩放倍数
  214. /// </summary>
  215. /// <param name="set">倍数</param>
  216. /// <returns>true or false</returns>
  217. public Boolean SetMagnification(float set)
  218. {
  219. return WriteParams(AP_MAG, set);
  220. }
  221. #endregion
  222. #region 焦距
  223. /// <summary>
  224. /// 读取工作距离
  225. /// </summary>
  226. /// <returns>true:float or false:NaN</returns>
  227. public float GetWorkingDistance()
  228. {
  229. float ret = 0;
  230. if (ReadParams(AP_WD, ref ret))
  231. {
  232. return ret;
  233. }
  234. else
  235. {
  236. return float.NaN;
  237. }
  238. }
  239. /// <summary>
  240. /// 设置焦距
  241. /// </summary>
  242. /// <param name="set">焦距</param>
  243. /// <returns>true or false</returns>
  244. public Boolean SetWorkingDistance(float set)
  245. {
  246. return WriteParams(AP_WD, set);
  247. }
  248. #endregion
  249. #region 亮度
  250. /// <summary>
  251. /// 读取亮度
  252. /// </summary>
  253. /// <returns>true:float or false:NaN</returns>
  254. public float GetBrightness()
  255. {
  256. float ret = 0;
  257. if (ReadParams(AP_BRIGHTNESS, ref ret))
  258. {
  259. return ret;
  260. }
  261. else
  262. {
  263. return float.NaN;
  264. }
  265. }
  266. /// <summary>
  267. /// 设置亮度
  268. /// </summary>
  269. /// <param name="set">亮度</param>
  270. /// <returns>true or false</returns>
  271. public Boolean SetBrightness(float set)
  272. {
  273. return WriteParams(AP_BRIGHTNESS, set);
  274. }
  275. #endregion
  276. #region 对比度
  277. /// <summary>
  278. /// 读取对比度
  279. /// </summary>
  280. /// <returns>true:float or false:NaN</returns>
  281. public float GetContrast()
  282. {
  283. float ret = 0;
  284. if (ReadParams(AP_CONTRAST, ref ret))
  285. {
  286. return ret;
  287. }
  288. else
  289. {
  290. return float.NaN;
  291. }
  292. }
  293. /// <summary>
  294. /// 设置对比度
  295. /// </summary>
  296. /// <param name="set">对比度</param>
  297. /// <returns>true or false</returns>
  298. public Boolean SetContrast(float set)
  299. {
  300. return WriteParams(AP_CONTRAST, set);
  301. }
  302. #endregion
  303. #region 消像散
  304. /// <summary>
  305. /// 读取消像散X
  306. /// </summary>
  307. /// <returns>true:float or false:NaN</returns>
  308. public float GetAstigmatismX()
  309. {
  310. float ret = 0;
  311. if (ReadParams(AP_STIG_X, ref ret))
  312. {
  313. return ret;
  314. }
  315. else
  316. {
  317. return float.NaN;
  318. }
  319. }
  320. /// <summary>
  321. /// 读取消像散Y
  322. /// </summary>
  323. /// <returns>true:float or false:NaN</returns>
  324. public float GetAstigmatismY()
  325. {
  326. float ret = 0;
  327. if (ReadParams(AP_STIG_Y, ref ret))
  328. {
  329. return ret;
  330. }
  331. else
  332. {
  333. return float.NaN;
  334. }
  335. }
  336. /// <summary>
  337. /// 设置消像散X
  338. /// </summary>
  339. /// <param name="set">对比度</param>
  340. /// <returns>true or false</returns>
  341. public Boolean SetAstigmatismX(float set)
  342. {
  343. return WriteParams(AP_STIG_X, set);
  344. }
  345. /// <summary>
  346. /// 设置消像散Y
  347. /// </summary>
  348. /// <param name="set">对比度</param>
  349. /// <returns>true or false</returns>
  350. public Boolean SetAstigmatismY(float set)
  351. {
  352. return WriteParams(AP_STIG_Y, set);
  353. }
  354. #endregion
  355. #region 角度补偿
  356. /// <summary>
  357. /// 读取角度补偿
  358. /// </summary>
  359. /// <returns>true:float or false:NaN</returns>
  360. public float GetTiltAngle()
  361. {
  362. float ret = 0;
  363. if (ReadParams(AP_TILT_ANGLE, ref ret))
  364. {
  365. return ret;
  366. }
  367. else
  368. {
  369. return float.NaN;
  370. }
  371. }
  372. /// <summary>
  373. /// 设置角度补偿
  374. /// </summary>
  375. /// <param name="set">角度补偿</param>
  376. /// <returns>true or false</returns>
  377. public Boolean SetTiltAngle(float set)
  378. {
  379. return WriteParams(AP_TILT_ANGLE, set);
  380. }
  381. #endregion
  382. #region 抓取图像
  383. /// <summary>
  384. /// 抓取图像
  385. /// </summary>
  386. /// <returns>true:float or false:NaN</returns>
  387. public Boolean GrabImage(String filename,short type)
  388. {
  389. if (m_bInitialised)
  390. {
  391. lrt = CZEMApi.Grab(0, 0, 1024, 768, type, filename);
  392. if (lrt != 0)
  393. {
  394. return false;
  395. }
  396. else
  397. {
  398. return true;
  399. }
  400. }
  401. else
  402. {
  403. return false;
  404. }
  405. }
  406. #endregion
  407. #region Scan Rotate角度接口
  408. /// <summary>
  409. /// 获取Scan Rotate角度接口
  410. /// </summary>
  411. /// <returns>true:float or false:NaN</returns>
  412. public float GetScanRotation()
  413. {
  414. float ret = 0;
  415. if (ReadParams(AP_SCANROTATION, ref ret))
  416. {
  417. return ret;
  418. }
  419. else
  420. {
  421. return float.NaN;
  422. }
  423. }
  424. /// <summary>
  425. /// 设置Scan Rotate角度接口
  426. /// </summary>
  427. /// <param name="set">角度补偿</param>
  428. /// <returns>true or false</returns>
  429. public Boolean SetScanRotation(float set)
  430. {
  431. return WriteParams(AP_SCANROTATION, set);
  432. }
  433. #endregion
  434. #region 像素读取PixelSize
  435. /// <summary>
  436. /// 获取Pixel Size 接口,只读
  437. /// </summary>
  438. /// <returns>true:float or false:NaN</returns>
  439. public float GetPixelSize()
  440. {
  441. float ret = 0;
  442. if (ReadParams(AP_PIXEL_SIZE, ref ret))
  443. {
  444. return ret;
  445. }
  446. else
  447. {
  448. return float.NaN;
  449. }
  450. }
  451. #endregion
  452. #region 开启电压
  453. public Boolean CmdOpenVoltage()
  454. {
  455. return ExecuteCmd(CMD_BEAM_ON);
  456. }
  457. #endregion
  458. #region 关闭电压
  459. public Boolean CmdCloseVoltage()
  460. {
  461. return ExecuteCmd(CMD_EHT_OFF);
  462. }
  463. #endregion
  464. }
  465. }