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;
}
}
}
}