using Aitex.Core.RT.Log; 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.CANOpen { public class MaxonHomeRoutine : RoutineBase, IRoutine { private enum HomeStep { WriteControlWord, HomeModeOfOperation, WriteHomeControlWord, HomeDelay, CheckHome, NoneModeOfOperation, EnableOperation, End } #region 内部变量 private JetAxisBase _axis; private int _timeout = 5000; private byte _homingMethod = 0; #endregion public MaxonHomeRoutine(string module,JetAxisBase axis) : base(module) { _axis = axis; } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(HomeStep.WriteControlWord, () => { return _axis.WriteControlWord(0x0F); }, () => { return CheckControlWord(0x0F); }, 1000) .Run(HomeStep.HomeModeOfOperation, () => { return _axis.WriteModeOfMode(AxisModeOfOperation.HomingMode); }, ()=> { return CheckModeOfOperation((byte)AxisModeOfOperation.HomingMode); }, 1000) .Run(HomeStep.WriteHomeControlWord, () => { return _axis.WriteControlWord(0x1F); }, () => { return CheckControlWord(0x1F); },1000) .Delay(HomeStep.HomeDelay,100) .WaitWithStopCondition(HomeStep.CheckHome,CheckHome,CheckErrorOrWarning,_timeout) .Run(HomeStep.NoneModeOfOperation, () => { return _axis.WriteModeOfMode(AxisModeOfOperation.None); }, () => { return CheckModeOfOperation((byte)AxisModeOfOperation.None); },1000) .Run(HomeStep.EnableOperation, () => { return _axis.EnableOperation(); }, () => { return CheckControlWord(0x0F); },1000) .End(HomeStep.End,NullFun,100); return Runner.Status; } public bool CheckModeOfOperation(byte modeOfOperation) { return _axis.ModeOfOperation == modeOfOperation; } public bool CheckControlWord(ushort controlWord) { return _axis.ControlWord == controlWord; } private bool CheckHome() { return _axis.IsHomed; } /// 检验是否出错或告警 /// /// private bool CheckErrorOrWarning() { bool result = _axis.MotionData.Status.ToLower().Contains("error") || _axis.MotionData.Status.ToLower().Contains("warning"); if (result) { LOG.WriteLog(eEvent.ERR_AXIS, Module, $"axis home occur error or warning"); } return result; } public RState Start(params object[] objs) { _timeout = (int)objs[0]; _homingMethod = (byte)objs[1]; return Runner.Start(Module, "Home"); } } }