PufReadyForRobotPickRoutine.cs 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  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 CyberX8_RT.Devices.PUF;
  7. using System;
  8. using System.Collections.Generic;
  9. using System.Linq;
  10. using System.Text;
  11. using System.Threading.Tasks;
  12. using Aitex.Core.RT.Log;
  13. using MECF.Framework.Common.Utilities;
  14. namespace CyberX8_RT.Modules.PUF
  15. {
  16. public class PufReadyForRobotPickRoutine : RoutineBase, IRoutine
  17. {
  18. private enum ReadyForPickPlaceStep
  19. {
  20. RotationRobot,
  21. WaitRotationRobot,
  22. VerticalRobot,
  23. WaitVerticalRobot,
  24. //ChuckAVacuumOff,
  25. End
  26. }
  27. #region 内部变量
  28. private JetAxisBase _flipAxis;
  29. private JetAxisBase _rotationAxis;
  30. private JetAxisBase _verticalAxis;
  31. private PufVacuum _vacuum;
  32. #endregion
  33. /// <summary>
  34. /// 构造函数
  35. /// </summary>
  36. /// <param name="module"></param>
  37. public PufReadyForRobotPickRoutine(string module) : base(module)
  38. {
  39. }
  40. /// <summary>
  41. /// 中止
  42. /// </summary>
  43. public void Abort()
  44. {
  45. Runner.Stop("manual abort");
  46. }
  47. /// <summary>
  48. /// 监控
  49. /// </summary>
  50. /// <returns></returns>
  51. public RState Monitor()
  52. {
  53. Runner.Run(ReadyForPickPlaceStep.RotationRobot, () => AxisGotoPosition(_rotationAxis,"Robot",0), _delay_1ms)
  54. .WaitWithStopCondition(ReadyForPickPlaceStep.WaitRotationRobot, CheckRotationPositionStatus, ()=>CheckRotationStopStatus(0))
  55. .Run(ReadyForPickPlaceStep.VerticalRobot, () => _verticalAxis.PositionStation("Robot"), _delay_1ms)
  56. .WaitWithStopCondition(ReadyForPickPlaceStep.WaitVerticalRobot, CheckVerticalPositionStatus, ()=>CheckVerticalStopStatus(0))
  57. //.Run(ReadyForPickPlaceStep.ChuckAVacuumOff,SideAVacuumOff, _delay_1ms)
  58. .End(ReadyForPickPlaceStep.End, NullFun, _delay_1ms);
  59. return Runner.Status;
  60. }
  61. /// <summary>
  62. /// Axis goto position
  63. /// </summary>
  64. /// <param name="axis"></param>
  65. /// <param name="position"></param>
  66. /// <param name="index"></param>
  67. /// <returns></returns>
  68. private bool AxisGotoPosition(JetAxisBase axis, string position, int index)
  69. {
  70. bool result = axis.PositionStation(position);
  71. if (!result)
  72. {
  73. NotifyError(eEvent.ERR_PUF, $"{axis.Module} goto {position} failed", index);
  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. /// 检验Rotation异常状态
  87. /// </summary>
  88. /// <returns></returns>
  89. private bool CheckRotationStopStatus(int index)
  90. {
  91. bool result = _rotationAxis.Status == RState.Failed || _rotationAxis.Status == RState.Timeout;
  92. if (result)
  93. {
  94. NotifyError(eEvent.ERR_PUF, "rotation motion failed", index);
  95. }
  96. return result;
  97. }
  98. /// <summary>
  99. /// 检验Vertical移动状态
  100. /// </summary>
  101. /// <returns></returns>
  102. private bool CheckVerticalPositionStatus()
  103. {
  104. return _verticalAxis.Status == RState.End;
  105. }
  106. /// <summary>
  107. /// 检验Vertical异常状态
  108. /// </summary>
  109. /// <returns></returns>
  110. private bool CheckVerticalStopStatus(int index)
  111. {
  112. bool result = _verticalAxis.Status == RState.Failed || _verticalAxis.Status == RState.Timeout;
  113. if (result)
  114. {
  115. NotifyError(eEvent.ERR_PUF, "vetical motion failed", index);
  116. }
  117. return result;
  118. }
  119. /// <summary>
  120. /// 启动
  121. /// </summary>
  122. /// <param name="objs"></param>
  123. /// <returns></returns>
  124. public RState Start(params object[] objs)
  125. {
  126. InitializeParameters();
  127. return Runner.Start(Module, "start ready for robot place");
  128. }
  129. /// <summary>
  130. /// 初始化参数
  131. /// </summary>
  132. private void InitializeParameters()
  133. {
  134. _flipAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Flip");
  135. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  136. _verticalAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Vertical");
  137. _vacuum = DEVICE.GetDevice<PufVacuum>($"{Module}.Vacuum");
  138. }
  139. /// <summary>
  140. /// 重试
  141. /// </summary>
  142. /// <param name="step"></param>
  143. public RState Retry(int step)
  144. {
  145. InitializeParameters();
  146. List<Enum> preStepIds = new List<Enum>();
  147. return Runner.Retry(ReadyForPickPlaceStep.RotationRobot, preStepIds, Module, "ReadyForPick Retry");
  148. }
  149. /// <summary>
  150. /// 检验完成情况
  151. /// </summary>
  152. /// <returns></returns>
  153. public bool CheckCompleteCondition()
  154. {
  155. double rotationPosition = _rotationAxis.MotionData.MotorPosition;
  156. if (!_rotationAxis.CheckPositionIsInStation(rotationPosition, "Robot"))
  157. {
  158. NotifyError(eEvent.ERR_PUF, $"rotation {rotationPosition} not in Robot", 0);
  159. return false;
  160. }
  161. double verticalPosition = _verticalAxis.MotionData.MotorPosition;
  162. if (!_verticalAxis.CheckPositionIsInStation(verticalPosition, "Robot"))
  163. {
  164. NotifyError(eEvent.ERR_PUF, $"vertical {verticalPosition} not in Robot", 0);
  165. return false;
  166. }
  167. return true;
  168. }
  169. }
  170. }