TMCycle.cs 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337
  1. using Aitex.Core.RT.Routine;
  2. using Aitex.Core.RT.SCCore;
  3. using Aitex.Sorter.Common;
  4. using Venus_RT.Devices;
  5. using MECF.Framework.Common.Routine;
  6. using MECF.Framework.Common.Equipment;
  7. using MECF.Framework.Common.SubstrateTrackings;
  8. using Venus_Core;
  9. using Aitex.Core.RT.Log;
  10. using Aitex.Core.Util;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using Venus_RT.Modules.Schedulers;
  14. using Venus_RT.Scheduler;
  15. using System;
  16. using MECF.Framework.Common.Schedulers;
  17. namespace Venus_RT.Modules
  18. {
  19. class TMCycle : ModuleRoutineBase, IRoutine
  20. {
  21. enum TMCycleStep
  22. {
  23. Start,
  24. ReturnBack,
  25. Cycling,
  26. End,
  27. }
  28. private bool IsModuleAvailable(ModuleName module) => dictSchedulers.Keys.Contains(module) && dictSchedulers[module].IsAvailable;
  29. List<ModuleName> tmCycleRoutine = new List<ModuleName>() { ModuleName.LLA, ModuleName.PMA, ModuleName.PMB, ModuleName.LLB };
  30. int cycleCount = 1000;
  31. ModuleName _sourceModule = ModuleName.LLA;
  32. ModuleName _destinationModule = ModuleName.LLB;
  33. int _sourceSlotNumber = 4;
  34. int _destinationSlotNumber = 4;
  35. SchedulerTMRobot _TMRobot = new SchedulerTMRobot();
  36. private readonly int INVALID_SLOT = -1;
  37. Dictionary<ModuleName, SchedulerModule> dictSchedulers = new Dictionary<ModuleName, SchedulerModule>();
  38. Queue<MoveItem> _ReturnWafers = new Queue<MoveItem>();
  39. Queue<MoveItem> _runningItems = new Queue<MoveItem>();
  40. Queue<MoveItem> _CycleWafers = new Queue<MoveItem>();
  41. public int CycleIndex;
  42. public TMCycle() : base(ModuleName.System)
  43. {
  44. Name = "TM Cycle";
  45. void _initMoudle(ModuleName name, SchedulerModule sche)
  46. {
  47. if (ModuleHelper.IsInstalled(name))
  48. {
  49. dictSchedulers[name] = sche;
  50. }
  51. }
  52. _initMoudle(ModuleName.LLA, new SchedulerLoadLock(ModuleName.LLA));
  53. _initMoudle(ModuleName.LLB, new SchedulerLoadLock(ModuleName.LLB));
  54. _initMoudle(ModuleName.PMA, new SchedulerPM(ModuleName.PMA));
  55. _initMoudle(ModuleName.PMB, new SchedulerPM(ModuleName.PMB));
  56. _initMoudle(ModuleName.PMC, new SchedulerPM(ModuleName.PMC));
  57. _initMoudle(ModuleName.PMD, new SchedulerPM(ModuleName.PMD));
  58. }
  59. public RState Start(params object[] objs)
  60. {
  61. CycleIndex = 0;
  62. if (objs.Length == 2)
  63. {
  64. var modules = ((string[])objs[0]).ToList();
  65. if (modules.Count >= 2)
  66. tmCycleRoutine.Clear();
  67. foreach(var mod in modules)
  68. {
  69. try
  70. {
  71. ModuleName module = ModuleHelper.Converter(mod);
  72. tmCycleRoutine.Add(module);
  73. }
  74. catch(Exception _)
  75. {
  76. LOG.Write(eEvent.ERR_ROUTER, "TMCycle", $"Invalid module string: {mod}");
  77. return RState.Failed;
  78. }
  79. }
  80. cycleCount = (int)objs[1];
  81. }
  82. // temp debug
  83. {
  84. //for(int i = 0; i < _sourceSlotNumber; i ++)
  85. //{
  86. // WaferManager.Instance.CreateWafer(_sourceModule, i, Aitex.Core.Common.WaferStatus.Normal);
  87. // WaferManager.Instance.DeleteWafer(_destinationModule, i);
  88. //}
  89. //WaferManager.Instance.DeleteWafer(ModuleName.TM, 0);
  90. //WaferManager.Instance.DeleteWafer(ModuleName.TM, 1);
  91. //WaferManager.Instance.DeleteWafer(ModuleName.PMA, 0);
  92. //WaferManager.Instance.DeleteWafer(ModuleName.PMB, 0);
  93. }
  94. // temp debug
  95. return Runner.Start(Module, Name);
  96. }
  97. public RState Monitor()
  98. {
  99. Runner.Run((int)TMCycleStep.Start, NullFun)
  100. .LoopStart((int)TMCycleStep.ReturnBack, "Cycle", cycleCount, StartReturn, ReturnBack)
  101. .LoopEnd((int)TMCycleStep.Cycling, StartCycle, Cycling)
  102. .End((int)TMCycleStep.End, NullFun, _delay_50ms);
  103. return Runner.Status;
  104. }
  105. private bool StartReturn()
  106. {
  107. CycleIndex += 1;
  108. _destinationModule = tmCycleRoutine.Last();
  109. _destinationSlotNumber = SC.GetValue<int>($"{_destinationModule}.SlotNumber");
  110. _sourceModule = tmCycleRoutine.First();
  111. _sourceSlotNumber = SC.GetValue<int>($"{_sourceModule}.SlotNumber");
  112. _ReturnWafers.Clear();
  113. for(int i = 0; i < _destinationSlotNumber; i++)
  114. {
  115. if(WaferManager.Instance.CheckHasWafer(_destinationModule, i))
  116. {
  117. _ReturnWafers.Enqueue(new MoveItem(_destinationModule, i, _sourceModule, INVALID_SLOT, Hand.None));
  118. }
  119. }
  120. return true;
  121. }
  122. List<int> GetReadyInSlot(ModuleName module, int slotCount)
  123. {
  124. List<int> slots = new List<int>();
  125. for (int i = 0; i < slotCount; i++)
  126. {
  127. if (WaferManager.Instance.CheckNoWafer(module, i))
  128. slots.Add(i);
  129. if (slots.Count >= 2)
  130. return slots;
  131. }
  132. return slots;
  133. }
  134. List<int> GetReadyOutSlot(ModuleName module, int slotCount)
  135. {
  136. List<int> slots = new List<int>();
  137. for (int i = 0; i < slotCount; i++)
  138. {
  139. if (WaferManager.Instance.CheckHasWafer(module, i))
  140. slots.Add(i);
  141. if (slots.Count >= 2)
  142. return slots;
  143. }
  144. return slots;
  145. }
  146. List<ModuleName> GetReadyOutPMs()
  147. {
  148. List<ModuleName> outpm = new List<ModuleName>();
  149. foreach(var module in tmCycleRoutine)
  150. {
  151. if(ModuleHelper.IsPm(module))
  152. {
  153. if(IsModuleAvailable(module) && WaferManager.Instance.CheckHasWafer(module, 0))
  154. {
  155. outpm.Add(module);
  156. if (outpm.Count >= 2)
  157. break;
  158. }
  159. }
  160. }
  161. return outpm;
  162. }
  163. List<ModuleName> GetReadyInPMs()
  164. {
  165. List<ModuleName> inpm = new List<ModuleName>();
  166. foreach (var module in tmCycleRoutine)
  167. {
  168. if (ModuleHelper.IsPm(module))
  169. {
  170. if (IsModuleAvailable(module) && WaferManager.Instance.CheckNoWafer(module, 0))
  171. {
  172. inpm.Add(module);
  173. if (inpm.Count >= 2)
  174. break;
  175. }
  176. }
  177. }
  178. return inpm;
  179. }
  180. private bool ReturnBack()
  181. {
  182. if (IsModuleAvailable(_sourceModule) && IsModuleAvailable(_destinationModule) && _TMRobot.IsAvailable)
  183. {
  184. var InSlots = GetReadyInSlot(_sourceModule, _sourceSlotNumber);
  185. var OutSlots = GetReadyOutSlot(_destinationModule, _destinationSlotNumber);
  186. if (InSlots.Count == 0 || OutSlots.Count == 0)
  187. return true;
  188. Queue<MoveItem> items = new Queue<MoveItem>();
  189. for(int i = 0; i < Math.Min(InSlots.Count, OutSlots.Count); i++)
  190. {
  191. items.Enqueue(new MoveItem(_destinationModule, OutSlots[i], _sourceModule, InSlots[i], (Hand)i));
  192. }
  193. if(items.Count > 0)
  194. {
  195. _TMRobot.PostMoveItems(items.ToArray());
  196. }
  197. }
  198. return false;
  199. }
  200. private bool ModuleHasWafer(ModuleName mod, int nSlots)
  201. {
  202. for(int i= 0; i< nSlots; i++)
  203. {
  204. if (WaferManager.Instance.CheckHasWafer(mod, i))
  205. return true;
  206. }
  207. return false;
  208. }
  209. private bool PMsHasWafers()
  210. {
  211. foreach (var module in tmCycleRoutine)
  212. {
  213. if (ModuleHelper.IsPm(module) && ModuleHelper.IsInstalled(module))
  214. {
  215. if (WaferManager.Instance.CheckHasWafer(module, 0))
  216. return true;
  217. }
  218. }
  219. return false;
  220. }
  221. private bool IsPMsAvailabe()
  222. {
  223. foreach (var module in tmCycleRoutine)
  224. {
  225. if (ModuleHelper.IsPm(module)&&ModuleHelper.IsInstalled(module))
  226. {
  227. if (!IsModuleAvailable(module))
  228. return false;
  229. }
  230. }
  231. return true;
  232. }
  233. private bool Cycling()
  234. {
  235. if(IsPMsAvailabe() && IsModuleAvailable(_destinationModule) && IsModuleAvailable(_sourceModule) && _TMRobot.IsAvailable)
  236. {
  237. if (!PMsHasWafers() && _TMRobot.IsAvailable && _CycleWafers.Count == 0)
  238. return true;
  239. if(PMsHasWafers())
  240. {
  241. var pmSlots = GetReadyOutPMs();
  242. var inSlots = GetReadyInSlot(_destinationModule, _destinationSlotNumber);
  243. for(int i = 0; i < Math.Min(pmSlots.Count, inSlots.Count); i++)
  244. {
  245. _runningItems.Enqueue(new MoveItem(pmSlots[i], 0, _destinationModule, inSlots[i], Hand.Both));
  246. }
  247. }
  248. else
  249. {
  250. var InPMs = GetReadyInPMs();
  251. if(_CycleWafers.Count > 0 && InPMs.Count >= 1)
  252. {
  253. var item = _CycleWafers.Dequeue();
  254. _runningItems.Enqueue(new MoveItem(item.SourceModule, item.SourceSlot, InPMs[0], 0, Hand.Both));
  255. }
  256. if(_CycleWafers.Count > 0 && InPMs.Count >= 2)
  257. {
  258. var item = _CycleWafers.Dequeue();
  259. _runningItems.Enqueue(new MoveItem(item.SourceModule, item.SourceSlot, InPMs[1], 0, Hand.Both));
  260. }
  261. }
  262. if (_runningItems.Count > 0)
  263. {
  264. if (_TMRobot.PostMoveItems(_runningItems.ToArray()))
  265. _runningItems.Clear();
  266. }
  267. }
  268. return false;
  269. }
  270. private bool StartCycle()
  271. {
  272. _CycleWafers.Clear();
  273. for(int i = 0; i< _sourceSlotNumber; i++)
  274. {
  275. if (WaferManager.Instance.CheckHasWafer(_sourceModule, i))
  276. _CycleWafers.Enqueue(new MoveItem(_sourceModule, i, _destinationModule, INVALID_SLOT, Hand.None));
  277. }
  278. return true;
  279. }
  280. public void Abort()
  281. {
  282. }
  283. }
  284. }