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