SchedulerWaferRobot.cs 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.Util;
  3. using Aitex.Sorter.Common;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.SubstrateTrackings;
  6. using FurnaceRT.Equipments.Systems;
  7. using FurnaceRT.Equipments.WaferRobots;
  8. using FurnaceRT.Equipments.FIMSs;
  9. namespace FurnaceRT.Equipments.Schedulers
  10. {
  11. public class SchedulerWaferRobot : SchedulerModule
  12. {
  13. public override bool IsAvailable
  14. {
  15. get { return _waferRobot.IsReady && _waferRobot.IsOnline && CheckTaskDone(); }
  16. }
  17. public override bool IsOnline
  18. {
  19. get { return _waferRobot.IsOnline; }
  20. }
  21. public override bool IsError
  22. {
  23. get { return _waferRobot.IsError; }
  24. }
  25. private WaferRobotModuleBase _waferRobot = null;
  26. private Hand _hand;
  27. private Hand _taskSwapPickHand;
  28. private Hand _taskSwapPlaceHand;
  29. private int _taskSwapPickSlot;
  30. private int _taskSwapPlaceSlot;
  31. public ModuleName PreviousTarget { get; set; }
  32. public SchedulerWaferRobot() : base(ModuleName.WaferRobot.ToString())
  33. {
  34. _waferRobot = Singleton<EquipmentManager>.Instance.Modules[ModuleName.WaferRobot] as WaferRobotModuleBase;
  35. PreviousTarget = ModuleName.System;
  36. }
  37. public override void ResetTask()
  38. {
  39. base.ResetTask();
  40. PreviousTarget = ModuleName.System;
  41. }
  42. public bool IsReadyForPick(Hand blade)
  43. {
  44. if(blade == Hand.Blade1)
  45. {
  46. return WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 0);
  47. }
  48. else if (blade == Hand.Blade2)
  49. {
  50. return WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1) &&
  51. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2) &&
  52. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3) &&
  53. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);
  54. }
  55. else
  56. {
  57. return WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 0) &&
  58. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1) &&
  59. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2) &&
  60. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3) &&
  61. WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);
  62. }
  63. }
  64. public bool IsReadyForPlace(Hand blade)
  65. {
  66. if (blade == Hand.Blade1)
  67. {
  68. return WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0);
  69. }
  70. else if (blade == Hand.Blade2)
  71. {
  72. return WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1) &&
  73. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2) &&
  74. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3) &&
  75. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);
  76. }
  77. else
  78. {
  79. return WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0) &&
  80. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1) &&
  81. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2) &&
  82. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3) &&
  83. WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);
  84. }
  85. }
  86. public bool Pick(ModuleName source, int slot, Hand hand)
  87. {
  88. _task = TaskType.Pick;
  89. _hand = hand;
  90. if (!_waferRobot.Pick(source, hand, slot, out string reason))
  91. {
  92. LOG.Write(reason);
  93. }
  94. PreviousTarget = source;
  95. LogTaskStart(_task, $"{source}.{slot + 1}=>{Module}.{hand}");
  96. return true;
  97. }
  98. public bool Place(ModuleName destination, int slot, Hand hand)
  99. {
  100. _task = TaskType.Place;
  101. _hand = hand;
  102. if (!_waferRobot.Place(destination, hand, slot, out string reason))
  103. {
  104. LOG.Write(reason);
  105. }
  106. PreviousTarget = destination;
  107. LogTaskStart(_task, $"{Module}.{hand}=>{destination}.{slot + 1}");
  108. return true;
  109. }
  110. public bool Map(ModuleName destination, int slotNumber, string slotMap, bool isCompareWithSlotMap, bool isCreateWafer, Hand hand)
  111. {
  112. _task = TaskType.Map;
  113. _hand = hand;
  114. if (!_waferRobot.Map(destination, hand, slotNumber, slotMap, isCompareWithSlotMap, isCreateWafer, out string reason))
  115. {
  116. LOG.Write(reason);
  117. }
  118. if (destination == ModuleName.FIMS1 || destination == ModuleName.FIMS2)
  119. (Singleton<EquipmentManager>.Instance.Modules[destination] as FIMSModule).IsMapping = true;
  120. PreviousTarget = destination;
  121. LogTaskStart(_task, $"{Module}.{hand}=> slot number = {slotNumber}");
  122. return true;
  123. }
  124. public bool Goto(ModuleName target, int slot, Hand hand )
  125. {
  126. PreviousTarget = target;
  127. _task = TaskType.Goto;
  128. //if (!_waferRobot.Goto(target, hand, slot, out string reason))
  129. //{
  130. // LOG.Write(reason);
  131. //}
  132. LogTaskStart(_task, $"robot {hand} goto {target}, slot {slot+1}");
  133. return true;
  134. }
  135. public bool CheckTaskDone()
  136. {
  137. bool ret = false;
  138. switch (_task)
  139. {
  140. case TaskType.None:
  141. ret = true;
  142. break;
  143. case TaskType.Pick:
  144. if (_hand == Hand.Both)
  145. {
  146. ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 0)
  147. && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1)
  148. && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2)
  149. && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3)
  150. && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);
  151. }
  152. else if(_hand == Hand.Blade1)
  153. {
  154. ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2);
  155. }
  156. else
  157. {
  158. ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 1)
  159. && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 2)
  160. && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 3)
  161. && WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, 4);
  162. }
  163. break;
  164. case TaskType.Place:
  165. if (_hand == Hand.Both)
  166. {
  167. ret = WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 0)
  168. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1)
  169. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2)
  170. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3)
  171. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);
  172. }
  173. else if (_hand == Hand.Blade1)
  174. {
  175. ret = WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2);
  176. }
  177. else
  178. {
  179. ret = WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 1)
  180. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 2)
  181. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 3)
  182. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, 4);
  183. }
  184. break;
  185. case TaskType.Goto:
  186. ret = _waferRobot.IsReady;
  187. break;
  188. case TaskType.PickAndPlace:
  189. ret = WaferManager.Instance.CheckHasWafer(ModuleName.WaferRobot, (int)_taskSwapPickHand)
  190. && WaferManager.Instance.CheckNoWafer(ModuleName.WaferRobot, (int)_taskSwapPlaceHand);
  191. break;
  192. case TaskType.Map:
  193. var carrier = CarrierManager.Instance.GetCarrier(PreviousTarget, 0);
  194. if (carrier != null)
  195. ret = carrier.IsMapped;
  196. else
  197. ret = _waferRobot.IsReady;
  198. break;
  199. }
  200. if (ret && _task != TaskType.None)
  201. {
  202. LogTaskDone(_task, "");
  203. _task = TaskType.None;
  204. }
  205. return ret;
  206. }
  207. }
  208. }