SchedulerRobot.cs 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. using Aitex.Core.RT.Fsm;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.Schedulers;
  7. using PunkHPX8_Core;
  8. using PunkHPX8_RT.Modules;
  9. using System;
  10. using System.Collections.Generic;
  11. using System.Linq;
  12. using System.Text;
  13. using System.Threading.Tasks;
  14. using MECF.Framework.Common.SubstrateTrackings;
  15. using PunkHPX8_RT.Modules.SRD;
  16. namespace PunkHPX8_RT.Schedulers.EfemRobot
  17. {
  18. public class SchedulerRobot : SchedulerModule
  19. {
  20. private enum SchedulerRobotOperation
  21. {
  22. None,
  23. Pick,
  24. PickWait,
  25. Place,
  26. PlaceWait
  27. }
  28. #region 内部变量
  29. private EfemEntity _efemEntity;
  30. #endregion
  31. #region 属性
  32. /// <summary>
  33. /// 是否空闲
  34. /// </summary>
  35. public override bool IsIdle
  36. {
  37. get { return _state == RState.End; }
  38. }
  39. /// <summary>
  40. /// 是否错误
  41. /// </summary>
  42. public override bool IsError
  43. {
  44. get { return _state == RState.Failed || _state == RState.Timeout; }
  45. }
  46. #endregion
  47. /// <summary>
  48. /// 构造函数
  49. /// </summary>
  50. /// <param name="module"></param>
  51. public SchedulerRobot(ModuleName module) : base(module.ToString())
  52. {
  53. _efemEntity = Singleton<RouteManager>.Instance.EFEM;
  54. }
  55. /// <summary>
  56. /// 执行
  57. /// </summary>
  58. /// <param name="parameter"></param>
  59. /// <returns></returns>
  60. public override bool RunProcess(object recipe, object parameter, List<SchedulerSyncModuleMessage> syncMessages)
  61. {
  62. if (_efemEntity.IsBusy)
  63. {
  64. return false;
  65. }
  66. MoveItem moveItem = (MoveItem)parameter;
  67. if (moveItem.SourceModule != ModuleName.Unknown&&moveItem.DestinationModule!=ModuleName.Unknown)
  68. {
  69. _state = RState.Running;
  70. if (RobotMoveHelper.Instance.IsIdle)
  71. {
  72. RobotMoveHelper.Instance.Start(moveItem, Module.ToString());
  73. return true;
  74. }
  75. }
  76. return false;
  77. }
  78. /// <summary>
  79. /// 监控执行
  80. /// </summary>
  81. /// <returns></returns>
  82. public override bool MonitorProcess(SchedulerSequence schedulerSequence, bool hasMatchWafer)
  83. {
  84. RobotMoveHelper.Instance.Monitor(Module.ToString());
  85. if (RobotMoveHelper.Instance.IsIdle)
  86. {
  87. _state = RState.End;
  88. }
  89. return true;
  90. }
  91. /// <summary>
  92. /// 检验前置条件
  93. /// </summary>
  94. /// <param name="sequenceIndex"></param>
  95. /// <param name="parameter"></param>
  96. /// <returns></returns>
  97. public override bool CheckPrecondition(List<SchedulerSequence> schedulerSequences, int sequenceIndex, object parameter,string materialId, ref string reason)
  98. {
  99. if (parameter == null)
  100. {
  101. reason = "parameter is null";
  102. return true;
  103. }
  104. if (_state == RState.Running)
  105. {
  106. reason = "scheduler module is already running";
  107. return false;
  108. }
  109. if(_efemEntity.IsBusy)
  110. {
  111. reason = "efem is busy";
  112. return false;
  113. }
  114. if(_efemEntity.IsError)
  115. {
  116. reason = "efem is error";
  117. return false;
  118. }
  119. MoveItem moveItem = (MoveItem)parameter;
  120. if(WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot,(int)moveItem.RobotHand))
  121. {
  122. reason = "robot has wafer";
  123. return false;
  124. }
  125. if (moveItem.SourceModule == ModuleName.Unknown)
  126. {
  127. UpdateUnkownSourceModule(schedulerSequences, moveItem, sequenceIndex);
  128. }
  129. if (moveItem.DestinationModule == ModuleName.Unknown)
  130. {
  131. bool result= UpdateUnkownTargetModule(schedulerSequences, moveItem, sequenceIndex);
  132. if (!result)
  133. {
  134. reason = "efem robot confirm target module failed";
  135. return false;
  136. }
  137. }
  138. return true;
  139. }
  140. /// <summary>
  141. /// 更新未知源模块
  142. /// </summary>
  143. private void UpdateUnkownSourceModule(List<SchedulerSequence> schedulerSequences, MoveItem moveItem, int sequenceIndex)
  144. {
  145. if (moveItem.SourceModule == ModuleName.Unknown)
  146. {
  147. if (sequenceIndex >= 1 && sequenceIndex - 1 < schedulerSequences.Count)
  148. {
  149. SchedulerSequence preSchedulerSequence = schedulerSequences[sequenceIndex - 1];
  150. if (preSchedulerSequence != null && preSchedulerSequence.SchedulerModule != null)
  151. {
  152. moveItem.SourceModule = preSchedulerSequence.SchedulerModule.Module;
  153. }
  154. }
  155. }
  156. }
  157. /// <summary>
  158. /// 更新未知目标模块
  159. /// </summary>
  160. private bool UpdateUnkownTargetModule(List<SchedulerSequence> schedulerSequences, MoveItem moveItem, int sequenceIndex)
  161. {
  162. SchedulerSequence currentSchedulerSequence= schedulerSequences[sequenceIndex];
  163. ModuleName moduleName = ModuleName.Unknown;
  164. if (moveItem.DestinationType == ModuleType.SRD)
  165. {
  166. SRDEntity srd1Entity = Singleton<RouteManager>.Instance.GetModule<SRDEntity>(ModuleName.SRD1.ToString());
  167. if (srd1Entity != null&&srd1Entity.IsIdle&&srd1Entity.IsAuto&&WaferManager.Instance.CheckNoWafer(ModuleName.SRD1.ToString(),0))
  168. {
  169. moduleName = ModuleName.SRD1;
  170. }
  171. else
  172. {
  173. SRDEntity srd2Entity= Singleton<RouteManager>.Instance.GetModule<SRDEntity>(ModuleName.SRD2.ToString());
  174. if (srd2Entity != null && srd2Entity.IsIdle&&srd2Entity.IsAuto && WaferManager.Instance.CheckNoWafer(ModuleName.SRD2.ToString(), 0))
  175. {
  176. moduleName=ModuleName.SRD2;
  177. }
  178. }
  179. }
  180. else
  181. {
  182. return false;
  183. }
  184. if (moduleName == ModuleName.Unknown)
  185. {
  186. return false;
  187. }
  188. else
  189. {
  190. if(WaferManager.Instance.CheckHasWafer(moduleName,0))
  191. {
  192. return false;
  193. }
  194. IModuleEntity moduleEntity = Singleton<RouteManager>.Instance.GetModule<IModuleEntity>(moduleName.ToString());
  195. if (moduleEntity==null)
  196. {
  197. return false;
  198. }
  199. if (moduleEntity.IsBusy)
  200. {
  201. return false;
  202. }
  203. moveItem.DestinationModule = moduleName;
  204. if (sequenceIndex + 1 < schedulerSequences.Count)
  205. {
  206. SchedulerSequence sequence = schedulerSequences[sequenceIndex + 1];
  207. if (sequence.SchedulerModule == null)
  208. {
  209. sequence.SchedulerModule = SchedulerManager.Instance.GetScheduler(moduleName);
  210. sequence.ModuleName = moduleName;
  211. }
  212. }
  213. }
  214. return true;
  215. }
  216. public override void ResetTask()
  217. {
  218. base.ResetTask();
  219. RobotMoveHelper.Instance.Reset();
  220. }
  221. }
  222. }