RouteManager.cs 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using Aitex.Core.RT.Fsm;
  7. using Aitex.Core.Common;
  8. using Aitex.Core.RT.DataCenter;
  9. using Aitex.Core.RT.Event;
  10. using Aitex.Core.RT.OperationCenter;
  11. using Aitex.Core.RT.Routine;
  12. using Aitex.Core.RT.SCCore;
  13. using Aitex.Core.Util;
  14. using MECF.Framework.Common.Equipment;
  15. using MECF.Framework.Common.SubstrateTrackings;
  16. using Venus_Core;
  17. using Venus_RT.Modules.PMs;
  18. namespace Venus_RT.Modules
  19. {
  20. class RouteManager : Entity, IEntity
  21. {
  22. public enum MSG
  23. {
  24. MoveWafer,
  25. ReturnWafer,
  26. HomeUnit,
  27. PauseAuto,
  28. ResumeAuto,
  29. Stop,
  30. StartCycle,
  31. HOME,
  32. RESET,
  33. ABORT,
  34. ERROR,
  35. SetAutoMode,
  36. SetManualMode,
  37. ResetIdleCleanTime,
  38. ResetIdlePurgeTime,
  39. CreateJob,
  40. PauseJob,
  41. ResumeJob,
  42. StartJob,
  43. StopJob,
  44. AbortJob,
  45. JobDone,
  46. CassetteLeave, //For unload light control off afer job done
  47. Map,
  48. ReturnAllWafer,
  49. TMCycle,
  50. }
  51. public PMEntity PMA { get; private set; }
  52. public PMEntity PMB { get; private set; }
  53. public PMEntity PMC { get; private set; }
  54. public PMEntity PMD { get; private set; }
  55. public TMEntity TM { get; private set; }
  56. public LLEntity LLA { get; private set; }
  57. public LLEntity LLB { get; private set; }
  58. public EfemEntity EFEM { get; private set; }
  59. public string Name { get; set; }
  60. private TMCycle _TMCycle;
  61. public RouteManager()
  62. {
  63. Name = "System";
  64. if (ModuleHelper.IsInstalled(ModuleName.PMA))
  65. PMA = new PMEntity(ModuleName.PMA);
  66. if (ModuleHelper.IsInstalled(ModuleName.PMB))
  67. PMB = new PMEntity(ModuleName.PMB);
  68. if (ModuleHelper.IsInstalled(ModuleName.PMC))
  69. PMC = new PMEntity(ModuleName.PMC);
  70. if (ModuleHelper.IsInstalled(ModuleName.PMD))
  71. PMD = new PMEntity(ModuleName.PMD);
  72. if (ModuleHelper.IsInstalled(ModuleName.TM))
  73. TM = new TMEntity();
  74. if (ModuleHelper.IsInstalled(ModuleName.LLA))
  75. LLA = new LLEntity(ModuleName.LLA);
  76. if (ModuleHelper.IsInstalled(ModuleName.LLB))
  77. LLB = new LLEntity(ModuleName.LLB);
  78. fsm = new StateMachine<RouteManager>(Name, (int)RtState.Init, 200);
  79. SubscribeOperation();
  80. }
  81. public bool Check(int msg, out string reason, params object[] args)
  82. {
  83. if (!fsm.FindTransition(fsm.State, msg))
  84. {
  85. reason = String.Format("{0} is in {1} state,can not do {2}", Name, 0, (MSG)msg);
  86. return false;
  87. }
  88. if (msg == (int)MSG.StartCycle)
  89. {
  90. //if (!IsAutoMode)
  91. {
  92. reason = String.Format("can not do {0}, isn't auto mode.", msg.ToString());
  93. return false;
  94. }
  95. }
  96. reason = "";
  97. return true;
  98. }
  99. void SubscribeOperation()
  100. {
  101. OP.Subscribe("CreateWafer", InvokeCreateWafer);
  102. OP.Subscribe("DeleteWafer", InvokeDeleteWafer);
  103. }
  104. private bool InvokeCreateWafer(string arg1, object[] args)
  105. {
  106. ModuleName chamber = ModuleHelper.Converter(args[0].ToString());
  107. int slot = (int)args[1];
  108. WaferStatus state = WaferStatus.Normal;
  109. if (WaferManager.Instance.IsWaferSlotLocationValid(chamber, slot))
  110. {
  111. if (WaferManager.Instance.CheckHasWafer(chamber, slot))
  112. {
  113. EV.PostInfoLog("System", string.Format("{0} slot {1} already has wafer.create wafer is not valid", chamber, slot));
  114. }
  115. else if (WaferManager.Instance.CreateWafer(chamber, slot, state) != null)
  116. {
  117. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferCreate, chamber.ToString(), slot + 1, state.ToString());
  118. }
  119. }
  120. else
  121. {
  122. EV.PostWarningLog("System", string.Format("Invalid position,{0},{1}", chamber.ToString(), slot.ToString()));
  123. return false;
  124. }
  125. return true;
  126. }
  127. private bool InvokeDeleteWafer(string arg1, object[] args)
  128. {
  129. ModuleName chamber = ModuleHelper.Converter(args[0].ToString());
  130. int slot = (int)args[1];
  131. if (WaferManager.Instance.IsWaferSlotLocationValid(chamber, slot))
  132. {
  133. if (WaferManager.Instance.CheckHasWafer(chamber, slot))
  134. {
  135. WaferManager.Instance.DeleteWafer(chamber, slot);
  136. EV.PostMessage(ModuleName.System.ToString(), EventEnum.WaferDelete, chamber.ToString(), slot + 1);
  137. }
  138. else
  139. {
  140. EV.PostInfoLog("System", string.Format("No wafer at {0} {1}, delete not valid", chamber.ToString(), slot + 1));
  141. }
  142. }
  143. else
  144. {
  145. EV.PostWarningLog("System", string.Format("Invalid position,{0},{1}", chamber.ToString(), slot.ToString()));
  146. return false;
  147. }
  148. return true;
  149. }
  150. public PMEntity GetPM(ModuleName mod)
  151. {
  152. if (ModuleHelper.IsInstalled(mod))
  153. {
  154. switch (mod)
  155. {
  156. case ModuleName.PMA:
  157. return PMA;
  158. case ModuleName.PMB:
  159. return PMB;
  160. case ModuleName.PMC:
  161. return PMC;
  162. case ModuleName.PMD:
  163. return PMD;
  164. }
  165. }
  166. return null;
  167. }
  168. public LLEntity GetLL(ModuleName mod)
  169. {
  170. if (ModuleHelper.IsInstalled(mod))
  171. {
  172. switch (mod)
  173. {
  174. case ModuleName.LLA:
  175. return LLA;
  176. case ModuleName.LLB:
  177. return LLB;
  178. }
  179. }
  180. return null;
  181. }
  182. protected override bool Init()
  183. {
  184. PMA?.Initialize();
  185. PMB?.Initialize();
  186. TM?.Initialize();
  187. LLA?.Initialize();
  188. LLB?.Initialize();
  189. _TMCycle = new TMCycle();
  190. return true;
  191. }
  192. private void BuildTransitionTable()
  193. {
  194. //Init sequence
  195. Transition(RtState.Init, MSG.HOME, FsmStartHome, RtState.Initializing);
  196. Transition(RtState.Idle, MSG.HOME, FsmStartHome, RtState.Initializing);
  197. Transition(RtState.Error, MSG.HOME, FsmStartHome, RtState.Initializing);
  198. //// EnterExitTransition<RtState, FSM_MSG>(RtState.Initializing, fStartInit, FSM_MSG.NONE, null);
  199. Transition(RtState.Initializing, FSM_MSG.TIMER, FsmMonitorHome, RtState.Idle);
  200. Transition(RtState.Initializing, MSG.ERROR, FsmError, RtState.Error);
  201. Transition(RtState.Initializing, MSG.ABORT, FsmAbort, RtState.Init);
  202. // TM Cycle
  203. Transition(RtState.Idle, MSG.TMCycle, FsmStartTMCycle, RtState.TMCycle);
  204. Transition(RtState.TMCycle, FSM_MSG.TIMER, FsmMonitorTMCycle, RtState.Idle);
  205. Transition(RtState.TMCycle, MSG.ABORT, FsmAbort, RtState.Idle);
  206. }
  207. private bool FsmStartHome(object[] objs)
  208. {
  209. return true;
  210. }
  211. private bool FsmMonitorHome(object[] objs)
  212. {
  213. return true;
  214. }
  215. private bool FsmError(object[] objs)
  216. {
  217. return true;
  218. }
  219. private bool FsmAbort(object[] objs)
  220. {
  221. return true;
  222. }
  223. private bool FsmStartTMCycle(object[] objs)
  224. {
  225. return _TMCycle.Start() == RState.Running;
  226. }
  227. private bool FsmMonitorTMCycle(object[] objs)
  228. {
  229. RState ret = _TMCycle.Monitor();
  230. if (ret == RState.Failed || ret == RState.Timeout)
  231. {
  232. PostMsg(MSG.ERROR);
  233. return false;
  234. }
  235. return ret == RState.End;
  236. }
  237. }
  238. }