Kaynağa Gözat

update N2purge mode

jiangjy 3 hafta önce
ebeveyn
işleme
930c0d0d5f

+ 9 - 0
Furnace/FurnaceRT/Config/DisplayReplace.xml

@@ -1,6 +1,11 @@
 <?xml version="1.0" encoding="utf-8" ?>
 <Displays>
 	<HistoryGroup name="ProcessHistory" display="Process History">
+		<Display Name="PM1.Tank1Pressure.Value" DisplayName="Pressure.PS132.Actual" />
+		<Display Name="PM1.Tank2Pressure.Value" DisplayName="Pressure.PS135.Actual" />
+		<Display Name="PM1.ConcentrationO2.Value" DisplayName="Pressure.O2.Actual" />
+
+
 		<Display Name="PM1.APC.PressureSetPoint" DisplayName="APC.CKD.Pressure Set" />
 		<Display Name="PM1.APC.Pressure1Feedback" DisplayName="APC.CKD.Sensor1" />
 		<Display Name="PM1.APC.Pressure2Feedback" DisplayName="APC.CKD.Sensor2" />
@@ -308,6 +313,10 @@
 		<Display Name="System.HeaterL.HeaterControlModeSV" DisplayName="Heater.L.Heater Control Mode SV" />
 	</HistoryGroup>
 	<DetailGroup name="ProcessDetail" display="Process Detail">
+		<Display ColName="PS132(act)" Name="PM1.Tank1Pressure.Value" DisplayName="Pressure.PS132.Actual" />
+		<Display ColName="PS135(act)" Name="PM1.Tank2Pressure.Value" DisplayName="Pressure.PS135.Actual" />
+		<Display ColName="O2(act)" Name="PM1.ConcentrationO2.Value" DisplayName="Pressure.O2.Actual" />
+		
 		<Display ColName="APCPressure(set)" Name="PM1.APC.PressureSetPoint" DisplayName="APC.CKD.Pressure Set" />
 		<Display ColName="APCSensor1(act)" Name="PM1.APC.Pressure1Feedback" DisplayName="APC.CKD.Sensor1" />
 		<Display ColName="APCSensor2(act)" Name="PM1.APC.Pressure2Feedback" DisplayName="APC.CKD.Sensor2" />

+ 2 - 0
Furnace/FurnaceRT/Config/FurnaceGemModel.xml

@@ -9484,6 +9484,7 @@
     <ECID id="940010019" valueType="Ascii" logicalName="CarrierRobot.SlotCount" value="" min="" max="" eventTrigger="" units="" description="Slot Count" isArray="false" />
     <ECID id="940010020" valueType="Ascii" logicalName="CarrierRobot.TransferMode" value="" min="" max="" eventTrigger="" units="" description="Transfer Mode" isArray="false" />
     <ECID id="940010021" valueType="Ascii" logicalName="CarrierRobot.TransferModeNumber" value="" min="" max="" eventTrigger="" units="" description="Transfer Mode Number" isArray="false" />
+    <ECID id="940010022" valueType="Ascii" logicalName="CarrierRobot.SafeHome" value="" min="" max="" eventTrigger="" units="" description="SafeHome" isArray="false" />
     <ECID id="940020001" valueType="Ascii" logicalName="CarrierRobot.CarrierRobotParameter.Parameter.P000.Axis" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
     <ECID id="940020002" valueType="Ascii" logicalName="CarrierRobot.CarrierRobotParameter.Parameter.P000.SettingItem" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
     <ECID id="940020003" valueType="Ascii" logicalName="CarrierRobot.CarrierRobotParameter.Parameter.P000.SetValue" value="" min="" max="" eventTrigger="" units="" description="" isArray="false" />
@@ -14526,6 +14527,7 @@
     <ALID id="330011017" logicalName="PM1.LoadingAreaExhaustMS321ToleranceWarning" description="LoadingAreaExhaustMS321 tolerance warning " category="EquipmentStatusWarning" enabled="false" eventSet="1330011017" eventClear="2330011017" />
     <ALID id="330011018" logicalName="PM1.VG32ToleranceAlarm" description="VG32 tolerance alarm " category="EquipmentStatusWarning" enabled="false" eventSet="1330011018" eventClear="2330011018" />
     <ALID id="330011019" logicalName="PM1.VG32ToleranceWarning" description="VG32 tolerance warning " category="EquipmentStatusWarning" enabled="false" eventSet="1330011019" eventClear="2330011019" />
+    <ALID id="330011020" logicalName="PM1.N2PurgeFaileAlarm" description="PM1 N2 Purge Faile Alarm" category="EquipmentStatusWarning" enabled="false" eventSet="1330011020" eventClear="2330011020" />
     <ALID id="330020001" logicalName="PM1.AlarmHighLimit.AI_APCExternalHeaterTempPV" description="APC external heater Temp.PV High Limit" category="EquipmentStatusWarning" enabled="false" eventSet="1330020001" eventClear="2330020001" />
     <ALID id="330020002" logicalName="PM1.AlarmHighLimit.AI_APCRingHeaterTempPV" description="APC ring heater Temp.PV High Limit" category="EquipmentStatusWarning" enabled="false" eventSet="1330020002" eventClear="2330020002" />
     <ALID id="330020003" logicalName="PM1.AlarmHighLimit.AI_CapHeaterTempPV" description="Cap heater Temp.PV High Limit" category="EquipmentStatusWarning" enabled="false" eventSet="1330020003" eventClear="2330020003" />

BIN
Furnace/FurnaceRT/Config/VIDs/Equipment_VIDs_20250613.xlsx


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
Furnace/FurnaceRT/Config/VIDs/_ALID.xml


Dosya farkı çok büyük olduğundan ihmal edildi
+ 1 - 1
Furnace/FurnaceRT/Config/VIDs/_ECID.xml


Dosya farkı çok büyük olduğundan ihmal edildi
+ 134 - 123
Furnace/FurnaceRT/Equipments/PMs/PMModuleAlarmDefine.cs


+ 95 - 25
Furnace/FurnaceRT/Equipments/PMs/PMN2Purge.cs

@@ -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"));