Browse Source

优化N2Purge 逻辑

jiangjy 3 weeks ago
parent
commit
2dee2d8f16

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


+ 64 - 17
Furnace/FurnaceRT/Equipments/PMs/PMN2Purge.cs

@@ -38,8 +38,7 @@ namespace FurnaceRT.Equipments.PMs
         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;
@@ -62,11 +61,9 @@ namespace FurnaceRT.Equipments.PMs
             _n2ToAirData = SC.ContainsItem($"System.N2PurgeData") ? SC.GetValue<double>("System.N2ToAirData") : 185000;
 
             _enableAbortN2purge = SC.ContainsItem($"PM1.N2Purge.EnableAbortN2purge") ? SC.GetValue<bool>("PM1.N2Purge.EnableAbortN2purge") : false;
-            _manualPhase2StabilityTime = SC.ContainsItem($"PM1.N2Purge.Manual_phase2.StabilityTime") ? SC.GetValue<double>("PM1.N2Purge.Manual_phase2.StabilityTime") : 0;
-            _manualPhase2NeedCheck = _manualPhase2StabilityTime > 0;
 
+            _manualPhase2StabilityTime = SC.ContainsItem($"PM1.N2Purge.Manual_phase2.StabilityTime") ? SC.GetValue<double>("PM1.N2Purge.Manual_phase2.StabilityTime") : 0;
             _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;
 
@@ -101,11 +98,6 @@ namespace FurnaceRT.Equipments.PMs
 
         private void MonitorN2Purge()
         {
-            if (IsAbortN2purge())
-            {
-                SC.SetItemValue("PM1.SelectN2PurgeMode", N2PurgeModeEnum.ATMMode.ToString());
-            }
-
             var selectN2PurgeMode = SC.ContainsItem("PM1.SelectN2PurgeMode") ? SC.GetStringValue("PM1.SelectN2PurgeMode") : "";
             if (string.IsNullOrEmpty(selectN2PurgeMode))
             {
@@ -116,8 +108,7 @@ namespace FurnaceRT.Equipments.PMs
 
         private void SetN2PurgeModeAction(string selectN2PurgeMode)
         {
-            double o2Density = GetO2Density();
-            bool laDoorOpenStatus = GetLADoorOpenStatus();
+          
             _N2PurgeMode = (N2PurgeModeEnum)Enum.Parse(typeof(N2PurgeModeEnum), selectN2PurgeMode);
 
             if (_N2PurgeMode == N2PurgeModeEnum.N2PurgeMode)
@@ -126,7 +117,7 @@ namespace FurnaceRT.Equipments.PMs
                 {
                     if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase2.ToString()].Invoke() && _canSwitchToPhase2)
                     {
-                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase2.ToString());
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase2.ToString(), "from Manual_phase1 to Manual_phase2");
                     }
                 }
                 else if (_currentPhase == N2PurgeModeEnum.Manual_phase2)
@@ -140,7 +131,7 @@ namespace FurnaceRT.Equipments.PMs
                     {
                         if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase1.ToString()].Invoke())
                         {
-                            SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase1.ToString());
+                            SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase1.ToString(), "from Manual_phase2 to Manual_phase1");
 
                             N2PurgeFaileAlarm.Set();
 
@@ -174,8 +165,63 @@ namespace FurnaceRT.Equipments.PMs
             if (_N2PurgeMode == N2PurgeModeEnum.ATMMode)
             {
 
-               
+                if (_currentPhase == N2PurgeModeEnum.Manual_phase3)
+                {
+
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase4.ToString()].Invoke())
+                    {
+                        if (!_allTimeDict[N2PurgeModeEnum.Manual_phase4.ToString()].IsRunning)
+                        {
+                            _allTimeDict[N2PurgeModeEnum.Manual_phase4.ToString()].Restart();
+                        }
+                        var second = _allTimeDict[N2PurgeModeEnum.Manual_phase4.ToString()].Elapsed.Seconds;
+
+                        if (second >= _manualPhase4StabilityTime)
+                        {
+                            SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase4.ToString(), "from Manual_phase3 to Manual_phase4");
+                            _allTimeDict[N2PurgeModeEnum.Manual_phase4.ToString()].Stop();
+                        }
+
+                    }
+                }
+                else if (_currentPhase == N2PurgeModeEnum.Manual_phase4)
+                {
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase5.ToString()].Invoke())
+                    {
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase5.ToString(), "from Manual_phase4 to Manual_phase5");
+                    }
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase3.ToString()].Invoke())
+                    {
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase3.ToString(), "from Manual_phase4 to Manual_phase3");
+                    }
 
