using Aitex.Core.RT.Routine; using MECF.Framework.Common.Device.LinMot; using MECF.Framework.Common.Routine; using Mono.Security.X509; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.LinMot { public class LinMotStopMotorRoutine : RoutineBase, IRoutine { private enum LinMotStopMotorStep { Freeze, GoToInitialPosition, ReDelay, ReWait, LastSwitchOn, LastSwitchOff, End } #region 内部变量 private LinMotAxis _axis; private bool _lastSwitchOff = false; #endregion public LinMotStopMotorRoutine(string module,LinMotAxis axis) : base(module) { _axis = axis; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(LinMotStopMotorStep.Freeze, () => { return _axis.SendOperation(LinMotOperation.Freeze); }, CheckMotorStop, _delay_5s) .Run(LinMotStopMotorStep.GoToInitialPosition, () => { return _axis.SendOperation(LinMotOperation.GoToInitialPosition); }, NullFun, 100) .Delay(LinMotStopMotorStep.ReDelay, 200) .WaitWithStopCondition(LinMotStopMotorStep.ReWait, CheckInTargetPosition,CheckAxisIsStop ) .Run(LinMotStopMotorStep.LastSwitchOn, () => { return _axis.SendOperation(LinMotOperation.SwitchOn); }, CheckSwitchOn, _delay_5s) .RunIf(LinMotStopMotorStep.LastSwitchOff, _lastSwitchOff, () => { return _axis.SendOperation(LinMotOperation.SwitchOff); }, _delay_1ms) .End(LinMotStopMotorStep.End, NullFun); return Runner.Status; } public RState Start(params object[] objs) { _lastSwitchOff = objs == null || objs.Length == 0 ? false : (bool)objs[0]; return Runner.Start(Module, "StopMotion"); } private bool CheckInTargetPosition() { return _axis.InTargetPosition; } private bool CheckAxisIsStop() { return !_axis.IsMotorOn; } private bool CheckSwitchOn() { return _axis.IsSwitchOn; } private bool CheckMotorStop() { return !_axis.IsMotorOn ; } } }