SmartSEM.cs 76 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259
  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. using System.IO;
  13. using FileManager;
  14. namespace SmartSEMControl
  15. {
  16. //可能遇到的错误提示部分??在log加入之后添加
  17. class SmartSEM : ISEMControl
  18. {
  19. #region 返回错误代码枚举
  20. private enum ZeissErrorCode
  21. {
  22. // Failed to translate parameter into an id
  23. API_E_GET_TRANSLATE_FAIL = 1000,
  24. // Failed to get analogue value
  25. API_E_GET_AP_FAIL = 1001,
  26. // Failed to get digital value
  27. API_E_GET_DP_FAIL = 1002,
  28. // Parameter supplied is not analogue nor digital
  29. API_E_GET_BAD_PARAMETER = 1003,
  30. // Failed to translate parameter into an id
  31. API_E_SET_TRANSLATE_FAIL = 1004,
  32. // Failed to set a digital state
  33. API_E_SET_STATE_FAIL = 1005,
  34. // Failed to set a float value
  35. API_E_SET_FLOAT_FAIL = 1006,
  36. // Value supplied is too low
  37. API_E_SET_FLOAT_LIMIT_LOW = 1007,
  38. // Value supplied is too high
  39. API_E_SET_FLOAT_LIMIT_HIGH = 1008,
  40. // Value supplied is is of wrong type
  41. API_E_SET_BAD_VALUE = 1009,
  42. // Parameter supplied is not analogue nor digital
  43. API_E_SET_BAD_PARAMETER = 1010,
  44. // Failed to translate command into an id
  45. API_E_EXEC_TRANSLATE_FAIL = 1011,
  46. // Failed to execute command=
  47. API_E_EXEC_CMD_FAIL = 1012,
  48. // Failed to execute file macro
  49. API_E_EXEC_MCF_FAIL = 1013,
  50. // Failed to execute library macro
  51. API_E_EXEC_MCL_FAIL = 1014,
  52. // Command supplied is not implemented
  53. API_E_EXEC_BAD_COMMAND = 1015,
  54. // Grab command failed
  55. API_E_GRAB_FAIL = 1016,
  56. // Get Stage position failed
  57. API_E_GET_STAGE_FAIL = 1017,
  58. // Move Stage position failed
  59. API_E_MOVE_STAGE_FAIL = 1018,
  60. // API not initialised
  61. API_E_NOT_INITIALISED = 1019,
  62. // Failed to translate parameter to an id
  63. API_E_NOTIFY_TRANSLATE_FAIL = 1020,
  64. // Set notification failed
  65. API_E_NOTIFY_SET_FAIL = 1021,
  66. // Get limits failed
  67. API_E_GET_LIMITS_FAIL = 1022,
  68. // Get multiple parameters failed
  69. API_E_GET_MULTI_FAIL = 1023,
  70. // Set multiple parameters failed
  71. API_E_SET_MULTI_FAIL = 1024,
  72. // Missing API license
  73. API_E_NOT_LICENSED = 1025,
  74. // Reserved or not implemented
  75. API_E_NOT_IMPLEMENTED = 1026,
  76. // Failed to get user name (Remoting Interface only)
  77. API_E_GET_USER_NAME_FAIL = 1027,
  78. // Failed to get user idle state (Remoting Interface only)
  79. API_E_GET_USER_IDLE_FAIL = 1028,
  80. // Failed to get the last remoting connection error string (Remoting Interface Only)
  81. API_E_GET_LAST_REMOTING_CONNECT_ERROR_FAIL = 1029,
  82. // Failed to remotely logon to the EM Server (username and password may be incorrect or EM Server is not running or User is already logged on
  83. API_E_EMSERVER_LOGON_FAILED = 1030,
  84. // Failed to start the EM Server - this may be because the Server is already running or has an internal error.
  85. API_E_EMSERVER_START_FAILED = 1031,
  86. // The command or parameter is currently disabled (you cannot execute or set it).
  87. API_E_PARAMETER_IS_DISABLED = 1032,
  88. // Remoting incorrectly configured, use RConfigure to correct
  89. API_E_REMOTING_NOT_CONFIGURED = 2027,
  90. // Remoting did not connect to the server
  91. API_E_REMOTING_FAILED_TO_CONNECT = 2028,
  92. // Remoting could not start (unknown reason)
  93. API_E_REMOTING_COULD_NOT_CREATE_INTERFACE = 2029,
  94. // Remoting: Remote server is not running currently.
  95. API_E_REMOTING_EMSERVER_NOT_RUNNING = 2030,
  96. // Remoting: Remote server has no user logged in
  97. API_E_REMOTING_NO_USER_LOGGED_IN = 2031,
  98. // Internal Defines, although they may be useful in your own program. TRS.
  99. API_FIRST_REMOTING_ERROR_CODE = API_E_REMOTING_NOT_CONFIGURED,
  100. API_LAST_REMOTING_ERROR_CODE = API_E_REMOTING_NO_USER_LOGGED_IN,
  101. API_FIRST_ERROR_CODE = API_E_GET_TRANSLATE_FAIL,
  102. API_LAST_ERROR_CODE = API_E_REMOTING_NO_USER_LOGGED_IN
  103. }
  104. #endregion
  105. #region 固定参数
  106. //判断这个文件夹是否存在20200826
  107. private readonly String ELYPATH = @"C:\ProgramData\Carl Zeiss\SmartFIB\API\Drop\";
  108. private readonly String ELYFILENAME = "ApiLayout.ely";
  109. private readonly String MLFPATH = @"C:\ProgramData\Carl Zeiss\SmartSEM\User\Service\";
  110. private readonly String MLFFILENAME = "Opton.MLF";
  111. #endregion
  112. #region 模拟参数
  113. //放大缩小
  114. private readonly String AP_MAG = "AP_MAG";
  115. //焦距
  116. private readonly String AP_WD = "AP_WD";
  117. //亮度
  118. private readonly String AP_BRIGHTNESS = "AP_BRIGHTNESS";
  119. //对比度
  120. private readonly String AP_CONTRAST = "AP_CONTRAST";
  121. //亮度目标
  122. private readonly String AP_AUTO_BRIGHT = "AP_AUTO_BRIGHT";
  123. //对比度目标
  124. private readonly String AP_AUTO_CONTRAST = "AP_AUTO_CONTRAST";
  125. //消像散X轴
  126. private readonly String AP_STIG_X = "AP_STIG_X";
  127. //消像散Y轴
  128. private readonly String AP_STIG_Y = "AP_STIG_Y";
  129. //角度补偿
  130. private readonly String AP_TILT_ANGLE = "AP_TILT_ANGLE";
  131. //SEM移动X
  132. private readonly String AP_BEAMSHIFT_X = "AP_BEAMSHIFT_X";
  133. //SEM移动Y
  134. private readonly String AP_BEAMSHIFT_Y = "AP_BEAMSHIFT_Y";
  135. //X轴移动到
  136. private readonly String AP_STAGE_GOTO_X = "AP_STAGE_GOTO_X";
  137. //Y轴移动到
  138. private readonly String AP_STAGE_GOTO_Y = "AP_STAGE_GOTO_Y";
  139. //Z轴移动到
  140. private readonly String AP_STAGE_GOTO_Z = "AP_STAGE_GOTO_Z";
  141. //T轴移动到
  142. private readonly String AP_STAGE_GOTO_T = "AP_STAGE_GOTO_T";
  143. //R轴移动到
  144. private readonly String AP_STAGE_GOTO_R = "AP_STAGE_GOTO_R";
  145. //M轴移动到
  146. private readonly String AP_STAGE_GOTO_M = "AP_STAGE_GOTO_M";
  147. //Scan Rotate角度
  148. private readonly String AP_SCANROTATION = "AP_SCANROTATION";
  149. //像素大小
  150. private readonly String AP_PIXEL_SIZE = "AP_PIXEL_SIZE";
  151. //X轴坐标
  152. private readonly String AP_STAGE_AT_X = "AP_STAGE_AT_X";
  153. //Y轴坐标
  154. private readonly String AP_STAGE_AT_Y = "AP_STAGE_AT_Y";
  155. //Z轴坐标
  156. private readonly String AP_STAGE_AT_Z = "AP_STAGE_AT_Z";
  157. //T轴坐标
  158. private readonly String AP_STAGE_AT_T = "AP_STAGE_AT_T";
  159. //R轴坐标
  160. private readonly String AP_STAGE_AT_R = "AP_STAGE_AT_R";
  161. //M轴坐标
  162. private readonly String AP_STAGE_AT_M = "AP_STAGE_AT_M";
  163. //扫描周期
  164. private readonly String AP_FRAME_TIME = "AP_FRAME_TIME";
  165. //FIB缩放
  166. private readonly String AP_FIB_MAGNIFICATION = "AP_FIB_MAGNIFICATION";
  167. //FIB焦距
  168. private readonly String AP_FIB_OBJECTIVE_POTENTIAL = "AP_FIB_OBJECTIVE_POTENTIAL";
  169. //FIB消像散X
  170. private readonly String AP_FIB_STIGMATOR_X = "AP_FIB_STIGMATOR_X";
  171. //FIB消像散Y
  172. private readonly String AP_FIB_STIGMATOR_Y = "AP_FIB_STIGMATOR_Y";
  173. //FIB光束移动X
  174. private readonly String AP_FIB_BEAM_SHIFT_X = "AP_FIB_BEAM_SHIFT_X";
  175. //FIB光束移动Y
  176. private readonly String AP_FIB_BEAM_SHIFT_Y = "AP_FIB_BEAM_SHIFT_Y";
  177. //SEM电压
  178. private readonly String AP_MANUALKV = "AP_MANUALKV";
  179. //拉直
  180. private readonly String AP_STAGE_DELTA_R = "AP_STAGE_DELTA_R";
  181. //光束移动位置值
  182. private readonly String AP_BEAM_OFFSET_X = "AP_BEAM_OFFSET_X";
  183. private readonly String AP_BEAM_OFFSET_Y = "AP_BEAM_OFFSET_Y";
  184. #endregion
  185. #region 数字参数
  186. //Scan Rotate开关
  187. private readonly String DP_SCAN_ROT = "DP_SCAN_ROT";
  188. //取消电子束校正
  189. private readonly String DP_TILT_CORRECTION = "DP_TILT_CORRECTION";
  190. //自动亮度对比度
  191. private readonly String DP_AUTO_VIDEO = "DP_AUTO_VIDEO";
  192. //图像解冻
  193. private readonly String DP_FROZEN = "DP_FROZEN";
  194. //图像类型切换
  195. private readonly String DP_DETECTOR_TYPE = "DP_DETECTOR_TYPE";
  196. //图像大小
  197. private readonly String DP_IMAGE_STORE = "DP_IMAGE_STORE";
  198. //样品台状态
  199. private readonly String DP_STAGE_IS = "DP_STAGE_IS";
  200. //自动函数状态
  201. private readonly String DP_AUTO_FUNCTION = "DP_AUTO_FUNCTION";
  202. //FIB模式
  203. private readonly String DP_FIB_MODE = "DP_FIB_MODE";
  204. //FIB_IMAGING
  205. private readonly String DP_FIB_IMAGING = "DP_FIB_IMAGING";
  206. //FIB状态
  207. private readonly String DP_SMARTFIB_API_STATUS = "DP_SMARTFIB_API_STATUS";
  208. //FIB,ELY文件确认前,需要将该变量置为2->FIB
  209. private readonly String DP_PATTERNING_MODE = "DP_PATTERNING_MODE";
  210. #endregion
  211. #region 命令
  212. //20201016 设置图像速度 CMD_SCANRATE0...CMD_SCANRATE15
  213. private readonly String CMD_SCANRATE3 = "CMD_SCANRATE3";
  214. private readonly String CMD_SCANRATE6 = "CMD_SCANRATE6";
  215. //开启电压
  216. private readonly String CMD_BEAM_ON = "CMD_BEAM_ON";
  217. //关闭电压
  218. private readonly String CMD_EHT_OFF = "CMD_EHT_OFF";
  219. //自动对焦1
  220. private readonly String CMD_AUTO_FOCUS_COARSE = "CMD_AUTO_FOCUS_COARSE";
  221. //自动对焦2
  222. private readonly String CMD_AUTO_FOCUS_FINE = "CMD_AUTO_FOCUS_FINE";
  223. //自动消像散
  224. private readonly String CMD_AUTO_STIG = "CMD_AUTO_STIG";
  225. //样品台急停
  226. private readonly String CMD_STAGE_ABORT = "CMD_STAGE_ABORT";
  227. //FIB模式选择
  228. private readonly String CMD_FIB_MODE_SEM = "CMD_FIB_MODE_SEM";
  229. private readonly String CMD_FIB_MODE_FIB = "CMD_FIB_MODE_FIB";
  230. private readonly String CMD_FIB_MODE_MILL = "CMD_FIB_MODE_MILL";
  231. private readonly String CMD_FIB_MODE_SEM_FIB = "CMD_FIB_MODE_SEM_FIB";
  232. private readonly String CMD_FIB_MODE_MILL_SEM = "CMD_FIB_MODE_MILL_SEM";
  233. private readonly String CMD_FIB_MODE_EXT = "CMD_FIB_MODE_EXT";
  234. private readonly String CMD_FIB_MODE_EXT_SEM = "CMD_FIB_MODE_EXT_SEM";
  235. private readonly String CMD_FIB_MODE_ARGON_SEM = "CMD_FIB_MODE_ARGON_SEM";
  236. private readonly String CMD_FIB_MODE_DRIFT_SEM = "CMD_FIB_MODE_DRIFT_SEM";
  237. private readonly String CMD_FIB_MODE_DRIFT_FIB = "CMD_FIB_MODE_DRIFT_FIB";
  238. private readonly String CMD_FIB_MODE_ARGON = "CMD_FIB_MODE_ARGON";
  239. //FIB加载.ely文件命令
  240. private readonly String CMD_SMARTFIB_LOAD_ELY = "CMD_SMARTFIB_LOAD_ELY";
  241. //FIB确认.ely文件命令
  242. private readonly String CMD_SMARTFIB_PREPARE_EXPOSURE = "CMD_SMARTFIB_PREPARE_EXPOSURE";
  243. //FIB开始.ley文件命令
  244. private readonly String CMD_FIB_START_MILLING = "CMD_FIB_START_MILLING";
  245. #endregion
  246. #region 宏文件命令
  247. private readonly String MCF_FILENAME = "MCF_";
  248. #endregion
  249. #region APILib
  250. private Api CZEMApi = new Api();
  251. private Boolean m_bInitialised = false;
  252. #endregion
  253. #region 构造函数
  254. public SmartSEM()
  255. {
  256. LogManager.InitHardwareLog();
  257. Init();
  258. //判断ELY默认文件夹是否存在
  259. if(!Directory.Exists(ELYPATH))
  260. {
  261. Directory.CreateDirectory(ELYPATH);
  262. }
  263. if (!Directory.Exists(MLFPATH))
  264. {
  265. Directory.CreateDirectory(MLFPATH);
  266. }
  267. }
  268. #endregion
  269. #region 设备初始化
  270. /// <summary>
  271. /// 设备初始化
  272. /// </summary>
  273. /// <returns>return:true or false</returns>
  274. public Boolean Init()
  275. {
  276. long lrt = 0;
  277. #if ROMOTE
  278. lrt = CZEMApi.InitialiseRemoting();
  279. #else
  280. lrt = CZEMApi.Initialise("");
  281. #endif
  282. if (lrt != 0)
  283. {
  284. LogManager.AddHardwareLog("CZEMApi.Initialise Faild - " + ErrorToString(lrt), false);
  285. m_bInitialised = false;
  286. return false;
  287. }
  288. else
  289. {
  290. LogManager.AddHardwareLog("CZEMApi.Initialise Success!", true);
  291. m_bInitialised = true;
  292. return true;
  293. }
  294. }
  295. #endregion
  296. #region 设备远程初始化
  297. /// <summary>
  298. /// 设备远程初始化
  299. /// </summary>
  300. /// <returns>return:true or false</returns>
  301. public Boolean InitRemoting()
  302. {
  303. long lrt = CZEMApi.InitialiseRemoting();
  304. if (lrt != 0)
  305. {
  306. m_bInitialised = false;
  307. return false;
  308. }
  309. else
  310. {
  311. m_bInitialised = true;
  312. return true;
  313. }
  314. }
  315. #endregion
  316. #region 连接状态
  317. public Boolean ConnectStatus()
  318. {
  319. return m_bInitialised;
  320. }
  321. #endregion
  322. #region 关闭设备
  323. /// <summary>
  324. /// 关闭设备
  325. /// </summary>
  326. /// <returns>true or false</returns>
  327. public Boolean Dispose()
  328. {
  329. if (m_bInitialised)
  330. {
  331. long lrt = CZEMApi.ClosingControl();
  332. if (lrt != 0)
  333. {
  334. LogManager.AddHardwareLog("CZEMApi.ClosingControl Faild - " + ErrorToString(lrt), false);
  335. return false;
  336. }
  337. else
  338. {
  339. LogManager.AddHardwareLog("CZEMApi.ClosingControl Success!", true);
  340. m_bInitialised = false;
  341. return true;
  342. }
  343. }
  344. else
  345. {
  346. return false;
  347. }
  348. }
  349. #endregion
  350. #region 读参数函数
  351. private Boolean ReadParams(String str_param, ref float value)
  352. {
  353. if (m_bInitialised)
  354. {
  355. object varfloat = new VariantWrapper((float)0.0f);
  356. long lrt = CZEMApi.Get(str_param, ref varfloat);
  357. if (lrt != 0)
  358. {
  359. LogManager.AddHardwareLog("Get " + str_param + " Faild - " + ErrorToString(lrt), false);
  360. return false;
  361. }
  362. else
  363. {
  364. value = Convert.ToSingle(varfloat);
  365. return true;
  366. }
  367. }
  368. else
  369. {
  370. LogManager.AddHardwareLog("ReadParams m_bInitialised = false", false);
  371. return false;
  372. }
  373. }
  374. #endregion
  375. #region 写模拟参数函数
  376. private Boolean WriteParams(String str_param, float value)
  377. {
  378. if (m_bInitialised)
  379. {
  380. //先取范围
  381. object varMin = new VariantWrapper((float)0.0f);
  382. object varMax = new VariantWrapper((float)0.0f);
  383. long lrt = CZEMApi.GetLimits(str_param, ref varMin, ref varMax);
  384. if (lrt != 0)
  385. {
  386. LogManager.AddHardwareLog("GetLimits " + str_param + " Faild - " + ErrorToString(lrt), false);
  387. return false;
  388. }
  389. if (value <= Convert.ToSingle(varMax) && value >= Convert.ToSingle(varMin))
  390. {
  391. object varFloat = new VariantWrapper(value);
  392. lrt = CZEMApi.Set(str_param, ref varFloat);// set value
  393. if (lrt != 0)
  394. {
  395. LogManager.AddHardwareLog("Set " + str_param + " Faild - " + ErrorToString(lrt), false);
  396. return false;
  397. }
  398. return true;
  399. }
  400. else
  401. {
  402. LogManager.AddHardwareLog("Set " + str_param + " Faild - Out to range", false);
  403. return false;
  404. }
  405. }
  406. else
  407. {
  408. LogManager.AddHardwareLog("ReadParams m_bInitialised = false", false);
  409. return false;
  410. }
  411. }
  412. #endregion
  413. #region 写数字参数函数
  414. private Boolean WriteDataParams(String str_param, float value)
  415. {
  416. if (m_bInitialised)
  417. {
  418. object varFloat = new VariantWrapper(value);
  419. long lrt = CZEMApi.Set(str_param, ref varFloat);// set value
  420. if (lrt != 0)
  421. {
  422. LogManager.AddHardwareLog("Set " + str_param + " Faild - " + ErrorToString(lrt), false);
  423. return false;
  424. }
  425. return true;
  426. }
  427. else
  428. {
  429. LogManager.AddHardwareLog("ReadParams m_bInitialised = false", false);
  430. return false;
  431. }
  432. }
  433. #endregion
  434. #region 执行命令
  435. private Boolean ExecuteCmd(String cmd)
  436. {
  437. if (m_bInitialised)
  438. {
  439. long lrt = CZEMApi.Execute(cmd);// execute command
  440. if (lrt != 0)
  441. {
  442. LogManager.AddHardwareLog("ExecuteCmd " + cmd + " Faild - " + ErrorToString(lrt), false);
  443. return false;
  444. }
  445. else
  446. {
  447. return true;
  448. }
  449. }
  450. else
  451. {
  452. return false;
  453. }
  454. }
  455. #endregion
  456. #region SEM缩放
  457. /// <summary>
  458. /// 读取缩放倍数
  459. /// </summary>
  460. /// <returns>true:float or false:NaN</returns>
  461. public float GetMagnification()
  462. {
  463. float ret = 0;
  464. if(ReadParams(AP_MAG, ref ret))
  465. {
  466. LogManager.AddHardwareLog("GetMagnification " + ret.ToString() + " Success!", true);
  467. return ret;
  468. }
  469. else
  470. {
  471. LogManager.AddHardwareLog("GetMagnification Faild!", false);
  472. return float.NaN;
  473. }
  474. }
  475. /// <summary>
  476. /// 设置缩放倍数
  477. /// </summary>
  478. /// <param name="set">倍数</param>
  479. /// <returns>true or false</returns>
  480. public Boolean SetMagnification(float set)
  481. {
  482. Boolean ret = WriteParams(AP_MAG, set);
  483. LogManager.AddHardwareLog("SetMagnification = " + set.ToString(), ret);
  484. return ret;
  485. }
  486. #endregion
  487. #region SEM焦距
  488. /// <summary>
  489. /// 读取工作距离
  490. /// </summary>
  491. /// <returns>true:float or false:NaN</returns>
  492. public float GetWorkingDistance()
  493. {
  494. float ret = 0;
  495. if (ReadParams(AP_WD, ref ret))
  496. {
  497. LogManager.AddHardwareLog("GetWorkingDistance " + ret.ToString() + " Success!", true);
  498. return ret;
  499. }
  500. else
  501. {
  502. LogManager.AddHardwareLog("GetWorkingDistance Faild!", false);
  503. return float.NaN;
  504. }
  505. }
  506. /// <summary>
  507. /// 设置焦距
  508. /// </summary>
  509. /// <param name="set">焦距</param>
  510. /// <returns>true or false</returns>
  511. public Boolean SetWorkingDistance(float set)
  512. {
  513. Boolean ret = WriteParams(AP_WD, set);
  514. LogManager.AddHardwareLog("SetWorkingDistance = " + set.ToString(), ret);
  515. return ret;
  516. }
  517. #endregion
  518. #region 亮度
  519. /// <summary>
  520. /// 读取亮度
  521. /// </summary>
  522. /// <returns>true:float or false:NaN</returns>
  523. public float GetBrightness()
  524. {
  525. float ret = 0;
  526. if (ReadParams(AP_BRIGHTNESS, ref ret))
  527. {
  528. LogManager.AddHardwareLog("GetBrightness " + ret.ToString() + " Success!", true);
  529. return ret;
  530. }
  531. else
  532. {
  533. LogManager.AddHardwareLog("GetBrightness Faild!", false);
  534. return float.NaN;
  535. }
  536. }
  537. /// <summary>
  538. /// 设置亮度
  539. /// </summary>
  540. /// <param name="set">亮度</param>
  541. /// <returns>true or false</returns>
  542. public Boolean SetBrightness(float set)
  543. {
  544. Boolean ret = WriteParams(AP_BRIGHTNESS, set);
  545. LogManager.AddHardwareLog("SetBrightness = " + set.ToString(), ret);
  546. return ret;
  547. }
  548. #endregion
  549. #region 对比度
  550. /// <summary>
  551. /// 读取对比度
  552. /// </summary>
  553. /// <returns>true:float or false:NaN</returns>
  554. public float GetContrast()
  555. {
  556. float ret = 0;
  557. if (ReadParams(AP_CONTRAST, ref ret))
  558. {
  559. LogManager.AddHardwareLog("GetContrast " + ret.ToString() + " Success!", true);
  560. return ret;
  561. }
  562. else
  563. {
  564. LogManager.AddHardwareLog("GetContrast Faild!", false);
  565. return float.NaN;
  566. }
  567. }
  568. /// <summary>
  569. /// 设置对比度
  570. /// </summary>
  571. /// <param name="set">对比度</param>
  572. /// <returns>true or false</returns>
  573. public Boolean SetContrast(float set)
  574. {
  575. Boolean ret = WriteParams(AP_CONTRAST, set);
  576. LogManager.AddHardwareLog("SetContrast = " + set.ToString(), ret);
  577. return ret;
  578. }
  579. #endregion
  580. #region 自动亮度对比度
  581. /// <summary>
  582. /// 读取自动亮度对比度状态
  583. /// </summary>
  584. /// <returns>true:float or false:NaN</returns>
  585. public float GetAutoVideo()
  586. {
  587. float ret = 0;
  588. if (ReadParams(DP_AUTO_VIDEO, ref ret))
  589. {
  590. LogManager.AddHardwareLog("GetAutoVideo " + ret.ToString() + " Success!", true);
  591. return ret;
  592. }
  593. else
  594. {
  595. LogManager.AddHardwareLog("GetAutoVideo Faild!", false);
  596. return float.NaN;
  597. }
  598. }
  599. /// <summary>
  600. /// 设置自动亮度对比度状态
  601. /// </summary>
  602. /// <param name="set">0:off;1:B(亮度);2:C(对比度);3:BC</param>
  603. /// <returns>true or false</returns>
  604. public Boolean SetAutoVideoOff()
  605. {
  606. Boolean ret = WriteDataParams(DP_AUTO_VIDEO, (float)0);
  607. LogManager.AddHardwareLog("SetAutoVideoOff", ret);
  608. return ret;
  609. }
  610. public Boolean SetAutoVideoBrightness()
  611. {
  612. Boolean ret = WriteDataParams(DP_AUTO_VIDEO, (float)1);
  613. LogManager.AddHardwareLog("SetAutoVideoBrightness", ret);
  614. return ret;
  615. }
  616. public Boolean SetAutoVideoContrast()
  617. {
  618. Boolean ret = WriteDataParams(DP_AUTO_VIDEO, (float)2);
  619. LogManager.AddHardwareLog("SetAutoVideoContrast", ret);
  620. return ret;
  621. }
  622. public Boolean SetAutoVideoBrightnessAndContrast()
  623. {
  624. Boolean ret = WriteDataParams(DP_AUTO_VIDEO, (float)3);
  625. LogManager.AddHardwareLog("SetAutoVideoBrightnessAndContrast", ret);
  626. return ret;
  627. }
  628. #endregion
  629. #region 亮度目标
  630. /// <summary>
  631. /// 读取亮度目标
  632. /// </summary>
  633. /// <returns>true:float or false:NaN</returns>
  634. public float GetAutoBright()
  635. {
  636. float ret = 0;
  637. if (ReadParams(AP_AUTO_BRIGHT, ref ret))
  638. {
  639. LogManager.AddHardwareLog("GetAutoBright " + ret.ToString() + " Success!", true);
  640. return ret;
  641. }
  642. else
  643. {
  644. LogManager.AddHardwareLog("GetAutoBright Faild!", false);
  645. return float.NaN;
  646. }
  647. }
  648. /// <summary>
  649. /// 设置亮度目标
  650. /// </summary>
  651. /// <param name="set">亮度</param>
  652. /// <returns>true or false</returns>
  653. public Boolean SetAutoBright(float set)
  654. {
  655. Boolean ret = WriteParams(AP_AUTO_BRIGHT, set);
  656. LogManager.AddHardwareLog("SetAutoBright = " + set.ToString(), ret);
  657. return ret;
  658. }
  659. #endregion
  660. #region 对比度目标
  661. /// <summary>
  662. /// 读取对比度目标
  663. /// </summary>
  664. /// <returns>true:float or false:NaN</returns>
  665. public float GetAutoContrast()
  666. {
  667. float ret = 0;
  668. if (ReadParams(AP_AUTO_CONTRAST, ref ret))
  669. {
  670. LogManager.AddHardwareLog("GetAutoContrast " + ret.ToString() + " Success!", true);
  671. return ret;
  672. }
  673. else
  674. {
  675. LogManager.AddHardwareLog("GetAutoContrast Faild!", false);
  676. return float.NaN;
  677. }
  678. }
  679. /// <summary>
  680. /// 设置对比度目标
  681. /// </summary>
  682. /// <param name="set">对比度目标</param>
  683. /// <returns>true or false</returns>
  684. public Boolean SetAutoContrast(float set)
  685. {
  686. Boolean ret = WriteParams(AP_AUTO_CONTRAST, set);
  687. LogManager.AddHardwareLog("SetAutoContrast = " + set.ToString(), ret);
  688. return ret;
  689. }
  690. #endregion
  691. #region SEM消像散
  692. /// <summary>
  693. /// 读取消像散X
  694. /// </summary>
  695. /// <returns>true:float or false:NaN</returns>
  696. public float GetAstigmatismX()
  697. {
  698. float ret = 0;
  699. if (ReadParams(AP_STIG_X, ref ret))
  700. {
  701. LogManager.AddHardwareLog("GetAstigmatismX " + ret.ToString() + " Success!", true);
  702. return ret;
  703. }
  704. else
  705. {
  706. LogManager.AddHardwareLog("GetAstigmatismX Faild!", false);
  707. return float.NaN;
  708. }
  709. }
  710. /// <summary>
  711. /// 读取消像散Y
  712. /// </summary>
  713. /// <returns>true:float or false:NaN</returns>
  714. public float GetAstigmatismY()
  715. {
  716. float ret = 0;
  717. if (ReadParams(AP_STIG_Y, ref ret))
  718. {
  719. LogManager.AddHardwareLog("GetAstigmatismY " + ret.ToString() + " Success!", true);
  720. return ret;
  721. }
  722. else
  723. {
  724. LogManager.AddHardwareLog("GetAstigmatismY Faild!", false);
  725. return float.NaN;
  726. }
  727. }
  728. /// <summary>
  729. /// 设置消像散X
  730. /// </summary>
  731. /// <param name="set">对比度</param>
  732. /// <returns>true or false</returns>
  733. public Boolean SetAstigmatismX(float set)
  734. {
  735. Boolean ret = WriteParams(AP_STIG_X, set);
  736. LogManager.AddHardwareLog("SetAstigmatismX = " + set.ToString(), ret);
  737. return ret;
  738. }
  739. /// <summary>
  740. /// 设置消像散Y
  741. /// </summary>
  742. /// <param name="set">对比度</param>
  743. /// <returns>true or false</returns>
  744. public Boolean SetAstigmatismY(float set)
  745. {
  746. Boolean ret = WriteParams(AP_STIG_Y, set);
  747. LogManager.AddHardwareLog("SetAstigmatismY = " +set.ToString(), ret);
  748. return ret;
  749. }
  750. #endregion
  751. #region 角度补偿
  752. /// <summary>
  753. /// 读取角度补偿
  754. /// </summary>
  755. /// <returns>true:float or false:NaN</returns>
  756. public float GetTiltAngle()
  757. {
  758. float ret = 0;
  759. if (ReadParams(AP_TILT_ANGLE, ref ret))
  760. {
  761. LogManager.AddHardwareLog("GetTiltAngle " + ret.ToString() + " Success!", true);
  762. return ret;
  763. }
  764. else
  765. {
  766. LogManager.AddHardwareLog("GetTiltAngle Faild!", false);
  767. return float.NaN;
  768. }
  769. }
  770. /// <summary>
  771. /// 角度补偿解锁
  772. /// </summary>
  773. /// <returns></returns>
  774. public Boolean SetTiltAngleOn()
  775. {
  776. Boolean ret = WriteDataParams(DP_TILT_CORRECTION, 1);
  777. LogManager.AddHardwareLog("Set DP_TILT_CORRECTION = 1.", ret);
  778. return ret;
  779. }
  780. /// <summary>
  781. /// 角度补偿锁定
  782. /// </summary>
  783. /// <returns></returns>
  784. public Boolean SetTiltAngleOff()
  785. {
  786. Boolean ret = WriteDataParams(DP_TILT_CORRECTION, 0);
  787. LogManager.AddHardwareLog("Set DP_TILT_CORRECTION = 0.", ret);
  788. return ret;
  789. }
  790. /// <summary>
  791. /// 设置角度补偿
  792. /// </summary>
  793. /// <param name="set">角度补偿</param>
  794. /// <returns>true or false</returns>
  795. public Boolean SetTiltAngle(float set)
  796. {
  797. Boolean ret = false;
  798. //ret = WriteDataParams(DP_TILT_CORRECTION, 1);
  799. //LogManager.AddHardwareLog("Set DP_TILT_CORRECTION = 1.", ret);
  800. ret = WriteParams(AP_TILT_ANGLE, set);
  801. LogManager.AddHardwareLog("SetTiltAngle = " + set.ToString(), ret);
  802. //ret = WriteDataParams(DP_TILT_CORRECTION, 0);
  803. //LogManager.AddHardwareLog("Set DP_TILT_CORRECTION = 0.", ret);
  804. return ret;
  805. }
  806. #endregion
  807. #region 图像大小
  808. public int[] GetImageStore()
  809. {
  810. int[] i_ret = new int[2];
  811. float ret = 0;
  812. if (ReadParams(DP_IMAGE_STORE, ref ret))
  813. {
  814. switch (ret)
  815. {
  816. case 0:
  817. i_ret[0] = 1024;
  818. i_ret[1] = 768;
  819. break;
  820. case 1:
  821. i_ret[0] = 512;
  822. i_ret[1] = 384;
  823. break;
  824. case 2:
  825. i_ret[0] = 2048;
  826. i_ret[1] = 1536;
  827. break;
  828. case 3:
  829. i_ret[0] = 3072;
  830. i_ret[1] = 2304;
  831. break;
  832. case 4:
  833. i_ret[0] = 4096;
  834. i_ret[1] = 3072;
  835. break;
  836. case 5:
  837. i_ret[0] = 5120;
  838. i_ret[1] = 3840;
  839. break;
  840. case 6:
  841. i_ret[0] = 6144;
  842. i_ret[1] = 4608;
  843. break;
  844. case 7:
  845. i_ret[0] = 8192;
  846. i_ret[1] = 6144;
  847. break;
  848. case 8:
  849. i_ret[0] = 12288;
  850. i_ret[1] = 9216;
  851. break;
  852. case 9:
  853. i_ret[0] = 16384;
  854. i_ret[1] = 12288;
  855. break;
  856. case 10:
  857. i_ret[0] = 24576;
  858. i_ret[1] = 18432;
  859. break;
  860. case 11:
  861. i_ret[0] = 32768;
  862. i_ret[1] = 24576;
  863. break;
  864. default:
  865. i_ret[0] = 0;
  866. i_ret[1] = 0;
  867. break;
  868. }
  869. LogManager.AddHardwareLog("GetImageStore=" + i_ret[0].ToString() + "*" + i_ret[1].ToString(), true);
  870. }
  871. else
  872. {
  873. LogManager.AddHardwareLog("GetImageStore Faild!", false);
  874. i_ret[0] = 0;
  875. i_ret[1] = 0;
  876. }
  877. return i_ret;
  878. }
  879. public Boolean SetImageStore(float set)
  880. {
  881. Boolean ret = WriteDataParams("DP_IMAGE_STORE", set);
  882. LogManager.AddHardwareLog("SetImageStore = " + set.ToString(), ret);
  883. return ret;
  884. }
  885. #endregion
  886. #region 扫描周期
  887. public float GetCycleTime()
  888. {
  889. float ret = 0;
  890. if (ReadParams(AP_FRAME_TIME, ref ret))
  891. {
  892. LogManager.AddHardwareLog("GetCycleTime=" + ret.ToString(), true);
  893. }
  894. else
  895. {
  896. LogManager.AddHardwareLog("GetCycleTime Faild!", false);
  897. }
  898. return ret;
  899. }
  900. #endregion
  901. #region SEM电压
  902. /// <summary>
  903. /// 读取电压
  904. /// </summary>
  905. /// <returns>true:float or false:NaN</returns>
  906. public float GetSEMVoltage()
  907. {
  908. float ret = 0;
  909. if (ReadParams(AP_MANUALKV, ref ret))
  910. {
  911. LogManager.AddHardwareLog("SEM_Voltage " + ret.ToString() + " Success!", true);
  912. return ret;
  913. }
  914. else
  915. {
  916. LogManager.AddHardwareLog("SEM_Voltage Faild!", false);
  917. return float.NaN;
  918. }
  919. }
  920. /// <summary>
  921. /// 设置电压
  922. /// </summary>
  923. /// <param name="set">电压</param>
  924. /// <returns>true or false</returns>
  925. public Boolean SetSEMVoltage(float set)
  926. {
  927. Boolean ret = WriteParams(AP_MANUALKV, set);
  928. LogManager.AddHardwareLog("SetSEMVoltage = " + set.ToString(), ret);
  929. return ret;
  930. }
  931. #endregion
  932. #region 抓取图像
  933. /// <summary>
  934. /// 抓取图像
  935. /// </summary>
  936. /// <returns>true:float or false:NaN</returns>
  937. public Boolean GrabImage(String filename, short xoff,short yoff, short width,short height,short type)
  938. {
  939. if (m_bInitialised)
  940. {
  941. long lrt = CZEMApi.Grab(xoff, yoff, width, height, type, filename);
  942. if (lrt != 0)
  943. {
  944. LogManager.AddHardwareLog("GrabImage Faild!", false);
  945. return false;
  946. }
  947. else
  948. {
  949. LogManager.AddHardwareLog("GrabImage Filename=" + filename + ",x,y,w,h,type=" + xoff.ToString() + "," +
  950. yoff.ToString() + "," + width.ToString() + "," + height.ToString() + "," + type.ToString(), true);
  951. while (true)
  952. {
  953. Thread.Sleep(1000);
  954. float sta = GetImageFrozen();
  955. if (sta == 1)
  956. {
  957. LogManager.AddHardwareLog("ImageLive", true);
  958. ImageLive();
  959. break;
  960. }
  961. }
  962. return true;
  963. }
  964. }
  965. else
  966. {
  967. LogManager.AddHardwareLog("GrabImage m_bInitialised = False!", false);
  968. return false;
  969. }
  970. }
  971. #endregion
  972. #region 图像解冻
  973. public float GetImageFrozen()
  974. {
  975. float ret = 0;
  976. if (ReadParams(DP_FROZEN, ref ret))
  977. {
  978. LogManager.AddHardwareLog("GetImageFrozen " + ret.ToString() + " Success!", true);
  979. return ret;
  980. }
  981. else
  982. {
  983. LogManager.AddHardwareLog("GetImageFrozen Faild!", false);
  984. return float.NaN;
  985. }
  986. }
  987. public Boolean ImageFrozen()
  988. {
  989. Boolean ret = WriteDataParams(DP_FROZEN, (float)1);
  990. LogManager.AddHardwareLog("ImageFrozen!", ret);
  991. return ret;
  992. }
  993. public Boolean ImageLive()
  994. {
  995. Boolean ret = WriteDataParams(DP_FROZEN, (float)0);
  996. LogManager.AddHardwareLog("ImageLive!", ret);
  997. return ret;
  998. }
  999. #endregion
  1000. #region 图像类型切换
  1001. public Boolean DetectorType(float set)
  1002. {
  1003. Boolean ret = WriteDataParams(DP_DETECTOR_TYPE, set);
  1004. LogManager.AddHardwareLog("DetectorType = " + set.ToString(), ret);
  1005. return ret;
  1006. }
  1007. #endregion
  1008. #region SEM电子束移动接口
  1009. /// <summary>
  1010. /// 获取电子束移动接口X
  1011. /// </summary>
  1012. /// <returns>true:float or false:NaN</returns>
  1013. public float GetBeamShiftX()
  1014. {
  1015. float ret = 0;
  1016. if (ReadParams(AP_BEAMSHIFT_X, ref ret))
  1017. {
  1018. LogManager.AddHardwareLog("GetBeamShiftX " + ret.ToString() + " Success!", true);
  1019. return ret;
  1020. }
  1021. else
  1022. {
  1023. LogManager.AddHardwareLog("GetBeamShiftX Faild!", false);
  1024. return float.NaN;
  1025. }
  1026. }
  1027. /// <summary>
  1028. /// 获取电子束移动接口Y
  1029. /// </summary>
  1030. /// <returns>true:float or false:NaN</returns>
  1031. public float GetBeamShiftY()
  1032. {
  1033. float ret = 0;
  1034. if (ReadParams(AP_BEAMSHIFT_Y, ref ret))
  1035. {
  1036. LogManager.AddHardwareLog("GetBeamShiftY " + ret.ToString() + " Success!", true);
  1037. return ret;
  1038. }
  1039. else
  1040. {
  1041. LogManager.AddHardwareLog("GetBeamShiftY Faild!", false);
  1042. return float.NaN;
  1043. }
  1044. }
  1045. /// <summary>
  1046. /// 设置电子束移动接口X
  1047. /// </summary>
  1048. /// <param name="set">X坐标</param>
  1049. /// <returns>true or false</returns>
  1050. public Boolean SetBeamShiftX(float set)
  1051. {
  1052. Boolean ret = WriteParams(AP_BEAMSHIFT_X, set);
  1053. LogManager.AddHardwareLog("SetBeamShiftX=" + set.ToString(), ret);
  1054. return ret;
  1055. }
  1056. /// <summary>
  1057. /// 设置电子束移动接口Y
  1058. /// </summary>
  1059. /// <param name="set">X坐标</param>
  1060. /// <returns>true or false</returns>
  1061. public Boolean SetBeamShiftY(float set)
  1062. {
  1063. Boolean ret = WriteParams(AP_BEAMSHIFT_Y, set);
  1064. LogManager.AddHardwareLog("SetBeamShiftY=" + set.ToString(), ret);
  1065. return ret;
  1066. }
  1067. #endregion
  1068. #region SEM电子束移动距离接口
  1069. /// <summary>
  1070. /// 获取电子束移动距离接口X值
  1071. /// </summary>
  1072. /// <returns>true:float or false:NaN</returns>
  1073. public float GetBeamOffsetX()
  1074. {
  1075. float ret = 0;
  1076. if (ReadParams(AP_BEAM_OFFSET_X, ref ret))
  1077. {
  1078. LogManager.AddHardwareLog("AP_BEAM_OFFSET_X " + ret.ToString() + " Success!", true);
  1079. return ret;
  1080. }
  1081. else
  1082. {
  1083. LogManager.AddHardwareLog("AP_BEAM_OFFSET_X Faild!", false);
  1084. return float.NaN;
  1085. }
  1086. }
  1087. /// <summary>
  1088. /// 获取电子束移动距离接口Y值
  1089. /// </summary>
  1090. /// <returns>true:float or false:NaN</returns>
  1091. public float GetBeamOffsetY()
  1092. {
  1093. float ret = 0;
  1094. if (ReadParams(AP_BEAM_OFFSET_Y, ref ret))
  1095. {
  1096. LogManager.AddHardwareLog("AP_BEAM_OFFSET_Y " + ret.ToString() + " Success!", true);
  1097. return ret;
  1098. }
  1099. else
  1100. {
  1101. LogManager.AddHardwareLog("AP_BEAM_OFFSET_Y Faild!", false);
  1102. return float.NaN;
  1103. }
  1104. }
  1105. /// <summary>
  1106. /// 设置电子束移动距离接口X值
  1107. /// </summary>
  1108. /// <param name="set">X坐标</param>
  1109. /// <returns>true or false</returns>
  1110. public Boolean SetBeamOffsetX(float set)
  1111. {
  1112. Boolean ret = WriteParams(AP_BEAM_OFFSET_X, set);
  1113. LogManager.AddHardwareLog("AP_BEAM_OFFSET_X=" + set.ToString(), ret);
  1114. return ret;
  1115. }
  1116. /// <summary>
  1117. /// 设置电子束移动接口Y
  1118. /// </summary>
  1119. /// <param name="set">X坐标</param>
  1120. /// <returns>true or false</returns>
  1121. public Boolean SetBeamOffsetY(float set)
  1122. {
  1123. Boolean ret = WriteParams(AP_BEAM_OFFSET_Y, set);
  1124. LogManager.AddHardwareLog("AP_BEAM_OFFSET_Y=" + set.ToString(), ret);
  1125. return ret;
  1126. }
  1127. #endregion
  1128. #region 样品台移动接口
  1129. /// <summary>
  1130. /// 返回样品台坐标数组
  1131. /// </summary>
  1132. /// <returns>Lenght=6</returns>
  1133. public float[] GetStagePosition()
  1134. {
  1135. object retx = new VariantWrapper((float)0.0f);
  1136. object rety = new VariantWrapper((float)0.0f);
  1137. object retz = new VariantWrapper((float)0.0f);
  1138. object rett = new VariantWrapper((float)0.0f);
  1139. object retr = new VariantWrapper((float)0.0f);
  1140. object retm = new VariantWrapper((float)0.0f);
  1141. float[] ret = new float[6];
  1142. if (m_bInitialised)
  1143. {
  1144. CZEMApi.GetStagePosition(ref retx, ref rety, ref retz, ref rett, ref retr, ref retm);
  1145. ret[0] = Convert.ToSingle(retx);
  1146. ret[1] = Convert.ToSingle(rety);
  1147. ret[2] = Convert.ToSingle(retz);
  1148. ret[3] = Convert.ToSingle(rett);
  1149. ret[4] = Convert.ToSingle(retr);
  1150. ret[5] = Convert.ToSingle(retm);
  1151. LogManager.AddHardwareLog("GetStagePosition x,y,z,t,r,m = " + retx.ToString() + "," + rety.ToString() +
  1152. "," + retz.ToString() + "," + rett.ToString() + "," + retr.ToString() + "," + retm.ToString(), true);
  1153. }
  1154. else
  1155. {
  1156. ret[0] = float.NaN;
  1157. ret[1] = float.NaN;
  1158. ret[2] = float.NaN;
  1159. ret[3] = float.NaN;
  1160. ret[4] = float.NaN;
  1161. ret[5] = float.NaN;
  1162. LogManager.AddHardwareLog("GetStagePosition Faild!", false);
  1163. }
  1164. return ret;
  1165. }
  1166. /// <summary>
  1167. /// 设置样品台坐标数组
  1168. /// </summary>
  1169. /// <returns>Lenght=6</returns>
  1170. private Boolean SetStagePosition(float[] set)
  1171. {
  1172. if (m_bInitialised)
  1173. {
  1174. long lrt = CZEMApi.MoveStage(set[0], set[1], set[2], set[3], set[4], set[5]);
  1175. if(lrt==0)
  1176. {
  1177. LogManager.AddHardwareLog("SetStagePosition x,y,z,t,r,m = " + set[0].ToString() + "," + set[1].ToString() +
  1178. "," + set[2].ToString() + "," + set[3].ToString() + "," + set[4].ToString() + "," + set[5].ToString(), true);
  1179. return true;
  1180. }
  1181. else
  1182. {
  1183. LogManager.AddHardwareLog("SetStagePosition Faild!", false);
  1184. return false;
  1185. }
  1186. }
  1187. else
  1188. {
  1189. LogManager.AddHardwareLog("SetStagePosition m_bInitialised = false!", false);
  1190. return false;
  1191. }
  1192. }
  1193. /// <summary>
  1194. /// 样品台位置 X轴
  1195. /// </summary>
  1196. /// <returns>true:float or false:NaN</returns>
  1197. public float GetStageAtX()
  1198. {
  1199. float ret = 0;
  1200. if (ReadParams(AP_STAGE_AT_X, ref ret))
  1201. {
  1202. LogManager.AddHardwareLog("GetStageAtX Success!", true);
  1203. return ret;
  1204. }
  1205. else
  1206. {
  1207. LogManager.AddHardwareLog("GetStageAtX Faild!", false);
  1208. return float.NaN;
  1209. }
  1210. }
  1211. /// <summary>
  1212. /// 样品台位置 Y轴
  1213. /// </summary>
  1214. /// <returns>true:float or false:NaN</returns>
  1215. public float GetStageAtY()
  1216. {
  1217. float ret = 0;
  1218. if (ReadParams(AP_STAGE_AT_Y, ref ret))
  1219. {
  1220. LogManager.AddHardwareLog("GetStageAtY Success!", true);
  1221. return ret;
  1222. }
  1223. else
  1224. {
  1225. LogManager.AddHardwareLog("GetStageAtY Faild!", false);
  1226. return float.NaN;
  1227. }
  1228. }
  1229. /// <summary>
  1230. /// 样品台位置 Z轴
  1231. /// </summary>
  1232. /// <returns>true:float or false:NaN</returns>
  1233. public float GetStageAtZ()
  1234. {
  1235. float ret = 0;
  1236. if (ReadParams(AP_STAGE_AT_Z, ref ret))
  1237. {
  1238. LogManager.AddHardwareLog("GetStageAtZ Success!", true);
  1239. return ret;
  1240. }
  1241. else
  1242. {
  1243. LogManager.AddHardwareLog("GetStageAtZ Faild!", false);
  1244. return float.NaN;
  1245. }
  1246. }
  1247. /// <summary>
  1248. /// 样品台位置 T轴
  1249. /// </summary>
  1250. /// <returns>true:float or false:NaN</returns>
  1251. public float GetStageAtT()
  1252. {
  1253. float ret = 0;
  1254. if (ReadParams(AP_STAGE_AT_T, ref ret))
  1255. {
  1256. LogManager.AddHardwareLog("GetStageAtT Success!", true);
  1257. return ret;
  1258. }
  1259. else
  1260. {
  1261. LogManager.AddHardwareLog("GetStageAtT Faild!", false);
  1262. return float.NaN;
  1263. }
  1264. }
  1265. /// <summary>
  1266. /// 样品台位置 R轴
  1267. /// </summary>
  1268. /// <returns>true:float or false:NaN</returns>
  1269. public float GetStageAtR()
  1270. {
  1271. float ret = 0;
  1272. if (ReadParams(AP_STAGE_AT_R, ref ret))
  1273. {
  1274. LogManager.AddHardwareLog("GetStageAtR Success!", true);
  1275. return ret;
  1276. }
  1277. else
  1278. {
  1279. LogManager.AddHardwareLog("GetStageAtR Faild!", false);
  1280. return float.NaN;
  1281. }
  1282. }
  1283. /// <summary>
  1284. /// 样品台位置 M轴
  1285. /// </summary>
  1286. /// <returns>true:float or false:NaN</returns>
  1287. public float GetStageAtM()
  1288. {
  1289. float ret = 0;
  1290. if (ReadParams(AP_STAGE_AT_M, ref ret))
  1291. {
  1292. LogManager.AddHardwareLog("GetStageAtM Success!", true);
  1293. return ret;
  1294. }
  1295. else
  1296. {
  1297. LogManager.AddHardwareLog("GetStageAtM Faild!", false);
  1298. return float.NaN;
  1299. }
  1300. }
  1301. /// <summary>
  1302. /// 样品台位置 X轴
  1303. /// </summary>
  1304. /// <param name="set">X轴移动坐标</param>
  1305. /// <returns></returns>
  1306. public Boolean SetStageGotoX(float set)
  1307. {
  1308. Boolean ret = WriteParams(AP_STAGE_GOTO_X, set);
  1309. LogManager.AddHardwareLog("SetStageGotoX = " + set.ToString(), ret);
  1310. return ret;
  1311. }
  1312. /// <summary>
  1313. /// 样品台位置 Y轴
  1314. /// </summary>
  1315. /// <param name="set">Y轴移动坐标</param>
  1316. /// <returns></returns>
  1317. public Boolean SetStageGotoY(float set)
  1318. {
  1319. Boolean ret = WriteParams(AP_STAGE_GOTO_Y, set);
  1320. LogManager.AddHardwareLog("SetStageGotoY = " + set.ToString(), ret);
  1321. return ret;
  1322. }
  1323. /// <summary>
  1324. /// 样品台位置 Z轴
  1325. /// </summary>
  1326. /// <param name="set">Y轴移动坐标</param>
  1327. /// <returns></returns>
  1328. public Boolean SetStageGotoZ(float set)
  1329. {
  1330. Boolean ret = WriteParams(AP_STAGE_GOTO_Z, set);
  1331. LogManager.AddHardwareLog("SetStageGotoZ = " + set.ToString(), ret);
  1332. return ret;
  1333. }
  1334. /// <summary>
  1335. /// 样品台位置 T轴
  1336. /// </summary>
  1337. /// <param name="set">Y轴移动坐标</param>
  1338. /// <returns></returns>
  1339. public Boolean SetStageGotoT(float set)
  1340. {
  1341. Boolean ret = WriteParams(AP_STAGE_GOTO_T, set);
  1342. LogManager.AddHardwareLog("SetStageGotoT = " + set.ToString(), ret);
  1343. return ret;
  1344. }
  1345. /// <summary>
  1346. /// 样品台位置 R轴
  1347. /// </summary>
  1348. /// <param name="set">Y轴移动坐标</param>
  1349. /// <returns></returns>
  1350. public Boolean SetStageGotoR(float set)
  1351. {
  1352. Boolean ret = WriteParams(AP_STAGE_GOTO_R, set);
  1353. LogManager.AddHardwareLog("SetStageGotoR = " + set.ToString(), ret);
  1354. return ret;
  1355. }
  1356. /// <summary>
  1357. /// 样品台位置 R轴拉直
  1358. /// </summary>
  1359. /// <param name="set">R轴拉直角度</param>
  1360. /// <returns></returns>
  1361. public Boolean SetStageDeltaR(float set)
  1362. {
  1363. Boolean ret = WriteParams(AP_STAGE_DELTA_R, set);
  1364. LogManager.AddHardwareLog("AP_STAGE_DELTA_R = " + set.ToString(), ret);
  1365. return ret;
  1366. }
  1367. /// <summary>
  1368. /// 样品台位置 M轴
  1369. /// </summary>
  1370. /// <param name="set">M轴移动坐标</param>
  1371. /// <returns></returns>
  1372. public Boolean SetStageGotoM(float set)
  1373. {
  1374. Boolean ret = WriteParams(AP_STAGE_GOTO_M, set);
  1375. LogManager.AddHardwareLog("SetStageGotoM = " + set.ToString(), ret);
  1376. return ret;
  1377. }
  1378. #endregion
  1379. #region 移动样品台XY轴
  1380. public Boolean MoveStageXY(float x,float y)
  1381. {
  1382. //先取范围
  1383. object xMin = new VariantWrapper((float)0.0f);
  1384. object xMax = new VariantWrapper((float)0.0f);
  1385. long lrt = CZEMApi.GetLimits(AP_STAGE_GOTO_X, ref xMin, ref xMax);
  1386. if (lrt != 0)
  1387. {
  1388. LogManager.AddHardwareLog("GetLimits AP_STAGE_GOTO_X Faild!", false);
  1389. return false;
  1390. }
  1391. if (x > Convert.ToSingle(xMax) || x < Convert.ToSingle(xMin))
  1392. {
  1393. LogManager.AddHardwareLog("GetLimits AP_STAGE_GOTO_X Max,Min,x = " + xMax.ToString() + "," + xMin.ToString() +
  1394. "," + x.ToString(), false);
  1395. return false;
  1396. }
  1397. object yMin = new VariantWrapper((float)0.0f);
  1398. object yMax = new VariantWrapper((float)0.0f);
  1399. lrt = CZEMApi.GetLimits(AP_STAGE_GOTO_Y, ref yMin, ref yMax);
  1400. if (lrt != 0)
  1401. {
  1402. LogManager.AddHardwareLog("GetLimits AP_STAGE_GOTO_Y Faild!", false);
  1403. return false;
  1404. }
  1405. if (y > Convert.ToSingle(yMax) || y < Convert.ToSingle(yMin))
  1406. {
  1407. LogManager.AddHardwareLog("GetLimits AP_STAGE_GOTO_Y Max,Min,y = " + yMax.ToString() + "," + yMin.ToString() +
  1408. "," + y.ToString(), false);
  1409. return false;
  1410. }
  1411. float[] gsp = GetStagePosition();
  1412. gsp[0] = x;
  1413. gsp[1] = y;
  1414. return SetStagePosition(gsp);
  1415. }
  1416. #endregion
  1417. #region 样品台急停
  1418. public Boolean CmdStageAbort()
  1419. {
  1420. Boolean ret = ExecuteCmd(CMD_STAGE_ABORT);
  1421. LogManager.AddHardwareLog("CmdStageAbort!", ret);
  1422. return ret;
  1423. }
  1424. #endregion
  1425. #region Scan Rotate角度接口
  1426. /// <summary>
  1427. /// 获取Scan Rotate角度接口
  1428. /// </summary>
  1429. /// <returns>true:float or false:NaN</returns>
  1430. public float GetScanRotation()
  1431. {
  1432. float ret = 0;
  1433. if (ReadParams(AP_SCANROTATION, ref ret))
  1434. {
  1435. LogManager.AddHardwareLog("GetScanRotation Success!", true);
  1436. return ret;
  1437. }
  1438. else
  1439. {
  1440. LogManager.AddHardwareLog("GetScanRotation Faild!", false);
  1441. return float.NaN;
  1442. }
  1443. }
  1444. /// <summary>
  1445. /// ScanRotation解锁
  1446. /// </summary>
  1447. /// <returns></returns>
  1448. public Boolean SetScanRotationOn()
  1449. {
  1450. Boolean ret = WriteDataParams(DP_SCAN_ROT, 1);
  1451. LogManager.AddHardwareLog("SetScanRotation DP_SCAN_ROT = 1", ret);
  1452. return ret;
  1453. }
  1454. /// <summary>
  1455. /// ScanRotation锁定
  1456. /// </summary>
  1457. /// <returns></returns>
  1458. public Boolean SetScanRotationOff()
  1459. {
  1460. Boolean ret = WriteDataParams(DP_SCAN_ROT, 0);
  1461. LogManager.AddHardwareLog("SetScanRotation DP_SCAN_ROT = 0", ret);
  1462. return ret;
  1463. }
  1464. /// <summary>
  1465. /// 设置Scan Rotate角度接口
  1466. /// </summary>
  1467. /// <param name="set">角度补偿</param>
  1468. /// <returns>true or false</returns>
  1469. public Boolean SetScanRotation(float set)
  1470. {
  1471. Boolean ret = false;
  1472. //ret = WriteDataParams(DP_SCAN_ROT, 1);
  1473. //LogManager.AddHardwareLog("SetScanRotation DP_SCAN_ROT = 1", ret);
  1474. ret = WriteParams(AP_SCANROTATION, set);
  1475. LogManager.AddHardwareLog("SetScanRotation = " + set.ToString(), ret);
  1476. //ret = WriteDataParams(DP_SCAN_ROT, 0);
  1477. //LogManager.AddHardwareLog("SetScanRotation DP_SCAN_ROT = 0", ret);
  1478. return ret;
  1479. }
  1480. #endregion
  1481. #region 像素读取PixelSize
  1482. /// <summary>
  1483. /// 获取Pixel Size 接口,只读
  1484. /// </summary>
  1485. /// <returns>true:float or false:NaN</returns>
  1486. public float GetPixelSize()
  1487. {
  1488. float ret = 0;
  1489. if (ReadParams(AP_PIXEL_SIZE, ref ret))
  1490. {
  1491. LogManager.AddHardwareLog("GetPixelSize " + ret.ToString() + " Success!", true);
  1492. return ret;
  1493. }
  1494. else
  1495. {
  1496. LogManager.AddHardwareLog("GetPixelSize Faild!", false);
  1497. return float.NaN;
  1498. }
  1499. }
  1500. #endregion
  1501. #region 电子束校正设置
  1502. /// <summary>
  1503. /// 读取电子束校正状态
  1504. /// </summary>
  1505. /// <returns></returns>
  1506. public float GetTiltCorrection()
  1507. {
  1508. float ret = 0;
  1509. if (ReadParams(DP_TILT_CORRECTION, ref ret))
  1510. {
  1511. LogManager.AddHardwareLog("GetTiltCorrection " + ret.ToString() + " Success!", true);
  1512. return ret;
  1513. }
  1514. else
  1515. {
  1516. LogManager.AddHardwareLog("GetTiltCorrection Faild!", false);
  1517. return float.NaN;
  1518. }
  1519. }
  1520. /// <summary>
  1521. /// 设置电子束校正状态
  1522. /// </summary>
  1523. /// <param name="set"></param>
  1524. /// <returns></returns>
  1525. public Boolean SetTiltCorrectionOff()
  1526. {
  1527. Boolean ret = WriteDataParams(DP_TILT_CORRECTION, (float)0);
  1528. LogManager.AddHardwareLog("SetTiltCorrectionOff!", ret);
  1529. return ret;
  1530. }
  1531. public Boolean SetTiltCorrectionOn()
  1532. {
  1533. Boolean ret = WriteDataParams(DP_TILT_CORRECTION, (float)1);
  1534. LogManager.AddHardwareLog("SetTiltCorrectionOn!", ret);
  1535. return ret;
  1536. }
  1537. #endregion
  1538. #region 开启电压
  1539. public Boolean CmdOpenVoltage()
  1540. {
  1541. Boolean ret = ExecuteCmd(CMD_BEAM_ON);
  1542. LogManager.AddHardwareLog("CmdOpenVoltage!", ret);
  1543. return ret;
  1544. }
  1545. #endregion
  1546. #region 关闭电压
  1547. public Boolean CmdCloseVoltage()
  1548. {
  1549. Boolean ret = ExecuteCmd(CMD_EHT_OFF);
  1550. LogManager.AddHardwareLog("CmdCloseVoltage!", ret);
  1551. return ret;
  1552. }
  1553. #endregion
  1554. #region 自动对焦1
  1555. public Boolean CmdAutoFocusCoarse()
  1556. {
  1557. Boolean ret = ExecuteCmd(CMD_AUTO_FOCUS_COARSE);
  1558. LogManager.AddHardwareLog("CmdAutoFocusCoarse!", ret);
  1559. return ret;
  1560. }
  1561. #endregion
  1562. #region 自动对焦2
  1563. public Boolean CmdAutoFocusFine()
  1564. {
  1565. Boolean ret = ExecuteCmd(CMD_AUTO_FOCUS_FINE);
  1566. LogManager.AddHardwareLog("CmdAutoFocusFine!", ret);
  1567. return ret;
  1568. }
  1569. #endregion
  1570. #region 自动消像散
  1571. public Boolean CmdAutoStig()
  1572. {
  1573. Boolean ret = ExecuteCmd(CMD_AUTO_STIG);
  1574. LogManager.AddHardwareLog("CmdAutoStig!", ret);
  1575. return ret;
  1576. }
  1577. #endregion
  1578. #region 调用宏文件命令
  1579. public Boolean CMDMCFFilename(String _MLFFullFileName)
  1580. {
  1581. //String CMDMCF = MCF_FILENAME + filename;
  1582. //Boolean ret = ExecuteCmd(CMDMCF);
  1583. //LogManager.AddHardwareLog("CMDMCFFilename = " + filename, ret);
  1584. //return ret;
  1585. if (File.Exists(_MLFFullFileName) && Directory.Exists(MLFPATH))
  1586. {
  1587. //移动文件
  1588. if (_MLFFullFileName != (MLFPATH + MLFFILENAME))
  1589. {
  1590. File.Copy(_MLFFullFileName, MLFPATH + MLFFILENAME, true);
  1591. LogManager.AddHardwareLog("CmdFIBLoadMLF Copy FileName:" + _MLFFullFileName + " To " + MLFPATH + MLFFILENAME, true);
  1592. }
  1593. Boolean ret = ExecuteCmd(MCF_FILENAME + MLFFILENAME.Substring(0,MLFFILENAME.Length-4));
  1594. LogManager.AddHardwareLog("CmdFIBLoadMLF Success Execute " + _MLFFullFileName, true);
  1595. return ret;
  1596. }
  1597. else
  1598. {
  1599. LogManager.AddHardwareLog("CmdFIBLoadMLF Faild:" + _MLFFullFileName + " Is Not Exists!", false);
  1600. return false;
  1601. }
  1602. }
  1603. #endregion
  1604. #region 读取样品台状态
  1605. public float GetStageIs()
  1606. {
  1607. float ret = 0;
  1608. if (ReadParams(DP_STAGE_IS, ref ret))
  1609. {
  1610. LogManager.AddHardwareLog("GetStageIs " + ret.ToString() + " Success!", true);
  1611. return ret;
  1612. }
  1613. else
  1614. {
  1615. LogManager.AddHardwareLog("GetStageIs Faild!", false);
  1616. return float.NaN;
  1617. }
  1618. }
  1619. #endregion
  1620. #region 读取自动函数的状态
  1621. public float GetAutoFunction()
  1622. {
  1623. float ret = 0;
  1624. if (ReadParams(DP_AUTO_FUNCTION, ref ret))
  1625. {
  1626. LogManager.AddHardwareLog("GetAutoFunction " + ret.ToString() + " Success!", true);
  1627. return ret;
  1628. }
  1629. else
  1630. {
  1631. LogManager.AddHardwareLog("GetAutoFunction Faild!", false);
  1632. return float.NaN;
  1633. }
  1634. }
  1635. #endregion
  1636. #region FIB缩放
  1637. /// <summary>
  1638. /// 读取缩放倍数
  1639. /// </summary>
  1640. /// <returns>true:float or false:NaN</returns>
  1641. public float GetFIBMagnification()
  1642. {
  1643. float ret = 0;
  1644. if (ReadParams(AP_FIB_MAGNIFICATION, ref ret))
  1645. {
  1646. LogManager.AddHardwareLog("GetFIBMagnification " + ret.ToString() + " Success!", true);
  1647. return ret;
  1648. }
  1649. else
  1650. {
  1651. LogManager.AddHardwareLog("GetFIBMagnification Faild!", false);
  1652. return float.NaN;
  1653. }
  1654. }
  1655. /// <summary>
  1656. /// 设置缩放倍数
  1657. /// </summary>
  1658. /// <param name="set">倍数</param>
  1659. /// <returns>true or false</returns>
  1660. public Boolean SetFIBMagnification(float set)
  1661. {
  1662. Boolean ret = WriteParams(AP_FIB_MAGNIFICATION, set);
  1663. LogManager.AddHardwareLog("GSetFIBMagnification = " + set.ToString(), ret);
  1664. return ret;
  1665. }
  1666. #endregion
  1667. #region FIB焦距
  1668. /// <summary>
  1669. /// 读取工作距离AP_FIB_OBJECTIVE_POTENTIAL
  1670. /// </summary>
  1671. /// <returns>true:float or false:NaN</returns>
  1672. public float GetFIBObjectivePotential()
  1673. {
  1674. float ret = 0;
  1675. if (ReadParams(AP_FIB_OBJECTIVE_POTENTIAL, ref ret))
  1676. {
  1677. LogManager.AddHardwareLog("GetFIBObjectivePotential " + ret.ToString() + " Success!", true);
  1678. return ret;
  1679. }
  1680. else
  1681. {
  1682. LogManager.AddHardwareLog("GetFIBObjectivePotential Faild!", false);
  1683. return float.NaN;
  1684. }
  1685. }
  1686. /// <summary>
  1687. /// 设置焦距
  1688. /// </summary>
  1689. /// <param name="set">焦距</param>
  1690. /// <returns>true or false</returns>
  1691. public Boolean SetFIBObjectivePotential(float set)
  1692. {
  1693. Boolean ret = WriteParams(AP_FIB_OBJECTIVE_POTENTIAL, set);
  1694. LogManager.AddHardwareLog("SetFIBObjectivePotential = " + set.ToString(), ret);
  1695. return ret;
  1696. }
  1697. #endregion
  1698. #region FIB消像散
  1699. /// <summary>
  1700. /// 读取消像散X
  1701. /// </summary>
  1702. /// <returns>true:float or false:NaN</returns>
  1703. public float GetFIBAstigmatismX()
  1704. {
  1705. float ret = 0;
  1706. if (ReadParams(AP_FIB_STIGMATOR_X, ref ret))
  1707. {
  1708. LogManager.AddHardwareLog("GetFIBAstigmatismX " + ret.ToString() + " Success!", true);
  1709. return ret;
  1710. }
  1711. else
  1712. {
  1713. LogManager.AddHardwareLog("GetFIBAstigmatismX Faild!", false);
  1714. return float.NaN;
  1715. }
  1716. }
  1717. /// <summary>
  1718. /// 读取消像散Y
  1719. /// </summary>
  1720. /// <returns>true:float or false:NaN</returns>
  1721. public float GetFIBAstigmatismY()
  1722. {
  1723. float ret = 0;
  1724. if (ReadParams(AP_FIB_STIGMATOR_Y, ref ret))
  1725. {
  1726. LogManager.AddHardwareLog("GetFIBAstigmatismY " + ret.ToString() + " Success!", true);
  1727. return ret;
  1728. }
  1729. else
  1730. {
  1731. LogManager.AddHardwareLog("GetFIBAstigmatismY Faild!", false);
  1732. return float.NaN;
  1733. }
  1734. }
  1735. /// <summary>
  1736. /// 设置消像散X
  1737. /// </summary>
  1738. /// <param name="set">对比度</param>
  1739. /// <returns>true or false</returns>
  1740. public Boolean SetFIBAstigmatismX(float set)
  1741. {
  1742. Boolean ret = WriteParams(AP_FIB_STIGMATOR_X, set);
  1743. LogManager.AddHardwareLog("SetFIBAstigmatismX = " + set.ToString(), ret);
  1744. return ret;
  1745. }
  1746. /// <summary>
  1747. /// 设置消像散Y
  1748. /// </summary>
  1749. /// <param name="set">对比度</param>
  1750. /// <returns>true or false</returns>
  1751. public Boolean SetFIBAstigmatismY(float set)
  1752. {
  1753. Boolean ret = WriteParams(AP_FIB_STIGMATOR_Y, set);
  1754. LogManager.AddHardwareLog("SetFIBAstigmatismY = " + set.ToString(), ret);
  1755. return ret;
  1756. }
  1757. #endregion
  1758. #region FIB电子束移动接口
  1759. /// <summary>
  1760. /// 获取电子束移动接口X
  1761. /// </summary>
  1762. /// <returns>true:float or false:NaN</returns>
  1763. public float GetFIBBeamShiftX()
  1764. {
  1765. float ret = 0;
  1766. if (ReadParams(AP_FIB_BEAM_SHIFT_X, ref ret))
  1767. {
  1768. LogManager.AddHardwareLog("GetFIBBeamShiftX " + ret.ToString() + " Success!", true);
  1769. return ret;
  1770. }
  1771. else
  1772. {
  1773. LogManager.AddHardwareLog("GetFIBBeamShiftX Faild!", false);
  1774. return float.NaN;
  1775. }
  1776. }
  1777. /// <summary>
  1778. /// 获取电子束移动接口Y
  1779. /// </summary>
  1780. /// <returns>true:float or false:NaN</returns>
  1781. public float GetFIBBeamShiftY()
  1782. {
  1783. float ret = 0;
  1784. if (ReadParams(AP_FIB_BEAM_SHIFT_Y, ref ret))
  1785. {
  1786. LogManager.AddHardwareLog("GetFIBBeamShiftY " + ret.ToString() + " Success!", true);
  1787. return ret;
  1788. }
  1789. else
  1790. {
  1791. LogManager.AddHardwareLog("GetFIBBeamShiftY Faild!", false);
  1792. return float.NaN;
  1793. }
  1794. }
  1795. /// <summary>
  1796. /// 设置电子束移动接口X
  1797. /// </summary>
  1798. /// <param name="set">X坐标</param>
  1799. /// <returns>true or false</returns>
  1800. public Boolean SetFIBBeamShiftX(float set)
  1801. {
  1802. Boolean ret = WriteParams(AP_FIB_BEAM_SHIFT_X, set);
  1803. LogManager.AddHardwareLog("SetFIBBeamShiftX = " + set.ToString(), ret);
  1804. return ret;
  1805. }
  1806. /// <summary>
  1807. /// 设置电子束移动接口Y
  1808. /// </summary>
  1809. /// <param name="set">X坐标</param>
  1810. /// <returns>true or false</returns>
  1811. public Boolean SetFIBBeamShiftY(float set)
  1812. {
  1813. Boolean ret = WriteParams(AP_FIB_BEAM_SHIFT_Y, set);
  1814. LogManager.AddHardwareLog("SetFIBBeamShiftX = " + set.ToString(), ret);
  1815. return ret;
  1816. }
  1817. #endregion
  1818. #region FIB模式
  1819. /// <summary>
  1820. /// 获取FIB模式
  1821. /// </summary>
  1822. /// <returns>true:float or false:NaN</returns>
  1823. public float GetFIBMode()
  1824. {
  1825. float ret = 0;
  1826. if (ReadParams(DP_FIB_MODE, ref ret))
  1827. {
  1828. LogManager.AddHardwareLog("GetFIBMode " + ret.ToString() + " Success!", true);
  1829. return ret;
  1830. }
  1831. else
  1832. {
  1833. LogManager.AddHardwareLog("GetFIBMode Faild!", false);
  1834. return float.NaN;
  1835. }
  1836. }
  1837. #endregion
  1838. #region 工作模式选择
  1839. //SEM模式
  1840. public Boolean CmdFIBModeSEM()
  1841. {
  1842. Boolean ret = ExecuteCmd(CMD_FIB_MODE_SEM);
  1843. LogManager.AddHardwareLog("CmdFIBModeSEM = SEM!", ret);
  1844. return ret;
  1845. }
  1846. //FIB模式
  1847. public Boolean CmdFIBModeFIB()
  1848. {
  1849. Boolean ret = ExecuteCmd(CMD_FIB_MODE_FIB);
  1850. LogManager.AddHardwareLog("CmdFIBModeSEM = FIB!", ret);
  1851. return ret;
  1852. }
  1853. //铣削模式
  1854. public Boolean CmdFIBModeMILL()
  1855. {
  1856. Boolean ret = ExecuteCmd(CMD_FIB_MODE_MILL);
  1857. LogManager.AddHardwareLog("CmdFIBModeSEM = MILL!", ret);
  1858. return ret;
  1859. }
  1860. //SEM+FIB模式
  1861. public Boolean CmdFIBModeSEMAndFIB()
  1862. {
  1863. return ExecuteCmd(CMD_FIB_MODE_SEM_FIB);
  1864. }
  1865. //铣削+SEM模式
  1866. public Boolean CmdFIBModeMILLAndSEM()
  1867. {
  1868. return ExecuteCmd(CMD_FIB_MODE_MILL_SEM);
  1869. }
  1870. //EXT模式
  1871. public Boolean CmdFIBModeEXT()
  1872. {
  1873. return ExecuteCmd(CMD_FIB_MODE_EXT);
  1874. }
  1875. //EXT+SEM模式
  1876. public Boolean CmdFIBModeEXTAndSEM()
  1877. {
  1878. return ExecuteCmd(CMD_FIB_MODE_EXT_SEM);
  1879. }
  1880. //Argon(氩)+SEM模式
  1881. public Boolean CmdFIBModeARGONAndSEM()
  1882. {
  1883. return ExecuteCmd(CMD_FIB_MODE_ARGON_SEM);
  1884. }
  1885. //DRIFT(流)+SEM模式
  1886. public Boolean CmdFIBModeDRIFTAndSEM()
  1887. {
  1888. return ExecuteCmd(CMD_FIB_MODE_DRIFT_SEM);
  1889. }
  1890. //DRIFT(流)+FIB模式
  1891. public Boolean CmdFIBModeDRIFTAndFIB()
  1892. {
  1893. return ExecuteCmd(CMD_FIB_MODE_DRIFT_FIB);
  1894. }
  1895. //Argon(氩)模式
  1896. public Boolean CmdFIBModeARGON()
  1897. {
  1898. return ExecuteCmd(CMD_FIB_MODE_ARGON);
  1899. }
  1900. #endregion
  1901. #region 工作模式读取
  1902. /// <summary>
  1903. /// 工作模式读取
  1904. /// </summary>
  1905. /// <returns>0:SEM 1:FIB 2:MILL</returns>
  1906. public float GetFIBIMAGING()
  1907. {
  1908. float ret = 0;
  1909. if (ReadParams(DP_FIB_IMAGING, ref ret))
  1910. {
  1911. LogManager.AddHardwareLog("GetFIBIMAGING " + ret.ToString() + " Success!", true);
  1912. return ret;
  1913. }
  1914. else
  1915. {
  1916. LogManager.AddHardwareLog("GetFIBIMAGING Faild!", false);
  1917. return float.NaN;
  1918. }
  1919. }
  1920. #endregion
  1921. #region FIB工作状态
  1922. public float GetFIBApiStatus()
  1923. {
  1924. float ret = 0;
  1925. if (ReadParams(DP_SMARTFIB_API_STATUS, ref ret))
  1926. {
  1927. LogManager.AddHardwareLog("GetFIBApiStatus " + ret.ToString() + " Success!", true);
  1928. return ret;
  1929. }
  1930. else
  1931. {
  1932. LogManager.AddHardwareLog("GetFIBApiStatus Faild!", false);
  1933. return float.NaN;
  1934. }
  1935. }
  1936. #endregion
  1937. #region FIB加载.ely文件
  1938. public Boolean CmdFIBLoadELY(String _ELYFullFileName)
  1939. {
  1940. if (File.Exists(_ELYFullFileName) && Directory.Exists(ELYPATH))
  1941. {
  1942. //移动文件
  1943. if(_ELYFullFileName != ( ELYPATH + ELYFILENAME ))
  1944. {
  1945. File.Copy(_ELYFullFileName, ELYPATH + ELYFILENAME, true);
  1946. LogManager.AddHardwareLog("CmdFIBLoadELY Copy FileName:" + _ELYFullFileName + " To " + ELYPATH + ELYFILENAME, true);
  1947. }
  1948. Boolean ret = ExecuteCmd(CMD_SMARTFIB_LOAD_ELY);
  1949. LogManager.AddHardwareLog("CmdFIBLoadELY Success Execute " + _ELYFullFileName, true);
  1950. return ret;
  1951. }
  1952. else
  1953. {
  1954. LogManager.AddHardwareLog("CmdFIBLoadELY Faild:" + _ELYFullFileName + " Is Not Exists!", false);
  1955. return false;
  1956. }
  1957. }
  1958. #endregion
  1959. #region FIB确认.ely文件
  1960. public Boolean CmdFIBEXPOSUREELY()
  1961. {
  1962. Boolean ret = WriteDataParams(DP_PATTERNING_MODE, 2);
  1963. LogManager.AddHardwareLog("DP_PATTERNING_MODE = 2", ret);
  1964. ret = ExecuteCmd(CMD_SMARTFIB_PREPARE_EXPOSURE);
  1965. LogManager.AddHardwareLog("CMD_SMARTFIB_PREPARE_EXPOSURE", ret);
  1966. return ret;
  1967. }
  1968. #endregion
  1969. #region FIB执行.ely文件
  1970. public Boolean CmdFIBSTARTELY()
  1971. {
  1972. Boolean ret = ExecuteCmd(CMD_FIB_START_MILLING);
  1973. LogManager.AddHardwareLog("CMD_FIB_START_MILLING", ret);
  1974. return ret;
  1975. }
  1976. #endregion
  1977. #region 错误代码转义
  1978. private String ErrorToString(long lError)
  1979. {
  1980. string strError;
  1981. switch ((ZeissErrorCode)lError)
  1982. {
  1983. case 0:
  1984. strError = "OK";
  1985. break;
  1986. case ZeissErrorCode.API_E_GET_TRANSLATE_FAIL:
  1987. strError = "Failed to translate parameter into an ID";
  1988. break;
  1989. case ZeissErrorCode.API_E_GET_AP_FAIL:
  1990. strError = "Failed to get analogue value";
  1991. break;
  1992. case ZeissErrorCode.API_E_GET_DP_FAIL:
  1993. strError = "Failed to get digital value";
  1994. break;
  1995. case ZeissErrorCode.API_E_GET_BAD_PARAMETER:
  1996. strError = "Parameter supplied is neither analogue nor digital";
  1997. break;
  1998. case ZeissErrorCode.API_E_SET_TRANSLATE_FAIL:
  1999. strError = "Failed to translate parameter into an ID";
  2000. break;
  2001. case ZeissErrorCode.API_E_SET_STATE_FAIL:
  2002. strError = "Failed to set a digital state";
  2003. break;
  2004. case ZeissErrorCode.API_E_SET_FLOAT_FAIL:
  2005. strError = "Failed to set a float value";
  2006. break;
  2007. case ZeissErrorCode.API_E_SET_FLOAT_LIMIT_LOW:
  2008. strError = "Value supplied is too low";
  2009. break;
  2010. case ZeissErrorCode.API_E_SET_FLOAT_LIMIT_HIGH:
  2011. strError = "Value supplied is too high";
  2012. break;
  2013. case ZeissErrorCode.API_E_SET_BAD_VALUE:
  2014. strError = "Value supplied is of wrong type";
  2015. break;
  2016. case ZeissErrorCode.API_E_SET_BAD_PARAMETER:
  2017. strError = "Parameter supplied is not analogue nor digital";
  2018. break;
  2019. case ZeissErrorCode.API_E_EXEC_TRANSLATE_FAIL:
  2020. strError = "Failed to translate command into an ID";
  2021. break;
  2022. case ZeissErrorCode.API_E_EXEC_CMD_FAIL:
  2023. strError = "Failed to execute command";
  2024. break;
  2025. case ZeissErrorCode.API_E_EXEC_MCF_FAIL:
  2026. strError = "Failed to execute file macro";
  2027. break;
  2028. case ZeissErrorCode.API_E_EXEC_MCL_FAIL:
  2029. strError = "Failed to execute library macro";
  2030. break;
  2031. case ZeissErrorCode.API_E_EXEC_BAD_COMMAND:
  2032. strError = "Command supplied is not implemented";
  2033. break;
  2034. case ZeissErrorCode.API_E_GRAB_FAIL:
  2035. strError = "Grab command failed";
  2036. break;
  2037. case ZeissErrorCode.API_E_GET_STAGE_FAIL:
  2038. strError = "Get Stage position failed";
  2039. break;
  2040. case ZeissErrorCode.API_E_MOVE_STAGE_FAIL:
  2041. strError = "Move Stage position failed";
  2042. break;
  2043. case ZeissErrorCode.API_E_NOT_INITIALISED:
  2044. strError = "API not initialised";
  2045. break;
  2046. case ZeissErrorCode.API_E_NOTIFY_TRANSLATE_FAIL: // 1020L
  2047. strError = "Failed to translate parameter to an ID";
  2048. break;
  2049. case ZeissErrorCode.API_E_NOTIFY_SET_FAIL:
  2050. strError = "Set notification failed";
  2051. break;
  2052. case ZeissErrorCode.API_E_GET_LIMITS_FAIL:
  2053. strError = "Get limits failed";
  2054. break;
  2055. case ZeissErrorCode.API_E_GET_MULTI_FAIL:
  2056. strError = "Get multiple parameters failed";
  2057. break;
  2058. case ZeissErrorCode.API_E_SET_MULTI_FAIL:
  2059. strError = "Set multiple parameters failed";
  2060. break;
  2061. case ZeissErrorCode.API_E_NOT_LICENSED:
  2062. strError = "Missing API license";
  2063. break;
  2064. case ZeissErrorCode.API_E_NOT_IMPLEMENTED:
  2065. strError = "Reserved or not implemented";
  2066. break;
  2067. case ZeissErrorCode.API_E_GET_USER_NAME_FAIL:
  2068. strError = "Failed to get user name";
  2069. break;
  2070. case ZeissErrorCode.API_E_GET_USER_IDLE_FAIL:
  2071. strError = "Failed to get user idle state";
  2072. break;
  2073. case ZeissErrorCode.API_E_GET_LAST_REMOTING_CONNECT_ERROR_FAIL:
  2074. strError = "Failed to get the last remoting connection error string";
  2075. break;
  2076. case ZeissErrorCode.API_E_EMSERVER_LOGON_FAILED:
  2077. strError = "Failed to remotely logon to the EM Server. Username and password may be incorrect or EM Server is not running or User is already logged on";
  2078. break;
  2079. case ZeissErrorCode.API_E_EMSERVER_START_FAILED:
  2080. strError = "Failed to start the EM Server. This may be because the Server is already running or has an internal error.";
  2081. break;
  2082. case ZeissErrorCode.API_E_REMOTING_NOT_CONFIGURED:
  2083. strError = "Remoting incorrectly configured, use RConfigure to correct";
  2084. break;
  2085. case ZeissErrorCode.API_E_REMOTING_FAILED_TO_CONNECT:
  2086. strError = "Remoting did not connect to the server";
  2087. break;
  2088. case ZeissErrorCode.API_E_REMOTING_COULD_NOT_CREATE_INTERFACE:
  2089. strError = "Remoting could not start (unknown reason)";
  2090. break;
  2091. case ZeissErrorCode.API_E_REMOTING_EMSERVER_NOT_RUNNING:
  2092. strError = "EMServer is not running on the remote machine";
  2093. break;
  2094. case ZeissErrorCode.API_E_REMOTING_NO_USER_LOGGED_IN:
  2095. strError = "No user is logged into EM Server on the remote machine";
  2096. break;
  2097. default:
  2098. strError = string.Format("Unknown error code {0}", lError);
  2099. break;
  2100. }
  2101. return strError;
  2102. }
  2103. #endregion
  2104. //20201016 扫图速度
  2105. #region Focus rate
  2106. public Boolean CmdFocusRate()
  2107. {
  2108. Boolean ret = ExecuteCmd(CMD_SCANRATE3);
  2109. LogManager.AddHardwareLog("CMD_SCANRATE3!", ret);
  2110. return ret;
  2111. }
  2112. #endregion
  2113. #region Save rate
  2114. public Boolean CmdSaveRate()
  2115. {
  2116. Boolean ret = ExecuteCmd(CMD_SCANRATE6);
  2117. LogManager.AddHardwareLog("CMD_SCANRATE6!", ret);
  2118. return ret;
  2119. }
  2120. #endregion
  2121. }
  2122. }