PufNoWaferPickRoutine.cs 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Routine;
  3. using Aitex.Core.RT.SCCore;
  4. using MECF.Framework.Common.Equipment;
  5. using MECF.Framework.Common.Routine;
  6. using MECF.Framework.Common.Utilities;
  7. using CyberX8_Core;
  8. using CyberX8_RT.Devices.AXIS;
  9. using CyberX8_RT.Devices.PUF;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. namespace CyberX8_RT.Modules.PUF
  16. {
  17. public class PufNoWaferPickRoutine : RoutineBase, IRoutine
  18. {
  19. private enum PufPickStep
  20. {
  21. VacuumLevelCheck,
  22. RotationLoaderPickup,
  23. RotationLoaderPickupWait,
  24. VerticalFlip,
  25. VerticalFlipWait,
  26. FlipSide,
  27. FlipSideWait,
  28. VerticalLoaderPickup,
  29. VerticalLoaderPickupWait,
  30. VacuumOn,
  31. StickDistance,
  32. StickDistanceWait,
  33. StickDistanceCheck,
  34. ReVerticalFlip,
  35. ReVerticalFlipWait,
  36. VerticalPark,
  37. VerticalParkWait,
  38. RotationPark,
  39. RotationParkWait,
  40. End
  41. }
  42. #region 常量
  43. private const string SideA = "SideA";
  44. private const string SideB = "SideB";
  45. private const string VACUUM_OFF= "VacuumOff";
  46. private const string WAFER_PRESENT = "WaferPresent";
  47. #endregion
  48. #region 内部变量
  49. private JetAxisBase _flipAxis;
  50. private JetAxisBase _rotationAxis;
  51. private JetAxisBase _verticalAxis;
  52. private PufDistanceSensor _distanceSensor;
  53. private PufVacuum _vacuum;
  54. private string _side;
  55. private bool _enableCheckStickDistanceStatus = false;
  56. #endregion
  57. public PufNoWaferPickRoutine(string module) : base(module)
  58. {
  59. _flipAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Flip");
  60. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Rotation");
  61. _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{module}.Vertical");
  62. _vacuum = DEVICE.GetDevice<PufVacuum>($"{module}.Vacuum");
  63. _distanceSensor = DEVICE.GetDevice<PufDistanceSensor>($"{module}.DistanceSensor");
  64. }
  65. public void Abort()
  66. {
  67. Runner.Stop("Manual Abort");
  68. }
  69. public RState Monitor()
  70. {
  71. Runner.Run(PufPickStep.VacuumLevelCheck, CheckVacuumLevel, 100)
  72. .Run(PufPickStep.RotationLoaderPickup,()=> { return _rotationAxis.PositionStation("LoaderPickup"); },NullFun,100)
  73. .WaitWithStopCondition(PufPickStep.RotationLoaderPickupWait,CheckRotationPositionStatus,CheckRotationPositionRunStop)
  74. .Run(PufPickStep.VerticalFlip, () => { return _verticalAxis.PositionStation("Flip"); },NullFun,100)
  75. .WaitWithStopCondition(PufPickStep.VerticalFlipWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
  76. .Run(PufPickStep.FlipSide, () => { return _flipAxis.PositionStation(_side); }, NullFun, 100)
  77. .WaitWithStopCondition(PufPickStep.FlipSideWait, CheckFlipPositionStatus, CheckFlipPositionRunStop)
  78. .Run(PufPickStep.VerticalLoaderPickup, () => { return _verticalAxis.PositionStation("LoaderPickup"); }, NullFun, 100)
  79. .WaitWithStopCondition(PufPickStep.VerticalLoaderPickupWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
  80. .Run(PufPickStep.VacuumOn,VacuumOn,CheckWaferPresent,5000)
  81. .Run(PufPickStep.StickDistance,StickDistance,100)
  82. .WaitWithStopCondition(PufPickStep.StickDistanceWait,CheckVerticalPositionStatus,CheckVerticalPositionRunStop)
  83. .Wait(PufPickStep.StickDistanceCheck,CheckStickDistanceStatus,1000)
  84. .Run(PufPickStep.ReVerticalFlip, () => { return _verticalAxis.PositionStation("Flip"); }, NullFun, 100)
  85. .WaitWithStopCondition(PufPickStep.ReVerticalFlipWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
  86. .Run(PufPickStep.VerticalPark, () => { return _verticalAxis.PositionStation("Park"); }, NullFun, 100)
  87. .WaitWithStopCondition(PufPickStep.VerticalParkWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
  88. .Run(PufPickStep.RotationPark, () => { return _rotationAxis.PositionStation("Park"); }, NullFun, 100)
  89. .WaitWithStopCondition(PufPickStep.RotationParkWait, CheckRotationPositionStatus, CheckRotationPositionRunStop)
  90. .End(PufPickStep.End, NullFun);
  91. return Runner.Status;
  92. }
  93. /// <summary>
  94. /// 检验VacuumLevel
  95. /// </summary>
  96. /// <returns></returns>
  97. private bool CheckVacuumLevel()
  98. {
  99. if (_side == SideA)
  100. {
  101. return _vacuum.ChuckAVacuumStatus == VACUUM_OFF;
  102. }
  103. else if (_side == SideB)
  104. {
  105. return _vacuum.ChuckBVacuumStatus == VACUUM_OFF;
  106. }
  107. else
  108. {
  109. return false;
  110. }
  111. }
  112. /// <summary>
  113. /// 检验存在Wafer
  114. /// </summary>
  115. /// <returns></returns>
  116. private bool CheckWaferPresent()
  117. {
  118. if (_side == SideA)
  119. {
  120. return _vacuum.ChuckAVacuumStatus==WAFER_PRESENT;
  121. }
  122. else if (_side == SideB)
  123. {
  124. return _vacuum.ChuckBVacuumStatus==WAFER_PRESENT;
  125. }
  126. else
  127. {
  128. return false;
  129. }
  130. }
  131. /// <summary>
  132. /// 检验Rotation移动状态
  133. /// </summary>
  134. /// <returns></returns>
  135. private bool CheckRotationPositionStatus()
  136. {
  137. return _rotationAxis.Status == RState.End;
  138. }
  139. /// <summary>
  140. /// 检验Rotation是否还在运动
  141. /// </summary>
  142. /// <returns></returns>
  143. private bool CheckRotationPositionRunStop()
  144. {
  145. return _rotationAxis.Status == RState.Failed;
  146. }
  147. /// <summary>
  148. /// 检验Vertical移动状态
  149. /// </summary>
  150. /// <returns></returns>
  151. private bool CheckVerticalPositionStatus()
  152. {
  153. return _verticalAxis.Status == RState.End;
  154. }
  155. /// <summary>
  156. /// 检验Vertical是否还在运动
  157. /// </summary>
  158. /// <returns></returns>
  159. private bool CheckVerticalPositionRunStop()
  160. {
  161. return _verticalAxis.Status == RState.Failed;
  162. }
  163. /// <summary>
  164. /// 检验Flip移动状态
  165. /// </summary>
  166. /// <returns></returns>
  167. private bool CheckFlipPositionStatus()
  168. {
  169. return _flipAxis.Status == RState.End;
  170. }
  171. /// <summary>
  172. /// 检验Flip是否还在运动
  173. /// </summary>
  174. /// <returns></returns>
  175. private bool CheckFlipPositionRunStop()
  176. {
  177. return _flipAxis.Status == RState.Failed;
  178. }
  179. /// <summary>
  180. /// 打开Vacuum
  181. /// </summary>
  182. /// <returns></returns>
  183. private bool VacuumOn()
  184. {
  185. if(_side==SideA)
  186. {
  187. return _vacuum.VacuumAOn();
  188. }
  189. else if(_side==SideB)
  190. {
  191. return _vacuum.VacuumBOn();
  192. }
  193. return false;
  194. }
  195. /// <summary>
  196. /// Stick Distance
  197. /// </summary>
  198. /// <returns></returns>
  199. private bool StickDistance()
  200. {
  201. return _distanceSensor.GotoStickDistance();
  202. }
  203. /// <summary>
  204. /// Stick Distance检验结果
  205. /// </summary>
  206. /// <returns></returns>
  207. private bool CheckStickDistanceStatus()
  208. {
  209. if (_enableCheckStickDistanceStatus)
  210. {
  211. if (_side == "SideA")
  212. {
  213. return _distanceSensor.CheckStickDistanceStatus();
  214. }
  215. else
  216. {
  217. return true;
  218. }
  219. }
  220. else
  221. {
  222. return true;
  223. }
  224. }
  225. /// <summary>
  226. /// 启动
  227. /// </summary>
  228. /// <param name="objs"></param>
  229. /// <returns></returns>
  230. public RState Start(params object[] objs)
  231. {
  232. _side = objs[0].ToString();
  233. _enableCheckStickDistanceStatus = SC.GetValue<bool>($"{Module}.EnableCheckStickDistanceStatus");
  234. Runner.Start(Module, "NoWaferPick");
  235. return RState.Running;
  236. }
  237. }
  238. }