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 CanOpenHomeRoutine : 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; private bool _isLogError = true; #endregion public CanOpenHomeRoutine(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, _isLogError) .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() { if (CheckHomingMethodNeedHomeSwitched() && !_axis.IsHomeSwitchedTriggered) { return false; } LOG.WriteLog(eEvent.INFO_AXIS, Module, $"StatusWord is {_axis.MotionData.StatusWord}"); _axis.UpdateStatusWord(_axis.MotionData.StatusWord); return _axis.IsHomed; } /// /// 检验Homing Method是否需要检验Home Switch /// /// private bool CheckHomingMethodNeedHomeSwitched() { if (_homingMethod >= 1 && _homingMethod <= 14) { return true; } if (_homingMethod == 19) { return true; } if (_homingMethod == 21) { return true; } return false; } /// 检验是否出错或告警 /// /// 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]; if(objs.Length >= 3) { _isLogError = (bool)objs[2]; } return Runner.Start(Module, "Home"); } } }