EfemAction.cs 28 KB

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