using Aitex.Core.RT.Routine; using MECF.Framework.Common.CommonData.PUF; using MECF.Framework.Common.Routine; using MECF.Framework.Common.TwinCat; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.AXIS.CANOpen { public class CanOpenSwitchOnRoutine : RoutineBase, IRoutine { private enum SwitchOnStep { NoneModeOfOperation, ClearError, WriteTargetPosition, CheckSwitchDisabled, WriteSwitchOnControlWord, SwitchOnDelay, CheckSwitchOn, End } #region 常量 private const string TARGET_POSITION = "TargetPosition"; #endregion #region 内部变量 private JetAxisBase _axis; private bool _isSwitchDisabled = false; #endregion public CanOpenSwitchOnRoutine(string module,JetAxisBase axis) : base(module) { _axis = axis; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(SwitchOnStep.NoneModeOfOperation, () => { return _axis.WriteModeOfMode(AxisModeOfOperation.None); }, ()=> { return CheckModeOfOperation((byte)AxisModeOfOperation.None); }, 1000) .Run(SwitchOnStep.ClearError, ClearError,CheckError,1000) .Run(SwitchOnStep.WriteTargetPosition, WriteTargetPosition,_delay_1ms) .Run(SwitchOnStep.CheckSwitchDisabled,CheckSwitchDisabled,CheckReadyToSwitchOn,_delay_2s) .Run(SwitchOnStep.WriteSwitchOnControlWord, () => { return _axis.WriteControlWord(0x0F); }, () => { return CheckControlWord(0x0F); },1000) .Delay(SwitchOnStep.SwitchOnDelay,100) .Wait(SwitchOnStep.CheckSwitchOn,CheckSwitchOn,500) .End(SwitchOnStep.End,NullFun,_delay_1ms); return Runner.Status; } /// /// 清除错误 /// /// private bool ClearError() { if(_axis.IsError) { return _axis.WriteControlWord(128); } return true; } /// /// 检验SwitchDisabled /// /// private bool CheckSwitchDisabled() { if(_axis.MotionData.Status== "Switch On Disabled") { _isSwitchDisabled = true; return _axis.WriteControlWord(0x06); } return true; } /// /// 当前位置写入Target /// /// private bool WriteTargetPosition() { int targetPosition = _axis.CalculateValueMultiplyScale(_axis.MotionData.MotorPosition); return _axis.WriteVariable(TARGET_POSITION, targetPosition); } /// /// 检验Ready to Switch On /// /// private bool CheckReadyToSwitchOn() { if (_isSwitchDisabled) { return _axis.MotionData.Status == "Ready to Switch On"; } else { 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 CheckSwitchOn() { return _axis.IsSwitchOn; } public RState Start(params object[] objs) { _isSwitchDisabled = false; return Runner.Start(Module, "Switch On"); } } }