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.AXIS; using CyberX8_RT.Devices.Facilities; using CyberX8_RT.Devices.SRD; using MECF.Framework.Common.Routine; namespace CyberX8_RT.Modules.SRD { public class SRDUnloaderRoutine : RoutineBase, IRoutine { private enum SRDUnloaderStep { ChuckVacuumOff, ChuckATMOn, CheckVacuum, LiftUpOn, CheckWaferPresent, OpenDoor, End } #region 常量 private const int RETRY_TIMES = 3; #endregion #region 内部变量 /// /// Rotation Axis /// private JetAxisBase _rotationAxis; /// /// SRD Common /// private SrdCommonDevice _srdCommon; /// /// Total SRD /// private TotalSRDDevice _totalSRDDevice; /// /// System Facility /// private SystemFacilities _systemFacilities; /// /// 当前WaferSize /// private int _waferSize = 200; /// /// 当前Retry次数 /// private int _currentRetryTimes = 0; /// /// 真空值 /// private int _vacuumOffLimit = 0; #endregion #region 属性 #endregion /// /// 构造函数 /// /// public SRDUnloaderRoutine(string module) : base(module) { } /// /// 中止 /// public void Abort() { Runner.Stop("SRD Loader Abort"); } /// /// 监控 /// /// public RState Monitor() { Runner.Run(SRDUnloaderStep.ChuckVacuumOff, ChuckVacuumOff, CheckChuckVacuumOffEndStatus, CheckChuckVacuumOffStopStatus) .Run(SRDUnloaderStep.ChuckATMOn, ChuckATMOn, CheckChuckATMEndStatus, CheckChuckATMStopStatus) .WaitWithStopCondition(SRDUnloaderStep.CheckVacuum, CheckVacuumEndStatus, CheckVacuumStopStatus) .Run(SRDUnloaderStep.LiftUpOn, LiftUpOn, CheckLiftUpOnEndStatus, CheckLiftUpOnStopStatus) .Run(SRDUnloaderStep.CheckWaferPresent, CheckWaferPresent, _delay_1ms) .Run(SRDUnloaderStep.OpenDoor, OpenDoor, CheckDoorOpenedEndStatus, CheckDoorOpenedStopStatus) .End(SRDUnloaderStep.End, NullFun, _delay_1ms); return Runner.Status; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _srdCommon = DEVICE.GetDevice($"{Module}.Common"); _totalSRDDevice = DEVICE.GetDevice("SRD"); _rotationAxis = DEVICE.GetDevice($"{Module}.Rotation"); _systemFacilities = DEVICE.GetDevice("System.Facilities"); _vacuumOffLimit = SC.GetValue("SRD.ChuckVacuumOffLimit"); if (!CheckPreCondition()) { return RState.Failed; } return Runner.Start(Module, "SRD Unloader Start"); } /// /// Check Pre Condition /// /// private bool CheckPreCondition() { //Check Rotation Home //if (!_rotationAxis.IsHomed) //{ // NotifyError(eEvent.ERR_SRD, "Rotation is not homed", 0); // return false; //} //Check LiftUp if (_srdCommon.CommonData.LiftUp) { NotifyError(eEvent.ERR_SRD, "LiftUp is on", 0); return false; } //Check LiftUp Status if (_srdCommon.CommonData.LiftUpStatus) { NotifyError(eEvent.ERR_SRD, "LiftUp sensor is on", 0); return false; } //Check Wafer Present if (!_srdCommon.CommonData.WaferPresent) { NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0); return false; } //Check LoaderDI if (!_systemFacilities.LoaderDiEnable) { NotifyError(eEvent.ERR_SRD, "Load DI Is Disable", 0); return false; } //Check Vacuum int vacuumOnLimit = SC.GetValue("SRD.ChuckVacuumOnLimit"); if (!_srdCommon.CommonData.ChuckVacuum) { if(_srdCommon.CommonData.VacuumValue >= vacuumOnLimit) { LOG.WriteLog(eEvent.ERR_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{vacuumOnLimit}"); return false; } } else { LOG.WriteLog(eEvent.ERR_SRD, Module, $"Chuck Vacuum is off"); return false; } //Check Flippers if (_srdCommon.CommonData.FlippersIn150 || _srdCommon.CommonData.FlippersIn200) //|| _srdCommon.CommonData.FlippersIn100 { NotifyError(eEvent.ERR_SRD, "FlippersIn is on", 0); return false; } if (!_srdCommon.CommonData.Flipper1Out150Status || !_srdCommon.CommonData.Flipper2Out150Status || !_srdCommon.CommonData.Flipper3Out150Status || !_srdCommon.CommonData.Flipper1Out200Status || !_srdCommon.CommonData.Flipper2Out200Status || !_srdCommon.CommonData.Flipper3Out200Status) //|| !_srdCommon.CommonData.Flipper1Out100Status || !_srdCommon.CommonData.Flipper2Out100Status || !_srdCommon.CommonData.Flipper3Out100Status { NotifyError(eEvent.ERR_SRD, "Flippers are at In position", 0); return false; } return true; } /// /// ChuckATMOn /// /// private bool ChuckATMOn() { bool result = _srdCommon.ChuckATMAction("", null); if (!result) { NotifyError(eEvent.ERR_SRD, "Chuck ATM Action is failed", 0); return result; } return true; } /// /// Chuck ATM On End /// /// private bool CheckChuckATMEndStatus() { return _srdCommon.Status == RState.End && !_srdCommon.CommonData.ChuckATMOn; } /// /// Chuck ATM On Stop /// /// private bool CheckChuckATMStopStatus() { if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout) { NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0); return true; } return false; } /// /// Check Vacuum End /// /// private bool CheckVacuumEndStatus() { if(_srdCommon.Status == RState.End && CheckVacuumValue()) { return true; } return false; } /// /// Check Vacuum Stop /// /// private bool CheckVacuumStopStatus() { if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout) { NotifyError(eEvent.ERR_SRD, "Check ChuckATM is failed", 0); return true; } else if (_srdCommon.Status == RState.End) { if (_currentRetryTimes < RETRY_TIMES) { _currentRetryTimes++; NotifyError(eEvent.WARN_SRD, $"Current Chuck ATM Retry Times is {_currentRetryTimes}", 0); _srdCommon.ChuckATMAction("", null); } else { NotifyError(eEvent.ERR_SRD, $"Chuck ATM Retry Times is over {RETRY_TIMES}. ChuckATM is failed!", 0); return true; } } return false; } /// /// Check Vacuum Value /// /// private bool CheckVacuumValue() { if (_srdCommon.CommonData.VacuumValue >= _vacuumOffLimit) { //LOG.WriteLog(eEvent.INFO_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}"); return true; } else { LOG.WriteLog(eEvent.WARN_SRD, Module, $"VacuumValue:{_srdCommon.CommonData.VacuumValue}, VacuumOn Limit:{_vacuumOffLimit}"); return false; } } /// /// LiftUpOff /// /// /// private bool LiftUpOn() { bool result = _srdCommon.LiftUpOnAction("", null); if (!result) { NotifyError(eEvent.ERR_SRD, "Lift Up On Action is failed", 0); return result; } return true; } /// /// 检验LiftUpOff结束状态 /// /// /// private bool CheckLiftUpOnEndStatus() { return _srdCommon.Status == RState.End && _srdCommon.CommonData.LiftUpStatus; } /// /// 检验LiftUpOff结束状态 /// /// /// private bool CheckLiftUpOnStopStatus() { if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout) { NotifyError(eEvent.ERR_SRD, "Check LiftUpOn is failed", 0); return true; } return false; } /// /// ChuckVacuumOn /// /// /// private bool ChuckVacuumOff() { bool result = _srdCommon.ChuckVacuumOffAction("", null); if (!result) { NotifyError(eEvent.ERR_SRD, "ChuckVacuumOff Action is failed", 0); return result; } return true; } /// /// 检验ChuckVacuumOn结束状态 /// /// /// private bool CheckChuckVacuumOffEndStatus() { return _srdCommon.Status == RState.End && _srdCommon.CommonData.ChuckVacuum; } /// /// 检验ChuckVacuumOn结束状态 /// /// /// private bool CheckChuckVacuumOffStopStatus() { if (_srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout) { NotifyError(eEvent.ERR_SRD, "Check ChuckVacuumOff is failed", 0); return true; } return false; } /// /// Check WaferPresent /// /// private bool CheckWaferPresent() { if (!_srdCommon.CommonData.WaferPresent) { NotifyError(eEvent.ERR_SRD, "WaferPresent sensor is off", 0); return false; } return true; } /// /// Open Door /// /// /// private bool OpenDoor() { return _srdCommon.DoorOpenAction("", null); } /// /// 检验DoorOpened /// /// /// private bool CheckDoorOpenedEndStatus() { bool result = _srdCommon.Status == RState.End; if (result) { if (_srdCommon.CommonData.DoorOpened && !_srdCommon.CommonData.DoorClosed) { return true; } else { NotifyError(eEvent.ERR_SRD, $"Opened {_srdCommon.CommonData.DoorOpened}&&Closed {_srdCommon.CommonData.DoorClosed}", 0); return false; } } return false; } /// /// 检验Door /// /// private bool CheckDoorOpenedStopStatus() { return _srdCommon.Status == RState.Failed || _srdCommon.Status == RState.Timeout; } } }