|
@@ -1,4 +1,5 @@
|
|
|
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;
|
|
@@ -27,7 +28,7 @@ namespace Venus_RT.Devices
|
|
|
#region io变量定义
|
|
|
private readonly IoLid _Lid;
|
|
|
|
|
|
- private readonly IoCylinder _slitDoor;
|
|
|
+ private readonly IoCylinder _linerDoor;
|
|
|
private readonly IoCylinder _LiftPin;
|
|
|
|
|
|
private readonly IoValve _PVN21Valve;
|
|
@@ -94,7 +95,7 @@ namespace Venus_RT.Devices
|
|
|
private readonly IoSensor _TurboPumpInterlock;
|
|
|
private readonly IoSensor _GasBoxDoor;
|
|
|
private readonly IoSensor _GasBoxPressure;
|
|
|
-
|
|
|
+ private readonly IoSensor _PM_LinerDoor_Closed;
|
|
|
private readonly PumpBase _MainPump;
|
|
|
private readonly ESC5HighVoltage _ESCHV;
|
|
|
private readonly AdixenTurboPump _TurboPump;
|
|
@@ -129,7 +130,7 @@ namespace Venus_RT.Devices
|
|
|
Module = moduleName;
|
|
|
_Lid = DEVICE.GetDevice<IoLid>($"{Module}.{VenusDevice.Lid}");
|
|
|
_LiftPin = DEVICE.GetDevice<IoCylinder>($"{Module}.{VenusDevice.LiftPin}");
|
|
|
- _slitDoor = DEVICE.GetDevice<IoCylinder>($"{Module}.{VenusDevice.LinerDoor}");
|
|
|
+ _linerDoor = DEVICE.GetDevice<IoCylinder>($"{Module}.{VenusDevice.LinerDoor}");
|
|
|
_PVN21Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVN21}");
|
|
|
_PVN22Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVN22}");
|
|
|
_PV11Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePV11}");
|
|
@@ -156,7 +157,7 @@ namespace Venus_RT.Devices
|
|
|
_PVB2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVB2}");
|
|
|
_PVC1Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVC1}");
|
|
|
_PVC2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValvePVC2}");
|
|
|
-
|
|
|
+ _PM_LinerDoor_Closed = DEVICE.GetDevice<IoSensor>($"{Module}.SensorLinerDoorClosed");
|
|
|
_N2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveN2}");
|
|
|
_Mfc1Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc1}");
|
|
|
_Mfc2Valve = DEVICE.GetDevice<IoValve>($"{Module}.{VenusDevice.ValveMfc2}");
|
|
@@ -366,7 +367,7 @@ namespace Venus_RT.Devices
|
|
|
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+ public override bool IsLinerDoorClosed => !_linerDoor.ONFeedback && _linerDoor.OFFFeedback;
|
|
|
public override bool IsPumpRunning => _MainPump.IsRunning;
|
|
|
|
|
|
public override bool IsTurboPumpRunning => _TurboPump.IsRunning;
|
|
@@ -433,6 +434,7 @@ namespace Venus_RT.Devices
|
|
|
public override bool TurboPumpInterlock => _TurboPumpInterlock.Value;
|
|
|
|
|
|
public override bool SourceRFFanInterlock => _Source_RF_Fan.Value;
|
|
|
+ public override bool LinerDoorClosed => _PM_LinerDoor_Closed.Value;
|
|
|
|
|
|
public override bool SlitDoorClosed
|
|
|
{
|
|
@@ -619,7 +621,17 @@ namespace Venus_RT.Devices
|
|
|
//检查是否是ATM模式
|
|
|
return _ATM_sw.Value && ChamberPressure > 700000;
|
|
|
}
|
|
|
-
|
|
|
+ public override void RTCloseEvent()
|
|
|
+ {
|
|
|
+ if (_GeneratorBias.IsPowerOn)
|
|
|
+ {
|
|
|
+ GeneratorBiasPowerOn(false);
|
|
|
+ }
|
|
|
+ if (PendulumValveIsOpen())
|
|
|
+ {
|
|
|
+ TurnPendulumValve(false);
|
|
|
+ }
|
|
|
+ }
|
|
|
public override bool CheckChillerStatus()
|
|
|
{
|
|
|
return _Chiller != null /*&& _Chiller.IsRunning*/ && !_Chiller.IsError;
|
|
@@ -664,6 +676,11 @@ namespace Venus_RT.Devices
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ if (!LinerDoorClosed)
|
|
|
+ {
|
|
|
+ LOG.Write(evt, Module, $"Cannot Power ON {device} as Liner Door is open.");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
if ((device == VenusDevice.ESCHV || device == VenusDevice.BiasRf) && WaferManager.Instance.CheckNoWafer(Module, 0))
|
|
|
{
|
|
|
LOG.Write(evt, Module, $"Cannot Power ON {device} as {Module} has no wafer");
|
|
@@ -673,6 +690,49 @@ namespace Venus_RT.Devices
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+ public override bool SetBiasMatchWorkMode(MatchWorkMode matchWorkMode)
|
|
|
+ {
|
|
|
+ if (_BiasMatch == null) return false;
|
|
|
+ if (matchWorkMode == MatchWorkMode.Auto)
|
|
|
+ {
|
|
|
+ return _BiasMatch.SetMatchMode(EnumRfMatchTuneMode.Auto, out _);
|
|
|
+ }
|
|
|
+ else if (matchWorkMode == MatchWorkMode.Manual)
|
|
|
+ {
|
|
|
+ return _BiasMatch.SetMatchMode(EnumRfMatchTuneMode.Manual, out _);
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ public override bool StartControlPressure(int pressureSetpoint, int flowSetpoint)
|
|
|
+ {
|
|
|
+ OpenValve(ValveType.TurboPumpPumping, true);
|
|
|
+ if (_TurboPumpPumpingValve.Status)
|
|
|
+ {
|
|
|
+ OpenValve(ValveType.Purge, true);
|
|
|
+ OpenValve(ValveType.GasFinal, false);
|
|
|
+ OpenValve(ValveType.N2, true);
|
|
|
+ OpenValve(ValveType.PVN22, true);
|
|
|
+ //FlowGas(12, flowSetpoint);
|
|
|
+ TurnPendulumValve(true);
|
|
|
+ SetPVPressure(pressureSetpoint);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ LOG.Write(eEvent.WARN_DEVICE_INFO, Module, $"cannot control pressure,cause Turbo Pump Pumping Valve is Close");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ public async override Task<bool> AbortControlPressure()
|
|
|
+ {
|
|
|
+ OpenValve(ValveType.PVN22, false);
|
|
|
+ OpenValve(ValveType.N2, false);
|
|
|
+ await Task.Delay(2000);
|
|
|
+ OpenValve(ValveType.GasFinal, false);
|
|
|
+ OpenValve(ValveType.Purge, false);
|
|
|
+ return true;
|
|
|
+ }
|
|
|
public override void CheckIdleInterlock()
|
|
|
{
|
|
|
if (ForelinePressure > _foreline_interlock_pressure)
|
|
@@ -697,12 +757,20 @@ namespace Venus_RT.Devices
|
|
|
{
|
|
|
return _LiftPin.State == CylinderState.Open;
|
|
|
}
|
|
|
+ public override bool CheckLinerDoorOpen()
|
|
|
+ {
|
|
|
+ return _linerDoor.State == CylinderState.Open;
|
|
|
+ }
|
|
|
|
|
|
+ public override bool CheckLinerDoorClose()
|
|
|
+ {
|
|
|
+ return _linerDoor.State == CylinderState.Close;
|
|
|
+ }
|
|
|
public override bool CheckSlitDoorClose()
|
|
|
- => IsSlitDoorClosed;
|
|
|
+ => IsSlitDoorClosed && IsLinerDoorClosed;
|
|
|
|
|
|
public override bool CheckSlitDoorOpen()
|
|
|
- => !IsSlitDoorClosed;
|
|
|
+ => !IsSlitDoorClosed && !IsLinerDoorClosed;
|
|
|
|
|
|
public override void CloseValves(int? delayTime = null)
|
|
|
{
|
|
@@ -867,7 +935,17 @@ namespace Venus_RT.Devices
|
|
|
{
|
|
|
SetSlitDoor(false, out _);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
+ if (_linerDoor.State == CylinderState.Open)
|
|
|
+ {
|
|
|
+ SetLinerDoor(true, out _);
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ SetLinerDoor(false, out _);
|
|
|
+ }
|
|
|
+
|
|
|
+ SetLinerDoor(false, out _);
|
|
|
//SetSlitDoor(false, out _);
|
|
|
OpenValve(ValveType.PVN22, false);
|
|
|
}
|
|
@@ -1000,6 +1078,35 @@ namespace Venus_RT.Devices
|
|
|
OP.DoOperation($"{ModuleName.SETM}.SetSlitDoor",Module,open);
|
|
|
return true;
|
|
|
}
|
|
|
+ public override bool SetLinerDoor(bool open, out string reason)
|
|
|
+ {
|
|
|
+ if (open)
|
|
|
+ {
|
|
|
+ if (RouteManager.IsATMMode)
|
|
|
+ {
|
|
|
+ if (!IsATM)
|
|
|
+ {
|
|
|
+ reason = $"{Module} is not ATM, can not open slit door";
|
|
|
+ LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //else
|
|
|
+ //{
|
|
|
+
|
|
|
+ // double maxPressureDifference = SC.GetValue<double>("System.PMTMMaxPressureDifference");
|
|
|
+ // if (Math.Abs(TMPressure - ChamberPressure) > maxPressureDifference)
|
|
|
+ // {
|
|
|
+ // reason = $"{Module} and TM pressure difference exceeds the max limit {maxPressureDifference}, TMPressure:{TMPressure}, {Module}Pressure:{ChamberPressure}";
|
|
|
+ // LOG.Write(eEvent.ERR_DEVICE_INFO, Module, reason);
|
|
|
+ // return false;
|
|
|
+ // }
|
|
|
+ //}
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return _linerDoor.SetCylinder(open, out reason);
|
|
|
+ }
|
|
|
|
|
|
public override bool SetWallTCTemperature(float value)
|
|
|
=> _WallTC.RampTemp(value);
|
|
@@ -1052,7 +1159,7 @@ namespace Venus_RT.Devices
|
|
|
|
|
|
}
|
|
|
//
|
|
|
- if (!_slitDoor.SetCylinder(true, out reason))
|
|
|
+ if (!SetLinerDoor(true, out reason))
|
|
|
{
|
|
|
LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Open failed:{reason}");
|
|
|
return false;
|
|
@@ -1081,11 +1188,11 @@ namespace Venus_RT.Devices
|
|
|
}
|
|
|
public override bool PreparePlaceIsOK()
|
|
|
{
|
|
|
- return CheckSlitDoorOpen() && LiftPinIsDown;
|
|
|
+ return CheckSlitDoorOpen() && LiftPinIsDown && CheckLinerDoorOpen();
|
|
|
}
|
|
|
public override bool PreparePickIsOK()
|
|
|
{
|
|
|
- return CheckSlitDoorOpen() && LiftPinIsUp;
|
|
|
+ return CheckSlitDoorOpen() && LiftPinIsUp && CheckLinerDoorOpen();
|
|
|
}
|
|
|
public override bool EndPlace()
|
|
|
{
|
|
@@ -1100,7 +1207,11 @@ namespace Venus_RT.Devices
|
|
|
LOG.Write(eEvent.ERR_PM, Module, $"Set Slit Door Close failed:{reason}");
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+ if (!SetLinerDoor(false, out reason))
|
|
|
+ {
|
|
|
+ LOG.Write(eEvent.ERR_PM, Module, $"Set Liner Door Close failed:{reason}");
|
|
|
+ return false;
|
|
|
+ }
|
|
|
return true;
|
|
|
}
|
|
|
|