PufBackToParkRoutine.cs 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Routine;
  3. using MECF.Framework.Common.Routine;
  4. using CyberX8_Core;
  5. using CyberX8_RT.Devices.AXIS;
  6. using System;
  7. using System.Collections.Generic;
  8. using System.Linq;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. using Aitex.Core.RT.Log;
  12. using System.Windows.Media.Animation;
  13. using MECF.Framework.Common.Utilities;
  14. using MECF.Framework.Common.Equipment;
  15. using CyberX8_RT.Devices.PUF;
  16. namespace CyberX8_RT.Modules.PUF
  17. {
  18. public class PufBackToParkRoutine : RoutineBase, IRoutine
  19. {
  20. private enum BackToParkStep
  21. {
  22. ChuckIn,
  23. WaitChuck,
  24. RotationHome,
  25. WaitRotationHome,
  26. FlipSideA,
  27. WaitFlipSideA,
  28. End
  29. }
  30. #region 内部变量
  31. private JetAxisBase _flipAxis;
  32. private JetAxisBase _rotationAxis;
  33. private PufVacuum _pufVacuum;
  34. private PufChuckRoutine _chuckRoutine;
  35. #endregion
  36. /// <summary>
  37. /// 构造函数
  38. /// </summary>
  39. /// <param name="module"></param>
  40. public PufBackToParkRoutine(string module) : base(module)
  41. {
  42. _chuckRoutine=new PufChuckRoutine(module);
  43. _pufVacuum = DEVICE.GetDevice<PufVacuum>($"{Module}.Vacuum");
  44. }
  45. /// <summary>
  46. /// 中止
  47. /// </summary>
  48. public void Abort()
  49. {
  50. Runner.Stop("manual abort");
  51. }
  52. /// <summary>
  53. /// 监控
  54. /// </summary>
  55. /// <returns></returns>
  56. public RState Monitor()
  57. {
  58. Runner.Run(BackToParkStep.ChuckIn, () => _chuckRoutine.Start(false)==RState.Running, _delay_1ms)
  59. .WaitWithStopCondition(BackToParkStep.WaitChuck, ()=>CommonFunction.CheckRoutineEndState(_chuckRoutine),
  60. CheckChuckStopStatus)
  61. .Run(BackToParkStep.RotationHome, () => AxisGotoPosition(_rotationAxis, "Home", 0), _delay_1ms)
  62. .WaitWithStopCondition(BackToParkStep.WaitRotationHome, CheckRotationPositionStatus, CheckRotationStopStatus)
  63. .RunIf(BackToParkStep.FlipSideA,Module==ModuleName.PUF1.ToString(),() => AxisGotoPosition(_flipAxis,"SideA", 0), _delay_1ms)
  64. .WaitWithStopConditionIf(BackToParkStep.WaitFlipSideA, Module == ModuleName.PUF1.ToString(), CheckFlipPositionStatus, CheckFlipStopStatus)
  65. .End(BackToParkStep.End, NullFun, _delay_1ms);
  66. return Runner.Status;
  67. }
  68. private bool CheckChuckStopStatus()
  69. {
  70. bool result=CommonFunction.CheckRoutineStopState(_chuckRoutine);
  71. if (!result)
  72. {
  73. NotifyError(eEvent.ERR_PUF, _chuckRoutine.ErrorMsg, 0);
  74. }
  75. return result;
  76. }
  77. /// <summary>
  78. /// 检验Rotation移动状态
  79. /// </summary>
  80. /// <returns></returns>
  81. private bool CheckRotationPositionStatus()
  82. {
  83. return _rotationAxis.Status == RState.End;
  84. }
  85. /// <summary>
  86. /// 检验Flip移动状态
  87. /// </summary>
  88. /// <returns></returns>
  89. private bool CheckFlipPositionStatus()
  90. {
  91. return _flipAxis.Status == RState.End;
  92. }
  93. /// <summary>
  94. /// 检验Flip异常状态
  95. /// </summary>
  96. /// <returns></returns>
  97. private bool CheckFlipStopStatus()
  98. {
  99. bool result = _flipAxis.Status == RState.Failed || _flipAxis.Status == RState.Timeout;
  100. if (result)
  101. {
  102. NotifyError(eEvent.ERR_PUF, "flip motion failed", 0);
  103. }
  104. return result;
  105. }
  106. /// <summary>
  107. /// 检验Rotation异常状态
  108. /// </summary>
  109. /// <returns></returns>
  110. private bool CheckRotationStopStatus()
  111. {
  112. bool result = _rotationAxis.Status == RState.Failed || _rotationAxis.Status == RState.Timeout;
  113. if (result)
  114. {
  115. NotifyError(eEvent.ERR_PUF, "rotation motion failed", 0);
  116. }
  117. return result;
  118. }
  119. /// <summary>
  120. /// Axis goto position
  121. /// </summary>
  122. /// <param name="axis"></param>
  123. /// <param name="position"></param>
  124. /// <param name="index"></param>
  125. /// <returns></returns>
  126. private bool AxisGotoPosition(JetAxisBase axis, string position, int index)
  127. {
  128. bool result = axis.PositionStation(position);
  129. if (!result)
  130. {
  131. NotifyError(eEvent.ERR_PUF, $"{axis.Module} goto {position} failed", index);
  132. }
  133. return result;
  134. }
  135. /// <summary>
  136. /// 启动
  137. /// </summary>
  138. /// <param name="objs"></param>
  139. /// <returns></returns>
  140. public RState Start(params object[] objs)
  141. {
  142. InitializeParameters();
  143. return Runner.Start(Module, "start back to park station");
  144. }
  145. /// <summary>
  146. /// 初始化参数
  147. /// </summary>
  148. private void InitializeParameters()
  149. {
  150. _flipAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Flip");
  151. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  152. }
  153. /// <summary>
  154. /// 重试
  155. /// </summary>
  156. /// <param name="step"></param>
  157. public RState Retry(int step)
  158. {
  159. InitializeParameters();
  160. List<Enum> preStepIds = new List<Enum>();
  161. return Runner.Retry(BackToParkStep.ChuckIn, preStepIds, Module, "Back to park Retry");
  162. }
  163. /// <summary>
  164. /// 检验完成情况
  165. /// </summary>
  166. /// <returns></returns>
  167. public bool CheckCompleteCondition()
  168. {
  169. double rotationPosition = _rotationAxis.MotionData.MotorPosition;
  170. if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, "Home"))
  171. {
  172. NotifyError(eEvent.ERR_PUF, $"rotation {rotationPosition} not in Home", 0);
  173. return false;
  174. }
  175. double flipPosition = _flipAxis.MotionData.MotorPosition;
  176. if (!_flipAxis.CheckPositionIsInStation(flipPosition, "SideA"))
  177. {
  178. NotifyError(eEvent.ERR_PUF, $"flip {flipPosition} not in SideA", 0);
  179. return false;
  180. }
  181. if (!_pufVacuum.CheckChuckIn())
  182. {
  183. NotifyError(eEvent.ERR_PUF, $"Chuck status is not chuck in", 0);
  184. return false;
  185. }
  186. return true;
  187. }
  188. }
  189. }