SchedulerAligner.cs 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. using System.Diagnostics;
  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.Util;
  8. using Aitex.Core.RT.SCCore;
  9. using Aitex.Sorter.Common;
  10. using MECF.Framework.Common.Equipment;
  11. using MECF.Framework.Common.Schedulers;
  12. using MECF.Framework.Common.SubstrateTrackings;
  13. using CyberX8_RT.Modules;
  14. using MECF.Framework.Common.CommonData;
  15. using CyberX8_Core;
  16. using Aitex.Core.RT.Log;
  17. using Aitex.Core.Common;
  18. namespace CyberX8_RT.Schedulers.Aligner
  19. {
  20. public class SchedulerAligner : SchedulerModule
  21. {
  22. #region 内部变量
  23. private EfemEntity _efemEntity;
  24. #endregion
  25. #region 属性
  26. /// <summary>
  27. /// 是否空闲
  28. /// </summary>
  29. public override bool IsIdle
  30. {
  31. get { return _state == RState.End; }
  32. }
  33. /// <summary>
  34. /// 是否错误
  35. /// </summary>
  36. public override bool IsError
  37. {
  38. get { return _state == RState.Failed || _state == RState.Timeout; }
  39. }
  40. #endregion
  41. /// <summary>
  42. /// 构造函数
  43. /// </summary>
  44. /// <param name="module"></param>
  45. public SchedulerAligner(ModuleName module) : base(module.ToString())
  46. {
  47. _efemEntity = Singleton<RouteManager>.Instance.EFEM;
  48. }
  49. /// <summary>
  50. /// 执行
  51. /// </summary>
  52. /// <param name="parameter"></param>
  53. /// <returns></returns>
  54. public override bool RunProcess(object recipe, object parameter, List<SchedulerSyncModuleMessage> syncModuleMessages)
  55. {
  56. if (_efemEntity.IsBusy)
  57. {
  58. return false;
  59. }
  60. int angle = int.Parse(parameter.ToString());
  61. return _efemEntity.CheckToPostMessage<EfemEntity.STATE, EfemEntity.MSG>(eEvent.ERR_EFEM_COMMON_FAILED,
  62. Module.ToString(), (int)EfemEntity.MSG.Align, ModuleName.Aligner1.ToString(), 0, angle);
  63. }
  64. /// <summary>
  65. /// 监控执行
  66. /// </summary>
  67. /// <returns></returns>
  68. public override bool MonitorProcess(SchedulerSequence schedulerSequence,bool hasMatchWafer)
  69. {
  70. if (_efemEntity.IsBusy)
  71. {
  72. _state = RState.Running;
  73. }
  74. if (_efemEntity.IsIdle)
  75. {
  76. _state = RState.End;
  77. }
  78. return true;
  79. }
  80. /// <summary>
  81. /// 检验前置条件
  82. /// </summary>
  83. /// <param name="sequenceIndex"></param>
  84. /// <param name="parameter"></param>
  85. /// <returns></returns>
  86. public override bool CheckPrecondition(List<SchedulerSequence> schedulerSequences, int sequenceIndex, object parameter, string materialId, ref string reason)
  87. {
  88. if(_state == RState.Running)
  89. {
  90. reason = "scheduler module is already running";
  91. return false;
  92. }
  93. if (WaferManager.Instance.CheckHasWafer(Module, 0))
  94. {
  95. WaferInfo waferInfo = WaferManager.Instance.GetWafer(Module, 0);
  96. bool result= waferInfo.WaferID==materialId;
  97. if (!result)
  98. {
  99. reason = $"aligner wafer id {waferInfo.WaferID} is not matched with {materialId}";
  100. }
  101. return result;
  102. }
  103. else
  104. {
  105. reason = "aligner has no wafer";
  106. return false;
  107. }
  108. }
  109. }
  110. }