using Aitex.Core.RT.Device;
using Aitex.Core.RT.Fsm;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Beckhoff.AxisProvider;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.RecipeCenter;
using MECF.Framework.Common.Utilities;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS;
using CyberX8_RT.Devices.SRD;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Modules.SRD
{
internal class SRDRotationRoutine : ModuleRoutineBase, IRoutine
{
private enum RotationStep
{
Rotation,
Wait,
End
}
#region 常量
///
/// ROTATION电机转速比例
///
private const int SPEED_RATIO = 10;
#endregion
#region 内部变量
///
/// 模块名称
///
private string _module;
///
/// Rotation Axis
///
private JetAxisBase _rotationAxis;
///
/// 转速
///
private double _speed;
///
/// 时间
///
private double _time;
///
/// 超时时间
///
private int _timeOut = 6000;
///
/// SRD rotation Provider对象
///
private BeckhoffProviderAxis _rotationProviderAxis;
///
/// SRD Common
///
private SrdCommonDevice _srdCommon;
#endregion
#region 属性
///
/// 当前状态机
///
public string CurrentStateMachine
{
get { return Runner.CurrentStep.ToString(); }
}
#endregion
public SRDRotationRoutine(ModuleName module, JetAxisBase rotationAxis) : base(module)
{
Name = "StartRotation";
_module = module.ToString();
_srdCommon = DEVICE.GetDevice($"{module}.Common");
}
public void Abort()
{
Runner.Stop("Manual Abort");
}
public RState Monitor()
{
Runner.Run(RotationStep.Rotation, StartRotation, NullFun, _timeOut)
.WaitWithStopCondition(RotationStep.Wait, CheckRotationStatus, CheckRotationRunStop)
.End(RotationStep.End, NullFun);
return Runner.Status;
}
///
/// 开始旋转
///
///
public bool StartRotation()
{
if (_srdCommon.CommonData.DoorOpened)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, "Door is not closed. Can't do rotation");
return false;
}
if (!_rotationAxis.IsSwitchOn)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, $"{_module}.Rotation is switchoff");
return false;
}
if (!_rotationAxis.IsHomed)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, $"{_module}.Rotation is not homed");
return false;
}
_rotationProviderAxis = BeckhoffAxisProviderManager.Instance.GetAxisProvider($"{_module}.Rotation");
if (_rotationProviderAxis == null)
{
LOG.WriteLog(eEvent.ERR_SRD, _module, $"{_module}.Rotation Provider is not exist");
return false;
}
double _scale = _rotationProviderAxis.ScaleFactor;
//获取当前Position
double currentPosition = _rotationAxis.MotionData.MotorPosition;
//转成角速度(deg/s)
double DPSspeed = BeckhoffVelocityUtil.ConvertVelocityToDegPerSecondByRPM((int)_speed);
int rotationSpeed = (int)Math.Round(_scale * DPSspeed, 0);
int targetPosition = (int)Math.Round(_scale * (_time * DPSspeed + currentPosition), 0);
LOG.WriteLog(eEvent.INFO_SRD, _module, "Start Rotation");
return _rotationAxis.ProfilePosition(targetPosition, rotationSpeed * SPEED_RATIO, 0, 0);
}
///
/// 检验移动状态
///
///
private bool CheckRotationStatus()
{
return _rotationAxis.Status == RState.End;
}
///
/// 检验是否还在运动
///
///
private bool CheckRotationRunStop()
{
return _rotationAxis.Status == RState.Failed;
}
public RState Start(params object[] objs)
{
_rotationAxis = (JetAxisBase)objs[0];
_time = (double)objs[1];
_speed = (double)objs[2];
Runner.Start(Module, Name);
return RState.Running;
}
}
}