SchedulerMetal.cs 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. using Aitex.Common.Util;
  2. using Aitex.Core.Common;
  3. using Aitex.Core.RT.Log;
  4. using Aitex.Core.Util;
  5. using CyberX8_Core;
  6. using CyberX8_RT.Modules;
  7. using CyberX8_RT.Modules.Dryer;
  8. using CyberX8_RT.Modules.Loader;
  9. using CyberX8_RT.Modules.Metal;
  10. using CyberX8_RT.Modules.Prewet;
  11. using MECF.Framework.Common.Equipment;
  12. using MECF.Framework.Common.RecipeCenter;
  13. using MECF.Framework.Common.WaferHolder;
  14. using System;
  15. using System.Collections.Generic;
  16. using System.Linq;
  17. using System.Text;
  18. using System.Threading.Tasks;
  19. namespace CyberX8_RT.Schedulers.Metal
  20. {
  21. public class SchedulerMetal : SchedulerModule
  22. {
  23. #region 内部变量
  24. /// <summary>
  25. /// Metal Entity
  26. /// </summary>
  27. private MetalEntity _metalEntity;
  28. /// <summary>
  29. /// 是否开始Run Recipe
  30. /// </summary>
  31. private bool _isStartRunRecipe = false;
  32. #endregion
  33. #region 属性
  34. /// <summary>
  35. /// 是否空闲
  36. /// </summary>
  37. public override bool IsIdle
  38. {
  39. get { return _state == RState.End; }
  40. }
  41. /// <summary>
  42. /// 是否错误
  43. /// </summary>
  44. public override bool IsError
  45. {
  46. get { return _state == RState.Failed || _state == RState.Timeout; }
  47. }
  48. #endregion
  49. /// <summary>
  50. /// 构造函数
  51. /// </summary>
  52. /// <param name="module"></param>
  53. public SchedulerMetal(ModuleName moduleName) : base(moduleName.ToString())
  54. {
  55. _metalEntity = Singleton<RouteManager>.Instance.GetModule<MetalEntity>(moduleName.ToString());
  56. }
  57. /// <summary>
  58. /// 执行
  59. /// </summary>
  60. /// <param name="parameter"></param>
  61. /// <returns></returns>
  62. public override bool RunProcess(object recipe, object parameter, List<SchedulerSyncModuleMessage> syncModuleMessages)
  63. {
  64. if (!(recipe is DepRecipe))
  65. {
  66. _state = RState.Failed;
  67. LOG.WriteLog(eEvent.ERR_DRYER, Module.ToString(), "recipe is invalid");
  68. return false;
  69. }
  70. DepRecipe depRecipe = (DepRecipe)recipe;
  71. WaferHolderInfo waferHolderInfo = _metalEntity.WaferHolderInfo;
  72. if (waferHolderInfo == null)
  73. {
  74. return false;
  75. }
  76. string side = "";
  77. if (waferHolderInfo.WaferAType == (int)WaferType.Production && waferHolderInfo.WaferBType == (int)WaferType.Assit)
  78. {
  79. side = "SideA";
  80. }
  81. else if (waferHolderInfo.WaferBType == (int)WaferType.Production && waferHolderInfo.WaferAType == (int)WaferType.Assit)
  82. {
  83. side = "SideB";
  84. }
  85. _isStartRunRecipe = false;
  86. bool result = _metalEntity.CheckToPostMessage<MetalState, MetalMsg>(eEvent.ERR_METAL, Module.ToString(),
  87. (int)MetalMsg.RunRecipe, depRecipe,side, 1);
  88. if (result)
  89. {
  90. _state = RState.Running;
  91. }
  92. return result;
  93. }
  94. /// <summary>
  95. /// 监控执行
  96. /// </summary>
  97. /// <returns></returns>
  98. public override bool MonitorProcess(SchedulerSequence schedulerSequence, bool hasMatchWafer)
  99. {
  100. if (!_isStartRunRecipe)
  101. {
  102. _isStartRunRecipe = _metalEntity.State == (int)MetalState.RunReciping;
  103. }
  104. if (_metalEntity.IsError)
  105. {
  106. _state = RState.Failed;
  107. _isStartRunRecipe = false;
  108. return true;
  109. }
  110. if (_isStartRunRecipe)
  111. {
  112. if (_metalEntity.IsIdle)
  113. {
  114. _state = RState.End;
  115. _isStartRunRecipe = false;
  116. }
  117. }
  118. return true;
  119. }
  120. /// <summary>
  121. /// 检验前置条件
  122. /// </summary>
  123. /// <param name="sequenceIndex"></param>
  124. /// <param name="parameter"></param>
  125. /// <returns></returns>
  126. public override bool CheckPrecondition(List<SchedulerSequence> schedulerSequences, int sequenceIndex, object parameter, string materialId, ref string reason)
  127. {
  128. if (_state == RState.Running)
  129. {
  130. reason = "scheduler module is already running";
  131. return false;
  132. }
  133. if (_metalEntity.WaferHolderInfo==null)
  134. {
  135. reason = $"{_metalEntity.Module} has no wafer shuttle";
  136. return false;
  137. }
  138. if (_metalEntity.WaferHolderInfo.Id != materialId)
  139. {
  140. reason = $"{_metalEntity.Module} wafer shuttle {_metalEntity.WaferHolderInfo.Id} is not matched with {materialId}";
  141. return false;
  142. }
  143. if (_metalEntity.IsIdle || _metalEntity.State == (int)MetalState.WaitForRunRecipe)
  144. {
  145. return true;
  146. }
  147. else
  148. {
  149. reason = $"{_metalEntity.Module} is not idle or WaitForRunRecipe";
  150. return false;
  151. }
  152. }
  153. }
  154. }