EfemAction.cs 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  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.Log;
  15. namespace VirgoRT.Devices
  16. {
  17. /// <summary>
  18. /// Base action
  19. /// </summary>
  20. abstract class EfemActionBase : ActionBase
  21. {
  22. protected readonly EfemBase _efem;
  23. public EfemOperation Type { get; protected set; }
  24. protected EfemActionBase() : this(null) { }
  25. protected EfemActionBase(EfemBase efem) : base(ModuleName.EFEM)
  26. {
  27. _efem = efem;
  28. }
  29. }
  30. class DelayAction : ActionBase
  31. {
  32. private readonly DeviceTimer _timer = new DeviceTimer();
  33. private readonly ushort _delayTime;
  34. public bool IsDone => _timer.IsTimeout();
  35. public DelayAction(ushort delaytime) : base(ModuleName.System)
  36. {
  37. this._delayTime = delaytime;
  38. }
  39. public override void Execute()
  40. {
  41. _timer.Start(this._delayTime * 1000);
  42. }
  43. public override void OnPostWork(string data)
  44. {
  45. EV.PostInfoLog(ModuleName.EFEM.ToString(), $"Delay time [{_delayTime}]");
  46. }
  47. }
  48. }
  49. namespace VirgoRT.Devices.YASKAWA
  50. {
  51. class EfemAction : EfemActionBase
  52. {
  53. public EfemAction(EfemBase device, ModuleName mod) : base(device)
  54. { }
  55. public override void Execute()
  56. {
  57. _efem.MsgHandler.Send(new EfemMessage
  58. {
  59. Operation = this.Type,
  60. Head = EfemMessage.MsgHead.MOV,
  61. Parameters = new List<string> { Constant.ModuleString[this.Module] }
  62. });
  63. base.Execute();
  64. _efem.Status = DeviceState.Busy;
  65. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} Start");
  66. }
  67. public override void OnPostWork(string data = null)
  68. {
  69. _efem.Status = DeviceState.Idle;
  70. EV.PostInfoLog(this.Module.ToString(), $"Cmd {this.ID} {this.Type} End");
  71. }
  72. }
  73. /// <summary>
  74. ///
  75. /// </summary>
  76. class HomeAllAction : EfemAction
  77. {
  78. public HomeAllAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  79. {
  80. Type = EfemOperation.Home;
  81. this.Module = mod;
  82. }
  83. }
  84. class HomeModuleAction : EfemAction
  85. {
  86. public HomeModuleAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  87. {
  88. Type = EfemOperation.Home;
  89. this.Module = mod;
  90. }
  91. }
  92. class OrgshAction : EfemAction
  93. {
  94. public OrgshAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  95. {
  96. Type = EfemOperation.Orgsh;
  97. this.Module = mod;
  98. }
  99. }
  100. class TrackAction : EfemAction
  101. {
  102. public TrackAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  103. {
  104. //Type = EfemOperation.;
  105. this.Module = mod;
  106. }
  107. }
  108. class ClearErrorAction : EfemAction
  109. {
  110. public ClearErrorAction(EfemBase efem) : base(efem, ModuleName.EFEM)
  111. {
  112. Type = EfemOperation.ClearError;
  113. IsBackground = true;
  114. }
  115. public override void Execute()
  116. {
  117. _efem.MsgHandler.Send(new EfemMessage
  118. {
  119. Operation = this.Type,
  120. Head = EfemMessage.MsgHead.SET,
  121. Parameters = new List<string> { "CLEAR" }
  122. });
  123. this.Status = ActionStatus.SendCmd;
  124. EV.PostInfoLog(this.Module.ToString(), "清除 EFEM 所有错误");
  125. }
  126. }
  127. class MapAction : EfemAction
  128. {
  129. public MapAction(EfemBase efem, ModuleName mod) : base(efem, mod)
  130. {
  131. Type = EfemOperation.Map;
  132. this.Module = mod;
  133. }
  134. public override void OnPostWork(string data)
  135. {
  136. _efem[Module].Status = DeviceState.Idle;
  137. }
  138. }
  139. class PickAction : EfemAction
  140. {
  141. private MoveParam MoveParam { get; }
  142. public PickAction(EfemBase efem, MoveParam mp) : base(efem, ModuleName.EFEM)
  143. {
  144. Type = EfemOperation.Pick;
  145. MoveParam = mp;
  146. }
  147. public override void Execute()
  148. {
  149. //MOV:LOAD/P113/ARM2;
  150. _efem.MsgHandler.Send(new EfemMessage
  151. {
  152. Operation = this.Type,
  153. Head = EfemMessage.MsgHead.MOV,
  154. Parameters = new List<string>
  155. {
  156. MoveParam.SrcPos.ToHWString(),
  157. Constant.ArmString[MoveParam.Arm],
  158. MoveParam.WaferSize.ToString()
  159. }
  160. });
  161. this.Status = ActionStatus.SendCmd;
  162. _efem.Status = DeviceState.Busy;
  163. }
  164. public override void OnPostWork(string data)
  165. {
  166. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
  167. _efem.Status = DeviceState.Idle;
  168. //_bladeTarget = ModuleName.EfemRobot;
  169. }
  170. }
  171. class PlaceAction : EfemAction
  172. {
  173. private MoveParam MoveParam { get; }
  174. public PlaceAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
  175. {
  176. Type = EfemOperation.Place;
  177. MoveParam = mp;
  178. }
  179. public override void Execute()
  180. {
  181. _efem.MsgHandler.Send(new EfemMessage
  182. {
  183. Operation = this.Type,
  184. Head = EfemMessage.MsgHead.MOV,
  185. Parameters = new List<string>
  186. {
  187. MoveParam.DestPos.ToHWString(),
  188. Constant.ArmString[MoveParam.Arm],
  189. MoveParam.WaferSize.ToString()
  190. }
  191. });
  192. this.Status = ActionStatus.SendCmd;
  193. _efem.Status = DeviceState.Busy;
  194. }
  195. public override void OnPostWork(string data)
  196. {
  197. WaferManager.Instance.WaferMoved(MoveParam.SrcModule, MoveParam.SrcSlot, MoveParam.DestModule, MoveParam.DestSlot);
  198. _efem.Status = DeviceState.Idle;
  199. }
  200. }
  201. class GotoAction : EfemAction
  202. {
  203. private MoveParam MoveParam { get; }
  204. public GotoAction(EfemBase device, MoveParam mp) : base(device, ModuleName.EFEM)
  205. {
  206. Type = EfemOperation.Goto;
  207. MoveParam = mp;
  208. }
  209. public override void Execute()
  210. {
  211. _efem.MsgHandler.Send(new EfemMessage
  212. {
  213. Operation = this.Type,
  214. Head = EfemMessage.MsgHead.MOV,
  215. Parameters = new List<string>
  216. {
  217. MoveParam.DestPos.ToHWString(),
  218. Constant.ArmString[MoveParam.Arm],
  219. MoveParam.WaferSize.ToString()
  220. }
  221. });
  222. this.Status = ActionStatus.SendCmd;
  223. _efem.Status = DeviceState.Busy;
  224. }
  225. public override void OnPostWork(string data)
  226. {
  227. _efem.Status = DeviceState.Idle;
  228. }
  229. }
  230. class ExtendAction : EfemAction
  231. {
  232. private ExtendParam ExtParam { get; }
  233. public ExtendPos TargetPosition => ExtParam.Pos;
  234. public ExtendAction(EfemBase efem, ExtendParam ep)
  235. : base(efem, ModuleName.EFEM)
  236. {
  237. Type = EfemOperation.Extend;
  238. ExtParam = ep;
  239. ExtParam.Arm = ep.Arm;
  240. }
  241. public override void Execute()
  242. {
  243. //MOV:EXTEND/LLA03/ARM2;
  244. _efem.MsgHandler.Send(new EfemMessage
  245. {
  246. Operation = this.Type,
  247. Head = EfemMessage.MsgHead.MOV,
  248. Parameters = new List<string>
  249. {
  250. ExtParam.Module.ToHWString(),
  251. //Constant.ExtendPosString[ExtParam.Pos],
  252. ExtParam.Pos.ToString(),
  253. Constant.ArmString[ExtParam.Arm]
  254. }
  255. });
  256. this.Status = ActionStatus.SendCmd;
  257. _efem.Status = DeviceState.Busy;
  258. }
  259. public override void OnPostWork(string data)
  260. {
  261. _efem.Status = DeviceState.Idle;
  262. switch (TargetPosition)
  263. {
  264. case ExtendPos.PB:
  265. LOG.Write($"robot extend PB put: arm {ExtParam.Arm}, module {ExtParam.Module}");
  266. //WaferManager.Instance.WaferMoved(ModuleName.EfemRobot, (int)ExtParam.Arm, ExtParam.Module, 0);
  267. break;
  268. case ExtendPos.G4:
  269. LOG.Write($"robot extend G4 get: arm {ExtParam.Arm}, module {ExtParam.Module}");
  270. // WaferManager.Instance.WaferMoved(ExtParam.Module, 0, ModuleName.EfemRobot, (int)ExtParam.Arm);
  271. break;
  272. default:
  273. Debug.WriteLine($"MNPT:{TargetPosition} 不需要更新 WaferManager 信息");
  274. break;
  275. }
  276. }
  277. }
  278. class GripAction : EfemAction
  279. {
  280. private Hand _blade;
  281. private bool _isGrip;
  282. public GripAction(EfemBase efem, Hand blade, bool isGrip)
  283. : base(efem, ModuleName.EFEM)
  284. {
  285. Type = EfemOperation.Grip;
  286. _blade = blade;
  287. _isGrip = isGrip;
  288. }
  289. public override void Execute()
  290. {
  291. _efem.MsgHandler.Send(new EfemMessage
  292. {
  293. Operation = this.Type,
  294. Head = EfemMessage.MsgHead.SET,
  295. Parameters = new List<string>
  296. {
  297. _isGrip ? "ON":"OFF",
  298. Constant.ArmString[_blade]
  299. }
  300. });
  301. this.Status = ActionStatus.SendCmd;
  302. _efem.Status = DeviceState.Busy;
  303. }
  304. public override void OnPostWork(string data)
  305. {
  306. _efem.Status = DeviceState.Idle;
  307. if (_blade == Hand.Blade1)
  308. _efem.GripStateBlade1 = _isGrip ? "ON" : "OFF";
  309. if (_blade == Hand.Blade2)
  310. _efem.GripStateBlade2 = _isGrip ? "ON" : "OFF";
  311. }
  312. }
  313. class LiftAction : EfemAction
  314. {
  315. // MOV:LIFT/ALIGN1;
  316. public LiftAction(EfemBase device, ModuleName mod) : base(device, mod)
  317. {
  318. Type = EfemOperation.Lift;
  319. Module = mod;
  320. }
  321. public override void OnPostWork(string data)
  322. { }
  323. }
  324. class AlignAction : EfemAction
  325. {
  326. private WaferSize _ws { get; }
  327. public AlignAction(EfemBase device, ModuleName mod, WaferSize size) : base(device, mod)
  328. {
  329. Type = EfemOperation.Align;
  330. this.Module = mod;
  331. this._ws = size;
  332. }
  333. public override void Execute()
  334. {
  335. _efem.MsgHandler.Send(new EfemMessage
  336. {
  337. Operation = this.Type,
  338. Head = EfemMessage.MsgHead.MOV,
  339. Parameters = new List<string> { Module.ToHWString(), this._ws.ToString() }
  340. });
  341. this.Status = ActionStatus.SendCmd;
  342. }
  343. public override void OnPostWork(string data) { }
  344. }
  345. class LedAction : EfemAction
  346. {
  347. private LightType Light { get; }
  348. private LightStatus LtStatus { get; }
  349. public LedAction(EfemBase device, LightType lt, LightStatus st) : base(device, ModuleName.EFEM)
  350. {
  351. Type = EfemOperation.Light;
  352. Light = lt;
  353. LtStatus = st;
  354. IsBackground = true;
  355. }
  356. public override void Execute()
  357. {
  358. _efem.MsgHandler.Send(new EfemMessage
  359. {
  360. Operation = this.Type,
  361. Head = EfemMessage.MsgHead.SET,
  362. Parameters = new List<string> { Constant.STOWER, Light.ToString(), LtStatus.ToString() }
  363. });
  364. _efem.Status = DeviceState.Busy;
  365. this.Status = ActionStatus.SendCmd;
  366. //EV.PostInfoLog(this.Module.ToString(), $"CMD[{this.ID}], Set {this.Light} = {LtStatus}");
  367. }
  368. public override void OnPostWork(string data)
  369. {
  370. }
  371. }
  372. class AbortAction: EfemAction
  373. {
  374. public AbortAction(EfemBase efem) : base(efem, ModuleName.EFEM)
  375. {
  376. Type = EfemOperation.Abort;
  377. }
  378. public override void Execute()
  379. {
  380. _efem.MsgHandler.Send(new EfemMessage
  381. {
  382. Operation = this.Type,
  383. Head = EfemMessage.MsgHead.MOV
  384. });
  385. }
  386. }
  387. }