MaxonStopPositionRoutine.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.RT.Routine;
  3. using PunkHPX8_Core;
  4. using MECF.Framework.Common.Beckhoff.AxisProvider;
  5. using MECF.Framework.Common.CommonData.PUF;
  6. using MECF.Framework.Common.Routine;
  7. using System;
  8. namespace PunkHPX8_RT.Devices.AXIS.Maxon
  9. {
  10. public class MaxonStopPositionRoutine : RoutineBase, IRoutine
  11. {
  12. private enum StopPositionStep
  13. {
  14. SetHaltControlWord,
  15. CheckStop,
  16. WriteTargePosition,
  17. ResetHaltControlWord,
  18. CheckRun,
  19. NoneModeOfOperation,
  20. EnableOperation,
  21. End
  22. }
  23. #region 常量
  24. private const string TARGET_POSITION = "TargetPosition";
  25. #endregion
  26. #region 内部变量
  27. private JetAxisBase _axis;
  28. private int _timeout = 5000;
  29. private int _targetPosition;
  30. /// <summary>
  31. /// SRD rotation Provider对象
  32. /// </summary>
  33. private BeckhoffProviderAxis _rotationProviderAxis;
  34. private BeckhoffCommonAxis _beckhoffCommonAxis;
  35. #endregion
  36. public MaxonStopPositionRoutine(string module, JetAxisBase axis,BeckhoffCommonAxis beckhoffCommonAxis) : base(module)
  37. {
  38. _axis = axis;
  39. _beckhoffCommonAxis = beckhoffCommonAxis;
  40. }
  41. public void Abort()
  42. {
  43. Runner.Stop("Manual Abort");
  44. }
  45. public RState Monitor()
  46. {
  47. Runner.Run(StopPositionStep.SetHaltControlWord, () => { return _beckhoffCommonAxis.WriteControlWord(0X8F); }, () => { return CheckControlWord(0X8F); }, 1000)
  48. .WaitWithStopCondition(StopPositionStep.CheckStop, CheckStop, CheckErrorOrWarning, _timeout)
  49. .Run(StopPositionStep.WriteTargePosition, () => { return WriteTargetPosition(); }, NullFun, 100)
  50. .Run(StopPositionStep.ResetHaltControlWord, () => { return _beckhoffCommonAxis.WriteControlWord(0x3F); }, () => { return CheckControlWord(0x3F); }, 1000)
  51. .WaitWithStopCondition(StopPositionStep.CheckRun, CheckRunEnd, CheckRunStop, 5000)
  52. .Run(StopPositionStep.NoneModeOfOperation, () => { return _beckhoffCommonAxis.WriteModeOfMode(AxisModeOfOperation.None); }, () => { return CheckModeOfOperation((byte)AxisModeOfOperation.None); }, 1000)
  53. .Run(StopPositionStep.EnableOperation, () => { return _beckhoffCommonAxis.WriteControlWord(0x0F); }, () => { return CheckControlWord(0x0F); }, 1000)
  54. .End(StopPositionStep.End, NullFun, 100);
  55. return Runner.Status;
  56. }
  57. public bool CheckModeOfOperation(byte modeOfOperation)
  58. {
  59. return _axis.ModeOfOperation == modeOfOperation;
  60. }
  61. public bool CheckControlWord(ushort controlWord)
  62. {
  63. return _axis.ControlWord == controlWord;
  64. }
  65. /// <summary>
  66. /// 设置目标位置为当前位置
  67. /// </summary>
  68. /// <param name="targetPosition"></param>
  69. private bool WriteTargetPosition()
  70. {
  71. double scale = _rotationProviderAxis.ScaleFactor;
  72. _targetPosition = (int)Math.Ceiling(_axis.MotionData.MotorPosition * scale);
  73. return _beckhoffCommonAxis.WriteVariable(TARGET_POSITION, _targetPosition);
  74. }
  75. /// <summary>
  76. /// 检查是否运动完成
  77. /// </summary>
  78. /// <returns></returns>
  79. private bool CheckRunEnd()
  80. {
  81. bool result = _axis.InTargetPosition && !_axis.IsRun;
  82. return result;
  83. }
  84. /// <summary>
  85. /// 检查是否运动完成
  86. /// </summary>
  87. /// <returns></returns>
  88. private bool CheckRunStop()
  89. {
  90. //没有到达目标同时没有运动
  91. bool isStop = !_axis.IsRun && !_axis.JudgeCurrentPositionIsInTargetPosition(_targetPosition);
  92. if (isStop)
  93. {
  94. ErrorMsg = "position is stop";
  95. return true;
  96. }
  97. return false;
  98. }
  99. /// <summary>
  100. /// 检查Halt是否停下来
  101. /// </summary>
  102. /// <returns></returns>
  103. private bool CheckStop()
  104. {
  105. return !_axis.IsRun;
  106. }
  107. /// 检验是否出错或告警
  108. /// </summary>
  109. /// <returns></returns>
  110. private bool CheckErrorOrWarning()
  111. {
  112. bool result = _axis.MotionData.Status.ToLower().Contains("error") || _axis.MotionData.Status.ToLower().Contains("warning");
  113. if (result)
  114. {
  115. LOG.WriteLog(eEvent.ERR_AXIS, Module, $"axis stop occur error or warning");
  116. }
  117. return result;
  118. }
  119. public RState Start(params object[] objs)
  120. {
  121. _rotationProviderAxis = BeckhoffAxisProviderManager.Instance.GetAxisProvider($"{Module}");
  122. if (_rotationProviderAxis == null)
  123. {
  124. LOG.WriteLog(eEvent.ERR_AXIS, Module, $"{Module} Axist Provider is not exist");
  125. return RState.Failed;
  126. }
  127. return Runner.Start(Module, "Stop Position");
  128. }
  129. }
  130. }