using Aitex.Core.RT.Device;
using Aitex.Core.RT.Routine;
using MECF.Framework.Common.Routine;
using PunkHPX8_Core;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MECF.Framework.Common.Beckhoff.ModuleIO;
using MECF.Framework.Common.TwinCat;
using MECF.Framework.Common.IOCore;
using Aitex.Core.RT.Log;
namespace PunkHPX8_RT.Devices.Safety
{
public class SafetyResetRoutine : RoutineBase, IRoutine
{
private enum SafetyResetStep
{
RunStop,
ErrAck,
LockCasseteDoors,
LockCellDoors,
LockAlignerDoors,
FacilityStoEstopRestart,
FacilityEstopDelay,
PlatingCell12Sto1EstopRestart,
PlatingCell12Sto1EstopDelay,
PlatingCell12Sto2EstopRestart,
PlatingCell12Sto2EstopDelay,
PlatingCell34Sto1EstopRestart,
PlatingCell34Sto1EstopDelay,
PlatingCell34Sto2EstopRestart,
PlatingCell34Sto2EstopDelay,
SlsRestart,
End
}
#region 常量
private const string RUNSTOP = "RunStop";
#endregion
#region 内部变量
private SafetyToggleRoutine _errAckToggleRoutine;
private SafetyToggleRoutine _facilityStoEstopRestart;
private SafetyToggleRoutine _platingCell12Sto1EstopRestart;
private SafetyToggleRoutine _platingCell12Sto2EstopRestart;
private SafetyToggleRoutine _platingCell34Sto1EstopRestart;
private SafetyToggleRoutine _platingCell34Sto2EstopRestart;
private SafetyDevice _device;
#endregion
///
/// 构造函数
///
///
public SafetyResetRoutine(string module) : base(module)
{
_errAckToggleRoutine = new SafetyToggleRoutine(module);
_facilityStoEstopRestart = new SafetyToggleRoutine(module);
_platingCell12Sto1EstopRestart=new SafetyToggleRoutine(module);
_platingCell12Sto2EstopRestart=new SafetyToggleRoutine(module);
_platingCell34Sto1EstopRestart= new SafetyToggleRoutine(module);
_platingCell34Sto2EstopRestart = new SafetyToggleRoutine(module);
}
///
/// 中止
///
public void Abort()
{
Runner.Stop("Manaul abort safety reset");
}
///
/// 监控
///
///
public RState Monitor()
{
Runner.Run(SafetyResetStep.RunStop, RunStop, _delay_1ms)
.Run(SafetyResetStep.ErrAck, () => { return _errAckToggleRoutine.Start("ErrAck") == RState.Running; },
() => { return CheckRoutineStatus(_errAckToggleRoutine); }, _delay_1s)
.Run(SafetyResetStep.LockCasseteDoors, () => { return _device.LockCasseteDoor(); },CheckCasseteLocked, _delay_5s)
.Run(SafetyResetStep.LockCellDoors, LockCellDoors,CheckCellLocked, _delay_1ms)
.Run(SafetyResetStep.LockAlignerDoors, () => { return _device.LockAlignerDoor(); },CheckAlignerLocked, _delay_1ms)
.Run(SafetyResetStep.FacilityStoEstopRestart, () => { return _facilityStoEstopRestart.Start("FacilityStoEstopRestart") == RState.Running; },
() => { return CheckRoutineStatus(_facilityStoEstopRestart); }, _delay_1s)
.Delay(SafetyResetStep.FacilityEstopDelay,100)//100 delay
.Run(SafetyResetStep.PlatingCell12Sto1EstopDelay, () => { return _platingCell12Sto1EstopRestart.Start("PlatingCell12Sto1EstopRestart") == RState.Running; },
() => { return CheckRoutineStatus(_platingCell12Sto1EstopRestart); }, _delay_1s)
.Delay(SafetyResetStep.PlatingCell12Sto1EstopDelay, 100)//100 delay
.Run(SafetyResetStep.PlatingCell12Sto2EstopDelay, () => { return _platingCell12Sto2EstopRestart.Start("PlatingCell12Sto2EstopRestart") == RState.Running; },
() => { return CheckRoutineStatus(_platingCell12Sto2EstopRestart); }, _delay_1s)
.Delay(SafetyResetStep.PlatingCell12Sto1EstopDelay, 100)//100 delay
.Run(SafetyResetStep.PlatingCell34Sto1EstopDelay, () => { return _platingCell34Sto1EstopRestart.Start("PlatingCell34Sto1EstopRestart") == RState.Running; },
() => { return CheckRoutineStatus(_platingCell34Sto1EstopRestart); }, _delay_1s)
.Delay(SafetyResetStep.PlatingCell34Sto1EstopDelay, 100)//100 delay
.Run(SafetyResetStep.PlatingCell34Sto2EstopDelay, () => { return _platingCell34Sto1EstopRestart.Start("PlatingCell34Sto2EstopRestart") == RState.Running; },
() => { return CheckRoutineStatus(_platingCell34Sto2EstopRestart); }, _delay_1s)
.Delay(SafetyResetStep.PlatingCell34Sto1EstopDelay, 100)//100 delay
.Run(SafetyResetStep.SlsRestart, () => { return _slsRestart.Start("SlsRestart") == RState.Running; },
() => { return CheckRoutineStatus(_slsRestart); }, _delay_1s)
.End(SafetyResetStep.End, NullFun, _delay_1ms);
return Runner.Status;
}
///
///
///
///
private bool RunStop()
{
string ioName = BeckhoffModuleIOManager.Instance.GetIoNameByInnerModuleName($"{Module}.{RUNSTOP}");
return IOModuleManager.Instance.WriteIoValue(ioName, true);
}
///
/// 检验是否完成
///
///
///
private bool CheckRoutineStatus (IRoutine routine)
{
RState rsState = routine.Monitor();
return rsState == RState.End;
}
///
/// 检验Process door locked状态
///
///
private bool CheckCasseteLocked()
{
return _device.SafetyData.CassetteDoorsLeftLocked&& _device.SafetyData.CassetteDoorsRightLocked;
}
///
/// lock cell doors
///
///
private bool LockCellDoors()
{
return _device.LockCell12Door() && _device.LockCell34Door();
}
///
/// 检验Cell locked状态
///
///
private bool CheckCellLocked()
{
return _device.SafetyData.Cell12DoorsLeftLocked && _device.SafetyData.Cell12DoorsRightLocked && _device.SafetyData.Cell34DoorsLeftLocked &&
_device.SafetyData.Cell34DoorsRightLocked;
}
///
/// 检验Aligner door locked
///
///
private bool CheckAlignerLocked()
{
return _device.SafetyData.AlignerDoorClosed;
}
///
/// 启动
///
///
///
public RState Start(params object[] objs)
{
_device = DEVICE.GetDevice("Safety");
return Runner.Start(Module, "Start Reset safety");
}
}
}