using Aitex.Core.RT.Routine; using MECF.Framework.Common.Routine; using CyberX8_Core; using CyberX8_RT.Devices.AXIS.CANOpen; using System; using System.Collections.Generic; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.Loader { public class LoaderSideUnloadVacuumLevelCheckRoutine : RoutineBase, IRoutine { private enum UnloadVacuumLevelStep { VecuumLevel, VecuumLevelCheck, ConditionWHBladder, ConditionWHBladderCheck, ConditionVacuumLevel, ConditionVacuumLevelCheck, End } #region 内部变量 private bool _continue = false; private bool _vacuumLevelCheckFailed = false; private LoaderSideVacuumLevelCheckRoutine _vacuumLevelCheckRoutine; private LoaderSideWhBladderRoutine _whBladderRoutine; #endregion /// /// 构造函数 /// /// public LoaderSideUnloadVacuumLevelCheckRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { } /// /// 监控 /// /// public RState Monitor() { Runner.Run(UnloadVacuumLevelStep.VecuumLevel, () => { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; }, NullFun, _delay_1ms) .WaitWithStopCondition(UnloadVacuumLevelStep.VecuumLevelCheck, FirstVacuumLevelCheck, () => { return _vacuumLevelCheckFailed; }) .Run(UnloadVacuumLevelStep.ConditionWHBladder,ConditionWHBladder,_delay_1ms) .WaitWithStopCondition(UnloadVacuumLevelStep.ConditionWHBladderCheck,ConditionWHBladderEndStatus,ConditionWHBladderStopStatus) .Run(UnloadVacuumLevelStep.ConditionVacuumLevelCheck,ConditionVacuumLevel,_delay_1ms) .WaitWithStopCondition(UnloadVacuumLevelStep.ConditionVacuumLevelCheck,ConditionVacuumLevelEndStatus,ConditionVacuumLevelStopStatus) .End(UnloadVacuumLevelStep.End,NullFun,100); return Runner.Status; } /// /// 首次VacuumLevel校验 /// /// private bool FirstVacuumLevelCheck() { RState state = _vacuumLevelCheckRoutine.Monitor(); if(state==RState.End) { return true; } else if(state==RState.Timeout) { _continue = true; return true; } else if(state==RState.Failed) { _vacuumLevelCheckFailed = true; return false; } else { return false; } } /// /// 条件WHBladder /// /// private bool ConditionWHBladder() { if(_continue) { return true; } else { return _whBladderRoutine.Start(true) == RState.Running; } } /// /// 条件WHBladder检验 /// /// private bool ConditionWHBladderEndStatus() { if(_continue) { return true; } else { return _whBladderRoutine.Monitor() == RState.End; } } /// /// 条件WHBladder停止检验 /// /// private bool ConditionWHBladderStopStatus() { if (_continue) { return true; } else { RState state = _whBladderRoutine.Monitor(); return state == RState.Failed || state == RState.Timeout; } } /// /// 条件Vacuum Level /// /// private bool ConditionVacuumLevel() { if (_continue) { return true; } else { return _vacuumLevelCheckRoutine.Start(true) == RState.Running; } } /// /// 条件Vacuum Level /// /// private bool ConditionVacuumLevelEndStatus() { if (_continue) { return true; } else { return _vacuumLevelCheckRoutine.Monitor() == RState.End; } } /// /// 条件Vacuum Level /// /// private bool ConditionVacuumLevelStopStatus() { if (_continue) { return true; } else { RState state = _vacuumLevelCheckRoutine.Monitor(); return state == RState.Failed || state == RState.Timeout; } } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _vacuumLevelCheckRoutine = new LoaderSideVacuumLevelCheckRoutine(Module); _whBladderRoutine = new LoaderSideWhBladderRoutine(Module); Runner.Start(Module, "UnloadVacuumLevelCheck"); return RState.Running; } } }