SmartSEM.cs 71 KB

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