+                }
+                else if (_currentPhase == N2PurgeModeEnum.Manual_phase5)
+                {
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase4.ToString()].Invoke())
+                    {
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase4.ToString(), "from Manual_phase5 to Manual_phase4");
+                    }
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase3.ToString()].Invoke())
+                    {
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase3.ToString(), "from Manual_phase5 to Manual_phase3");
+                    }
+                }
+                else
+                {
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase3.ToString()].Invoke())
+                    {
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase3.ToString());
+                    }
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase5.ToString()].Invoke())
+                    {
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase5.ToString());
+                    }
+                    if (_n2PurgeSequenceStatus[N2PurgeModeEnum.Manual_phase4.ToString()].Invoke())
+                    {
+                        SetN2PurgeValveData(N2PurgeModeEnum.Manual_phase4.ToString());
+                    }
+                }
             }
 
             //switch (_N2PurgeMode)
@@ -251,10 +297,11 @@ namespace FurnaceRT.Equipments.PMs
             }
 
         }
-        private void SetN2PurgeValveData(string mode)
+        private void SetN2PurgeValveData(string mode, string msg = "")
         {
+            string message = string.IsNullOrEmpty(msg) ? $"N2PurgeMode Trigger {mode},O2:{GetO2Density()}" : $"N2PurgeMode Trigger {msg},O2:{GetO2Density()}";
+            LOG.Info(message);
             var value = _n2PurgeSequenceAction[mode];
-            LOG.Info($"N2PurgeMode Trigger{mode},O2:{GetO2Density()}");
 
             _currentPhase = (N2PurgeModeEnum)Enum.Parse(typeof(N2PurgeModeEnum), mode);
 

+ 26 - 26
Furnace/FurnaceSimulator/Instances/SimulatorSystem.cs

@@ -694,8 +694,8 @@ namespace FurnaceSimulator.Instances
             //IO.DI[$"PM1.DI_IV2REALOUT"].Value = IO.DO[$"PM1.DO_IV2ValveOpen"].Value;
         }
         bool increasing = true;
-        int start = 184950;
-        int end = 185050;
+        int start = 0;
+        int end = 50;
         private void MonitorMFC()
         {
             for (int i = 1; i < 52; i++)
@@ -714,33 +714,33 @@ namespace FurnaceSimulator.Instances
             IO.AI[$"PM1.AI_MFM57AirFlowPV"].FloatValue = random.Next(1, 3);
 
 
-            if (increasing)
-            {
-                for (int i = start; i <= end; i++)
-                {
-                    IO.AI[$"PM1.AI_O2Concentration"].FloatValue = i;
+            //if (increasing)
+            //{
+            //    for (int i = start; i <= end; i++)
+            //    {
+            //        IO.AI[$"PM1.AI_O2Concentration"].FloatValue = i;
 
-                    if (_enableN2purge)
-                    {
-                        System.Threading.Thread.Sleep(300);
+            //        if (_enableN2purge)
+            //        {
+            //            System.Threading.Thread.Sleep(300);
 
-                    }
-                }
-                increasing = false; // 切换方向
-            }
-            else
-            {
-                for (int i = end; i >= start; i--)
-                {
-                    IO.AI[$"PM1.AI_O2Concentration"].FloatValue = i;
-                    if (_enableN2purge)
-                    {
-                        System.Threading.Thread.Sleep(300); // 延迟500毫秒以便观察输出
+            //        }
+            //    }
+            //    increasing = false; // 切换方向
+            //}
+            //else
+            //{
+            //    for (int i = end; i >= start; i--)
+            //    {
+            //        IO.AI[$"PM1.AI_O2Concentration"].FloatValue = i;
+            //        if (_enableN2purge)
+            //        {
+            //            System.Threading.Thread.Sleep(300); // 延迟500毫秒以便观察输出
 
-                    }
-                }
-                increasing = true; // 切换方向
-            }
+            //        }
+            //    }
+            //    increasing = true; // 切换方向
+            //}
             //IO.AI[$"PM1.AI_APCFeedback"].Value = IO.AO[$"PM1.AO_APCSetpoint"].Value;
         }