using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.RT.SCCore; using CyberX8_Core; using CyberX8_RT.Devices.SRD; using CyberX8_RT.Modules.Transporter; using MECF.Framework.Common.Routine; using MECF.Framework.Common.Utilities; namespace CyberX8_RT.Modules.SRD { public class SRDInitializeHomeRoutine : RoutineBase, IRoutine { private enum InitializeStep { Initialize, InitializeWait, SwitchOn, SwitchOnWait, Home, HomeWait, End } #region 内部变量 private SRDInitializeRoutine _initializeRoutine; private SRDSwitchOnRoutine _switchOnRoutine; private SRDHomeRoutine _homeRoutine; #endregion /// /// 构造函数 /// /// public SRDInitializeHomeRoutine(string module) : base(module) { _initializeRoutine = new SRDInitializeRoutine(module); _switchOnRoutine = new SRDSwitchOnRoutine(module); _homeRoutine = new SRDHomeRoutine(module); } /// /// 中止 /// public void Abort() { Runner.Stop("Manual Abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(InitializeStep.Initialize, () => _initializeRoutine.Start() == RState.Running, _delay_1ms) .WaitWithStopCondition(InitializeStep.InitializeWait, () => CommonFunction.CheckRoutineEndState(_initializeRoutine), () => CommonFunction.CheckRoutineStopState(_initializeRoutine)) .Run(InitializeStep.SwitchOn, () => _switchOnRoutine.Start() == RState.Running, _delay_1ms) .WaitWithStopCondition(InitializeStep.SwitchOnWait, () => CommonFunction.CheckRoutineEndState(_switchOnRoutine), () => CommonFunction.CheckRoutineStopState(_switchOnRoutine)) .Run(InitializeStep.Home, () => _homeRoutine.Start() == RState.Running, _delay_1ms) .WaitWithStopCondition(InitializeStep.HomeWait, () => CommonFunction.CheckRoutineEndState(_homeRoutine), () => CommonFunction.CheckRoutineStopState(_homeRoutine)) .End(InitializeStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { if (!CheckPreCondition()) { return RState.Failed; } return Runner.Start(Module, "Start Initialize Home"); } private bool CheckPreCondition() { SrdCommonDevice srdCommon = DEVICE.GetDevice($"{Module}.Common"); bool isSimulator = SC.GetValue("System.IsSimulatorMode"); if (!isSimulator && srdCommon.CommonData.WaferPresent) { LOG.WriteLog(eEvent.ERR_SRD, Module, $"Wafer is present"); return false; } if (!srdCommon.CommonData.ChuckVacuum) { LOG.WriteLog(eEvent.ERR_SRD, Module, $"Chuck Vacuum is on"); return false; } int vacuumOffLimit = SC.GetValue("SRD.ChuckVacuumOffLimit"); if (srdCommon.CommonData.VacuumValue < vacuumOffLimit) { LOG.WriteLog(eEvent.ERR_SRD, Module, $"VacuumValue:{srdCommon.CommonData.VacuumValue}, VacuumOff Limit:{vacuumOffLimit}"); return false; } if (srdCommon.CommonData.ChuckATMOn) { LOG.WriteLog(eEvent.ERR_SRD, Module, $"Chuck ATM is on"); return false; } return true; } } }