using Aitex.Core.RT.Device;
using Aitex.Core.RT.Log;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Equipment;
using MECF.Framework.Common.Routine;
using MECF.Framework.Common.Utilities;
using CyberX8_Core;
using CyberX8_RT.Devices.AXIS;
using CyberX8_RT.Devices.Facilities;
using CyberX8_RT.Devices.PUF;
using CyberX8_RT.Devices.SRD;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using CyberX8_RT.Devices.Safety;
namespace CyberX8_RT.Modules.Transporter
{
public class SRDHomeRoutine : RoutineBase, IRoutine
{
private enum HomeAllStep
{
CheckSafety,
CheckPreCondition,
CloseDoor,
CheckDoorClosed,
HomeSRDArm,
CheckArmHome,
ArmHome,
ArmHomeWait,
HomeSRDRotation,
RotationHome,
RotationHomeWait,
CheckRotationHome,
OpenDoor,
CheckDoorOpened,
End
}
#region 内部变量
private JetAxisBase _armAxis;
private JetAxisBase _rotationAxis;
private SrdCommonDevice _common;
private SrdCommonDoorCloseRoutine _doorCloseRoutine;
private string _module;
#endregion
#region 属性
///
/// 当前子状态机
///
public string CurrentStateMachine
{
get { return Runner.CurrentStep.ToString(); }
}
#endregion
public SRDHomeRoutine(string module) : base(module)
{
_module = module;
}
public void Abort()
{
Runner.Stop("Manual Abort");
}
public RState Monitor()
{
Runner.Run(HomeAllStep.CheckSafety,CheckSafety,_delay_1ms)
.Run(HomeAllStep.CheckPreCondition, CheckPreCondition,NullFun,_delay_1ms)
.Run(HomeAllStep.CloseDoor, () => { return _doorCloseRoutine.Start(true) == RState.Running; }, NullFun, _delay_1ms)
.WaitWithStopCondition(HomeAllStep.CheckDoorClosed, () => CommonFunction.CheckRoutineEndState(_doorCloseRoutine), () => CommonFunction.CheckRoutineStopState(_doorCloseRoutine))
.Run(HomeAllStep.HomeSRDArm, ArmAxisHome, _delay_1ms)
.WaitWithStopCondition(HomeAllStep.CheckArmHome, () => { return _armAxis.IsHomed && _armAxis.Status == RState.End; }, () => { return _armAxis.Status == RState.Failed; })
.Run(HomeAllStep.HomeSRDRotation, RotationAxisHome,_delay_1ms)
.WaitWithStopCondition(HomeAllStep.CheckRotationHome, () => { return _rotationAxis.IsHomed && _rotationAxis.Status == RState.End; }, () => { return _rotationAxis.Status == RState.Failed; })
.Run(HomeAllStep.ArmHome, () => { return _armAxis.PositionStation("Home", true); }, NullFun, 100)
.WaitWithStopCondition(HomeAllStep.ArmHomeWait, () => { return _armAxis.Status == RState.End; }, () => { return _armAxis.Status == RState.Failed; })
.Run(HomeAllStep.RotationHome, () => { return _rotationAxis.PositionStation("Home",true); }, NullFun, 100)
.WaitWithStopCondition(HomeAllStep.RotationHomeWait, () => { return _rotationAxis.Status == RState.End; }, () => { return _rotationAxis.Status == RState.Failed; })
.Run(HomeAllStep.OpenDoor, () => { return _doorCloseRoutine.Start(false) == RState.Running; },NullFun,_delay_1ms)
.WaitWithStopCondition(HomeAllStep.CheckDoorOpened,()=>CommonFunction.CheckRoutineEndState(_doorCloseRoutine),()=>CommonFunction.CheckRoutineStopState(_doorCloseRoutine))
.End(HomeAllStep.End,NullFun);
return Runner.Status;
}
///
/// 检验Safety
///
///
private bool CheckSafety()
{
SafetyDevice safetyDevice = DEVICE.GetDevice("Safety");
if (safetyDevice == null)
{
LOG.WriteLog(eEvent.ERR_SRD, Module.ToString(), "Safety device is null");
return false;
}
if (safetyDevice.SafetyData.TwincatState != 8)
{
LOG.WriteLog(eEvent.ERR_SRD, Module.ToString(), "Twincat Status is not OP status");
return false;
}
if (safetyDevice.SafetyData.SrdCommErr)
{
LOG.WriteLog(eEvent.ERR_SRD, Module.ToString(), "Twincat SRD Communication status is error");
return false;
}
if (safetyDevice.SafetyData.SrdFunctionBlockErr)
{
LOG.WriteLog(eEvent.ERR_SRD, Module.ToString(), "Twincat SRD function block status is error");
return false;
}
return true;
}
///
/// 检验前置条件
///
///
private bool CheckPreCondition()
{
//检查电机谁否开启
if(! _armAxis.IsSwitchOn)
{
LOG.WriteLog(eEvent.ERR_SRD, Module, $"{_module}.Arm is switchoff");
return false;
}
if(!_rotationAxis.IsSwitchOn)
{
LOG.WriteLog(eEvent.ERR_SRD, Module, $"{_module}.Rotation is switchoff");
return false;
}
//检查CDA与N2是否开启
SystemFacilities systemFacilities = DEVICE.GetDevice("System.Facilities");
var result = systemFacilities.CheckCDAN2();
if (!result.result)
{
LOG.WriteLog(eEvent.ERR_SRD, Module, $"CDA or N2 is not enabled");
return false;
}
return true;
}
///
/// Rotation Home
///
///
private bool RotationAxisHome()
{
return _rotationAxis.Home();
}
///
/// 检验Rotation Home状态
///
///
private bool CheckRotationHome()
{
return _rotationAxis.IsHomed&&_rotationAxis.Status==RState.End;
}
///
/// Arm Home
///
///
private bool ArmAxisHome()
{
return _armAxis.Home();
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_armAxis = DEVICE.GetDevice($"{Module}.Arm");
_rotationAxis = DEVICE.GetDevice($"{Module}.Rotation");
_common = DEVICE.GetDevice($"{Module}.Common");
_doorCloseRoutine = new SrdCommonDoorCloseRoutine(Module);
return Runner.Start(Module, "Home");
}
}
}