RotationBiDirectionRoutine.cs 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. using Aitex.Core.RT.Device;
  2. using Aitex.Core.RT.Log;
  3. using Aitex.Core.RT.Routine;
  4. using Aitex.Core.Util;
  5. using MECF.Framework.Common.Equipment;
  6. using MECF.Framework.Common.Routine;
  7. using MECF.Framework.Common.SubstrateTrackings;
  8. using PunkHPX8_Core;
  9. using PunkHPX8_RT.Devices.AXIS;
  10. using System;
  11. using System.Collections.Generic;
  12. using System.Linq;
  13. using System.Text;
  14. using System.Threading.Tasks;
  15. namespace PunkHPX8_RT.Modules.PlatingCell
  16. {
  17. public class RotationBiDirectionRoutine : RoutineBase, IRoutine
  18. {
  19. private enum BiDirectionStep
  20. {
  21. StartBiDirection,
  22. LoopStart,
  23. LoopStartRotation,
  24. LoopRotationWait,
  25. LoopStopRotation,
  26. LoopCheckStopRotation,
  27. LoopUpdateRemain1,
  28. LoopReverseRotationStart,
  29. LoopReverseRotationWait,
  30. LooPStopRevserseRotation,
  31. LoopCheckStopReverseRotation,
  32. LoopUpdateRemain2,
  33. LoopEnd,
  34. StartRemainRotation,
  35. RemainRotationDelay,
  36. StopRemainRotation,
  37. CheckStopRemainRotation,
  38. End
  39. }
  40. #region 常量
  41. private const int TARGETPOSITION = 10 * 60 * 60 * 100 * 6; //转速100rmp转10个小时的目的地
  42. private const int SPEED_RATIO = 1;
  43. #endregion
  44. #region 内部变量
  45. /// <summary>
  46. /// rotation axis
  47. /// </summary>
  48. private JetAxisBase _rotationAxis;
  49. /// <summary>
  50. /// 运行过程总时间
  51. /// </summary>
  52. private int _rotationTime;
  53. /// <summary>
  54. /// 转向频率
  55. /// </summary>
  56. private int _frequency;
  57. /// <summary>
  58. /// 速度,单位rpm
  59. /// </summary>
  60. private int _speed;
  61. /// <summary>
  62. /// 单步电镀过程中电机需要转向的次数
  63. /// </summary>
  64. private int _reverseTimes;
  65. /// <summary>
  66. /// 反转次数整除以外的时间
  67. /// </summary>
  68. private int _extralTime;
  69. /// <summary>
  70. /// 剩余反转次数
  71. /// </summary>
  72. private int _remainTimes;
  73. /// <summary>
  74. /// monitor部分的循环次数
  75. /// </summary>
  76. private int _cycleCount;
  77. #endregion
  78. /// <summary>
  79. /// 构造函数
  80. /// </summary>
  81. /// <param name="module"></param>
  82. public RotationBiDirectionRoutine(string module) : base(module)
  83. {
  84. }
  85. /// <summary>
  86. /// 中止
  87. /// </summary>
  88. public void Abort()
  89. {
  90. Runner.Stop("Manual Abort");
  91. }
  92. /// <summary>
  93. /// 监控
  94. /// </summary>
  95. /// <returns></returns>
  96. public RState Monitor()
  97. {
  98. Runner.Run(BiDirectionStep.StartBiDirection, NullFun, _delay_1ms)
  99. .LoopStart(BiDirectionStep.LoopStart, "Rotation Bi-Direction Step Start", _cycleCount, NullFun, _delay_1ms)
  100. .LoopRunIf(BiDirectionStep.LoopStartRotation, _cycleCount > 0,() => { return StratRotation(true); }, _delay_1ms)
  101. .LoopDelayIf(BiDirectionStep.LoopRotationWait, _cycleCount > 0, _frequency * 1000)
  102. .LoopRunIf(BiDirectionStep.LoopStopRotation, _cycleCount > 0, _rotationAxis.StopPositionOperation,_delay_1ms)
  103. .LoopRunIfWithStopStatus(BiDirectionStep.LoopCheckStopRotation, _cycleCount > 0, CheckRotationPositionStatus, CheckRotationPositionRunStop)
  104. .LoopRunIf(BiDirectionStep.LoopUpdateRemain1, _cycleCount > 0, UpdateRemain, _delay_1ms)
  105. .LoopRunIf(BiDirectionStep.LoopReverseRotationStart, _remainTimes != 0, () => { return StratRotation(false); }, _delay_1ms)
  106. .LoopDelayIf(BiDirectionStep.LoopReverseRotationWait, _remainTimes != 0, _frequency * 1000)
  107. .LoopRunIf(BiDirectionStep.LooPStopRevserseRotation, _remainTimes != 0, _rotationAxis.StopPositionOperation, _delay_1ms)
  108. .LoopRunIfWithStopStatus(BiDirectionStep.LoopCheckStopReverseRotation, _remainTimes != 0, CheckRotationPositionStatusWithStateupdate, CheckRotationPositionRunStop)
  109. //.LoopRunIf(BiDirectionStep.LoopUpdateRemain2, _remainTimes != 0,UpdateRemain, _delay_1ms)
  110. .LoopEnd(BiDirectionStep.LoopEnd, NullFun, _delay_1ms)
  111. //剩余旋转时间(如果翻转次数是偶数,则正转,否则反转)
  112. .RunIf(BiDirectionStep.StartRemainRotation, _extralTime !=0, () => { return _reverseTimes % 2 == 0 ? StratRotation(true): StratRotation(false); }, _delay_1ms)
  113. .DelayIf(BiDirectionStep.RemainRotationDelay, _extralTime != 0, _extralTime * 1000)
  114. .RunIf(BiDirectionStep.StopRemainRotation, _extralTime != 0, _rotationAxis.StopPositionOperation, _delay_1ms)
  115. .WaitWithStopConditionIf(BiDirectionStep.CheckStopRemainRotation, _extralTime != 0, CheckRotationPositionStatus, CheckRotationPositionRunStop)
  116. .End(BiDirectionStep.End, NullFun, _delay_1ms);
  117. return Runner.Status;
  118. }
  119. private bool UpdateRemain()
  120. {
  121. _remainTimes--;
  122. return true;
  123. }
  124. /// <summary>
  125. /// rotation开始旋转
  126. /// </summary>
  127. /// <returns></returns>
  128. private bool StratRotation(bool isforwardRotate)
  129. {
  130. bool result = false;
  131. if (isforwardRotate)
  132. {
  133. result = _rotationAxis.ProfilePosition(TARGETPOSITION, _speed * SPEED_RATIO * 6, 0, 0);
  134. }
  135. else
  136. {
  137. result = _rotationAxis.ProfilePosition(-TARGETPOSITION, _speed * SPEED_RATIO * 6, 0, 0);
  138. }
  139. if (!result)
  140. {
  141. NotifyError(eEvent.ERR_PLATINGCELL, "Start Rotation is failed", 0);
  142. return false;
  143. }
  144. return true;
  145. }
  146. /// <summary>
  147. /// 检验Rotation移动状态
  148. /// </summary>
  149. /// <returns></returns>
  150. private bool CheckRotationPositionStatus()
  151. {
  152. return _rotationAxis.Status == RState.End;
  153. }
  154. /// <summary>
  155. /// 检验Rotation移动状态(带状态更新)
  156. /// </summary>
  157. /// <returns></returns>
  158. private bool CheckRotationPositionStatusWithStateupdate()
  159. {
  160. bool result = _rotationAxis.Status == RState.End;
  161. if (result)
  162. {
  163. UpdateRemain();
  164. }
  165. return result;
  166. }
  167. /// <summary>
  168. /// 检验Rotation是否运动失败
  169. /// </summary>
  170. /// <returns></returns>
  171. private bool CheckRotationPositionRunStop()
  172. {
  173. return _rotationAxis.Status == RState.Failed || _rotationAxis.Status == RState.Timeout;
  174. }
  175. /// <summary>
  176. /// 启动
  177. /// </summary>
  178. /// <param name="objs"></param>
  179. /// <returns></returns>
  180. public RState Start(params object[] objs)
  181. {
  182. _rotationTime = (int)objs[0]; //单位s
  183. _frequency = (int)objs[1]; //单位s
  184. _speed = (int)objs[2]; //单位rmp
  185. if(_frequency > _rotationTime)
  186. {
  187. NotifyError(eEvent.ERR_PLATINGCELL, "frequency can not large than rotation time", 0);
  188. return RState.Failed;
  189. }
  190. _reverseTimes = _rotationTime / _frequency;
  191. if(_reverseTimes % 2 == 0)
  192. {
  193. _cycleCount = _reverseTimes / 2;
  194. }
  195. else
  196. {
  197. _cycleCount = _reverseTimes / 2 + 1;
  198. }
  199. _remainTimes = _reverseTimes;
  200. _extralTime = _rotationTime % _frequency;
  201. _rotationAxis = DEVICE.GetDevice<JetAxisBase>($"{Module}.Rotation");
  202. return Runner.Start(Module, "Start Bi-Direction rotation");
  203. }
  204. }
  205. }