EFEMAlignRoutine.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  1. using Aitex.Core.Common;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.SubstrateTrackings;
  6. using System;
  7. using System.Collections.Generic;
  8. using CyberX8_Core;
  9. using CyberX8_RT.Devices.EFEM;
  10. using Aitex.Core.Util;
  11. using MECF.Framework.Common.Routine;
  12. using Aitex.Core.RT.SCCore;
  13. namespace CyberX8_RT.Modules.EFEM
  14. {
  15. public class EFEMAlignRoutine : RoutineBase, IRoutine
  16. {
  17. private enum AlignStep
  18. {
  19. WaitIdle,
  20. SetAlignWaferSize,
  21. WaitWaferSizeIdle,
  22. SetAlignFlatType,
  23. WaitAlignFlatTypeIdle,
  24. SetAlignDistance,
  25. WaitAlignDistanceIdle,
  26. SetAngle,
  27. ReWaitIdle,
  28. Rotate,
  29. LastWaitIdle,
  30. VacuumOff,
  31. End
  32. }
  33. private int _moveTimeout = 20 * 1000;
  34. EfemBase _efem;
  35. private double angle = 25;
  36. private WaferSize ws = WaferSize.WS12;
  37. private int _angleOffset = 0;
  38. private int _platType = 0;
  39. public EFEMAlignRoutine(EfemBase efem) : base(ModuleName.Aligner1.ToString())
  40. {
  41. _efem = efem;
  42. }
  43. public RState Start(params object[] objs)
  44. {
  45. if (SC.ContainsItem($"EFEM.AlignerOffsetAngle"))
  46. {
  47. _angleOffset = SC.GetValue<int>($"EFEM.AlignerOffsetAngle");
  48. }
  49. if (objs.Length >= 3)
  50. {
  51. try
  52. {
  53. angle = Convert.ToDouble(objs[2]) + _angleOffset;
  54. }
  55. catch
  56. {
  57. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"ALIAN PARAMETER IS ILLEGAL ");
  58. }
  59. }
  60. if (objs.Length >= 4)
  61. {
  62. _platType=(int)objs[3];
  63. }
  64. if (!CheckPreCondition())
  65. {
  66. return RState.Failed;
  67. }
  68. return Runner.Start(Module,$"PreAligner Start align");
  69. }
  70. /// <summary>
  71. /// 检验前置条件
  72. /// </summary>
  73. /// <returns></returns>
  74. private bool CheckPreCondition()
  75. {
  76. if (!WaferManager.Instance.CheckHasWafer(ModuleName.Aligner1, 0))
  77. {
  78. NotifyError(eEvent.ERR_EFEM_ROBOT, $"Efem PreAligner not have wafer, cannot do the align action",0);
  79. return false;
  80. }
  81. return true;
  82. }
  83. public RState Monitor()
  84. {
  85. Runner.Wait(AlignStep.WaitIdle, WaitEFEMIdle)
  86. .Run(AlignStep.SetAlignWaferSize, SetAlignerWaferSize,CheckAlignDone,_delay_5s)
  87. .Wait(AlignStep.WaitWaferSizeIdle, WaitEFEMIdle)
  88. .Run(AlignStep.SetAlignFlatType, SetAlignerFlatType, CheckAlignDone, _delay_5s)
  89. .Wait(AlignStep.WaitAlignFlatTypeIdle, WaitEFEMIdle)
  90. .Run(AlignStep.SetAlignDistance, SetAlignerDistance, CheckAlignDone, _delay_5s)
  91. .Wait(AlignStep.WaitAlignDistanceIdle, WaitEFEMIdle)
  92. .Run(AlignStep.SetAngle, SetAlignAngle, CheckAlignDone, _delay_5s)
  93. .Wait(AlignStep.ReWaitIdle, WaitEFEMIdle)
  94. .Run(AlignStep.Rotate, Align, CheckAlignDone, _moveTimeout)
  95. .Wait(AlignStep.LastWaitIdle, WaitEFEMIdle)
  96. //.Run(AlignStep.VacuumOff,VacuumOff,CheckAlignDone,_delay_5s)
  97. .End( AlignStep.End, ActionDone, 0);
  98. return Runner.Status;
  99. }
  100. private bool SetAlignerWaferSize()
  101. {
  102. return _efem.SetAlignWaferSize();
  103. }
  104. private bool SetAlignerFlatType()
  105. {
  106. return _efem.SetAlignFlatType(_platType);
  107. }
  108. private bool SetAlignerDistance()
  109. {
  110. return _efem.SetAlignDistance();
  111. }
  112. private bool VacuumOff()
  113. {
  114. return _efem.Vacuum(ModuleName.Aligner1, false);
  115. }
  116. private bool SetAlignAngle()
  117. {
  118. return _efem.SetAlignAngle(ModuleName.Aligner1, angle);
  119. }
  120. private bool Align()
  121. {
  122. return _efem.Align(ModuleName.Aligner1,angle,0,ws);
  123. }
  124. private bool CheckAlignDone()
  125. {
  126. if (_efem.Status == RState.End)
  127. {
  128. return true;
  129. }
  130. else if (_efem.Status == RState.Failed)
  131. {
  132. LOG.Write(eEvent.ERR_EFEM_COMMON_FAILED, Module, $"Efem PreAligner align failed: {_efem.Status}");
  133. return true;
  134. }
  135. return false;
  136. }
  137. private bool ActionDone()
  138. {
  139. return true;
  140. }
  141. private bool WaitEFEMIdle()
  142. {
  143. return Singleton<RouteManager>.Instance.EFEM.RobotStatus == RState.End;
  144. }
  145. public void Abort()
  146. {
  147. }
  148. /// <summary>
  149. /// 重试
  150. /// </summary>
  151. /// <param name="step"></param>
  152. public RState Retry(int step)
  153. {
  154. if (!CheckPreCondition())
  155. {
  156. return RState.Failed;
  157. }
  158. _efem.Reset();
  159. List<Enum> preStepIds = new List<Enum>();
  160. return Runner.Retry(AlignStep.WaitIdle, preStepIds, Module, "Align Retry");
  161. }
  162. /// <summary>
  163. /// 检验前面完成状态
  164. /// </summary>
  165. /// <returns></returns>
  166. public bool CheckCompleteCondition(int index)
  167. {
  168. return true;
  169. }
  170. }
  171. }