using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Routine;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS;
using CyberX8_RT.Devices.TransPorter;
using CyberX8_RT.Modules.Loader;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace CyberX8_RT.Modules.Transporter
{
public class TransporterElevatorUpRoutine : RoutineBase, IRoutine
{
private enum ParkStep
{
CheckStatus,
ElevatorUp,
ElevatorUpWait,
End
}
#region 内部变量
private JetAxisBase _elevatorAxis;
private JetAxisBase _gantryAxis;
private TransporterCommon _transporterCommon;
#endregion
///
/// 构造函数
///
///
public TransporterElevatorUpRoutine(string module) : base(module)
{
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manual Abort");
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(ParkStep.CheckStatus, CheckPreCondition, NullFun,_delay_1ms)
//1.1 Elevator
.Run(ParkStep.ElevatorUp, ElevatorPosition, _delay_1ms)
.WaitWithStopCondition(ParkStep.ElevatorUpWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop)
.End(ParkStep.End,NullFun,100);
return Runner.Status;
}
///
/// 检验前置条件
///
///
private bool CheckPreCondition()
{
if (!_elevatorAxis.IsSwitchOn)
{
LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{Module} elevator axis is not switch on ");
return false;
}
if (!_elevatorAxis.IsHomed)
{
LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, $"{Module} elevator axis is not homed ");
return false;
}
return true;
}
///
/// Elevator Position
///
///
private bool ElevatorPosition()
{
return _elevatorAxis.PositionStation("UP");
}
///
/// 检验Vertical移动状态
///
///
private bool CheckVerticalPositionStatus()
{
return _elevatorAxis.Status == RState.End;
}
///
/// 检验Vertical是否还在运动
///
///
private bool CheckVerticalPositionRunStop()
{
return _elevatorAxis.Status == RState.Failed;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_elevatorAxis = DEVICE.GetDevice($"{Module}.Elevator");
_gantryAxis = DEVICE.GetDevice($"{Module}.Gantry");
_transporterCommon = DEVICE.GetDevice($"{Module}.Common");
if (!CheckStartPreConfition())
{
return RState.Failed;
}
return Runner.Start(Module, "ElevatorUp");
}
///
/// 启动校验条件
///
///
private bool CheckStartPreConfition()
{
//Ready to lock或WH Present Sensor触发
if(_transporterCommon.TransporterData.ReadyToLock1||_transporterCommon.TransporterData.ReadyToLock2||_transporterCommon.TransporterData.WhPresent1||
_transporterCommon.TransporterData.WhPresent2)
{
//lock clamp sensor触发
if(_transporterCommon.TransporterData.Locked1||_transporterCommon.TransporterData.Locked2)
{
//gantry 位置不明确
if(_gantryAxis.CheckPositionIsEmpty(_gantryAxis.MotionData.MotorPosition))
{
LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module, "gantry station is empty,can not elevator up");
return false;
}
}
}
return true;
}
}
}