using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using CyberX8_Core; using CyberX8_RT.Devices.EFEM; using CyberX8_RT.Modules.Rinse; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Routine; using MECF.Framework.Common.Utilities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Modules.EFEM { public class CycleRobotCycleRoutine : ModuleRoutineBase, IRoutine { private enum CycleRobotCycleStep { LoopStart, LoopRunRobotCycle, LoopRunRobotCycleWait, LoopEnd, End } /// /// Cycle次数 /// private int _cycleTimes; /// /// 当前处于第几次Cycle /// private int _currentCycle; private object[] param; private RobotCycleRoutine _robotCycleRoutine; public CycleRobotCycleRoutine(EfemBase efem) : base(ModuleName.EfemRobot) { _robotCycleRoutine = new RobotCycleRoutine(efem); } public RState Start(params object[] objs) { param = objs; _currentCycle = 1;//初始化当前Cycle次数 if (objs.Length >= 6) { _cycleTimes = (int)objs[4]; if (_cycleTimes < 1) { LOG.Write(eEvent.ERR_EFEM_ROBOT, Module, $"Input Robot Cycle Times{_cycleTimes} error"); return RState.Failed; } } return Runner.Start(Module, "Start CycleRobotCycleRoutine"); } public RState Monitor() { Runner.LoopStart(CycleRobotCycleStep.LoopStart, "Loop StartCycleRobotCycleRoutine", _cycleTimes, NullFun, _delay_1ms) .LoopRun(CycleRobotCycleStep.LoopRunRobotCycle, () => _robotCycleRoutine.Start(param) == RState.Running,_delay_1ms) .LoopRunWithStopStatus(CycleRobotCycleStep.LoopRunRobotCycleWait, () => { return CommonFunction.CheckRoutineEndState(_robotCycleRoutine); }, () => CheckRoutineStopStatus(_robotCycleRoutine, "CycleRobotCycleRoutine failed")) .LoopEnd(CycleRobotCycleStep.LoopEnd, UpdateCycleCount, _delay_1ms) .End(CycleRobotCycleStep.End, AchievedCycleCount, _delay_1ms); return Runner.Status; } private bool CheckRoutineStopStatus(IRoutine routine, string error) { bool result = CommonFunction.CheckRoutineStopState(routine); if (result) { Stop($"{error}"); } return result; } /// /// Abort /// public void Abort() { Runner.Stop("CycleRobotCycleRoutine Abort"); } /// /// 统计完成的Cycle次数 /// /// private bool UpdateCycleCount() { _currentCycle += 1; return true; } /// /// /// /// private bool AchievedCycleCount() { _currentCycle -= 1; return true; } /// /// 获取当前Cycle次数 /// /// public int GetCurrentCycle() { return _currentCycle; } } }