RobotSiasunPhoenixBHandler.cs 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858
  1. using Aitex.Sorter.Common;
  2. using MECF.Framework.Common.CommonData;
  3. using MECF.Framework.Common.Communications;
  4. using MECF.Framework.Common.Equipment;
  5. using Newtonsoft.Json.Linq;
  6. using System;
  7. using System.Linq;
  8. using System.Text;
  9. namespace MECF.Framework.RT.EquipmentLibrary.HardwareUnits.Robots.SiasunPhoenixB
  10. {
  11. public abstract class RobotSiasunPhoenixBHandler : HandlerBase
  12. {
  13. public RobotSiasunPhoenixB Device { get; }
  14. public bool HasResponse { get; set; } = true;
  15. protected string _command;
  16. protected string _parameter;
  17. protected string _target;
  18. protected RobotArmEnum _blade;
  19. protected string _requestResponse = "";
  20. protected RobotSiasunPhoenixBHandler(RobotSiasunPhoenixB device, string command, string parameter = null)
  21. : base(BuildMessage(command, parameter))
  22. {
  23. Device = device;
  24. _command = command;
  25. _parameter = parameter;
  26. Name = command;
  27. }
  28. private static string BuildMessage(string command, string parameter)
  29. {
  30. string msg = parameter == null ? $"{command}" : $"{command} {parameter}";
  31. return msg + "\r";
  32. }
  33. public override bool HandleMessage(MessageBase msg, out bool transactionComplete)
  34. {
  35. RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
  36. ResponseMessage = msg;
  37. if (response.IsError)
  38. {
  39. Device.NoteError(response.Data);
  40. }
  41. if (response.IsComplete)
  42. {
  43. SetState(EnumHandlerState.Completed);
  44. transactionComplete = true;
  45. return true;
  46. }
  47. if (response.IsResponse)
  48. {
  49. _requestResponse = response.Data;
  50. }
  51. transactionComplete = false;
  52. return false;
  53. }
  54. }
  55. public class RobotSiasunPhoenixBRawCommandHandler : RobotSiasunPhoenixBHandler
  56. {
  57. public RobotSiasunPhoenixBRawCommandHandler(RobotSiasunPhoenixB device, string command, string parameter = null)
  58. : base(device, command, parameter)
  59. {
  60. }
  61. public override bool HandleMessage(MessageBase msg, out bool handled)
  62. {
  63. if (base.HandleMessage(msg, out handled))
  64. {
  65. var result = msg as RobotSiasunPhoenixBMessage;
  66. var rawMsg = _requestResponse != null ? _requestResponse + "$" + result.RawMessage : result.RawMessage;
  67. Device.NoteRawCommandInfo(_command, rawMsg);
  68. }
  69. return true;
  70. }
  71. }
  72. public class RobotSiasunPhoenixBGotoHandler : RobotSiasunPhoenixBHandler
  73. {
  74. //GOTO N station [R (EX|RE)] [Z (UP|DN)] [SLOT num] [[ARM] arm]
  75. public RobotSiasunPhoenixBGotoHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade,
  76. bool isRetract = true, bool isZaxisDown = true, int timeout = 60)
  77. : base(device, "GOTO", $"N {device.ModuleAssociateStationDic[module.ToString()]} R {(isRetract ? "RE" : "EX")}" +
  78. $" Z {(isZaxisDown ? "DN" : "UP")} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")}")
  79. {
  80. AckTimeout = TimeSpan.FromSeconds(timeout);
  81. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  82. _target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
  83. _blade = blade;
  84. device.MoveInfo = new RobotMoveInfo()
  85. {
  86. Action = isRetract ? RobotAction.Moving : RobotAction.Picking,
  87. ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  88. BladeTarget = _target,
  89. };
  90. }
  91. public override bool HandleMessage(MessageBase msg, out bool handled)
  92. {
  93. var result = msg as RobotSiasunPhoenixBMessage;
  94. if (result.IsError)
  95. {
  96. Device.NoteError(result.Data);
  97. }
  98. else
  99. {
  100. Device.NoteError(null);
  101. }
  102. ResponseMessage = msg;
  103. handled = true;
  104. Device.NoteActionCompleted();
  105. return true;
  106. }
  107. }
  108. public class RobotSiasunPhoenixBPickHandler : RobotSiasunPhoenixBHandler
  109. {
  110. //PICK station [SLOT slot] [[ARM] arm][ENRT|STRT NR][RO x TO x]
  111. public RobotSiasunPhoenixBPickHandler(RobotSiasunPhoenixB device, string module, int slot, RobotArmEnum blade,
  112. int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
  113. : base(device, "PICK", $"{device.ModuleAssociateStationDic[module]} SLOT {slot}" +
  114. $" ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
  115. {
  116. AckTimeout = TimeSpan.FromSeconds(timeout);
  117. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  118. var moduleArr = module.Split('.');
  119. _target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + moduleArr[0];
  120. _blade = blade;
  121. device.MoveInfo = new RobotMoveInfo()
  122. {
  123. Action = RobotAction.Picking,
  124. ArmTarget = blade == RobotArmEnum.Blade2 ? RobotArm.ArmB : RobotArm.ArmA, //blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  125. BladeTarget = _target,
  126. };
  127. }
  128. public override bool HandleMessage(MessageBase msg, out bool handled)
  129. {
  130. var result = msg as RobotSiasunPhoenixBMessage;
  131. if (result.IsError)
  132. {
  133. Device.NoteError(result.Data);
  134. }
  135. else
  136. {
  137. Device.NoteError(null);
  138. Device.MoveInfo = new RobotMoveInfo()
  139. {
  140. Action = RobotAction.Moving,
  141. ArmTarget = _blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  142. BladeTarget = _target,
  143. };
  144. }
  145. ResponseMessage = msg;
  146. handled = true;
  147. Device.NoteActionCompleted();
  148. return true;
  149. }
  150. }
  151. public class RobotSiasunPhoenixBPickExtendHandler : RobotSiasunPhoenixBHandler
  152. {
  153. //PICK station [SLOT slot] [[ARM] arm][ENRT|STRT NR][RO x TO x]
  154. public RobotSiasunPhoenixBPickExtendHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade,
  155. int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
  156. : base(device, "PICK", $"{device.ModuleAssociateStationDic[module.ToString()]} SLOT {slot}" +
  157. $" ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} ENRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
  158. {
  159. AckTimeout = TimeSpan.FromSeconds(timeout);
  160. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  161. _target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
  162. _blade = blade;
  163. device.MoveInfo = new RobotMoveInfo()
  164. {
  165. Action = RobotAction.Picking,
  166. ArmTarget = blade == RobotArmEnum.Blade2 ? RobotArm.ArmB : RobotArm.ArmA, //blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  167. BladeTarget = _target,
  168. };
  169. }
  170. public override bool HandleMessage(MessageBase msg, out bool handled)
  171. {
  172. var result = msg as RobotSiasunPhoenixBMessage;
  173. if (result.IsError)
  174. {
  175. Device.NoteError(result.Data);
  176. }
  177. else
  178. {
  179. Device.NoteError(null);
  180. }
  181. ResponseMessage = msg;
  182. handled = true;
  183. Device.NoteActionCompleted();
  184. return true;
  185. }
  186. }
  187. public class RobotSiasunPhoenixBPickRetractHandler : RobotSiasunPhoenixBHandler
  188. {
  189. //PICK station [SLOT slot] [[ARM] arm][ENRT|STRT NR][RO x TO x]
  190. public RobotSiasunPhoenixBPickRetractHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade, int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
  191. : base(device, "PICK", $"{device.ModuleAssociateStationDic[module.ToString()]} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} STRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
  192. {
  193. AckTimeout = TimeSpan.FromSeconds(timeout);
  194. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  195. _target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
  196. _blade = blade;
  197. device.MoveInfo = new RobotMoveInfo()
  198. {
  199. Action = RobotAction.Moving,
  200. ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  201. BladeTarget = _target,
  202. };
  203. }
  204. public override bool HandleMessage(MessageBase msg, out bool handled)
  205. {
  206. var result = msg as RobotSiasunPhoenixBMessage;
  207. if (result.IsError)
  208. {
  209. Device.NoteError(result.Data);
  210. }
  211. else
  212. {
  213. Device.NoteError(null);
  214. }
  215. ResponseMessage = msg;
  216. handled = true;
  217. Device.NoteActionCompleted();
  218. return true;
  219. }
  220. }
  221. public class RobotSiasunPhoenixBPlaceHandler : RobotSiasunPhoenixBHandler
  222. {
  223. public RobotSiasunPhoenixBPlaceHandler(RobotSiasunPhoenixB device, string module, int slot, RobotArmEnum blade,
  224. int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
  225. : base(device, "PLACE", $"{device.ModuleAssociateStationDic[module]} SLOT {slot}" +
  226. $" ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
  227. {
  228. AckTimeout = TimeSpan.FromSeconds(timeout);
  229. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  230. var moduleArr = module.Split('.');
  231. _target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + moduleArr[0];
  232. _blade = blade;
  233. device.MoveInfo = new RobotMoveInfo()
  234. {
  235. Action = RobotAction.Placing,
  236. ArmTarget = blade == RobotArmEnum.Blade2 ? RobotArm.ArmB : RobotArm.ArmA,//RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  237. BladeTarget = _target,
  238. };
  239. }
  240. public override bool HandleMessage(MessageBase msg, out bool handled)
  241. {
  242. var result = msg as RobotSiasunPhoenixBMessage;
  243. if (result.IsError)
  244. {
  245. Device.NoteError(result.Data);
  246. }
  247. else
  248. {
  249. Device.NoteError(null);
  250. Device.MoveInfo = new RobotMoveInfo()
  251. {
  252. Action = RobotAction.Moving,
  253. ArmTarget = _blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  254. BladeTarget = _target,
  255. };
  256. }
  257. ResponseMessage = msg;
  258. handled = true;
  259. Device.NoteActionCompleted();
  260. return true;
  261. }
  262. }
  263. public class RobotSiasunPhoenixBPlaceExtendHandler : RobotSiasunPhoenixBHandler
  264. {
  265. public RobotSiasunPhoenixBPlaceExtendHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade, int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
  266. : base(device, "PLACE", $"{device.ModuleAssociateStationDic[module.ToString()]} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} ENRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
  267. {
  268. AckTimeout = TimeSpan.FromSeconds(timeout);
  269. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  270. _target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
  271. _blade = blade;
  272. device.MoveInfo = new RobotMoveInfo()
  273. {
  274. Action = RobotAction.Placing,
  275. ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  276. BladeTarget = _target,
  277. };
  278. }
  279. public override bool HandleMessage(MessageBase msg, out bool handled)
  280. {
  281. var result = msg as RobotSiasunPhoenixBMessage;
  282. if (result.IsError)
  283. {
  284. Device.NoteError(result.Data);
  285. }
  286. else
  287. {
  288. Device.NoteError(null);
  289. }
  290. ResponseMessage = msg;
  291. handled = true;
  292. Device.NoteActionCompleted();
  293. return true;
  294. }
  295. }
  296. public class RobotSiasunPhoenixBPlaceRetractHandler : RobotSiasunPhoenixBHandler
  297. {
  298. public RobotSiasunPhoenixBPlaceRetractHandler(RobotSiasunPhoenixB device, ModuleName module, int slot, RobotArmEnum blade, int ro = 0, int to = 0, int timeout = 60, bool isDisableInterlock = false)
  299. : base(device, "PLACE", $"{device.ModuleAssociateStationDic[module.ToString()]} SLOT {slot} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} STRT NR {(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")}{(isDisableInterlock ? " INTLCK DIS" : "")}")
  300. {
  301. AckTimeout = TimeSpan.FromSeconds(timeout);
  302. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  303. _target = (blade == RobotArmEnum.Blade2 ? "ArmB" : "ArmA") + "." + module;
  304. _blade = blade;
  305. device.MoveInfo = new RobotMoveInfo()
  306. {
  307. Action = RobotAction.Moving,
  308. ArmTarget = blade == RobotArmEnum.Blade1 ? RobotArm.ArmA : RobotArm.ArmB,
  309. BladeTarget = _target,
  310. };
  311. }
  312. public override bool HandleMessage(MessageBase msg, out bool handled)
  313. {
  314. var result = msg as RobotSiasunPhoenixBMessage;
  315. if (result.IsError)
  316. {
  317. Device.NoteError(result.Data);
  318. }
  319. else
  320. {
  321. Device.NoteError(null);
  322. }
  323. ResponseMessage = msg;
  324. handled = true;
  325. Device.NoteActionCompleted();
  326. return true;
  327. }
  328. }
  329. public class RobotSiasunPhoenixBTransferHandler : RobotSiasunPhoenixBHandler
  330. {
  331. //XFER [[ARM]arm] station-a station-b
  332. public RobotSiasunPhoenixBTransferHandler(RobotSiasunPhoenixB device, int fromStation, int toStation, RobotArmEnum blade, int timeout)
  333. : base(device, "XFER", $"ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} {fromStation} {toStation}")
  334. {
  335. AckTimeout = TimeSpan.FromSeconds(timeout);
  336. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  337. }
  338. public override bool HandleMessage(MessageBase msg, out bool handled)
  339. {
  340. var result = msg as RobotSiasunPhoenixBMessage;
  341. if (result.IsError)
  342. {
  343. Device.NoteError(result.Data);
  344. }
  345. else
  346. {
  347. Device.NoteError(null);
  348. }
  349. ResponseMessage = msg;
  350. handled = true;
  351. Device.NoteActionCompleted();
  352. return true;
  353. }
  354. }
  355. public class RobotSiasunPhoenixBRetractHandler : RobotSiasunPhoenixBHandler
  356. {
  357. public RobotSiasunPhoenixBRetractHandler(RobotSiasunPhoenixB device, int timeout)
  358. : base(device, "RETRACT")
  359. {
  360. AckTimeout = TimeSpan.FromSeconds(timeout);
  361. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  362. }
  363. public override bool HandleMessage(MessageBase msg, out bool handled)
  364. {
  365. var result = msg as RobotSiasunPhoenixBMessage;
  366. if (result.IsError)
  367. {
  368. Device.NoteError(result.Data);
  369. }
  370. else
  371. {
  372. Device.NoteError(null);
  373. }
  374. ResponseMessage = msg;
  375. handled = true;
  376. Device.NoteActionCompleted();
  377. return true;
  378. }
  379. }
  380. public class RobotSiasunPhoenixBResetHandler : RobotSiasunPhoenixBHandler
  381. {
  382. //RESET
  383. public RobotSiasunPhoenixBResetHandler(RobotSiasunPhoenixB device)
  384. : base(device, "RESET")
  385. {
  386. HasResponse = false;
  387. }
  388. //no return message
  389. public override bool HandleMessage(MessageBase msg, out bool handled)
  390. {
  391. handled = true;
  392. return true;
  393. }
  394. }
  395. public class RobotSiasunPhoenixBHaltHandler : RobotSiasunPhoenixBHandler
  396. {
  397. public RobotSiasunPhoenixBHaltHandler(RobotSiasunPhoenixB device)
  398. : base(device, "HALT")
  399. {
  400. }
  401. public override bool HandleMessage(MessageBase msg, out bool handled)
  402. {
  403. var result = msg as RobotSiasunPhoenixBMessage;
  404. if (result.IsError)
  405. {
  406. Device.NoteError(result.Data);
  407. }
  408. else
  409. {
  410. Device.NoteError(null);
  411. }
  412. ResponseMessage = msg;
  413. handled = true;
  414. return true;
  415. }
  416. }
  417. public class RobotSiasunPhoenixBSetCommunicationEchoHandler : RobotSiasunPhoenixBHandler
  418. {
  419. public RobotSiasunPhoenixBSetCommunicationEchoHandler(RobotSiasunPhoenixB device, bool isEchoOn)
  420. : base(device, "SET COMM ECHO", isEchoOn ? "ON" : "OFF")
  421. {
  422. }
  423. public override bool HandleMessage(MessageBase msg, out bool handled)
  424. {
  425. if (base.HandleMessage(msg, out handled))
  426. {
  427. Device.NoteSetCommEchoCompleted(true);
  428. }
  429. return true;
  430. }
  431. }
  432. public class RobotSiasunPhoenixBSetLoadHandler : RobotSiasunPhoenixBHandler
  433. {
  434. public RobotSiasunPhoenixBSetLoadHandler(RobotSiasunPhoenixB device, RobotArmEnum blade, bool isWaferPresent)
  435. : base(device, "SET LOAD", $"{(blade == RobotArmEnum.Blade1 ? "A" : "B")} {(isWaferPresent ? "ON" : "OFF")}")
  436. {
  437. }
  438. public override bool HandleMessage(MessageBase msg, out bool handled)
  439. {
  440. if (base.HandleMessage(msg, out handled))
  441. {
  442. Device.NoteSetParametersComplete();
  443. }
  444. return true;
  445. }
  446. }
  447. public class RobotSiasunPhoenixBSevoOnOffHandler : RobotSiasunPhoenixBHandler
  448. {
  449. public RobotSiasunPhoenixBSevoOnOffHandler(RobotSiasunPhoenixB device, bool isOn)
  450. : base(device, isOn ? "SVON" : "SVOFF")
  451. {
  452. }
  453. public override bool HandleMessage(MessageBase msg, out bool handled)
  454. {
  455. var result = msg as RobotSiasunPhoenixBMessage;
  456. if (result.IsError)
  457. {
  458. Device.NoteError(result.Data);
  459. }
  460. else
  461. {
  462. Device.NoteError(null);
  463. Device.NoteSevoOnOff(_command == "SVON");
  464. }
  465. ResponseMessage = msg;
  466. handled = true;
  467. return true;
  468. }
  469. }
  470. public class RobotSiasunPhoenixBHomeAxisHandler : RobotSiasunPhoenixBHandler
  471. {
  472. public RobotSiasunPhoenixBHomeAxisHandler(RobotSiasunPhoenixB device, int timeout)
  473. : base(device, "HOME", "ALL")
  474. {
  475. AckTimeout = TimeSpan.FromSeconds(timeout);
  476. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  477. device.MoveInfo = new RobotMoveInfo()
  478. {
  479. Action = RobotAction.Moving,
  480. ArmTarget = RobotArm.Both,
  481. BladeTarget = "ArmA.System",
  482. };
  483. }
  484. public override bool HandleMessage(MessageBase msg, out bool handled)
  485. {
  486. var result = msg as RobotSiasunPhoenixBMessage;
  487. if (result.IsError)
  488. {
  489. Device.NoteError(result.Data);
  490. }
  491. else
  492. {
  493. Device.NoteError(null);
  494. Device.NoteAxisHomed();
  495. }
  496. ResponseMessage = msg;
  497. handled = true;
  498. return true;
  499. }
  500. }
  501. public class RobotSiasunPhoenixBCheckLoadHandler : RobotSiasunPhoenixBHandler
  502. {
  503. //CHECK LOAD station [[ARM] arm]
  504. //_RDY
  505. public RobotSiasunPhoenixBCheckLoadHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, int timeout)
  506. : base(device, "CHECK LOAD", $"{station} {(blade == RobotArmEnum.Blade1 ? "A" : "B")}")
  507. {
  508. AckTimeout = TimeSpan.FromSeconds(timeout);
  509. CompleteTimeout = TimeSpan.FromSeconds(timeout);
  510. }
  511. public override bool HandleMessage(MessageBase msg, out bool handled)
  512. {
  513. RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
  514. ResponseMessage = msg;
  515. handled = false;
  516. if (response.IsError)
  517. {
  518. Device.NoteError(response.Data);
  519. }
  520. if (response.IsResponse)
  521. {
  522. _requestResponse = response.Data;
  523. }
  524. if (response.IsComplete)
  525. {
  526. SetState(EnumHandlerState.Completed);
  527. handled = true;
  528. Device.NoteReadDataComplete();
  529. return true;
  530. }
  531. return true;
  532. }
  533. }
  534. public class RobotSiasunPhoenixBQueryWaferPresentHandler : RobotSiasunPhoenixBHandler
  535. {
  536. public RobotSiasunPhoenixBQueryWaferPresentHandler(RobotSiasunPhoenixB device, RobotArmEnum blade)
  537. : base(device, "RQ LOAD", blade == RobotArmEnum.Blade1 ? "A" : "B")
  538. {
  539. }
  540. public override bool HandleMessage(MessageBase msg, out bool handled)
  541. {
  542. RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
  543. ResponseMessage = msg;
  544. handled = false;
  545. if (response.IsError)
  546. {
  547. Device.NoteError(response.Data);
  548. }
  549. if (response.IsResponse)
  550. {
  551. _requestResponse = response.Data;
  552. }
  553. if (_requestResponse != null && _requestResponse.Contains(" B"))
  554. {
  555. Device.NoteWafeOnOff("B", _requestResponse.ToUpper().Contains("ON"), _requestResponse.ToUpper().Contains("UNKNOW"));
  556. }
  557. else if (_requestResponse != null && _requestResponse.Contains(" A"))
  558. {
  559. Device.NoteWafeOnOff("A", _requestResponse.ToUpper().Contains("ON"), _requestResponse.ToUpper().Contains("UNKNOW"));
  560. }
  561. if (response.IsComplete)
  562. {
  563. SetState(EnumHandlerState.Completed);
  564. handled = true;
  565. Device.NoteReadDataComplete();
  566. return true;
  567. }
  568. return true;
  569. }
  570. }
  571. public class RobotSiasunPhoenixBRequestWaferCentDataHandler : RobotSiasunPhoenixBHandler
  572. {
  573. public RobotSiasunPhoenixBRequestWaferCentDataHandler(RobotSiasunPhoenixB device)
  574. : base(device, "RQ WAF_CEN DATA")
  575. {
  576. }
  577. public override bool HandleMessage(MessageBase msg, out bool handled)
  578. {
  579. RobotSiasunPhoenixBMessage response = msg as RobotSiasunPhoenixBMessage;
  580. ResponseMessage = msg;
  581. handled = false;
  582. if (response.IsError)
  583. {
  584. Device.NoteError(response.Data);
  585. }
  586. if (response.IsResponse)
  587. {
  588. _requestResponse = response.Data;
  589. }
  590. //WAF_CEN RT value1x value1y value4x value4y LFT value2x value2y value3x value3y offset_r offset_t
  591. Device.NoteWafeCenData(_requestResponse);
  592. if (response.IsComplete)
  593. {
  594. SetState(EnumHandlerState.Completed);
  595. handled = true;
  596. Device.NoteReadDataComplete();
  597. return true;
  598. }
  599. return true;
  600. }
  601. }
  602. public class RobotSiasunPhoenixBSetWaferCentModeHandler : RobotSiasunPhoenixBHandler
  603. {
  604. //SET WAF_CEN MODE SINGLE_SENS|RL_SENS
  605. public RobotSiasunPhoenixBSetWaferCentModeHandler(RobotSiasunPhoenixB device, bool isSingleSensorMode)
  606. : base(device, "SET WAF_CEN MODE", isSingleSensorMode ? "SINGLE_SENS" : "RL_SENS")
  607. {
  608. }
  609. public override bool HandleMessage(MessageBase msg, out bool handled)
  610. {
  611. if (base.HandleMessage(msg, out handled))
  612. {
  613. Device.NoteSetParametersComplete();
  614. }
  615. return true;
  616. }
  617. }
  618. public class RobotSiasunPhoenixBSetWaferCentEnableHandler : RobotSiasunPhoenixBHandler
  619. {
  620. //SET STN station [[ARM]arm] WAF_CEN ENABLE Y|N
  621. public RobotSiasunPhoenixBSetWaferCentEnableHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, bool isEnable)
  622. : base(device, "SET STN", $"{station} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} WAF_CEN ENABLE {(isEnable ? "Y" : "N")}")
  623. {
  624. }
  625. public override bool HandleMessage(MessageBase msg, out bool handled)
  626. {
  627. if (base.HandleMessage(msg, out handled))
  628. {
  629. Device.NoteSetParametersComplete();
  630. }
  631. return true;
  632. }
  633. }
  634. public class RobotSiasunPhoenixBSetWaferCentWaferSizeHandler : RobotSiasunPhoenixBHandler
  635. {
  636. //SET STN station [[ARM]arm] WAF_CEN WAF_SIZE value
  637. //SET STN 1 ARM A WAF_CEN WAF_SIZE 300000
  638. public RobotSiasunPhoenixBSetWaferCentWaferSizeHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, int waferSize)
  639. : base(device, "SET STN", $"{station} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} WAF_CEN WAF_SIZE {waferSize}")
  640. {
  641. }
  642. public override bool HandleMessage(MessageBase msg, out bool handled)
  643. {
  644. if (base.HandleMessage(msg, out handled))
  645. {
  646. Device.NoteSetParametersComplete();
  647. }
  648. return true;
  649. }
  650. }
  651. public class RobotSiasunPhoenixBSetWaferCentAutoNotchHandler : RobotSiasunPhoenixBHandler
  652. {
  653. //SET STN station [[ARM]arm] WAF_CEN AUTO_NOTCH Y|N
  654. //SET STN 1 ARM A WAF_CEN WAF_SIZE 300000
  655. public RobotSiasunPhoenixBSetWaferCentAutoNotchHandler(RobotSiasunPhoenixB device, int station, RobotArmEnum blade, bool isAutoNotch)
  656. : base(device, "SET STN", $"{station} ARM {(blade == RobotArmEnum.Blade1 ? "A" : "B")} WAF_CEN AUTO_NOTCH {(isAutoNotch ? "Y" : "N")}")
  657. {
  658. }
  659. public override bool HandleMessage(MessageBase msg, out bool handled)
  660. {
  661. if (base.HandleMessage(msg, out handled))
  662. {
  663. Device.NoteSetParametersComplete();
  664. }
  665. return true;
  666. }
  667. }
  668. #region Aligner
  669. public class RobotSiasunPhoenixBTransferAndAlignHandler : RobotSiasunPhoenixBHandler
  670. {
  671. //XFER [[ARM] arm] station [SLOT num] station [SLOT num] ALGN
  672. public RobotSiasunPhoenixBTransferAndAlignHandler(RobotSiasunPhoenixB device, int fromStation, int formSlot, int toStation, int toSlot, Hand blade)
  673. : base(device, "XFER", $"ARM {(blade == Hand.Blade1 ? "A" : "B")} {fromStation} SLOT {formSlot} {toStation} SLOT {toSlot} ALGN")
  674. {
  675. }
  676. }
  677. public class RobotSiasunPhoenixBAlignAndPickHandler : RobotSiasunPhoenixBHandler
  678. {
  679. //PICK station [SLOT num] [[ARM] arm][ENRT|STRT NR][RO x TO x][ALGN][PALGN]
  680. //align and then pick it
  681. public RobotSiasunPhoenixBAlignAndPickHandler(RobotSiasunPhoenixB device, int alignerStation, int alignerSlot, Hand blade, int ro = 0, int to = 0)
  682. : base(device, "PICK", $" {alignerStation} SLOT {alignerSlot} ARM {(blade == Hand.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")} ALGN")
  683. {
  684. }
  685. }
  686. public class RobotSiasunPhoenixBPlaceAndAlignHandler : RobotSiasunPhoenixBHandler
  687. {
  688. //PLACEstation [SLOT num] [[ARM] arm][ENRT|STRT NR][RO x TO x][ALGN]
  689. //place to aligner and align
  690. public RobotSiasunPhoenixBPlaceAndAlignHandler(RobotSiasunPhoenixB device, int alignerStation, int alignerSlot, Hand blade, int ro = 0, int to = 0)
  691. : base(device, "PLACE", $" {alignerStation} SLOT {alignerSlot} ARM {(blade == Hand.Blade1 ? "A" : "B")}{(ro == 0 ? "" : $" RO {ro}")}{(to == 0 ? "" : $" TO {to}")} ALGN")
  692. {
  693. }
  694. }
  695. //两个aligner怎么区分
  696. public class RobotSiasunPhoenixBRequestAlignerOffsetHandler : RobotSiasunPhoenixBHandler
  697. {
  698. //RQ ALGN 00 OFFSETS
  699. //RO 0.000 TO 0.000
  700. //_RDY
  701. public RobotSiasunPhoenixBRequestAlignerOffsetHandler(RobotSiasunPhoenixB device)
  702. : base(device, "RQ ALGN 00 OFFSETS")
  703. {
  704. }
  705. }
  706. //两个aligner怎么区分
  707. public class RobotSiasunPhoenixBRequestAlignerWaferPresentHandler : RobotSiasunPhoenixBHandler
  708. {
  709. //RQ ALIGNER RQWPRS
  710. //WFR PRS YES/NO
  711. //_RDY
  712. public RobotSiasunPhoenixBRequestAlignerWaferPresentHandler(RobotSiasunPhoenixB device)
  713. : base(device, "RQ ALIGNER RQWPRS")
  714. {
  715. }
  716. }
  717. //默认选用哪个index对应的angle?
  718. public class RobotSiasunPhoenixBSetAlignerAlignAngleHandler : RobotSiasunPhoenixBHandler
  719. {
  720. //SET ALIGNER 1 POSTPOS %i POS %i
  721. //_RDY
  722. //eg. SET ALIGNER 1 POSTPOS 1 POS 27.1
  723. public RobotSiasunPhoenixBSetAlignerAlignAngleHandler(RobotSiasunPhoenixB device, int alignerID, int index, int angle)
  724. : base(device, "SET ALIGNER", $"{alignerID} POSTPOS {index} POS {angle}")
  725. {
  726. }
  727. public override bool HandleMessage(MessageBase msg, out bool handled)
  728. {
  729. if (base.HandleMessage(msg, out handled))
  730. {
  731. Device.NoteSetParametersComplete();
  732. }
  733. return true;
  734. }
  735. }
  736. #endregion
  737. }