using Aitex.Core.RT.Device; using Aitex.Core.RT.Log; using Aitex.Core.RT.Routine; using Aitex.Core.Util; using MECF.Framework.Common.Equipment; using MECF.Framework.Common.Routine; using MECF.Framework.Common.Utilities; using CyberX8_Core; using CyberX8_RT.Devices.AXIS; using CyberX8_RT.Devices.Facilities; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using CyberX8_RT.Devices.Safety; namespace CyberX8_RT.Modules.Transporter { public class TransporterHomeRoutine : RoutineBase, IRoutine { private enum HomeAllStep { CheckSafety, CheckCDAWithN2, VerticalHome, VerticalHomeWait, VerticalLow, VerticalLowWait, GantryHome, GantryHomeWait, GantryPark, GantryParkWait, End } #region 内部变量 private JetAxisBase _gantryAxis; private JetAxisBase _elevatorAxis; private SystemFacilities _facilities; private TransporterEntity _transporterEntity; #endregion public TransporterHomeRoutine(string module) : base(module) { } public void Abort() { Runner.Stop("Manual Abort"); } public RState Monitor() { Runner.Run(HomeAllStep.CheckSafety,CheckSafety,_delay_1ms) .Run(HomeAllStep.CheckCDAWithN2, StartEnaleCDAndN2, CheckCDAWithN2, _delay_1s) .Run(HomeAllStep.VerticalHome, VerticalAxisHome, _delay_1ms) .WaitWithStopCondition(HomeAllStep.VerticalHomeWait, CheckVerticalPositionStatus, CheckVerticalPositionRunStop) .Run(HomeAllStep.VerticalLow, () => { return _elevatorAxis.PositionStation("LOW", true); },NullFun,100) .WaitWithStopCondition(HomeAllStep.VerticalLowWait,CheckVerticalPositionStatus, CheckVerticalPositionRunStop) .Run(HomeAllStep.GantryHome, GantryAxisHome, _delay_1ms) .WaitWithStopCondition(HomeAllStep.GantryHomeWait,CheckGantryPositionStatus,CheckGantryPositionRunStop) .Run(HomeAllStep.GantryPark, () => { return _gantryAxis.PositionStation("Park", true); }, NullFun, 100) .WaitWithStopCondition(HomeAllStep.GantryParkWait, CheckGantryPositionStatus, CheckGantryPositionRunStop) .End(HomeAllStep.End,NullFun); return Runner.Status; } /// /// 检验Safety /// /// private bool CheckSafety() { SafetyDevice safetyDevice = DEVICE.GetDevice("Safety"); if (safetyDevice == null) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Safety device is null"); return false; } if (safetyDevice.SafetyData.TwincatState != 8) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Twincat Status is not OP status"); return false; } if (safetyDevice.SafetyData.TransportCommErr) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Twincat Transporter Communication status is error"); return false; } if (safetyDevice.SafetyData.TransporterFunctionBlockErr) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Twincat Transporter function block status is error"); return false; } return true; } /// /// 检验前置条件 /// /// private bool CheckPreCondition() { //所有运动模块均已Initialized if(! _gantryAxis.IsSwitchOn) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Gantry is switchoff"); return false; } if(!_elevatorAxis.IsSwitchOn) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Elevator is switchoff"); return false; } if(_transporterEntity.WaferHolderInfo!=null) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "transporter exsit wafer Shuttle,can not home"); return false; } if (Module == ModuleName.Transporter1.ToString()) { TransporterEntity transporterEntity1 = Singleton.Instance.GetModule(ModuleName.Transporter2.ToString()); if (!transporterEntity1.IsHomed) { LOG.WriteLog(eEvent.ERR_TRANSPORTER, Module.ToString(), "Loader Transporter is not homed"); return false; } } return true; } /// /// 启动CDA和N2 /// /// private bool StartEnaleCDAndN2() { if(!_facilities.CDAEnable) { bool result= _facilities.N2EnableOperation("", true); if(!result) { return false; } } if(!_facilities.N2Enable) { bool result = _facilities.CDAEnableOperation("", true); if(!result) { return false; } } return true; } /// /// 检验CDA和N2 Enable /// /// private bool CheckCDAWithN2() { return _facilities.CDAEnable && _facilities.N2Enable; } /// /// Vertical Home /// /// private bool VerticalAxisHome() { return _elevatorAxis.Home(); } /// /// 检验Vertical Home状态 /// /// private bool CheckVerticalHome() { return _elevatorAxis.IsHomed&&_elevatorAxis.Status==RState.End; } /// /// 检验Vertical移动状态 /// /// private bool CheckVerticalPositionStatus() { return _elevatorAxis.Status == RState.End; } /// /// 检验Vertical是否还在运动 /// /// private bool CheckVerticalPositionRunStop() { return _elevatorAxis.Status==RState.Failed; } /// /// Gantry Home /// /// private bool GantryAxisHome() { return _gantryAxis.Home(); } /// /// 检验Gantry Home状态 /// /// private bool CheckGantryHome() { return _gantryAxis.IsHomed && _gantryAxis.Status == RState.End; } /// /// 检验Gantry移动状态 /// /// private bool CheckGantryPositionStatus() { return _gantryAxis.Status == RState.End; } /// /// 检验Gantry是否还在运动 /// /// private bool CheckGantryPositionRunStop() { return _gantryAxis.Status == RState.Failed; } /// /// 启动 /// /// /// public RState Start(params object[] objs) { _transporterEntity = Singleton.Instance.GetModule(Module); _gantryAxis = DEVICE.GetDevice($"{Module}.Gantry"); _elevatorAxis = DEVICE.GetDevice($"{Module}.Elevator"); _facilities = DEVICE.GetDevice("System.Facilities"); if (!CheckPreCondition()) { return RState.Failed; } return Runner.Start(Module, "Home"); } } }