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
}
}