using Aitex.Core.Common.DeviceData; using Aitex.Core.RT.DataCenter; using Aitex.Core.RT.Device; using Aitex.Core.RT.Device.Unit; using Aitex.Core.RT.Log; using Aitex.Core.RT.OperationCenter; using Aitex.Core.RT.SCCore; using Aitex.Core.Util; using MECF.Framework.Common.Device.Bases; using MECF.Framework.Common.Equipment; using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.TMs; using System; using IoMfc = Venus_RT.Devices.IODevices.IoMfc; using IoPressureMeter = Venus_RT.Devices.IODevices.IoPressureMeter; using Venus_Core; using Venus_RT.Modules; using Venus_RT.Devices.IODevices; namespace Venus_RT.Devices.TM { public class HongHuDETM : TMBase { /// /// 针对VenusDE六边形设计 /// #region io 信号抽象 //控制阀信号 private readonly IoValve _TMFastPumpValve; private readonly IoValve _TMSoftPumpValve; private readonly IoValve _VCEASoftPumpValve; private readonly IoValve _VCEAFastPumpValve; private readonly IoValve _VCEBSoftPumpValve; private readonly IoValve _VCEBFastPumpValve; private readonly IoValve _TMFastVentValve; private readonly IoValve _TMSoftVentValve; private readonly IoValve _VCEASoftVentValve; private readonly IoValve _VCEAFastVentValve; private readonly IoValve _VCEBSoftVentValve; private readonly IoValve _VCEBFastVentValve; //判断信号 //private readonly IoSensor _VCEASlitDoorOpenEnable; //private readonly IoSensor _VCEBSlitDoorOpenEnable; //private readonly IoSensor _PMASlitDoorOpenEnable; //private readonly IoSensor _PMBSlitDoorOpenEnable; //private readonly IoSensor _PMCSlitDoorOpenEnable; //private readonly IoSensor _PMDSlitDoorOpenEnable; //private readonly IoSensor _VCEASlitDoorCloseEnable; //private readonly IoSensor _VCEBSlitDoorCloseEnable; //private readonly IoSensor _PMASlitDoorCloseEnable; //private readonly IoSensor _PMBSlitDoorCloseEnable; //private readonly IoSensor _PMCSlitDoorCloseEnable; //private readonly IoSensor _PMDSlitDoorCloseEnable; private readonly IoSensor _TMExtendVCEAEnable; private readonly IoSensor _TMExtendVCEBEnable; private readonly IoSensor _TMExtendPMAEnable; private readonly IoSensor _TMExtendPMBEnable; private readonly IoSensor _TMExtendPMCEnable; private readonly IoSensor _TMExtendPMDEnable; private readonly IoSensor _VCEAATMSensor; private readonly IoSensor _VCEBATMSensor; private readonly IoSensor _TMATMSensor; private readonly IoSensor _VCEACasSensor; private readonly IoSensor _VCEALOCKEDSensor; private readonly IoSensor _VCEBCasSensor; private readonly IoSensor _VCEBLOCKEDSensor; private readonly IoSensor _VCEAProtrusionSensor; private readonly IoSensor _VCEBProtrusionSensor; //控制门信号 private readonly IoCylinder _VCEASlitDoor; private readonly IoCylinder _VCEBSlitDoor; private readonly IoCylinder _PMASlitDoor; private readonly IoCylinder _PMBSlitDoor; private readonly IoCylinder _PMCSlitDoor; private readonly IoCylinder _PMDSlitDoor; private readonly IoMfc _TMMfc; private readonly IoPressureMeter _TMPressure; //private readonly IoPressureMeter _TMPiplinePressure; private readonly IoPressureMeter _VCEAPressure; private readonly IoPressureMeter _VCEBPressure; //private readonly IoPressureMeter _VCEPiplinePressure; private readonly PumpBase _TMPump; private readonly PumpBase _VCEPump; //控压 private readonly IoHongHuControl _PressureControl; //安装的module private string _allInstalledModules { get { return SC.GetStringValue("System.InstalledModules").ToString(); } } private double TMATMTargetPressure; private double TMVACTargetPressure; private double VCEAATMTargetPressure; private double VCEBATMTargetPressure; private double VCEAVACTargetPressure; private double VCEBVACTargetPressure; #endregion #region 暴露变量 public override bool IsPressureControl { get { if (_PressureControl != null) return _PressureControl.IsProcessControl; return false; } } public override bool VCEACassPresent => _VCEACasSensor.Value; public override bool VCEBCassPresent => _VCEBCasSensor.Value; public override bool VCEALOCKED => _VCEALOCKEDSensor.Value; public override bool VCEBLOCKED => _VCEBLOCKEDSensor.Value; public override bool VCEAProtrusion => _VCEAProtrusionSensor.Value; public override bool VCEBProtrusion => _VCEBProtrusionSensor.Value; //ATM VAC信号 public override bool IsTMATM => _TMATMSensor.Value && _TMPressure.Value >= TMATMTargetPressure; public override bool IsVCEAATM => _VCEAATMSensor.Value && _VCEAPressure.Value >= VCEAATMTargetPressure; public override bool IsVCEBATM => _VCEBATMSensor.Value && _VCEBPressure.Value >= VCEBATMTargetPressure; public override bool IsTMVAC => _TMPressure.Value <= TMVACTargetPressure; public override bool IsVCEAVAC => _VCEAPressure.Value <= VCEAVACTargetPressure; public override bool IsVCEBVAC => _VCEBPressure.Value <= VCEAVACTargetPressure; public bool? IsTMPumpRunning => _TMPump?.IsRunning; public bool? IsVCEPumpRunning => _VCEPump?.IsRunning; //valve开关状态 public override bool IsTMFastPumpOpen => _TMFastPumpValve.Status; public override bool IsTMSoftPumpOpen => _TMSoftPumpValve.Status; public override bool IsTMFastVentOpen => _TMFastVentValve.Status; public override bool IsTMSoftVentOpen => _TMSoftVentValve.Status; public override bool IsVCEAFastPumpOpen => _VCEAFastPumpValve.Status; public override bool IsVCEBFastPumpOpen => _VCEBFastPumpValve.Status; public override bool IsVCEASoftPumpOpen => _VCEASoftPumpValve.Status; public override bool IsVCEBSoftPumpOpen => _VCEBSoftPumpValve.Status; public override bool IsVCEAFastVentOpen => _VCEAFastVentValve.Status; public override bool IsVCEBFastVentOpen => _VCEBFastVentValve.Status; public override bool IsVCEASoftVentOpen => _VCEASoftVentValve.Status; public override bool IsVCEBSoftVentOpen => _VCEBSoftVentValve.Status; public override bool IsTMVentValveOpen => IsTMFastVentOpen && IsTMSoftVentOpen; public override bool IsVCEAVentValveOpen => IsVCEAFastVentOpen && IsVCEASoftVentOpen; public override bool IsVCEBVentValveOpen => IsVCEBFastVentOpen && IsVCEBSoftVentOpen; //SlitDoor public override bool VCEASlitDoorClosed => _VCEASlitDoor.State == CylinderState.Close; public override bool VCEBSlitDoorClosed => _VCEBSlitDoor.State == CylinderState.Close; public override bool PMASlitDoorClosed { get { if (_allInstalledModules.Contains("PMA")) return _PMASlitDoor.State == CylinderState.Close; else return false; } } public override bool PMBSlitDoorClosed { get { if (_allInstalledModules.Contains("PMB")) return _PMBSlitDoor.State == CylinderState.Close; else return false; } } public override bool PMCSlitDoorClosed { get { if (_allInstalledModules.Contains("PMC")) return _PMCSlitDoor.State == CylinderState.Close; else return false; } } public override bool PMDSlitDoorClosed { get { if (_allInstalledModules.Contains("PMD")) return _PMDSlitDoor.State == CylinderState.Close; else return false; } } public bool VCEASlitDoorOpen => _VCEASlitDoor.State == CylinderState.Open; public bool VCEBSlitDoorOpen => _VCEBSlitDoor.State == CylinderState.Open; public bool PMASlitDoorOpen { get { if (_allInstalledModules.Contains("PMA")) return _PMASlitDoor.State == CylinderState.Open; else return false; } } public bool PMBSlitDoorOpen { get { if (_allInstalledModules.Contains("PMB")) return _PMBSlitDoor.State == CylinderState.Open; else return false; } } public bool PMCSlitDoorOpen { get { if (_allInstalledModules.Contains("PMC")) return _PMCSlitDoor.State == CylinderState.Open; else return false; } } public bool PMDSlitDoorOpen { get { if (_allInstalledModules.Contains("PMD")) return _PMDSlitDoor.State == CylinderState.Open; else return false; } } public override bool VCESlitDoorClosed(ModuleName vcename) { switch (vcename) { case ModuleName.VCEA: return _VCEASlitDoor.State == CylinderState.Close; case ModuleName.VCEB: return _VCEBSlitDoor.State == CylinderState.Close; default: return false; } } public override bool AllPMSlitDoorClosed { get { bool PMAFlag = true; bool PMBFlag = true; bool PMCFlag = true; bool PMDFlag = true; if (_allInstalledModules.Contains("PMA")) PMAFlag = PMASlitDoorClosed; if (_allInstalledModules.Contains("PMB")) PMBFlag = PMBSlitDoorClosed; if (_allInstalledModules.Contains("PMC")) PMCFlag = PMCSlitDoorClosed; if (_allInstalledModules.Contains("PMD")) PMDFlag = PMDSlitDoorClosed; if (PMAFlag && PMBFlag && PMCFlag&&PMDFlag) return true; else return false; } } //public bool VCEASlitDoorOpenEnable => _VCEASlitDoorOpenEnable.Value; //public bool VCEBSlitDoorOpenEnable => _VCEBSlitDoorOpenEnable.Value; //public bool PMASlitDoorOpenEnable => _PMASlitDoorOpenEnable.Value; //public bool PMBSlitDoorOpenEnable => _PMBSlitDoorOpenEnable.Value; //public bool PMCSlitDoorOpenEnable => _PMCSlitDoorOpenEnable.Value; //public bool PMDSlitDoorOpenEnable => _PMDSlitDoorOpenEnable.Value; //public bool VCEASlitDoorCloseEnable => _VCEASlitDoorCloseEnable.Value; //public bool VCEBSlitDoorCloseEnable => _VCEBSlitDoorCloseEnable.Value; //public bool PMASlitDoorCloseEnable => _PMASlitDoorCloseEnable.Value; //public bool PMBSlitDoorCloseEnable => _PMBSlitDoorCloseEnable.Value; //public bool PMCSlitDoorCloseEnable => _PMCSlitDoorCloseEnable.Value; //public bool PMDSlitDoorCloseEnable => _PMDSlitDoorCloseEnable.Value; //Robot动作 //public bool TMExtendVCEEnable => _TMExtendVCEEnable.Value; public bool TMExtendPMAEnable => _TMExtendPMAEnable.Value; public bool TMExtendPMBEnable => _TMExtendPMBEnable.Value; public bool TMExtendPMCEnable => _TMExtendPMCEnable.Value; public bool TMExtendPMDEnable => _TMExtendPMDEnable.Value; public override double TMPressure => _TMPressure.Value; public override double VCEAPressure => _VCEAPressure.Value; public override double VCEBPressure => _VCEBPressure.Value; public override PumpState PumpingState => _PumpingState; PumpState _PumpingState = PumpState.Idle; #endregion public HongHuDETM() : base(ModuleName.DETM.ToString()) { Module = ModuleName.DETM.ToString(); TMATMTargetPressure = SC.GetValue($"{Module}.ATMTargetPressure"); TMVACTargetPressure = SC.GetValue($"{Module}.VACTargetPressure"); VCEAATMTargetPressure = SC.GetValue($"VCEA.ATMTargetPressure"); VCEAVACTargetPressure = SC.GetValue($"VCEA.VACTargetPressure"); VCEBATMTargetPressure = SC.GetValue($"VCEB.ATMTargetPressure"); VCEBVACTargetPressure = SC.GetValue($"VCEB.VACTargetPressure"); _TMFastPumpValve = DEVICE.GetDevice($"{Module}.{VenusDevice.TMFastPumpValve}"); _TMSoftPumpValve = DEVICE.GetDevice($"{Module}.{VenusDevice.TMSoftPumpValve}"); _VCEASoftPumpValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEASoftPumpValve}"); _VCEBSoftPumpValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBSoftPumpValve}"); _VCEAFastPumpValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEAFastPumpValve}"); _VCEBFastPumpValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBFastPumpValve}"); _TMFastVentValve = DEVICE.GetDevice($"{Module}.{VenusDevice.TMFastVentValve}"); _TMSoftVentValve = DEVICE.GetDevice($"{Module}.{VenusDevice.TMSoftVentValve}"); _VCEASoftVentValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEASoftVentValve}"); _VCEBSoftVentValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBSoftVentValve}"); _VCEAFastVentValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEAFastVentValve}"); _VCEBFastVentValve = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBFastVentValve}"); //_VCEASlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEASlitDoorOpenEnable}"); //_VCEBSlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBSlitDoorOpenEnable}"); //_PMASlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMASlitDoorOpenEnable}"); //_PMBSlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMBSlitDoorOpenEnable}"); //_PMCSlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMCSlitDoorOpenEnable}"); //_PMDSlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMDSlitDoorOpenEnable}"); // //_VCEASlitDoorCloseEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEASlitDoorCloseEnable}"); //_VCEBSlitDoorCloseEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBSlitDoorCloseEnable}"); //_PMASlitDoorCloseEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMASlitDoorCloseEnable}"); //_PMBSlitDoorCloseEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMBSlitDoorCloseEnable}"); _TMATMSensor = DEVICE.GetDevice($"{Module}.{VenusDevice.TMATMSensor}"); _VCEAATMSensor = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEAATMSensor}"); _VCEBATMSensor = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBATMSensor}"); _VCEACasSensor = DEVICE.GetDevice($"{Module}.VCEACasSensor"); _VCEALOCKEDSensor = DEVICE.GetDevice($"{Module}.VCEALOCKEDSensor"); _VCEBCasSensor = DEVICE.GetDevice($"{Module}.VCEBCasSensor"); _VCEBLOCKEDSensor = DEVICE.GetDevice($"{Module}.VCEBLOCKEDSensor"); _VCEAProtrusionSensor = DEVICE.GetDevice($"{Module}.VCEAProtrusionSensor"); _VCEBProtrusionSensor = DEVICE.GetDevice($"{Module}.VCEBProtrusionSensor"); _VCEASlitDoor = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEASlitDoor}"); _VCEBSlitDoor = DEVICE.GetDevice($"{Module}.{VenusDevice.VCEBSlitDoor}"); _PMASlitDoor = DEVICE.GetDevice($"{Module}.{VenusDevice.PMASlitDoor}"); _PMBSlitDoor = DEVICE.GetDevice($"{Module}.{VenusDevice.PMBSlitDoor}"); if (_allInstalledModules.Contains("PMC")) { //_PMCSlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMCSlitDoorOpenEnable}"); _PMCSlitDoor = DEVICE.GetDevice($"{Module}.{VenusDevice.PMCSlitDoor}"); //_PMCSlitDoorCloseEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMCSlitDoorCloseEnable}"); } if (_allInstalledModules.Contains("PMD")) { //_PMDSlitDoorOpenEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMDSlitDoorOpenEnable}"); _PMDSlitDoor = DEVICE.GetDevice($"{Module}.{VenusDevice.PMDSlitDoor}"); //_PMDSlitDoorCloseEnable = DEVICE.GetDevice($"{Module}.{VenusDevice.PMDSlitDoorCloseEnable}"); } _TMMfc = DEVICE.GetDevice($"{Module}.TM_MFC1"); _TMPressure = DEVICE.GetDevice($"{Module}.TMPressure"); //_TMPiplinePressure = DEVICE.GetDevice($"{Module}.TMPipelinePressure"); _VCEAPressure = DEVICE.GetDevice($"{Module}.VCEAPressure"); _VCEBPressure = DEVICE.GetDevice($"{Module}.VCEBPressure"); if (SC.GetValue($"{Module}.DryPump.CommunicationType") == (int)CommunicationType.RS232) { if (SC.GetValue($"{Module}.DryPump.MFG") == (int)DryPumpMFG.SKY) { _TMPump = DEVICE.GetDevice($"{Module}.{VenusDevice.MainPump}"); } else if (SC.GetValue($"{Module}.DryPump.MFG") == (int)DryPumpMFG.Edwards) { _TMPump = DEVICE.GetDevice($"{Module}.{VenusDevice.MainPump}"); } } if (SC.GetValue($"VCEA.DryPump.CommunicationType") == (int)CommunicationType.RS232) { if (SC.GetValue($"VCEA.DryPump.MFG") == (int)DryPumpMFG.SKY) { _VCEPump = DEVICE.GetDevice($"VCEA.{VenusDevice.MainPump}"); } else if (SC.GetValue($"VCEA.DryPump.MFG") == (int)DryPumpMFG.Edwards) { _VCEPump = DEVICE.GetDevice($"VCEA.{VenusDevice.MainPump}"); } } _PressureControl = DEVICE.GetDevice($"{Module}.PressureControl"); DATA.Subscribe($"{Module}.VCEASlitDoorClosed", () => VCEASlitDoorClosed); DATA.Subscribe($"{Module}.VCEBSlitDoorClosed", () => VCEBSlitDoorClosed); DATA.Subscribe($"{Module}.PMASlitDoorClosed", () => PMASlitDoorClosed); DATA.Subscribe($"{Module}.PMBSlitDoorClosed", () => PMBSlitDoorClosed); DATA.Subscribe($"{Module}.PMCSlitDoorClosed", () => PMCSlitDoorClosed); DATA.Subscribe($"{Module}.PMDSlitDoorClosed", () => PMDSlitDoorClosed); DATA.Subscribe($"{Module}.PumpIsRunning", () => IsTMPumpRunning, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe($"VCEA.PumpIsRunning", () => IsVCEPumpRunning, SubscriptionAttribute.FLAG.IgnoreSaveDB); DATA.Subscribe($"{Module}.TMIsATM", () => IsTMATM); DATA.Subscribe($"{Module}.VCEAIsATM", () => IsVCEAATM); DATA.Subscribe($"{Module}.VCEBIsATM", () => IsVCEBATM); OP.Subscribe($"{Module}.ControlPump", (cmd, args) => { _TMPump.SetPumpOnOff((bool)args[0]); return true; }); OP.Subscribe($"VCEA.ControlPump", (cmd, args) => { _VCEPump.SetPumpOnOff((bool)args[0]); return true; }); OP.Subscribe($"{Module}.SetSlitDoor", (cmd, args) => { var module = (ModuleName)Enum.Parse(typeof(ModuleName), args[0].ToString()); return TurnSlitDoor(module, (bool)args[1]); }); } #region IO控制方法 public override void PressureControl(bool bCtrl) { if (!_PressureControl.IsProcessControl && bCtrl) { _PressureControl.SetMode(true); } if (_PressureControl.IsProcessControl && !bCtrl) { _PressureControl.SetMode(false); } } //slitdoor //2023/11/1 增加两边压差比较 public override bool TurnSlitDoor(ModuleName mod, bool bOn) { double MaxPressureDifference = SC.GetValue("System.PMTMMaxPressureDifference"); switch (mod) { case ModuleName.VCEA: if (bOn && IsVCEAATM && IsTMATM) { LOG.Write(eEvent.INFO_TM, ModuleName.DETM, $"open door without Pressure, TM Pressure:{_TMPressure.Value} and VCE Pressure:{_VCEAPressure.Value}"); return _VCEASlitDoor.SetCylinder(bOn, out _); } if (bOn && Math.Abs(_TMPressure.Value - _VCEAPressure.Value) > MaxPressureDifference) { LOG.Write(eEvent.ERR_TM, ModuleName.DETM, $"cannot open door cause pressure, TM Pressure:{_TMPressure.Value} and VCE Pressure:{_VCEAPressure.Value}"); return false; } return _VCEASlitDoor.SetCylinder(bOn, out _); case ModuleName.VCEB: if (bOn && IsVCEBATM && IsTMATM) { LOG.Write(eEvent.INFO_TM, ModuleName.DETM, $"open door without Pressure, TM Pressure:{_TMPressure.Value} and VCE Pressure:{_VCEBPressure.Value}"); return _VCEBSlitDoor.SetCylinder(bOn, out _); } if (bOn && Math.Abs(_TMPressure.Value - _VCEBPressure.Value) > MaxPressureDifference) { LOG.Write(eEvent.ERR_TM, ModuleName.DETM, $"cannot open door cause pressure, TM Pressure:{_TMPressure.Value} and VCE Pressure:{_VCEBPressure.Value}"); return false; } return _VCEBSlitDoor.SetCylinder(bOn, out _); case ModuleName.PMA: if (bOn && Singleton.Instance.PMA.IsAtm && IsTMATM) return _PMASlitDoor.SetCylinder(bOn, out _); if (bOn && !CanOpenSlitDoor(mod, MaxPressureDifference)) return false; return _PMASlitDoor.SetCylinder(bOn, out _); case ModuleName.PMB: if (bOn && Singleton.Instance.PMB.IsAtm && IsTMATM) return _PMBSlitDoor.SetCylinder(bOn, out _); if (bOn && !CanOpenSlitDoor(mod, MaxPressureDifference)) return false; return _PMBSlitDoor.SetCylinder(bOn, out _); case ModuleName.PMC: if (bOn && Singleton.Instance.PMC.IsAtm && IsTMATM) return _PMCSlitDoor.SetCylinder(bOn, out _); if (bOn && !CanOpenSlitDoor(mod, MaxPressureDifference)) return false; return _PMCSlitDoor.SetCylinder(bOn, out _); case ModuleName.PMD: if (bOn && Singleton.Instance.PMD.IsAtm && IsTMATM) return _PMDSlitDoor.SetCylinder(bOn, out _); if (bOn && !CanOpenSlitDoor(mod, MaxPressureDifference)) return false; return _PMDSlitDoor.SetCylinder(bOn, out _); } return false; } //valve public override void TurnFastPumpValve(ModuleName mod, bool bOn) { switch (mod) { case ModuleName.DETM: _TMFastPumpValve.TurnValve(bOn, out string _); break; case ModuleName.VCEA: _VCEAFastPumpValve.TurnValve(bOn, out string _); break; case ModuleName.VCEB: _VCEBFastPumpValve.TurnValve(bOn, out string _); break; } } public override void TurnSoftPumpValve(ModuleName mod, bool bOn) { switch (mod) { case ModuleName.DETM: _TMSoftPumpValve.TurnValve(bOn, out string _); break; case ModuleName.VCEA: _VCEASoftPumpValve.TurnValve(bOn, out string _); break; case ModuleName.VCEB: _VCEBSoftPumpValve.TurnValve(bOn, out string _); break; } } public override void TurnFastVentValve(ModuleName mod, bool bOn) { switch (mod) { case ModuleName.DETM: _TMFastVentValve.TurnValve(bOn, out string _); break; case ModuleName.VCEA: _VCEAFastVentValve.TurnValve(bOn, out string _); break; case ModuleName.VCEB: _VCEBFastVentValve.TurnValve(bOn, out string _); break; } } public override void TurnSoftVentValve(ModuleName mod, bool bOn) { switch (mod) { case ModuleName.DETM: _TMSoftVentValve.TurnValve(bOn, out string _); break; case ModuleName.VCEA: _VCEASoftVentValve.TurnValve(bOn, out string _); break; case ModuleName.VCEB: _VCEBSoftVentValve.TurnValve(bOn, out string _); break; } } public override bool CloseAllSlitDoor() { TurnSlitDoor(ModuleName.VCEA, false); TurnSlitDoor(ModuleName.VCEB, false); if (_allInstalledModules.Contains("PMA")) TurnSlitDoor(ModuleName.PMA, false); if (_allInstalledModules.Contains("PMB")) TurnSlitDoor(ModuleName.PMB, false); if (_allInstalledModules.Contains("PMC")) TurnSlitDoor(ModuleName.PMC, false); if (_allInstalledModules.Contains("PMD")) TurnSlitDoor(ModuleName.PMD, false); return true; } public override void HomeVceSlitDoor() { //由SlitDoor的状态对其下发同样的指令 if (VCEASlitDoorClosed == true) TurnSlitDoor(ModuleName.VCEA, false); else TurnSlitDoor(ModuleName.VCEA, true); if (VCEBSlitDoorClosed == true) TurnSlitDoor(ModuleName.VCEB, false); else TurnSlitDoor(ModuleName.VCEB, true); } public override void CloseModuleAllValves(ModuleName module) { TurnFastPumpValve(module, false); TurnSoftPumpValve(module, false); TurnFastVentValve(module, false); TurnSoftVentValve(module, false); } public override void CloseVentValve() { _TMSoftVentValve.TurnValve(false, out _); _TMFastVentValve.TurnValve(false, out _); _VCEASoftVentValve.TurnValve(false, out _); _VCEBSoftVentValve.TurnValve(false, out _); _VCEAFastVentValve.TurnValve(false, out _); _VCEBFastVentValve.TurnValve(false, out _); } public override bool CheckSlitValveOpen(ModuleName mod) { switch (mod) { case ModuleName.VCEA: return VCEASlitDoorOpen; case ModuleName.VCEB: return VCEBSlitDoorOpen; case ModuleName.PMA: return PMASlitDoorOpen; case ModuleName.PMB: return PMBSlitDoorOpen; case ModuleName.PMC: return PMCSlitDoorOpen; case ModuleName.PMD: return PMDSlitDoorOpen; } return false; } public override bool CheckSlitValveClose(ModuleName mod) { switch (mod) { case ModuleName.VCEA: return VCEASlitDoorClosed; case ModuleName.VCEB: return VCEBSlitDoorClosed; case ModuleName.PMA: return PMASlitDoorClosed; case ModuleName.PMB: return PMBSlitDoorClosed; case ModuleName.PMC: return PMCSlitDoorClosed; case ModuleName.PMD: return PMDSlitDoorClosed; } return false; } public override bool CheckPumpValveClosed(ModuleName mod) { switch (mod) { case ModuleName.DETM: return !IsTMFastPumpOpen && !IsTMSoftPumpOpen; case ModuleName.VCEA: return !IsVCEAFastPumpOpen && !IsVCEASoftPumpOpen; case ModuleName.VCEB: return !IsVCEBFastPumpOpen && !IsVCEBSoftPumpOpen; } return true; } public override bool CheckVentValveClosed(ModuleName mod) { switch (mod) { case ModuleName.DETM: if (IsTMVentValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.DETM, "TM Vent Valve not closed"); return false; } break; case ModuleName.VCEA: if (IsVCEAVentValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.VCEA, "VCEA Vent Valve not closed"); return false; } break; case ModuleName.VCEB: if (IsVCEBVentValveOpen) { LOG.Write(eEvent.ERR_TM, ModuleName.VCEB, "VCEB Vent Valve not closed"); return false; } break; } return true; } public override void SetTMFlow(int flowValue) { _TMMfc.SetPoint = (flowValue); } public override double GetModulePressure(ModuleName mod) { switch (mod) { case ModuleName.DETM: return TMPressure; case ModuleName.VCEA: return VCEAPressure; case ModuleName.VCEB: return VCEBPressure; } return 0.0; } public override bool TryGetPump(ModuleName mod) { if (mod == ModuleName.DETM) return true; //Self if ((mod == ModuleName.VCEA && _PumpingState == PumpState.VCEAUsing) || (mod == ModuleName.VCEB && _PumpingState == PumpState.VCEBUsing)) return true; //Idle if (mod == ModuleName.VCEA && !IsVCEAFastPumpOpen && !IsVCEASoftPumpOpen && _PumpingState == PumpState.Idle) { _PumpingState = PumpState.VCEAUsing; return true; } if (mod == ModuleName.VCEB && !IsVCEBFastPumpOpen && !IsVCEBSoftPumpOpen && _PumpingState == PumpState.Idle) { _PumpingState = PumpState.VCEBUsing; return true; } LOG.Write(eEvent.WARN_DEFAULT_WARN, mod, "无法打开,另一个泵正在用!"); //locked return false; } public override void ReleasePump(ModuleName Module) { //release pump (must do it by user) if ((Module == ModuleName.VCEA && _PumpingState == PumpState.VCEAUsing)|| (Module == ModuleName.VCEB && _PumpingState == PumpState.VCEBUsing)) _PumpingState = PumpState.Idle; } #endregion #region 工具方法 private bool CanOpenSlitDoor(ModuleName mod, double MaxPressureDifference) { if (Singleton.Instance.GetPM(mod) == null || RouteManager.IsATMMode) return true; else { double PMPressure = Singleton.Instance.GetPM(mod).ChamberPressure; if (Math.Abs(_TMPressure.Value - PMPressure) <= MaxPressureDifference || (Singleton.Instance.GetPM(mod).IsAtm && IsTMATM)) { return true; } else { LOG.Write(eEvent.ERR_TM, ModuleName.DETM, $"cannot open door cause pressure, TM Pressure:{_TMPressure.Value} and {mod} pressure:{PMPressure}"); return false; } } } private double mbar2mtorrConvert(double mbar) => mbar * 0.75 * 1000; #endregion } }