using Aitex.Core.Common.DeviceData; using Aitex.Core.RT.Device; using Aitex.Core.RT.Device.Unit; using Aitex.Core.Util; using Aitex.Core.RT.SCCore; using Aitex.Core.RT.Log; using MECF.Framework.Common.Device.Bases; using MECF.Framework.Common.Equipment; using System; using System.Collections.Generic; using Venus_Core; using Venus_RT.Modules; using Venus_RT.Devices.IODevices; using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.OperationCenter; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs; using IoMfc = Venus_RT.Devices.IODevices.IoMfc; using MECF.Framework.RT.Core.Equipments; using System.Windows.Media; namespace Venus_RT.Devices { class JetTM : TM { private readonly IoLid _TMLid; private readonly IoLid _LLALid; private readonly IoLid _LLBLid; private readonly IoLid _PMALid; private readonly IoLid _PMBLid; private readonly IoLid _PMCLid; private readonly IoLid _PMDLid; private readonly IoCylinder _LLATSlitDoor; private readonly IoCylinder _LLBTSlitDoor; private readonly IoCylinder _PMASlitDoor; private readonly IoCylinder _PMBSlitDoor; private readonly IoCylinder _PMCSlitDoor; private readonly IoCylinder _PMDSlitDoor; private readonly IoCylinder _LLAESlitDoor; private readonly IoCylinder _LLBESlitDoor; private readonly IoValve _TMN2Valve; private readonly IoValve _TMSoftPumpValve; private readonly IoValve _TMFastPumpValve; private readonly IoValve _TMPurgeValve; private readonly IoValve _TMVentValve; //private readonly IoValve _TMSoftVentValve; //private readonly IoValve _TMFastVentValve; private readonly IoValve _LLASoftPumpValve; private readonly IoValve _LLAFastPumpValve; private readonly IoValve _LLAPurgeValve; private readonly IoValve _LLAVentValve; private readonly IoValve _LLASoftVentValve; private readonly IoValve _LLAFastVentValve; private readonly IoValve _LLBSoftVentValve; private readonly IoValve _LLBFastVentValve; private readonly IoValve _LLBSoftPumpValve; private readonly IoValve _LLBFastPumpValve; private readonly IoValve _LLBPurgeValve; private readonly IoValve _LLBVentValve; private readonly IoValve _WaferRelayValve; private readonly IoValve _TMVacAtmMode; private readonly IoSensor _TMPowerOn; private readonly IoSensor _TMInSafty; private readonly IoSensor _WaferLeakSensor; private readonly IoSensor _EFEMSideDoorClosed; private readonly IoSensor _TMPCWFlowSwitch; private readonly IoSensor _LLAPCWFlowSwitch; private readonly IoSensor _LLBPCWFlowSwitch; private readonly IoSensor _TMLidClosed; private readonly IoSensor _CDAPressureSwitch; private readonly IoSensor _VaccumPressureSwitch; private readonly IoSensor _N2PressureSwitch; private readonly IoSensor _TMRobotNotExtendPMA; private readonly IoSensor _TMRobotNotExtendPMB; private readonly IoSensor _TMRobotNotExtendPMC; private readonly IoSensor _TMRobotNotExtendPMD; private readonly IoSensor _TMRobotNotExtendLLA; private readonly IoSensor _TMRobotNotExtendLLB; private readonly IoSensor _EfemRobotNotExtendLLA; private readonly IoSensor _EfemRobotNotExtendLLB; private readonly IoSensor _TMVacSwitch; private readonly IoSensor _LLAVacSwitch; private readonly IoSensor _LLBVacSwitch; private readonly IoSensor _TMATMSwitch; private readonly IoSensor _LLAATMSwitch; private readonly IoSensor _LLBATMSwitch; private readonly IoSwitch _LLAWaferSizeCheck; private readonly IoSwitch _LLBWaferSizeCheck; private readonly IoSwitch _PMAWaferSizeCheck; private readonly IoSwitch _PMBWaferSizeCheck; private readonly IoSwitch _PMCWaferSizeCheck; private readonly IoSwitch _PMDWaferSizeCheck; private readonly IoSwitch _TM_PressureMode_Switch; private readonly IoSwitch _LLA_PressureMode_Switch; private readonly IoSwitch _LLB_PressureMode_Switch; private readonly IoMfc _TMMfc; private readonly IoMfc _LLAMfc; private readonly IoMfc _LLBMfc; private readonly PumpBase _TMPump; private readonly PumpBase _LLPump; private readonly IoTMPressureCtrl _presureCtrl; public bool TMLidClosed => _TMLid.OFFFeedback; public bool LLALidClosed => _LLALid.OFFFeedback; public bool LLBLidClosed => _LLBLid.OFFFeedback; public bool PMALidClosed => _PMALid.OFFFeedback; public bool PMBLidClosed => _PMBLid.OFFFeedback; public bool PMCLidClosed => _PMCLid.OFFFeedback; public bool PMDLidClosed => _PMDLid.OFFFeedback; public bool IsLLASlitDoorClosed => _LLATSlitDoor.State == CylinderState.Close; public bool IsLLASlitDoorOpen => _LLATSlitDoor.State == CylinderState.Open; public bool IsLLAESlitDoorClosed => _LLAESlitDoor.State == CylinderState.Close; public bool IsLLAESlitDoorOpen => _LLAESlitDoor.State == CylinderState.Open; public bool IsLLBSlitDoorClosed => _LLBTSlitDoor.State == CylinderState.Close; public bool IsLLBSlitDoorOpen => _LLBTSlitDoor.State == CylinderState.Open; public bool IsLLBESlitDoorClosed => _LLBESlitDoor.State == CylinderState.Close; public bool IsLLBESlitDoorOpen => _LLBESlitDoor.State == CylinderState.Open; public bool IsTMVac => _TMVacSwitch.Value; public bool IsLLAVac => _LLAVacSwitch.Value; public bool IsLLBVac => _LLBVacSwitch.Value; public bool IsTMATM => _TMATMSwitch.Value; public bool IsLLAATM => _LLAATMSwitch.Value; public bool IsLLBATM => _LLBATMSwitch.Value; public bool IsTMPowerOn => _TMPowerOn.Value; public bool IsTMInSafty => _TMInSafty.Value; public bool IsLLAFastPumpOpen => _LLAFastPumpValve.Status; public bool IsLLASoftPumpOpen => _LLASoftPumpValve.Status; public bool IsLLBFastPumpOpen => _LLBFastPumpValve.Status; public bool IsLLBSoftPumpOpen => _LLBSoftPumpValve.Status; public bool IsLLAVentValveOpen => _LLAVentValve.Status; public bool IsLLAPurgeValveOpen => _LLAPurgeValve.Status; public bool IsLLBVentValveOpen => _LLBVentValve.Status; public bool IsLLBPurgeValveOpen => _LLBPurgeValve.Status; public bool IsTMVentValveOpen => _TMVentValve.Status; // public bool IsTMFastVentValveOpen => _TMFastVentValve.Status; public bool IsTMPurgeValveOpen => _TMPurgeValve.Status; public bool IsTMFastPumpOpen => _TMFastPumpValve.Status; public bool IsTMSoftPumpOpen => _TMSoftPumpValve.Status; public bool TMRobotNotExtendToPMA => _TMRobotNotExtendPMA.Value; public bool TMRobotNotExtendToPMB => _TMRobotNotExtendPMB.Value; public bool TMRobotNotExtendToPMC => _TMRobotNotExtendPMC.Value; public bool TMRobotNotExtendToPMD => _TMRobotNotExtendPMD.Value; public bool TMRobotNotExtendToLLA => _TMRobotNotExtendLLA.Value; public bool TMRobotNotExtendToLLB => _TMRobotNotExtendLLB.Value; public bool EfemRobotNotExtendToLLA => _EfemRobotNotExtendLLA.Value; public bool EfemRobotNotExtendToLLB => _EfemRobotNotExtendLLB.Value; public override double ChamberPressure => _presureCtrl.TMPressureGauge.Value; public double LLAPressure => _presureCtrl.LLAPressureGauge.Value; public double LLBPressure => _presureCtrl.LLBPressureGauge.Value; public override double ForelinePressure => _presureCtrl.MFForelineGauge.Value; public double LoadlockForelinePressure => _presureCtrl.LLForelineGauge.Value; public bool? TMPumpIsRunning => _TMPump?.IsRunning; public bool? LLPumpIsRunning => _LLPump?.IsRunning; public double PMAPressure { get { return Singleton.Instance.PMA.ChamberPressure; } } //public bool PMAIsVAC { get { return Singleton.Instance.PMA.IsVac; } } public double PMBPressure { get { return Singleton.Instance.PMB.ChamberPressure; } } //public bool PMBIsATM { get { return Singleton.Instance.PMB.IsAtm; } } public double PMCPressure { get { return Singleton.Instance.PMC.ChamberPressure; } } //public bool PMCIsATM { get { return Singleton.Instance.PMC.IsAtm; } } public double PMDPressure { get { return Singleton.Instance.PMD.ChamberPressure; } } //public bool PMDIsATM { get { return Singleton.Instance.PMD.IsAtm; } } public enum LLPumpState { Idle, LLAUsing, LLBUsing, } LLPumpState _llPumpingState = LLPumpState.Idle; public LLPumpState LLPumpStatus { get { return _llPumpingState; } } public bool PMASlitDoorClosed => _PMASlitDoor.OFFFeedback; public bool PMASlitDoorOpened => _PMASlitDoor.ONFeedback; public bool PMBSlitDoorClosed => _PMBSlitDoor.OFFFeedback; public bool PMBSlitDoorOpened => _PMBSlitDoor.ONFeedback; public bool PMCSlitDoorClosed => _PMCSlitDoor.OFFFeedback; public bool PMCSlitDoorOpened => _PMCSlitDoor.ONFeedback; public bool PMDSlitDoorClosed => _PMDSlitDoor.OFFFeedback; public bool PMDSlitDoorOpened => _PMDSlitDoor.ONFeedback; public bool AllPMSlitDoorClosed { get { if (PMASlitDoorClosed == true && PMBSlitDoorClosed == true && PMCSlitDoorClosed == true && PMDSlitDoorClosed == true) { return true; } else { return false; } } } public Dictionary PreRotateModules { get; private set; } public JetTM() : base("TM") { _TMLid = DEVICE.GetDevice($"TM.{VenusDevice.TMLid}"); _LLALid = DEVICE.GetDevice($"TM.{VenusDevice.LLALid}"); _LLBLid = DEVICE.GetDevice($"TM.{VenusDevice.LLBLid}"); _PMALid = DEVICE.GetDevice($"TM.PMALid"); _PMBLid = DEVICE.GetDevice($"TM.PMBLid"); _PMCLid = DEVICE.GetDevice($"TM.PMCLid"); _PMDLid = DEVICE.GetDevice($"TM.PMDLid"); _LLATSlitDoor = DEVICE.GetDevice($"TM.{VenusDevice.LLATSlitDoor}"); _LLBTSlitDoor = DEVICE.GetDevice($"TM.{VenusDevice.LLBTSlitDoor}"); _LLAESlitDoor = DEVICE.GetDevice($"TM.{VenusDevice.LLAESlitDoor}"); _LLBESlitDoor = DEVICE.GetDevice($"TM.{VenusDevice.LLBESlitDoor}"); _PMASlitDoor = DEVICE.GetDevice($"{Module}.PMASlitDoor"); _PMBSlitDoor = DEVICE.GetDevice($"{Module}.PMBSlitDoor"); _PMCSlitDoor = DEVICE.GetDevice($"{Module}.PMCSlitDoor"); _PMDSlitDoor = DEVICE.GetDevice($"{Module}.PMDSlitDoor"); _TMN2Valve = DEVICE.GetDevice($"TM.{VenusDevice.TMValveN2}"); _TMSoftPumpValve = DEVICE.GetDevice($"TM.{VenusDevice.TMSoftPumpValve}"); _TMFastPumpValve = DEVICE.GetDevice($"TM.{VenusDevice.TMFastPumpValve}"); _TMPurgeValve = DEVICE.GetDevice($"TM.{VenusDevice.TMPurgeValve}"); _TMVentValve = DEVICE.GetDevice($"TM.{VenusDevice.TMVentValve}"); //_TMSoftVentValve = DEVICE.GetDevice($"TM.{VenusDevice.TMSoftVentValve}"); //_TMFastVentValve = DEVICE.GetDevice($"TM.{VenusDevice.TMFastVentValve}"); _LLASoftPumpValve = DEVICE.GetDevice($"TM.{VenusDevice.LLASoftPumpValve}"); _LLAFastPumpValve = DEVICE.GetDevice($"TM.{VenusDevice.LLAFastPumpValve}"); _LLAPurgeValve = DEVICE.GetDevice($"TM.{VenusDevice.LLAPurgeValve}"); _LLAVentValve = DEVICE.GetDevice($"TM.{VenusDevice.LLAVentValve}"); _LLASoftVentValve = DEVICE.GetDevice($"TM.{VenusDevice.LLASoftVentValve}"); _LLAFastVentValve = DEVICE.GetDevice($"TM.{VenusDevice.LLAFastVentValve}"); _LLBSoftVentValve = DEVICE.GetDevice($"TM.{VenusDevice.LLBSoftVentValve}"); _LLBFastVentValve = DEVICE.GetDevice($"TM.{VenusDevice.LLBFastVentValve}"); _TMVacAtmMode = DEVICE.GetDevice($"TM.{VenusDevice.TMVacAtmMode}"); _LLBSoftPumpValve = DEVICE.GetDevice($"TM.{VenusDevice.LLBSoftPumpValve}"); _LLBFastPumpValve = DEVICE.GetDevice($"TM.{VenusDevice.LLBFastPumpValve}"); _LLBPurgeValve = DEVICE.GetDevice($"TM.{VenusDevice.LLBPurgeValve}"); _LLBVentValve = DEVICE.GetDevice($"TM.{VenusDevice.LLBVentValve}"); _WaferRelayValve = DEVICE.GetDevice($"TM.{VenusDevice.ValveWaterRelay}"); _TMPowerOn = DEVICE.GetDevice($"TM.{VenusDevice.TMPowerOn}"); _TMInSafty = DEVICE.GetDevice($"TM.{VenusDevice.TMInSafty}"); _WaferLeakSensor = DEVICE.GetDevice($"TM.{VenusDevice.WaferLeakSensor}"); _EFEMSideDoorClosed = DEVICE.GetDevice($"TM.{VenusDevice.EFEMSideDoorClosed}"); _TMPCWFlowSwitch = DEVICE.GetDevice($"TM.{VenusDevice.TMPCWFlowSwitch}"); _LLAPCWFlowSwitch = DEVICE.GetDevice($"TM.{VenusDevice.LLAPCWFlowSwitch}"); _LLBPCWFlowSwitch = DEVICE.GetDevice($"TM.{VenusDevice.LLBPCWFlowSwitch}"); _TMLidClosed = DEVICE.GetDevice($"TM.{VenusDevice.TMLidClosed}"); _CDAPressureSwitch = DEVICE.GetDevice($"TM.{VenusDevice.CDAPressureSwitch}"); _VaccumPressureSwitch = DEVICE.GetDevice($"TM.{VenusDevice.VaccumPressureSwitch}"); _N2PressureSwitch = DEVICE.GetDevice($"TM.{VenusDevice.N2PressureSwitch}"); _TMRobotNotExtendPMA = DEVICE.GetDevice($"TM.{VenusDevice.TMRobotNotExtendPMA}"); _TMRobotNotExtendPMB = DEVICE.GetDevice($"TM.{VenusDevice.TMRobotNotExtendPMB}"); _TMRobotNotExtendPMC = DEVICE.GetDevice($"TM.{VenusDevice.TMRobotNotExtendPMC}"); _TMRobotNotExtendPMD = DEVICE.GetDevice($"TM.{VenusDevice.TMRobotNotExtendPMD}"); _TMRobotNotExtendLLA = DEVICE.GetDevice($"TM.{VenusDevice.TMRobotNotExtendLLA}"); _TMRobotNotExtendLLB = DEVICE.GetDevice($"TM.{VenusDevice.TMRobotNotExtendLLB}"); _EfemRobotNotExtendLLA = DEVICE.GetDevice($"TM.{VenusDevice.EfemRobotNotExtendLLA}"); _EfemRobotNotExtendLLB = DEVICE.GetDevice($"TM.{VenusDevice.EfemRobotNotExtendLLB}"); _TMVacSwitch = DEVICE.GetDevice($"TM.{VenusDevice.TMVacSwitch}"); _LLAVacSwitch = DEVICE.GetDevice($"TM.{VenusDevice.LLAVacSwitch}"); _LLBVacSwitch = DEVICE.GetDevice($"TM.{VenusDevice.LLBVacSwitch}"); _TMATMSwitch = DEVICE.GetDevice($"TM.{VenusDevice.TMATMSwitch}"); _LLAATMSwitch = DEVICE.GetDevice($"TM.{VenusDevice.LLAATMSwitch}"); _LLBATMSwitch = DEVICE.GetDevice($"TM.{VenusDevice.LLBATMSwitch}"); _LLAWaferSizeCheck = DEVICE.GetDevice($"TM.{VenusDevice.LLAWaferSizeCheckSwitch}"); _LLBWaferSizeCheck = DEVICE.GetDevice($"TM.{VenusDevice.LLBWaferSizeCheckSwitch}"); _PMAWaferSizeCheck = DEVICE.GetDevice($"TM.{VenusDevice.PMAWaferSizeCheckSwitch}"); _PMBWaferSizeCheck = DEVICE.GetDevice($"TM.{VenusDevice.PMBWaferSizeCheckSwitch}"); _PMCWaferSizeCheck = DEVICE.GetDevice($"TM.{VenusDevice.PMCWaferSizeCheckSwitch}"); _PMDWaferSizeCheck = DEVICE.GetDevice($"TM.{VenusDevice.PMDWaferSizeCheckSwitch}"); _TM_PressureMode_Switch = DEVICE.GetDevice("TM.TMPressureModeSwitch"); _LLA_PressureMode_Switch = DEVICE.GetDevice("TM.LLAPressureModeSwitch"); _LLB_PressureMode_Switch = DEVICE.GetDevice("TM.LLBPressureModeSwitch"); _TMMfc = DEVICE.GetDevice($"{Module}.TM_MFC1"); _LLAMfc = DEVICE.GetDevice($"{Module}.LLA_MFC1"); _LLBMfc = DEVICE.GetDevice($"{Module}.LLB_MFC1"); _presureCtrl = DEVICE.GetDevice($"TM.{VenusDevice.TMPressureCtrl}"); if (SC.GetValue($"TM.DryPump.CommunicationType") == (int)CommunicationType.RS232) { if (SC.GetValue($"TM.DryPump.MFG") == (int)DryPumpMFG.SKY) { _TMPump = DEVICE.GetDevice($"TM.{VenusDevice.MainPump}"); } else if (SC.GetValue($"TM.DryPump.MFG") == (int)DryPumpMFG.Edwards) { _TMPump = DEVICE.GetDevice($"TM.{VenusDevice.MainPump}"); } } if (SC.GetValue($"LLA.DryPump.CommunicationType") == (int)CommunicationType.RS232) { if (SC.GetValue($"LLA.DryPump.MFG") == (int)DryPumpMFG.SKY) { _LLPump = DEVICE.GetDevice($"LLA.{VenusDevice.MainPump}"); } else if (SC.GetValue($"LLA.DryPump.MFG") == (int)DryPumpMFG.Edwards) { _LLPump = DEVICE.GetDevice($"LLA.{VenusDevice.MainPump}"); } } PreRotateModules = new Dictionary(); foreach (var mod in new List { ModuleName.LLA, ModuleName.LLB, ModuleName.PMA, ModuleName.PMB, ModuleName.PMC, ModuleName.PMD }) { string rotateModule = SC.GetStringValue($"TM.PreRotation.{mod}"); if (rotateModule.Length == 3) { ModuleName rotModule = ModuleHelper.Converter(rotateModule); if (ModuleHelper.IsPm(rotModule) || ModuleHelper.IsLoadLock(rotModule)) { PreRotateModules.Add(mod, rotModule); } } } DATA.Subscribe("TM.PumpIsRunning", () => TMPumpIsRunning, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe("TM.TMLidClosed", () => TMLidClosed, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe("TM.LLALidClosed", () => LLALidClosed, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe("TM.LLBLidClosed", () => LLBLidClosed, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe("LL.PumpIsRunning", () => LLPumpIsRunning, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe($"{Name}.LLAPressure", () => LLAPressure); DATA.Subscribe($"{Name}.LLBPressure", () => LLBPressure); OP.Subscribe("TM.ControlPump", (cmd, args) => { _TMPump.SetPumpOnOff((bool)args[0]); return true; }); OP.Subscribe("LL.ControlPump", (cmd, args) => { _LLPump.SetPumpOnOff((bool)args[0]); return true; }); OP.Subscribe("TM.SetChamberPressure", (cmd, args) => { _presureCtrl.SetTMPressure((int)(args[0])); return true; }); OP.Subscribe("TM.SetChamberFlow", (cmd, args) => { _TMMfc.SetPoint = (int)(args[0]); return true; }); OP.Subscribe($"TM.SetMFSlitDoor", (cmd, args) => { var module = (ModuleName)Enum.Parse(typeof(ModuleName), args[0].ToString()); TurnMFSlitDoor(module, (bool)args[1], out _); return true; }); OP.Subscribe($"TM.SetEFEMSlitDoor", (cmd, args) => { var module = (ModuleName)Enum.Parse(typeof(ModuleName), args[0].ToString()); TurnEFEMSlitDoor(module, (bool)args[1], out _); return true; }); _TMVacAtmMode.TurnValve(RouteManager.IsATMMode, out string _); } public override void Monitor() { if (_WaferLeakSensor.Value && _WaferRelayValve.Status == false) { _WaferRelayValve.TurnValve(true, out string _); } else if (_WaferLeakSensor.Value == false && _WaferRelayValve.Status == true) { _WaferRelayValve.TurnValve(false, out string _); } } public void TurnSoftPumpValve(ModuleName mod, bool bOn) { switch(mod) { case ModuleName.TM: _TMSoftPumpValve.TurnValve(bOn, out string _); break; case ModuleName.LLA: _LLASoftPumpValve.TurnValve(bOn, out string _); break; case ModuleName.LLB: _LLBSoftPumpValve.TurnValve(bOn, out string _); break; } } public void TurnFastPumpValve(ModuleName mod, bool bOn) { switch(mod) { case ModuleName.TM: _TMFastPumpValve.TurnValve(bOn, out string _); break; case ModuleName.LLA: _LLAFastPumpValve.TurnValve(bOn, out string _); break; case ModuleName.LLB: _LLBFastPumpValve.TurnValve(bOn, out string _); break; } } public void TurnVentValve(ModuleName mod, bool bOn) { switch (mod) { case ModuleName.TM: _TMVentValve.TurnValve(bOn, out string _); break; case ModuleName.LLA: _LLAVentValve.TurnValve(bOn, out string _); break; case ModuleName.LLB: _LLBVentValve.TurnValve(bOn, out string _); break; } } public void TurnPurgeValve(ModuleName mod, bool bOn) { switch(mod) { case ModuleName.TM: _TMPurgeValve.TurnValve(bOn, out string _); break; case ModuleName.LLA: _LLAPurgeValve.TurnValve(bOn, out string _); break; case ModuleName.LLB: _LLBPurgeValve.TurnValve(bOn, out string _); break; } } public void TurnN2Valve(bool bOn) { _TMN2Valve.TurnValve(bOn, out string _); } public void CloseModuleAllValves(ModuleName mod) { TurnFastPumpValve(mod, false); TurnSoftPumpValve(mod, false); TurnVentValve(mod, false); TurnPurgeValve(mod, false); if (mod == ModuleName.TM) TurnN2Valve(false); } public double GetModulePressure(ModuleName mod) { switch (mod) { case ModuleName.TM: return ChamberPressure; case ModuleName.LLA: return LLAPressure; case ModuleName.LLB: return LLBPressure; case ModuleName.PMA: return PMAPressure; case ModuleName.PMB: return PMBPressure; case ModuleName.PMC: return PMCPressure; case ModuleName.PMD: return PMDPressure; } return 0; } public bool IsModuleATM(ModuleName mod) { switch (mod) { case ModuleName.TM: return IsTMATM; case ModuleName.LLA: return IsLLAATM; case ModuleName.LLB: return IsLLBATM; case ModuleName.PMA: return Singleton.Instance.PMA.IsAtm; case ModuleName.PMB: return Singleton.Instance.PMB.IsAtm; case ModuleName.PMC: return Singleton.Instance.PMC.IsAtm; case ModuleName.PMD: return Singleton.Instance.PMD.IsAtm; } return false; } public bool IsModuleVaccum(ModuleName mod) { switch (mod) { case ModuleName.TM: return IsTMVac; case ModuleName.LLA: return IsLLAVac; case ModuleName.LLB: return IsLLBVac; case ModuleName.PMA: return Singleton.Instance.PMA.IsVac; case ModuleName.PMB: return Singleton.Instance.PMB.IsVac; case ModuleName.PMC: return Singleton.Instance.PMC.IsVac; case ModuleName.PMD: return Singleton.Instance.PMD.IsVac; } return false; } public bool IsPMSlitdoorOpened(ModuleName mod) { switch (mod) { case ModuleName.PMA: return PMASlitDoorOpened; case ModuleName.PMB: return PMBSlitDoorOpened; case ModuleName.PMC: return PMCSlitDoorOpened; case ModuleName.PMD: return PMDSlitDoorOpened; } return false; } public bool IsPMSlitdoorClosed(ModuleName mod) { switch (mod) { case ModuleName.PMA: return PMASlitDoorClosed; case ModuleName.PMB: return PMBSlitDoorClosed; case ModuleName.PMC: return PMCSlitDoorClosed; case ModuleName.PMD: return PMDSlitDoorClosed; } return false; } public bool CheckLidClosed(ModuleName mod) { switch (mod) { case ModuleName.TM: if(!TMLidClosed) { LOG.Write(eEvent.ERR_TM, ModuleName.TM, "TM Lid not closed"); return false; } break; case ModuleName.LLA: if(!LLALidClosed) { LOG.Write(eEvent.ERR_TM, ModuleName.LLA, "LLA Lid not closed"); return false; } break; case ModuleName.LLB: if (!LLBLidClosed) { LOG.Write(eEvent.ERR_TM, ModuleName.LLB, "LLB Lid not closed"); return false; } break; case ModuleName.PMA: if (!PMALidClosed) { LOG.Write(eEvent.ERR_TM, ModuleName.PMA, "PMA Lid not closed"); return false; } break; case ModuleName.PMB: if (!PMBLidClosed) { LOG.Write(eEvent.ERR_TM, ModuleName.PMB, "PMB Lid not closed"); return false; } break; case ModuleName.PMC: if (!PMCLidClosed) { LOG.Write(eEvent.ERR_TM, ModuleName.PMC, "PMC Lid not closed"); return false; } break; case ModuleName.PMD: if (!PMDLidClosed) { LOG.Write(eEvent.ERR_TM, ModuleName.PMD, "PMD Lid not closed"); return false; } break; } return true; } public bool CheckVentValveClosed(ModuleName mod) { switch (mod) { case ModuleName.TM: if (IsTMVentValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.TM, "TM Vent Valve not closed"); return false; } break; case ModuleName.LLA: if (IsLLAVentValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLA, "LLA Vent Valve not closed"); return false; } break; case ModuleName.LLB: if (IsLLBVentValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLB, "LLB Vent Valve not closed"); return false; } break; } return true; } public bool CheckPurgeValveClosed(ModuleName mod) { switch (mod) { case ModuleName.TM: if (IsTMPurgeValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.TM, "TM Purge Valve not closed"); return false; } break; case ModuleName.LLA: if (IsLLAPurgeValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLA, "LLA Purge Valve not closed"); return false; } break; case ModuleName.LLB: if (IsLLBPurgeValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLB, "LLB Purge Valve not closed"); return false; } break; } return true; } public bool CheckPumpValveClosed(ModuleName mod) { switch (mod) { case ModuleName.TM: if (IsTMFastPumpOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.TM, "TM Fast Pump Valve not closed"); return false; } else if(IsTMSoftPumpOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.TM, "TM Soft Pump Valve not closed"); return false; } break; case ModuleName.LLA: if (IsLLAFastPumpOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLA, "LLA Fast Pump Valve not closed"); return false; } else if(IsLLASoftPumpOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLA, "LLA Soft Pump Valve not closed"); return false; } break; case ModuleName.LLB: if (IsLLBFastPumpOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLB, "LLB Fast Pump Valve not closed"); return false; } else if(IsLLBSoftPumpOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.LLB, "LLB Soft Pump Valve not closed"); return false; } break; } return true; } //private bool CheckRobotNotExtendSensor(ModuleName ll, bool open, bool bTMDoor, out string reason) //{ // string action = open ? "Open" : "Close"; // string doorName = bTMDoor ? "TM" : "EFEM"; // if (ll == ModuleName.LLA) // { // if (!_TMRobotNotExtendLLA.Value) // { // reason = $"TM Robot Not Extend to {ll} is false, can not {action} {doorName} slit door"; // LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); // return false; // } // if (!_EfemRobotNotExtendLLA.Value) // { // reason = $"EFEM Robot Not Extend to {ll} is false, can not {action} {doorName} slit door"; // LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); // return false; // } // } // else // { // if (!_TMRobotNotExtendLLB.Value) // { // reason = $"TM Robot Not Extend to {ll} is false, can not {action} {doorName} slit door"; // LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); // return false; // } // if (!_EfemRobotNotExtendLLB.Value) // { // reason = $"EFEM Robot Not Extend to {ll} is false, can not {action} {doorName} slit door"; // LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); // return false; // } // } // reason = ""; // return true; //} public bool TurnMFSlitDoor(ModuleName moduleName, bool open, out string reason) { //if (!CheckRobotNotExtendSensor(loadlock, open, true, out reason)) // return false; if (open) { if (RouteManager.IsATMMode) { if (!IsTMATM) { reason = $"TM is not ATM, can not open slit door"; LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); return false; } if (!IsModuleATM(moduleName)) { reason = $"{moduleName} is not ATM, can not open slit door"; LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); return false; } } else { if(!IsModuleVaccum(moduleName)) { reason = $"{moduleName} is notVacuum, can not open slit door"; LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); return false; } double maxPressureDifference = SC.GetValue("System.TMLLMaxPressureDifference"); if (Math.Abs(GetModulePressure(moduleName) - GetModulePressure(ModuleName.TM)) > maxPressureDifference) { reason = $"{moduleName}:{GetModulePressure(moduleName)} and TM : {GetModulePressure(ModuleName.TM)} pressure difference exceeds the max limit {maxPressureDifference}"; LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); return false; } } } switch(moduleName) { case ModuleName.LLA: return _LLATSlitDoor.SetCylinder(open, out reason); case ModuleName.LLB: return _LLBTSlitDoor.SetCylinder(open, out reason); case ModuleName.PMA: return _PMASlitDoor.SetCylinder(open, out reason); case ModuleName.PMB: return _PMBSlitDoor.SetCylinder(open, out reason); case ModuleName.PMC: return _PMCSlitDoor.SetCylinder(open, out reason); case ModuleName.PMD: return _PMDSlitDoor.SetCylinder(open, out reason); } reason = $"Invalid module {moduleName}"; LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); return false; } public bool TurnEFEMSlitDoor(ModuleName loadlock, bool open, out string reason) { //if (!CheckRobotNotExtendSensor(loadlock, open, false, out reason)) // return false; if (open && !IsModuleATM(loadlock)) { reason = $"{loadlock} is not ATM, can not open EFEM side slit door"; LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); return false; } switch (loadlock) { case ModuleName.LLA: return _LLAESlitDoor.SetCylinder(open, out reason); case ModuleName.LLB: return _LLBESlitDoor.SetCylinder(open, out reason); } reason = $"Invalid module {loadlock}"; LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason); return false; } //public bool ControlTMPump(bool ison) //{ // _TMPump.SetPumpOnOff(ison); // return true; //} public void SwitchTMPressureMode(bool isPressureMode) { if (isPressureMode==true) { _TM_PressureMode_Switch.TurnOn(); } else { _TM_PressureMode_Switch.TurnOff(); } } public void SwitchLLAPressureMode(bool isPressureMode) { if (isPressureMode == true) { _LLA_PressureMode_Switch.TurnOn(); } else { _LLA_PressureMode_Switch.TurnOff(); } } public void SwitchLLBPressureMode(bool isPressureMode) { if (isPressureMode == true) { _LLB_PressureMode_Switch.TurnOn(); } else { _LLB_PressureMode_Switch.TurnOff(); } } public void SetTMPressure(int pressureValue) { _presureCtrl.SetTMPressure(pressureValue); } public void SetLLAPressure(int pressureValue) { _presureCtrl.SetLLAPressure(pressureValue); } public void SetLLBPressure(int pressureValue) { _presureCtrl.SetLLBPressure(pressureValue); } public void SetTMFlow(int flowValue) { _TMMfc.SetPoint = (flowValue); } public void SetLLAFlow(int flowValue) { _LLAMfc.SetPoint = (flowValue); } public void SetLLBFlow(int flowValue) { _LLBMfc.SetPoint = (flowValue); } public bool CloseAllSlitDoor() { TurnMFSlitDoor(ModuleName.LLA, false, out _); TurnMFSlitDoor(ModuleName.LLB, false, out _); TurnMFSlitDoor(ModuleName.PMA, false, out _); TurnMFSlitDoor(ModuleName.PMB, false, out _); TurnMFSlitDoor(ModuleName.PMC, false, out _); TurnMFSlitDoor(ModuleName.PMD, false, out _); return true; } public bool TurnTMPump(bool ison) { _TMPump.SetPumpOnOff(ison); return true; } public bool TryGetLLPump(ModuleName LLname) { //Self if ((LLname == ModuleName.LLA && _llPumpingState == LLPumpState.LLAUsing) || (LLname == ModuleName.LLB && _llPumpingState == LLPumpState.LLBUsing)) return true; //Idle if (LLname == ModuleName.LLA && !IsLLBFastPumpOpen && !IsLLBSoftPumpOpen && _llPumpingState == LLPumpState.Idle) { _llPumpingState = LLPumpState.LLAUsing; return true; } if (LLname == ModuleName.LLB && !IsLLAFastPumpOpen && !IsLLASoftPumpOpen && _llPumpingState == LLPumpState.Idle) { _llPumpingState = LLPumpState.LLBUsing; return true; } //LOG.Write(eEvent.WARN_DEFAULT_WARN, LLname, "无法打开,另一个泵正在用!"); //locked return false; } public void ReleasePump(ModuleName Module) { //release pump (must do it by user) if ((Module == ModuleName.LLA && _llPumpingState == LLPumpState.LLAUsing) || (Module == ModuleName.LLB && _llPumpingState == LLPumpState.LLBUsing)) _llPumpingState = LLPumpState.Idle; } public void HomeSlitDoor() { if (IsLLASlitDoorClosed == true) { _LLATSlitDoor.SetCylinder(false, out _); } else if(IsLLASlitDoorOpen == true) { _LLATSlitDoor.SetCylinder(true, out _); } if (IsLLBSlitDoorClosed == true) { _LLBTSlitDoor.SetCylinder(false, out _); } else if (IsLLBSlitDoorOpen == true) { _LLBTSlitDoor.SetCylinder(true, out _); } if (IsLLAESlitDoorClosed == true) { _LLAESlitDoor.SetCylinder(false, out _); } else if (IsLLAESlitDoorOpen == true) { _LLAESlitDoor.SetCylinder(true, out _); } if (IsLLBESlitDoorClosed == true) { _LLBESlitDoor.SetCylinder(false, out _); } else if (IsLLBESlitDoorOpen == true) { _LLBESlitDoor.SetCylinder(true, out _); } } } }