LinMotStartContinueCurveRoutine.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. using Aitex.Core.RT.Log;
  2. using Aitex.Core.RT.Routine;
  3. using MECF.Framework.Common.Routine;
  4. using CyberX8_Core;
  5. using System;
  6. using System.Collections.Generic;
  7. using System.Linq;
  8. using System.Text;
  9. using System.Threading.Tasks;
  10. using Aitex.Core.RT.SCCore;
  11. namespace CyberX8_RT.Devices.LinMot
  12. {
  13. public class LinMotStartContinueCurveRoutine : RoutineBase, IRoutine
  14. {
  15. private enum LinMotStartContinueStep
  16. {
  17. WriteCurveIdRam,
  18. CurveIdDelay,
  19. WriteAmplitudeRam,
  20. AmplitudeDelay,
  21. WriteTimeScaleRam,
  22. Delay,
  23. CommandTable,
  24. CommandTableDelay,
  25. CommandTableCheckRun,
  26. ReCommandTable,
  27. End
  28. }
  29. #region 内部变量
  30. private LinMotAxis _axis;
  31. private int _speed;
  32. /// <summary>
  33. /// Linmot检测运动时间
  34. /// </summary>
  35. private int _holdoffMilliseconds = 5000;
  36. /// <summary>
  37. /// 是否运动
  38. /// </summary>
  39. private bool _isRun = false;
  40. #endregion
  41. public LinMotStartContinueCurveRoutine(string module,LinMotAxis axis) : base(module)
  42. {
  43. _axis = axis;
  44. }
  45. public void Abort()
  46. {
  47. Runner.Stop("Manual Abort");
  48. }
  49. public RState Monitor()
  50. {
  51. //Runner.Run(LinMotStartContinueStep.WriteCurveIdRam, () => { return _axis.WriteRamIntValue(0xC8, 0x14, 1); }, 100)
  52. // .Delay(LinMotStartContinueStep.CurveIdDelay, 200)
  53. Runner.Run(LinMotStartContinueStep.WriteAmplitudeRam, () => { return _axis.WriteRamIntValue(0xCA, 0x14, 50 * 10); }, 100)
  54. .Delay(LinMotStartContinueStep.AmplitudeDelay, 100)
  55. .Run(LinMotStartContinueStep.WriteTimeScaleRam, () => { return _axis.WriteRamIntValue(0xCB,0x14,_speed*100); }, 100)
  56. .Delay(LinMotStartContinueStep.Delay, 100)
  57. .Run(LinMotStartContinueStep.CommandTable, () => { return _axis.SendCommandTableOperation(1); },_delay_1ms)
  58. .Delay(LinMotStartContinueStep.CommandTableDelay,500)
  59. .Run(LinMotStartContinueStep.CommandTableCheckRun, () => { _isRun = _axis.IsMotorOn; return true; },_delay_1ms)
  60. .RunIf(LinMotStartContinueStep.ReCommandTable,!_isRun, () => { return _axis.SendCommandTableOperation(1); },
  61. () => _axis.IsMotorOn,_holdoffMilliseconds-_delay_1s)
  62. .End(LinMotStartContinueStep.End, NullFun);
  63. return Runner.Status;
  64. }
  65. public RState Start(params object[] objs)
  66. {
  67. _speed = (int)(objs[0]);
  68. if (!CheckPreCondition())
  69. {
  70. return RState.Failed;
  71. }
  72. if (SC.ContainsItem("Linmot.LinmotHoldoffMilliseconds"))
  73. {
  74. _holdoffMilliseconds = SC.GetValue<int>("Linmot.LinmotHoldoffMilliseconds");
  75. }
  76. _isRun = false;
  77. return Runner.Start(Module, "Start Curve");
  78. }
  79. /// <summary>
  80. /// 前置条件
  81. /// </summary>
  82. /// <returns></returns>
  83. private bool CheckPreCondition()
  84. {
  85. if (!_axis.IsSwitchOn)
  86. {
  87. LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not switch on");
  88. return false;
  89. }
  90. if (!_axis.IsHomed)
  91. {
  92. LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not homed");
  93. return false;
  94. }
  95. if (!_axis.IsConnectd)
  96. {
  97. LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not connected");
  98. return false;
  99. }
  100. if (_axis.IsError)
  101. {
  102. LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is in error");
  103. return false;
  104. }
  105. return true;
  106. }
  107. }
  108. }