RotationBiDirectionRoutine.cs 9.2 KB

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