EfemAction.cs 30 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052
  1. using System;
  2. using System.Collections.Generic;
  3. using Aitex.Core.Common;
  4. using Aitex.Core.RT.Event;
  5. using Aitex.Core.Util;
  6. using Aitex.Sorter.Common;
  7. using MECF.Framework.Common.Equipment;
  8. using MECF.Framework.Common.SubstrateTrackings;
  9. using VirgoCommon;
  10. using VirgoRT.Device;
  11. using VirgoRT.Device.YASKAWA;
  12. using System.Diagnostics;
  13. using System.Threading;
  14. using Aitex.Core.RT.Device;
  15. using Aitex.Core.RT.Log;
  16. using MECF.Framework.Common.CommonData;
  17. using VirgoRT.Devices.EFEM;
  18. using VirgoRT.Modules;
  19. namespace VirgoRT.Devices
  20. {
  21. /// <summary>
  22. /// Base action
  23. /// </summary>
  24. abstract class EfemActionBase : ActionBase
  25. {
  26. protected readonly EfemBase _efem;
  27. public EfemOperation Type { get; protected set; }
  28. protected EfemActionBase() : this(null) { }
  29. protected EfemActionBase(EfemBase efem) : base(ModuleName.EFEM)
  30. {
  31. _efem = efem;
  32. }
  33. }
  34. class DelayAction : ActionBase
  35. {
  36. private readonly DeviceTimer _timer = new DeviceTimer();
  37. private readonly ushort _delayTime;
  38. public bool IsDone => _timer.IsTimeout();
  39. public DelayAction(ushort delaytime) : base(ModuleName.System)
  40. {
  41. this._delayTime = delaytime;
  42. }
  43. public override void Execute()
  44. {
  45. _timer.Start(this._delayTime * 1000);
  46. }
  47. public override void OnPostWork(string data)
  48. {
  49. EV.PostInfoLog(ModuleName.EFEM.ToString(), $"Delay time [{_delayTime}]");
  50. }
  51. }
  52. }
  53. namespace VirgoRT.Devices.YASKAWA
  54. {
  55. class EfemAction : EfemActionBase
  56. {
  57. public EfemAction(EfemBase device, ModuleName mod) : base(device)
  58. { }
  59. public override void Execute()
  60. {
  61. _efem.MsgHandler.Send(new EfemMessage
  62. {
  63. Operation = this.Type,
  64. Head = EfemMessage.MsgHead.MOV,
  65. Parameters = new List<string> { Constant.ModuleString[this.Module] }
  66. });
  67. base.Execute();
  68. _efem.Status = DeviceState.Busy;
  69. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  70. }
  71. public override void OnPostWork(string data = null)
  72. {
  73. _efem.Status = DeviceState.Idle;
  74. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  75. }
  76. }
  77. /// <summary>
  78. ///
  79. /// </summary>
  80. class HomeAllAction : EfemAction
  81. {
  82. public HomeAllAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  83. {
  84. Type = EfemOperation.Home;
  85. this.Module = mod;
  86. }
  87. public override void OnPostWork(string data = null)
  88. {
  89. _efem[ModuleName.LP1].OnHomed();
  90. _efem[ModuleName.LP2].OnHomed();
  91. (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
  92. (_efem as Efem).MoveInfo.BladeTarget = "System";
  93. base.OnPostWork(data);
  94. var tower = DEVICE.GetDevice<VirgoSignalTower>("System.SignalTower");
  95. if (tower != null)
  96. {
  97. tower.ResetData();
  98. }
  99. }
  100. }
  101. class HomeModuleAction : EfemAction
  102. {
  103. public HomeModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  104. {
  105. Type = EfemOperation.Home;
  106. this.Module = mod;
  107. IsBackground = ModuleHelper.IsLoadPort(mod);
  108. }
  109. public override void OnPostWork(string data = null)
  110. {
  111. if (ModuleHelper.IsLoadPort(Module))
  112. {
  113. _efem[Module].OnHomed();
  114. }
  115. (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
  116. (_efem as Efem).MoveInfo.BladeTarget = "System";
  117. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  118. }
  119. }
  120. class LoadModuleAction : EfemAction
  121. {
  122. public LoadModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  123. {
  124. Type = EfemOperation.Load;
  125. this.Module = mod;
  126. IsBackground = true;
  127. }
  128. public override void OnPostWork(string data = null)
  129. {
  130. _efem[Module].OnLoaded();
  131. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  132. }
  133. public override void OnError(string data = null)
  134. {
  135. _efem[Module].OnLoadFailed(data);
  136. base.OnError(data);
  137. }
  138. }
  139. class UnloadModuleAction : EfemAction
  140. {
  141. public UnloadModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  142. {
  143. Type = EfemOperation.Unload;
  144. this.Module = mod;
  145. IsBackground = true;
  146. }
  147. public override void OnPostWork(string data = null)
  148. {
  149. _efem.Status = DeviceState.Idle;
  150. _efem[Module].OnUnloaded();
  151. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  152. }
  153. public override void OnError(string data = null)
  154. {
  155. _efem[Module].OnUnloadFailed(data);
  156. base.OnError(data);
  157. }
  158. }
  159. class ReadCarrierIdModuleAction : EfemAction
  160. {
  161. public ReadCarrierIdModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  162. {
  163. Type = EfemOperation.CarrierId;
  164. this.Module = mod;
  165. IsBackground = true;
  166. }
  167. public override void Execute()
  168. {
  169. _efem.MsgHandler.Send(new EfemMessage
  170. {
  171. Operation = this.Type,
  172. Head = EfemMessage.MsgHead.GET,
  173. Parameters = new List<string> { Constant.ModuleString[this.Module] }
  174. });
  175. //base.Execute();
  176. this.Status = ActionStatus.SendCmd;
  177. _efem.Status = DeviceState.Busy;
  178. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  179. }
  180. public override void OnPostWork(string data = null)
  181. {
  182. _efem.Status = DeviceState.Idle;
  183. _efem[Module].OnCarrierIDRead(data);
  184. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  185. }
  186. public override void OnError(string data = null)
  187. {
  188. _efem[Module].OnCarrierIDReadFailed(data);
  189. base.OnError(data);
  190. }
  191. }
  192. class WriteCarrierIdModuleAction : EfemAction
  193. {
  194. private string _id;
  195. public WriteCarrierIdModuleAction(EfemBase efem, ModuleName mod, string id) : base(efem, mod)
  196. {
  197. Type = EfemOperation.CarrierId;
  198. this.Module = mod;
  199. IsBackground = true;
  200. _id = id;
  201. }
  202. public override void Execute()
  203. {
  204. _efem.MsgHandler.Send(new EfemMessage
  205. {
  206. Operation = this.Type,
  207. Head = EfemMessage.MsgHead.SET,
  208. Parameters = new List<string> { Constant.ModuleString[this.Module], _id }
  209. });
  210. //base.Execute();
  211. this.Status = ActionStatus.SendCmd;
  212. _efem.Status = DeviceState.Busy;
  213. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  214. }
  215. public override void OnPostWork(string data = null)
  216. {
  217. _efem.Status = DeviceState.Idle;
  218. _efem[Module].OnCarrierIDWrite(_id);
  219. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  220. }
  221. public override void OnError(string data = null)
  222. {
  223. _efem[Module].OnCarrierIDWriteFailed(_id);
  224. base.OnError(data);
  225. }
  226. }
  227. class ReadTagDataModuleAction : EfemAction
  228. {
  229. public ReadTagDataModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  230. {
  231. Type = EfemOperation.CarrierId;
  232. this.Module = mod;
  233. IsBackground = true;
  234. }
  235. public override void Execute()
  236. {
  237. _efem.MsgHandler.Send(new EfemMessage
  238. {
  239. Operation = this.Type,
  240. Head = EfemMessage.MsgHead.GET,
  241. Parameters = new List<string> { Constant.ModuleString[this.Module] }
  242. });
  243. //base.Execute();
  244. this.Status = ActionStatus.SendCmd;
  245. _efem.Status = DeviceState.Busy;
  246. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  247. }
  248. public override void OnPostWork(string data = null)
  249. {
  250. _efem.Status = DeviceState.Idle;
  251. _efem[Module].OnTagDataRead(data);
  252. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  253. }
  254. public override void OnError(string data = null)
  255. {
  256. _efem[Module].OnTagDataReadFailed(data);
  257. base.OnError(data);
  258. }
  259. }
  260. class WriteTagDataModuleAction : EfemAction
  261. {
  262. private string _id;
  263. public WriteTagDataModuleAction(EfemBase efem, ModuleName mod, string id) : base(efem, mod)
  264. {
  265. Type = EfemOperation.CarrierId;
  266. this.Module = mod;
  267. IsBackground = true;
  268. _id = id;
  269. }
  270. public override void Execute()
  271. {
  272. _efem.MsgHandler.Send(new EfemMessage
  273. {
  274. Operation = this.Type,
  275. Head = EfemMessage.MsgHead.SET,
  276. Parameters = new List<string> { Constant.ModuleString[this.Module], _id }
  277. });
  278. //base.Execute();
  279. this.Status = ActionStatus.SendCmd;
  280. _efem.Status = DeviceState.Busy;
  281. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  282. }
  283. public override void OnPostWork(string data = null)
  284. {
  285. _efem.Status = DeviceState.Idle;
  286. _efem[Module].OnTagDataWrite(_id);
  287. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  288. }
  289. public override void OnError(string data = null)
  290. {
  291. _efem[Module].OnTagDataWriteFailed(_id);
  292. base.OnError(data);
  293. }
  294. }
  295. class DockModuleAction : EfemAction
  296. {
  297. public DockModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  298. {
  299. Type = EfemOperation.Dock;
  300. this.Module = mod;
  301. IsBackground = true;
  302. }
  303. }
  304. class UndockModuleAction : EfemAction
  305. {
  306. public UndockModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  307. {
  308. Type = EfemOperation.Undock;
  309. this.Module = mod;
  310. IsBackground = true;
  311. }
  312. }
  313. class ClampModuleAction : EfemAction
  314. {
  315. private bool _isUnloadClamp;
  316. public ClampModuleAction(EfemBase efem, ModuleName mod, bool isUnloadClamp) : base(efem, mod)
  317. {
  318. Type = EfemOperation.Clamp;
  319. this.Module = mod;
  320. IsBackground = true;
  321. _isUnloadClamp = isUnloadClamp;
  322. }
  323. public override void OnPostWork(string data = null)
  324. {
  325. _efem.Status = DeviceState.Idle;
  326. _efem[Module].OnClamped(_isUnloadClamp);
  327. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  328. }
  329. public override void OnError(string data = null)
  330. {
  331. _efem[Module].OnClampFailed(data);
  332. base.OnError(data);
  333. }
  334. }
  335. class UnclampModuleAction : EfemAction
  336. {
  337. public UnclampModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  338. {
  339. Type = EfemOperation.Unclamp;
  340. this.Module = mod;
  341. IsBackground = true;
  342. }
  343. public override void OnPostWork(string data = null)
  344. {
  345. _efem.Status = DeviceState.Idle;
  346. _efem[Module].OnUnclamped();
  347. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  348. }
  349. public override void OnError(string data = null)
  350. {
  351. _efem[Module].OnUnclampFailed(data);
  352. base.OnError(data);
  353. }
  354. }
  355. class SetThicknessModuleAction : EfemAction
  356. {
  357. private string _thick;
  358. public SetThicknessModuleAction(EfemBase efem, ModuleName mod, string thickness) : base(efem, mod)
  359. {
  360. Type = EfemOperation.SetThickness;
  361. this.Module = mod;
  362. IsBackground = true;
  363. _thick = thickness;
  364. }
  365. public override void Execute()
  366. {
  367. _efem.MsgHandler.Send(new EfemMessage
  368. {
  369. Operation = this.Type,
  370. Head = EfemMessage.MsgHead.SET,
  371. Parameters = new List<string> { Constant.ModuleString[this.Module], _thick.ToUpper() }
  372. });
  373. //base.Execute();
  374. this.Status = ActionStatus.SendCmd;
  375. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  376. }
  377. }
  378. class OrgshAction : EfemAction
  379. {
  380. public OrgshAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  381. {
  382. Type = EfemOperation.Orgsh;
  383. this.Module = mod;
  384. }
  385. }
  386. class TrackAction : EfemAction
  387. {
  388. public TrackAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  389. {
  390. Type = EfemOperation.StateTrack;
  391. this.Module = mod;
  392. }
  393. public override void Execute()
  394. {
  395. _efem.MsgHandler.Send(new EfemMessage
  396. {
  397. Operation = this.Type,
  398. Head = EfemMessage.MsgHead.GET,
  399. Parameters = new List<string> { "TRACK" }
  400. });
  401. this.Status = ActionStatus.SendCmd;
  402. EV.PostInfoLog(this.Module.ToString(), "Query wafer present information");
  403. }
  404. public override void OnPostWork(string data)
  405. {
  406. this.Status = ActionStatus.Completed;
  407. //000/111 upperArmWafer, lowerArmWafer, alignerWafer1, alignerWafer2, coolingwafer1,coolingwafer2
  408. if (data.Length != 6)
  409. {
  410. LOG.Write($"EFEM Track wafer present return invalid value, {data}, should be 6 characters");
  411. return;
  412. }
  413. //upper arm
  414. if (data[0] == '1')
  415. {
  416. if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 1))
  417. {
  418. WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 1, WaferStatus.Normal);
  419. }
  420. }
  421. else
  422. {
  423. if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 1))
  424. {
  425. EV.PostWarningLog(Module.ToString(), $" {ModuleName.EfemRobot} upper arm has wafer information, while EFEM return empty, manually delete if really no wafer");
  426. }
  427. }
  428. //lower arm
  429. if (data[1] == '1')
  430. {
  431. if (WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, 0))
  432. {
  433. WaferManager.Instance.CreateWafer(ModuleName.EfemRobot, 0, WaferStatus.Normal);
  434. }
  435. }
  436. else
  437. {
  438. if (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0))
  439. {
  440. EV.PostWarningLog(Module.ToString(), $" {ModuleName.EfemRobot} lower arm has wafer information, while EFEM return empty, manually delete if really no wafer");
  441. }
  442. }
  443. //aligner1
  444. if (data[2] == '1')
  445. {
  446. if (WaferManager.Instance.CheckNoWafer(ModuleName.Aligner1, 0))
  447. {
  448. WaferManager.Instance.CreateWafer(ModuleName.Aligner1, 0, WaferStatus.Normal);
  449. }
  450. }
  451. else
  452. {
  453. if (WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0))
  454. {
  455. EV.PostWarningLog(Module.ToString(), $" {ModuleName.Aligner1} has wafer information, while EFEM return empty, manually delete if really no wafer");
  456. }
  457. }
  458. //aligner2
  459. if (data[3] == '1')
  460. {
  461. if (WaferManager.Instance.CheckNoWafer(ModuleName.Aligner2, 0))
  462. {
  463. WaferManager.Instance.CreateWafer(ModuleName.Aligner2, 0, WaferStatus.Normal);
  464. }
  465. }
  466. else
  467. {
  468. if (WaferManager.Instance.CheckHasWafer(ModuleName.Aligner2, 0))
  469. {
  470. EV.PostWarningLog(Module.ToString(), $" {ModuleName.Aligner2} has wafer information, while EFEM return empty, manually delete if really no wafer");
  471. }
  472. }
  473. //cooling1
  474. if (data[4] == '1')
  475. {
  476. if (WaferManager.Instance.CheckNoWafer(ModuleName.Cooling1, 0))
  477. {
  478. WaferManager.Instance.CreateWafer(ModuleName.Cooling1, 0, WaferStatus.Normal);
  479. }
  480. }
  481. else
  482. {
  483. if (WaferManager.Instance.CheckHasWafer(ModuleName.Cooling1, 0))
  484. {
  485. EV.PostWarningLog(Module.ToString(), $" {ModuleName.Cooling1} has wafer information, while EFEM return empty, manually delete if really no wafer");
  486. }
  487. }
  488. //cooling2
  489. if (data[5] == '1')
  490. {
  491. if (WaferManager.Instance.CheckNoWafer(ModuleName.Cooling2, 0))
  492. {
  493. WaferManager.Instance.CreateWafer(ModuleName.Cooling2, 0, WaferStatus.Normal);
  494. }
  495. }
  496. else
  497. {
  498. if (WaferManager.Instance.CheckHasWafer(ModuleName.Cooling2, 0))
  499. {
  500. EV.PostWarningLog(Module.ToString(), $" {ModuleName.Cooling2} has wafer information, while EFEM return empty, manually delete if really no wafer");
  501. }
  502. }
  503. }
  504. }
  505. class ClearErrorAction : EfemAction
  506. {
  507. public ClearErrorAction(EfemBase efem) : base(efem, ModuleName.EFEM)
  508. {
  509. Type = EfemOperation.ClearError;
  510. IsBackground = true;
  511. }
  512. public override void Execute()
  513. {
  514. _efem.MsgHandler.Send(new EfemMessage
  515. {
  516. Operation = this.Type,
  517. Head = EfemMessage.MsgHead.SET,
  518. Parameters = new List<string> { "CLEAR" }
  519. });
  520. this.Status = ActionStatus.SendCmd;
  521. EV.PostInfoLog(this.Module.ToString(), "清除 EFEM 所有错误");
  522. }
  523. }
  524. class LoadPortClearErrorAction : EfemAction
  525. {
  526. public LoadPortClearErrorAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  527. {
  528. Type = EfemOperation.ClearError;
  529. this.Module = mod;
  530. IsBackground = true;
  531. }
  532. public override void Execute()
  533. {
  534. _efem.MsgHandler.Send(new EfemMessage
  535. {
  536. Operation = this.Type,
  537. Head = EfemMessage.MsgHead.SET,
  538. Parameters = new List<string> { "CLEAR", Constant.ModuleString[this.Module] }
  539. });
  540. this.Status = ActionStatus.SendCmd;
  541. EV.PostInfoLog(this.Module.ToString(), "清除 LoadPort 所有错误");
  542. }
  543. }
  544. class MapAction : EfemAction
  545. {
  546. public MapAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  547. {
  548. Type = EfemOperation.Map;
  549. this.Module = mod;
  550. }
  551. public override void OnPostWork(string data)
  552. {
  553. _efem[Module].Status = DeviceState.Idle;
  554. }
  555. }
  556. class PickAction : EfemAction
  557. {
  558. private MoveParam MoveParam { get; }
  559. public PickAction(EfemBase efem, MoveParam mp) : base(efem, ModuleName.EFEM)
  560. {
  561. Type = EfemOperation.Pick;
  562. MoveParam = mp;
  563. }
  564. public override void Execute()
  565. {
  566. //MOV:LOAD/P113/ARM2;
  567. _efem.MsgHandler.Send(new EfemMessage
  568. {
  569. Operation = this.Type,
  570. Head = EfemMessage.MsgHead.MOV,
  571. Parameters = new List<string>
  572. {
  573. MoveParam.SrcPos.ToHWString(),
  574. Constant.ArmString[MoveParam.Arm],
  575. MoveParam.WaferSize.ToString()
  576. }
  577. });
  578. this.Status = ActionStatus.SendCmd;
  579. _efem.Status = DeviceState.Busy;
  580. }
  581. public override void OnPostWork(string data)
  582. {
  583. if (MoveParam.Arm == Hand.Both)
  584. {
  585. if (MoveParam.DestModule == ModuleName.EfemRobot)
  586. {
  587. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, 0);
  588. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot + 1, MoveParam.DestModule, 1);
  589. }
  590. else
  591. {
  592. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, 0, MoveParam.DestModule, MoveParam.DestSlot);
  593. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, 1, MoveParam.DestModule, MoveParam.DestSlot + 1);
  594. }
  595. }
  596. else
  597. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
  598. _efem.Status = DeviceState.Idle;
  599. //_bladeTarget = ModuleName.EfemRobot;
  600. (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
  601. }
  602. }
  603. class PlaceAction : EfemAction
  604. {
  605. private MoveParam MoveParam { get; }
  606. public PlaceAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
  607. {
  608. Type = EfemOperation.Place;
  609. MoveParam = mp;
  610. }
  611. public override void Execute()
  612. {
  613. _efem.MsgHandler.Send(new EfemMessage
  614. {
  615. Operation = this.Type,
  616. Head = EfemMessage.MsgHead.MOV,
  617. Parameters = new List<string>
  618. {
  619. MoveParam.DestPos.ToHWString(),
  620. Constant.ArmString[MoveParam.Arm],
  621. MoveParam.WaferSize.ToString()
  622. }
  623. });
  624. this.Status = ActionStatus.SendCmd;
  625. _efem.Status = DeviceState.Busy;
  626. }
  627. public override void OnPostWork(string data)
  628. {
  629. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
  630. _efem.Status = DeviceState.Idle;
  631. (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
  632. }
  633. }
  634. class GotoAction : EfemAction
  635. {
  636. private MoveParam MoveParam { get; }
  637. public GotoAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
  638. {
  639. Type = EfemOperation.Goto;
  640. MoveParam = mp;
  641. }
  642. public override void Execute()
  643. {
  644. _efem.MsgHandler.Send(new EfemMessage
  645. {
  646. Operation = this.Type,
  647. Head = EfemMessage.MsgHead.MOV,
  648. Parameters = new List<string>
  649. {
  650. MoveParam.DestPos.ToHWString(),
  651. Constant.ArmString[MoveParam.Arm],
  652. //MoveParam.WaferSize.ToString()
  653. }
  654. });
  655. this.Status = ActionStatus.SendCmd;
  656. _efem.Status = DeviceState.Busy;
  657. }
  658. public override void OnPostWork(string data)
  659. {
  660. _efem.Status = DeviceState.Idle;
  661. (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
  662. (_efem as Efem).MoveInfo.BladeTarget = MoveParam.DestPos.Module.ToString();
  663. }
  664. }
  665. class ExtendAction : EfemAction
  666. {
  667. private ExtendParam ExtParam { get; }
  668. public ExtendPos TargetPosition => ExtParam.Pos;
  669. private JetPM _pm;
  670. public ExtendAction(EfemBase efem, JetPM pm, ExtendParam ep)
  671. : base(efem, ModuleName.EFEM)
  672. {
  673. Type = EfemOperation.Extend;
  674. ExtParam = ep;
  675. ExtParam.Arm = ep.Arm;
  676. _pm = pm;
  677. }
  678. public override void Execute()
  679. {
  680. if (_pm != null && !_pm.CheckSlitDoorOpen())
  681. {
  682. EV.PostAlarmLog("EFEM", $"{_pm.Module} slit door should be opened");
  683. Singleton<RouteManager>.Instance.EFEM.PostMsg(EfemEntity.MSG.Error);
  684. return;
  685. }
  686. //MOV:EXTEND/LLA03/ARM2;
  687. _efem.MsgHandler.Send(new EfemMessage
  688. {
  689. Operation = this.Type,
  690. Head = EfemMessage.MsgHead.MOV,
  691. Parameters = new List<string>
  692. {
  693. ExtParam.Module.ToHWString(),
  694. //Constant.ExtendPosString[ExtParam.Pos],
  695. ExtParam.Pos.ToString(),
  696. Constant.ArmString[ExtParam.Arm],
  697. ExtParam.ws.ToString()
  698. }
  699. }); ;
  700. this.Status = ActionStatus.SendCmd;
  701. _efem.Status = DeviceState.Busy;
  702. }
  703. public override void OnPostWork(string data)
  704. {
  705. _efem.Status = DeviceState.Idle;
  706. switch (TargetPosition)
  707. {
  708. case ExtendPos.PB:
  709. LOG.Write($"robot extend PB put: arm {ExtParam.Arm}, module {ExtParam.Module}");
  710. //WaferManager.Instance.WaferMoved(ModuleName.EfemRobot, (int)ExtParam.Arm, ExtParam.Module, 0);
  711. break;
  712. case ExtendPos.G4:
  713. LOG.Write($"robot extend G4 get: arm {ExtParam.Arm}, module {ExtParam.Module}");
  714. // WaferManager.Instance.WaferMoved(ExtParam.Module, 0, ModuleName.EfemRobot, (int)ExtParam.Arm);
  715. break;
  716. default:
  717. LOG.Write($"MNPT:{TargetPosition} 不需要更新 WaferManager 信息");
  718. break;
  719. }
  720. (_efem as Efem).MoveInfo.Action = RobotAction.Moving;
  721. }
  722. }
  723. class GripAction : EfemAction
  724. {
  725. private Hand _blade;
  726. private bool _isGrip;
  727. public GripAction(EfemBase efem, Hand blade, bool isGrip)
  728. : base(efem, ModuleName.EFEM)
  729. {
  730. Type = EfemOperation.Grip;
  731. _blade = blade;
  732. _isGrip = isGrip;
  733. }
  734. public override void Execute()
  735. {
  736. _efem.MsgHandler.Send(new EfemMessage
  737. {
  738. Operation = this.Type,
  739. Head = EfemMessage.MsgHead.SET,
  740. Parameters = new List<string>
  741. {
  742. Constant.ArmString[_blade],
  743. _isGrip ? "ON":"OFF"
  744. }
  745. });
  746. this.Status = ActionStatus.SendCmd;
  747. _efem.Status = DeviceState.Busy;
  748. }
  749. public override void OnPostWork(string data)
  750. {
  751. _efem.Status = DeviceState.Idle;
  752. if (_blade == Hand.Blade1)
  753. _efem.GripStateBlade1 = _isGrip ? "ON" : "OFF";
  754. if (_blade == Hand.Blade2)
  755. _efem.GripStateBlade2 = _isGrip ? "ON" : "OFF";
  756. }
  757. }
  758. class LiftAction : EfemAction
  759. {
  760. // MOV:LIFT/ALIGN1;
  761. private bool _isUp;
  762. public LiftAction(EfemBase device, ModuleName mod, bool isUp) : base(device, mod)
  763. {
  764. Type = EfemOperation.Lift;
  765. Module = mod;
  766. _isUp = isUp;
  767. IsBackground = true;
  768. (device as Efem).IsBufferPinUp[mod] = !isUp;
  769. }
  770. public override void Execute()
  771. {
  772. _efem.MsgHandler.Send(new EfemMessage
  773. {
  774. Operation = this.Type,
  775. Head = EfemMessage.MsgHead.MOV,
  776. Parameters = new List<string> { Constant.ModuleString[this.Module], _isUp ? "UP" : "DOWN" }
  777. });
  778. this.Status = ActionStatus.SendCmd;
  779. _efem.Status = DeviceState.Busy;
  780. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  781. }
  782. public override void OnPostWork(string data)
  783. {
  784. _efem.Status = DeviceState.Idle;
  785. (_efem as Efem).IsBufferPinUp[Module] = _isUp;
  786. }
  787. }
  788. class AlignAction : EfemAction
  789. {
  790. private WaferSize _ws { get; }
  791. public AlignAction(EfemBase device, ModuleName mod, WaferSize size) : base(device, mod)
  792. {
  793. Type = EfemOperation.Align;
  794. this.Module = mod;
  795. this._ws = size;
  796. }
  797. public override void Execute()
  798. {
  799. _efem.MsgHandler.Send(new EfemMessage
  800. {
  801. Operation = this.Type,
  802. Head = EfemMessage.MsgHead.MOV,
  803. Parameters = new List<string> { Module.ToHWString(), this._ws.ToString() }
  804. });
  805. this.Status = ActionStatus.SendCmd;
  806. }
  807. public override void OnPostWork(string data) { }
  808. }
  809. class LedAction : EfemAction
  810. {
  811. private LightType Light { get; }
  812. private LightStatus LtStatus { get; }
  813. public LedAction(EfemBase device, LightType lt, LightStatus st) : base(device, ModuleName.EFEM)
  814. {
  815. Type = EfemOperation.Light;
  816. Light = lt;
  817. LtStatus = st;
  818. IsBackground = true;
  819. }
  820. public override void Execute()
  821. {
  822. _efem.MsgHandler.Send(new EfemMessage
  823. {
  824. Operation = this.Type,
  825. Head = EfemMessage.MsgHead.SET,
  826. Parameters = new List<string> { Constant.STOWER, Light.ToString(), LtStatus.ToString() }
  827. });
  828. _efem.Status = DeviceState.Busy;
  829. this.Status = ActionStatus.SendCmd;
  830. //EV.PostInfoLog(this.Module.ToString(), $"CMD[{this.ID}], Set {this.Light} = {LtStatus}");
  831. }
  832. public override void OnPostWork(string data)
  833. {
  834. }
  835. }
  836. class AbortAction : EfemAction
  837. {
  838. public AbortAction(EfemBase efem) : base(efem, ModuleName.EFEM)
  839. {
  840. Type = EfemOperation.Abort;
  841. }
  842. public override void Execute()
  843. {
  844. _efem.MsgHandler.Send(new EfemMessage
  845. {
  846. Operation = this.Type,
  847. Head = EfemMessage.MsgHead.MOV
  848. });
  849. }
  850. }
  851. }