using Aitex.Core.RT.Routine; using MECF.Framework.Common.CommonData.PUF; using MECF.Framework.Common.Routine; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.AXIS.Yaskawa { public class YaskawaSwitchOffRoutine : RoutineBase, IRoutine { private enum SwitchOffStep { ClearError, NoneModeOfOperation, WriteSwitchOffControlWord, SwitchOnDelay, CheckSwitchOff, End } #region 内部变量 private JetAxisBase _axis; #endregion public YaskawaSwitchOffRoutine(string module,JetAxisBase axis) : base(module) { _axis = axis; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(SwitchOffStep.ClearError, ClearError,CheckError,1000) .Run(SwitchOffStep.NoneModeOfOperation, () => { return _axis.WriteModeOfMode(AxisModeOfOperation.None); }, ()=> { return CheckModeOfOperation((byte)AxisModeOfOperation.None); }, 1000) .Run(SwitchOffStep.WriteSwitchOffControlWord, () => { return _axis.WriteControlWord(0x06); }, () => { return CheckControlWord(0x06); },1000) .Delay(SwitchOffStep.SwitchOnDelay,100) .Wait(SwitchOffStep.CheckSwitchOff,CheckSwitchOff,1000) .End(SwitchOffStep.End,NullFun,100); return Runner.Status; } /// /// 清除错误 /// /// private bool ClearError() { if(_axis.IsError) { return _axis.WriteControlWord(128); } return true; } /// /// 检验是否存在错误 /// /// private bool CheckError() { return !_axis.IsError; } public bool CheckModeOfOperation(byte modeOfOperation) { return _axis.ModeOfOperation == modeOfOperation; } public bool CheckControlWord(ushort controlWord) { return _axis.ControlWord == controlWord; } private bool CheckSwitchOff() { return !_axis.IsSwitchOn; } public RState Start(params object[] objs) { return Runner.Start(Module, "Switch Off"); } } }