|
@@ -35,13 +35,17 @@ namespace FurnaceRT.Equipments.PMs
|
|
|
private N2PurgeModeEnum _N2PurgeMode = N2PurgeModeEnum.Auto;
|
|
|
private double _n2PurgeData = 20;
|
|
|
private double _n2ToAirData = 185000;
|
|
|
-
|
|
|
+ private N2PurgeModeEnum _currentPhase;
|
|
|
private double _manualPhase2StabilityTime = 0;
|
|
|
private double _manualPhase4StabilityTime = 0;
|
|
|
private bool _manualPhase2NeedCheck = true;
|
|
|
private bool _manualPhase4NeedCheck = true;
|
|
|
private bool _enableAbortN2purge = true;
|
|
|
|
|
|
+ private int _phase1CycleCount = 0;
|
|
|
+ private int _phase1CycleCountSC = 0;
|
|
|
+ private bool _canSwitchToPhase2 = true;
|
|
|
+
|
|
|
private Dictionary<string, Stopwatch> _allTimeDict = new Dictionary<string, Stopwatch>();
|
|
|
private void InitN2PurgeData()
|
|
|
{
|
|
@@ -64,6 +68,9 @@ namespace FurnaceRT.Equipments.PMs
|
|
|
_manualPhase4StabilityTime = SC.ContainsItem($"PM1.N2Purge.Manual_phase4.StabilityTime") ? SC.GetValue<double>("PM1.N2Purge.Manual_phase4.StabilityTime") : 0;
|
|
|
_manualPhase4NeedCheck = _manualPhase4StabilityTime > 0;
|
|
|
|
|
|
+ _phase1CycleCountSC = SC.ContainsItem($"PM1.N2Purge.Manual_phase1.CycleCount") ? SC.GetValue<int>("PM1.N2Purge.Manual_phase1.CycleCount") : 0;
|
|
|
+
|
|
|
+
|
|
|
_n2PurgeSequenceAction = ExtractionMethods.GetN2PurgeSequenceAction();
|
|
|
_n2PurgeSequenceStatus = new Dictionary<string, Func<bool>>()
|
|
|
{
|
|
@@ -109,28 +116,88 @@ namespace FurnaceRT.Equipments.PMs
|
|
|
|
|
|
private void SetN2PurgeModeAction(string selectN2PurgeMode)
|
|
|
{
|
|
|
+ double o2Density = GetO2Density();
|
|
|
+ bool laDoorOpenStatus = GetLADoorOpenStatus();
|
|
|
_N2PurgeMode = (N2PurgeModeEnum)Enum.Parse(typeof(N2PurgeModeEnum), selectN2PurgeMode);
|
|
|
|
|
|
- switch (_N2PurgeMode)
|
|
|
+ if (_N2PurgeMode == N2PurgeModeEnum.N2PurgeMode)
|
|
|
+ {
|
|
|
+ if (_currentPhase == N2PurgeModeEnum.Manual_phase1)
|
|
|
+ {
|
|
|
+ if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase2.ToString()].Invoke() && _canSwitchToPhase2)
|
|
|
+ {
|
|
|
+ SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase2.ToString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else if (_currentPhase == N2PurgeModeEnum.Manual_phase2)
|
|
|
+ {
|
|
|
+ if (!_allTimeDict[N2PurgeModeEnum.Manual_phase2.ToString()].IsRunning && _canSwitchToPhase2)
|
|
|
+ {
|
|
|
+ _allTimeDict[N2PurgeModeEnum.Manual_phase2.ToString()].Restart();
|
|
|
+ }
|
|
|
+ var second = _allTimeDict[N2PurgeModeEnum.Manual_phase2.ToString()].Elapsed.Seconds;
|
|
|
+ if (second >= _manualPhase2StabilityTime)
|
|
|
+ {
|
|
|
+ if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase1.ToString()].Invoke())
|
|
|
+ {
|
|
|
+ SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase1.ToString());
|
|
|
+
|
|
|
+ N2PurgeFaileAlarm.Set();
|
|
|
+
|
|
|
+ _allTimeDict[N2PurgeModeEnum.Manual_phase2.ToString()].Restart();
|
|
|
+ _allTimeDict[N2PurgeModeEnum.Manual_phase2.ToString()].Stop();
|
|
|
+
|
|
|
+ _canSwitchToPhase2 = false;
|
|
|
+ }
|
|
|
+ if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase2.ToString()].Invoke())
|
|
|
+ {
|
|
|
+ _allTimeDict[N2PurgeModeEnum.Manual_phase2.ToString()].Restart();
|
|
|
+ _allTimeDict[N2PurgeModeEnum.Manual_phase2.ToString()].Stop();
|
|
|
+ _canSwitchToPhase2 = false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase1.ToString()].Invoke())
|
|
|
+ {
|
|
|
+ SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase1.ToString());
|
|
|
+ }
|
|
|
+ else if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase2.ToString()].Invoke())
|
|
|
+ {
|
|
|
+ SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase2.ToString());
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (_N2PurgeMode == N2PurgeModeEnum.ATMMode)
|
|
|
{
|
|
|
- case N2PurgeModeEnum.Auto:
|
|
|
- // 自动模式下的操作
|
|
|
- break;
|
|
|
- case N2PurgeModeEnum.ManualMode:
|
|
|
- break;
|
|
|
- case N2PurgeModeEnum.N2PurgeMode:
|
|
|
-
|
|
|
- ProcessPhase(_trigN2UpRD, N2PurgeModeEnum.Manual_phase1.ToString());
|
|
|
- ProcessPhase(_trigN2DownRD, N2PurgeModeEnum.Manual_phase2.ToString(), _manualPhase2NeedCheck, (int)(_manualPhase2StabilityTime * 1000));
|
|
|
- break;
|
|
|
- case N2PurgeModeEnum.ATMMode:
|
|
|
-
|
|
|
- ProcessPhase(_trigN2AirDownRD, N2PurgeModeEnum.Manual_phase3.ToString());
|
|
|
- ProcessPhase(_trigN2AirUpRD, N2PurgeModeEnum.Manual_phase4.ToString(), _manualPhase4NeedCheck, (int)(_manualPhase4StabilityTime * 1000));
|
|
|
- ProcessPhase(_trigN2AirDownTwoRD, N2PurgeModeEnum.Manual_phase5.ToString());
|
|
|
- break;
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+ //switch (_N2PurgeMode)
|
|
|
+ //{
|
|
|
+ // case N2PurgeModeEnum.Auto:
|
|
|
+ // // 自动模式下的操作
|
|
|
+ // break;
|
|
|
+ // case N2PurgeModeEnum.ManualMode:
|
|
|
+ // break;
|
|
|
+ // case N2PurgeModeEnum.N2PurgeMode:
|
|
|
+
|
|
|
+ // ProcessPhase(_trigN2UpRD, N2PurgeModeEnum.Manual_phase1.ToString());
|
|
|
+ // ProcessPhase(_trigN2DownRD, N2PurgeModeEnum.Manual_phase2.ToString(), _manualPhase2NeedCheck, (int)(_manualPhase2StabilityTime * 1000));
|
|
|
+ // break;
|
|
|
+ // case N2PurgeModeEnum.ATMMode:
|
|
|
+
|
|
|
+ // ProcessPhase(_trigN2AirDownRD, N2PurgeModeEnum.Manual_phase3.ToString());
|
|
|
+ // ProcessPhase(_trigN2AirUpRD, N2PurgeModeEnum.Manual_phase4.ToString(), _manualPhase4NeedCheck, (int)(_manualPhase4StabilityTime * 1000));
|
|
|
+ // ProcessPhase(_trigN2AirDownTwoRD, N2PurgeModeEnum.Manual_phase5.ToString());
|
|
|
+ // break;
|
|
|
+ //}
|
|
|
+
|
|
|
}
|
|
|
bool CheckConditionInTime(string modeKey, int millisecondsTimeout, Func<bool> condition)
|
|
|
{
|
|
@@ -187,6 +254,9 @@ namespace FurnaceRT.Equipments.PMs
|
|
|
private void SetN2PurgeValveData(string mode)
|
|
|
{
|
|
|
var value = _n2PurgeSequenceAction[mode];
|
|
|
+ LOG.Info($"N2PurgeMode Trigger{mode},O2:{GetO2Density()}");
|
|
|
+
|
|
|
+ _currentPhase = (N2PurgeModeEnum)Enum.Parse(typeof(N2PurgeModeEnum), mode);
|
|
|
|
|
|
foreach (var operateItem in value.Item2)
|
|
|
{
|
|
@@ -407,43 +477,43 @@ namespace FurnaceRT.Equipments.PMs
|
|
|
{
|
|
|
if (SC.ContainsItem("PM1.N2Purge.TransferRoomArrivalWaitTime") && TrigN2PurgeLAO2CheckTime != null)
|
|
|
{
|
|
|
- var time = (float)SC.GetValue<double>("PM1.N2Purge.TransferRoomArrivalWaitTime") ;
|
|
|
+ var time = (float)SC.GetValue<double>("PM1.N2Purge.TransferRoomArrivalWaitTime");
|
|
|
TrigN2PurgeLAO2CheckTime.SetAOTrigger(time, out _);
|
|
|
}
|
|
|
|
|
|
if (SC.ContainsItem("PM1.N2Purge.TransferRoomStableWaitTime") && TrigN2PurgeLAO2OverTime != null)
|
|
|
{
|
|
|
- var time = (float)SC.GetValue<double>("PM1.N2Purge.TransferRoomStableWaitTime") ;
|
|
|
+ var time = (float)SC.GetValue<double>("PM1.N2Purge.TransferRoomStableWaitTime");
|
|
|
TrigN2PurgeLAO2OverTime.SetAOTrigger(time, out _);
|
|
|
}
|
|
|
|
|
|
if (SC.ContainsItem("PM1.N2Purge.FOUPOpenerArrivalWaitTime") && TrigN2PurgeFOUPO2CheckTime != null)
|
|
|
{
|
|
|
- var time = (float)SC.GetValue<double>("PM1.N2Purge.FOUPOpenerArrivalWaitTime") ;
|
|
|
+ var time = (float)SC.GetValue<double>("PM1.N2Purge.FOUPOpenerArrivalWaitTime");
|
|
|
TrigN2PurgeFOUPO2CheckTime.SetAOTrigger(time, out _);
|
|
|
}
|
|
|
|
|
|
if (SC.ContainsItem("PM1.N2Purge.FOUPOpenerStableWaitTime") && TrigN2PurgeFOUPO2OverTime != null)
|
|
|
{
|
|
|
- var time = (float)SC.GetValue<double>("PM1.N2Purge.FOUPOpenerStableWaitTime") ;
|
|
|
+ var time = (float)SC.GetValue<double>("PM1.N2Purge.FOUPOpenerStableWaitTime");
|
|
|
TrigN2PurgeFOUPO2OverTime.SetAOTrigger(time, out _);
|
|
|
}
|
|
|
|
|
|
if (SC.ContainsItem("PM1.N2Purge.O2DetectorTransferRoomToFOUPTime") && TrigN2PurgeExchangeLATOFOUPWaitTime != null)
|
|
|
{
|
|
|
- var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorTransferRoomToFOUPTime") ;
|
|
|
+ var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorTransferRoomToFOUPTime");
|
|
|
TrigN2PurgeExchangeLATOFOUPWaitTime.SetAOTrigger(time, out _);
|
|
|
}
|
|
|
|
|
|
if (SC.ContainsItem("PM1.N2Purge.O2DetectorFOUPToTransferRoomTime") && TrigN2PurgeExchangeFOUPTOLAWaitTime != null)
|
|
|
{
|
|
|
- var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToTransferRoomTime") ;
|
|
|
+ var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToTransferRoomTime");
|
|
|
TrigN2PurgeExchangeFOUPTOLAWaitTime.SetAOTrigger(time, out _);
|
|
|
}
|
|
|
|
|
|
if (SC.ContainsItem("PM1.N2Purge.O2DetectorFOUPToFOUPTime") && TrigN2PurgeExchangeFOUPTOFOUPWaitTime != null)
|
|
|
{
|
|
|
- var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToFOUPTime") ;
|
|
|
+ var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToFOUPTime");
|
|
|
TrigN2PurgeExchangeFOUPTOFOUPWaitTime.SetAOTrigger(time, out _);
|
|
|
}
|
|
|
SetN2PurgeLAO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.N2PurgeLAO2CheckSV"));
|