using Aitex.Core.RT.Device; using Aitex.Core.RT.Routine; using MECF.Framework.Common.Routine; using MECF.Framework.Common.Utilities; using CyberX8_Core; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace CyberX8_RT.Devices.Loader { public class LoaderSideCycleRoutine : RoutineBase, IRoutine { private enum LoaderSideCycleStep { LoopStart, LoopUnload, LoopUnloadWait, LoopLoad, LoopLoadWait, LoopFlowTest, LoopFlowTestWait, LoopEnd, End } #region 内部变量 /// /// 面 /// private string _side; /// /// Load Routine /// private LoaderLoadRoutine _loadRoutine; /// /// Unload Routine /// private LoaderUnloadRoutine _unloadRoutine; /// /// Common device对象 /// private LoaderCommonDevice _commonDevice; /// /// 总次数 /// private int _totalCycle; #endregion #region 属性 /// /// 当前次数 /// public int CurrentCycle { get { return Runner.LoopCounter+1; } } #endregion /// /// 构造函数 /// /// public LoaderSideCycleRoutine(string module,string side) : base(module) { _side = side; } /// /// 中止 /// public void Abort() { Runner.Stop("Manual Stop"); if (Runner.CurrentStep.ToString() ==LoaderSideCycleStep.LoopFlowTest.ToString() || Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopFlowTestWait.ToString()) { _commonDevice.StopFlowTestAction(); } else if (Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopLoad.ToString() || Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopLoadWait.ToString()) { _loadRoutine.Abort(); } else if (Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopUnload.ToString() || Runner.CurrentStep.ToString() == LoaderSideCycleStep.LoopUnloadWait.ToString()) { _unloadRoutine.Abort(); } } /// /// 监控 /// /// public RState Monitor() { Runner.LoopStart(LoaderSideCycleStep.LoopStart, "Loader Cycle", _totalCycle, NullFun, _delay_1ms) .LoopRun(LoaderSideCycleStep.LoopUnload, StartUnload, _delay_1ms) .LoopRunWithStopStatus(LoaderSideCycleStep.LoopUnloadWait, () => CommonFunction.CheckRoutineEndState(_unloadRoutine), () => CommonFunction.CheckRoutineStopState(_unloadRoutine)) .LoopRun(LoaderSideCycleStep.LoopLoad, StartLoad, _delay_1ms) .LoopRunWithStopStatus(LoaderSideCycleStep.LoopLoadWait, () => CommonFunction.CheckRoutineEndState(_loadRoutine), () => CommonFunction.CheckRoutineStopState(_loadRoutine)) .LoopRun(LoaderSideCycleStep.LoopFlowTest, StartFlowTest, _delay_1ms) .LoopRunWithStopStatus(LoaderSideCycleStep.LoopFlowTestWait, () => _commonDevice.Status == RState.End, () => _commonDevice.Status == RState.Failed) .LoopEnd(LoaderSideCycleStep.LoopEnd, NullFun, _delay_1ms) .End(LoaderSideCycleStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// 启动Unload /// /// private bool StartUnload() { return _unloadRoutine.Start()==RState.Running; } /// /// 启动Load /// /// private bool StartLoad() { return _loadRoutine.Start()==RState.Running; } /// /// 启动Flowtest /// /// private bool StartFlowTest() { return _commonDevice.StartFlowTestAction(); } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _commonDevice = DEVICE.GetDevice($"{Module}.Common"); _totalCycle = (int)objs[0]; _loadRoutine = new LoaderLoadRoutine(Module, _side); _unloadRoutine= new LoaderUnloadRoutine(Module, _side); Runner.Start(Module, "Start Cycle"); return RState.Running; } } }