using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Event; using Aitex.Core.RT.Fsm; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.CommonData.PUF; using MECF.Framework.Common.TwinCat; using CyberX8_Core; using CyberX8_RT.Modules; using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.AXIS.GalilLipsel { public class GalilLipselAxis : JetAxisBase { #region 内部变量 /// /// Home routine /// private GalilLipselHomeRoutine _homeRoutine; /// /// 运动Routine /// private GalilLipselProfilePositionRoutine _profilePositionRoutine; /// /// Switch On Routine /// private GalilLipselSwitchOnRoutine _switchOnRoutine; /// /// Switch Off Routine /// private GalilLipselSwitchOffRoutine _switchOffRoutine; /// /// Stop Position /// private GalilLipselStopPositionRoutine _stopPositionRoutine; #endregion /// /// 构造函数 /// /// public GalilLipselAxis(string Module, string name) : base(Module, name) { } /// /// 初始化参数 /// protected override void InitializeParameter() { _accelerationRatio = 1; _speedRatio = 1; _motionPositionRation = 31.25; } /// /// 初始化Routine /// protected override void InitializeRoutine() { _homeRoutine = new GalilLipselHomeRoutine($"{Module}.{Name}", this); _profilePositionRoutine = new GalilLipselProfilePositionRoutine($"{Module}.{Name}", this); _switchOnRoutine = new GalilLipselSwitchOnRoutine($"{Module}.{Name}", this); _switchOffRoutine = new GalilLipselSwitchOffRoutine($"{Module}.{Name}", this); _stopPositionRoutine = new GalilLipselStopPositionRoutine($"{Module}.{Name}", this); } /// /// 中止操作 /// /// /// /// public override bool StopPositionOperation() { if (!IsRun) { return true; } if (_profilePositionRoutine.Monitor() == RState.Running) { _profilePositionRoutine.Abort(); } _status = _stopPositionRoutine.Start(); _currentOperation = MotionOperation.StopPosition; return true; } /// /// 更新StatusWord /// /// public override void UpdateStatusWord(ushort status) { } /// /// EnableOperation /// public override bool EnableOperation() { return WriteControlWord(0x0F); } /// /// Home /// public override bool Home() { bool result = base.Home(); if (!result) { return false; } MotionData.IsHomed = false; _homeRoutine.Start(_homeTimeout, _galilAxisConfig.HomingAcceleration,_galilAxisConfig.HomingDeceleration,_galilAxisConfig.HomingSpeed); IsHomeSwitchedTriggered = false; return true; } /// /// 停止 /// public override void Stop() { } /// /// SwitchOff /// public override bool SwitchOff() { if (_status == RState.Running) { EV.PostAlarmLog($"{Module}.{Name}", eEvent.ERR_AXIS, $"{Module}.{Name} current execute {_currentOperation},cannot switchoff"); return false; } _currentOperation = MotionOperation.SwitchOff; _switchOffRoutine.Start(); _status = RState.Running; return true; } /// /// SwitchOn /// public override bool SwitchOn() { if (_status == RState.Running) { EV.PostAlarmLog($"{Module}.{Name}", eEvent.ERR_AXIS, $"{Module}.{Name} current execute {_currentOperation},cannot SwitchOn"); return false; } _currentOperation = MotionOperation.SwitchOn; _switchOnRoutine.Start(); _status = RState.Running; return true; } /// /// 定时器 /// /// public override bool OnTimer() { if (_status == RState.Running) { if (_currentOperation == MotionOperation.Position) { RState state = _profilePositionRoutine.Monitor(); if (state == RState.End) { _inTargetPosition = false; EndOperation(); _status = RState.End; LOG.WriteLog(eEvent.INFO_AXIS, $"{Module}.{Name}", $"Position Complete,Current Position {MotionData.MotorPosition}"); } else if (state == RState.Failed || state == RState.Timeout) { _inTargetPosition = false; EndOperation(); _status = RState.Failed; LOG.WriteLog(eEvent.ERR_AXIS, $"{Module}.{Name}", $"Profile Position error {_profilePositionRoutine.ErrorMsg}"); } } else if (_currentOperation == MotionOperation.Home) { RState state = _homeRoutine.Monitor(); if (state == RState.End) { MotionData.IsHomed = true; IsHomed = true; EndOperation(); _status = RState.End; } else if (state == RState.Failed || state == RState.Timeout) { EndOperation(); _status = RState.Failed; LOG.WriteLog(eEvent.ERR_AXIS, $"{Module}.{Name}", "Home error"); } } else if (_currentOperation == MotionOperation.SwitchOn) { RState state = _switchOnRoutine.Monitor(); if (state == RState.End) { EndOperation(); _status = RState.End; } else if (state == RState.Failed || state == RState.Timeout) { EndOperation(); _status = RState.Failed; LOG.WriteLog(eEvent.ERR_AXIS, $"{Module}.{Name}", "Switch On error"); } } else if (_currentOperation == MotionOperation.SwitchOff) { RState state = _switchOffRoutine.Monitor(); if (state == RState.End) { EndOperation(); _status = RState.End; } else if (state == RState.Failed || state == RState.Timeout) { EndOperation(); _status = RState.Failed; LOG.WriteLog(eEvent.ERR_AXIS, $"{Module}.{Name}", "Switch Off error"); } } else if (_currentOperation == MotionOperation.StopPosition) { RState state = _stopPositionRoutine.Monitor(); if (state == RState.End) { EndOperation(); _status = RState.End; } else if (state == RState.Failed || state == RState.Timeout) { EndOperation(); _status = RState.Failed; LOG.WriteLog(eEvent.ERR_AXIS, $"{Module}.{Name}", "StopPosition error"); } } } JudgeRunMonitor(); return true; } /// /// 位置 /// /// public override bool ProfilePosition(int targetPoint, int profileVelocity, int profileAcceleration, int profileDeceleration, bool judgeTorqueLimit = true) { if (_status == RState.Running) { LOG.WriteLog(eEvent.WARN_AXIS, $"{Module}.{Name}", $"current execute {_currentOperation},cannot profile position"); return false; } if (profileAcceleration == 0) { profileAcceleration = _profileAcceleration; } if (profileDeceleration == 0) { profileDeceleration = _profileDeceleration; } _status = _profilePositionRoutine.Start(targetPoint, profileVelocity, profileAcceleration, profileDeceleration, judgeTorqueLimit); _currentOperation = MotionOperation.Position; _inTargetPosition = false; return true; } /// /// 改变速度 /// /// /// public override bool ChangeSpeed(int speed) { bool result = WriteControlWord(0x2F); if (!result) { return false; } result = BeckhoffAxisManager.Instance.WriteVariableValue($"{Module}.{Name}.ProfileVelocity", speed); if (!result) { return false; } result = WriteControlWord(0x3F); return result; } /// /// 改变速度加速度 /// /// /// public override bool ChangeSpeedAcceleration(int speed, int acceleration, int deceleration) { bool result = WriteControlWord(0x2F); if (!result) { return false; } result = BeckhoffAxisManager.Instance.WriteVariableValue($"{Module}.{Name}.ProfileVelocity", speed); BeckhoffAxisManager.Instance.WriteVariableValue($"{Module}.{Name}.{PROFILE_ACCEL}", acceleration); BeckhoffAxisManager.Instance.WriteVariableValue($"{Module}.{Name}.{PROFILE_DECEL}", deceleration); if (!result) { return false; } result = WriteControlWord(0x3F); return result; } /// /// KeyDown事件 /// /// /// protected override void AxisKeyDown(string arg, double value) { switch (arg) { case PROFILE_VELOCITY: _profileVelocity = CalculateMultiplySpeedRatio(CalculateValueMultiplyScale(value)); _commandMotionData.FileProfileVelocity = value; BeckhoffAxisManager.Instance.WriteVariableValue($"{Module}.{Name}.{arg}", _profileVelocity); break; case PROFILE_ACCEL: _profileAcceleration = CalculateDivideAccelerationRatio(CalculateValueMultiplyScale(value)); _commandMotionData.FileAcceleration = value; BeckhoffAxisManager.Instance.WriteVariableValue($"{Module}.{Name}.{arg}", _profileAcceleration); break; case PROFILE_DECEL: _profileDeceleration = CalculateDivideAccelerationRatio(CalculateValueMultiplyScale(value)); _commandMotionData.FileDeceleration = value; BeckhoffAxisManager.Instance.WriteVariableValue($"{Module}.{Name}.{arg}", _profileDeceleration); break; case HOMING_VELOCITY: _profileHomingVelocity = CalculateMultiplySpeedRatio(CalculateValueMultiplyScale(value)); _commandMotionData.FileHomingVelocity = value; TwincatCoeManager.Instance.WriteVariableValue($"{Module}.{Name}", arg, _profileHomingVelocity); break; case HOMING_VELOCITY_SLOW: _profileHomingVelocitySlow = CalculateMultiplySpeedRatio(CalculateValueMultiplyScale(value)); _commandMotionData.FileHomingVelocitySlow = value; TwincatCoeManager.Instance.WriteVariableValue($"{Module}.{Name}", arg, _profileHomingVelocitySlow); break; case HOMING_ACCEL: _profileHomingAccel = CalculateDivideAccelerationRatio(CalculateValueMultiplyScale(value)); _commandMotionData.FileHomingAccel = value; TwincatCoeManager.Instance.WriteVariableValue($"{Module}.{Name}", arg, _profileHomingAccel); break; } } } }