using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using MECF.Framework.Common.Routine; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Aitex.Core.RT.SCCore; namespace CyberX8_RT.Devices.LinMot { public class LinMotStartContinueCurveRoutine : RoutineBase, IRoutine { private enum LinMotStartContinueStep { WriteCurveIdRam, CurveIdDelay, WriteAmplitudeRam, AmplitudeDelay, WriteTimeScaleRam, Delay, CommandTable, CommandTableDelay, CommandTableCheckRun, ReCommandTable, End } #region 内部变量 private LinMotAxis _axis; private int _speed; /// /// Linmot检测运动时间 /// private int _holdoffMilliseconds = 5000; /// /// 是否运动 /// private bool _isRun = false; #endregion public LinMotStartContinueCurveRoutine(string module,LinMotAxis axis) : base(module) { _axis = axis; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { //Runner.Run(LinMotStartContinueStep.WriteCurveIdRam, () => { return _axis.WriteRamIntValue(0xC8, 0x14, 1); }, 100) // .Delay(LinMotStartContinueStep.CurveIdDelay, 200) Runner.Run(LinMotStartContinueStep.WriteAmplitudeRam, () => { return _axis.WriteRamIntValue(0xCA, 0x14, 50 * 10); }, 100) .Delay(LinMotStartContinueStep.AmplitudeDelay, 100) .Run(LinMotStartContinueStep.WriteTimeScaleRam, () => { return _axis.WriteRamIntValue(0xCB,0x14,_speed*100); }, 100) .Delay(LinMotStartContinueStep.Delay, 100) .Run(LinMotStartContinueStep.CommandTable, () => { return _axis.SendCommandTableOperation(1); },_delay_1ms) .Delay(LinMotStartContinueStep.CommandTableDelay,500) .Run(LinMotStartContinueStep.CommandTableCheckRun, () => { _isRun = _axis.IsMotorOn; return true; },_delay_1ms) .RunIf(LinMotStartContinueStep.ReCommandTable,!_isRun, () => { return _axis.SendCommandTableOperation(1); }, () => _axis.IsMotorOn,_holdoffMilliseconds-_delay_1s) .End(LinMotStartContinueStep.End, NullFun); return Runner.Status; } public RState Start(params object[] objs) { _speed = (int)(objs[0]); if (!CheckPreCondition()) { return RState.Failed; } if (SC.ContainsItem("Linmot.LinmotHoldoffMilliseconds")) { _holdoffMilliseconds = SC.GetValue("Linmot.LinmotHoldoffMilliseconds"); } _isRun = false; return Runner.Start(Module, "Start Curve"); } /// /// 前置条件 /// /// private bool CheckPreCondition() { if (!_axis.IsSwitchOn) { LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not switch on"); return false; } if (!_axis.IsHomed) { LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not homed"); return false; } if (!_axis.IsConnectd) { LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is not connected"); return false; } if (_axis.IsError) { LOG.WriteLog(eEvent.ERR_LINMOT, Module, "axis is in error"); return false; } return true; } } }