Browse Source

fix UI Status N2Purge模块 不同阶段应该展示不同阶段卡控的氧气浓度

jiangjy 1 week ago
parent
commit
2ccdf220a6

+ 1 - 0
FrameworkLocal/Common/CommonData/SorterDefines/N2PurgeModeEnum.cs

@@ -24,6 +24,7 @@ namespace MECF.Framework.Common.CommonData.SorterDefines
         Manual_phase4,
         Manual_phase5,
         
+        Idle,
         FoupEnter,
         WaferCharge,
         WaferDisCharge,

+ 4 - 0
Furnace/FurnaceRT/Config/System.sccfg

@@ -4614,8 +4614,12 @@
 		</configs>
 		<!--是否开启Recipe 关联N2PurgeMode/ATMMode功能-->
 		<config default="true" name="RecipeRelevancyN2Purge" description="Is Open Recipe Relevancy N2Purge" max="" min="" paramter="true;false" tag="ReadOnlySelection" unit="" type="Bool" />
+		<!--当前压氧模式-->
 		<config default="" name="SelectN2PurgeMode" description="" max="" min="" paramter="" tag="" unit="" type="String" visible="false"/>
+		<!--LA侧5阶段参数-->
 		<config default="" name="SelectN2PurgeModePhase" description="" max="" min="" paramter="" tag="" unit="" type="String" visible="false"/>
+		<!--N2Purge 阶段-->
+		<config default="" name="N2PurgeModePhase" description="" max="" min="" paramter="" tag="" unit="" type="String" visible="false"/>
 		<config default="Furnace" name="RecipeChamberType" description="Recipe Chamber Type" max="" min="" paramter="" tag="" unit="" type="String" />
 		<!--<config default="147" name="SlotCount" description="Cassette Slot Count" max="150" min="1" paramter="" tag="" unit=""  type="Integer" />-->
 		<config default="10" name="HomeTimeout" description="Home Time Out" max="60" min="1" paramter="" tag="" unit="s" type="Integer" />

+ 2 - 0
Furnace/FurnaceRT/Equipments/Boats/BoatMove.cs

@@ -217,11 +217,13 @@ namespace FurnaceRT.Equipments.Boats
                     return true;
 
                 _filterChecker.Monitor(pm.GetN2PurgeUnder20PPMStatus(o2LimtData) && pm.CheckIsLASide());
+                pm.SetN2PurgeModePhase(boatMoveN2Purge);
                 if (_filterChecker.Trig)
                 {
                     pm.IsWait = false;
                     LOG.Info($"{boatMoveN2Purge} Check O2Desity,TransferRoomO2DensityCheckEnable={isCheckO2Enbale},LA LimtData={o2LimtData},Wait {boatMoveN2Purge}。A");
                     _filterChecker.Restart();
+                    pm.SetN2PurgeModePhase(N2PurgeModeEnum.Idle.ToString());
                     return true;
                 }
                 if (!pm.IsWait)

+ 2 - 0
Furnace/FurnaceRT/Equipments/FIMSs/FIMSLoadRoutine.cs

@@ -110,6 +110,7 @@ namespace FurnaceRT.Equipments.FIMSs
 
 
                 CheckLoadFinish((int)RoutineStep.CheckLoadFinish, _timeout);
+             
 
 
             }
@@ -124,6 +125,7 @@ namespace FurnaceRT.Equipments.FIMSs
             }
             _fimsModule.FIMSDevice.IsLoadCompleted = true;
             _fimsModule.Stop();
+            _pmModule.SetN2PurgeModePhase(N2PurgeModeEnum.Idle.ToString());
             Notify($"{_fimsModule.Name} {Name} finished");
 
             return Result.DONE;

+ 3 - 0
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -1731,6 +1731,7 @@ namespace FurnaceRT.Equipments.Jobs
 
                             _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
                             _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(waferChargeLAO2CheckSV) && pm.CheckIsLASide());
+                            pm.SetN2PurgeModePhase(N2PurgeModeEnum.WaferCharge.ToString());
                             if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
                             {
                                 if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferCharge.ToString()))
@@ -1792,6 +1793,7 @@ namespace FurnaceRT.Equipments.Jobs
                             {
                                 _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
                                 _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(waferDisChargeLAO2CheckSV) && pm.CheckIsLASide());
+                                pm.SetN2PurgeModePhase(N2PurgeModeEnum.WaferDisCharge.ToString());
                                 if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
                                 {
                                     if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferDisCharge.ToString()))
@@ -1846,6 +1848,7 @@ namespace FurnaceRT.Equipments.Jobs
                             {
                                 _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
                                 _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(waferDisChargeLAO2CheckSV) && pm.CheckIsLASide());
+                                pm.SetN2PurgeModePhase(N2PurgeModeEnum.WaferDisCharge.ToString());
                                 if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
                                 {
                                     if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferDisCharge.ToString()))

+ 6 - 4
Furnace/FurnaceRT/Equipments/Jobs/TransferJob.cs

@@ -602,6 +602,8 @@ namespace FurnaceRT.Equipments.Jobs
                                 {
                                     tj.FimsCheckOxDensityDict[fims.Module.ToString()].Item1.CheckInterval = 1;
                                     tj.FimsCheckOxDensityDict[fims.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(foupEnterLAO2CheckSV) && pm.CheckIsLASide());
+                               
+                                    pm.SetN2PurgeModePhase(N2PurgeModeEnum.FoupEnter.ToString());
                                     if (tj.FimsCheckOxDensityDict[fims.Module.ToString()].Item1.Trig)
                                     {
                                         if (fims.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.FoupEnter.ToString()))
@@ -674,7 +676,7 @@ namespace FurnaceRT.Equipments.Jobs
                     continue;
 
                 if (tj.CarrierParas.Any(x => x.Stocker == carrier.InternalModuleName))
-                {                 
+                {
                     var carrierPara = tj.CarrierParas.FirstOrDefault(x => x.Stocker == carrier.InternalModuleName);
                     if (carrierPara != null && _waferRobot.Map(fims.Module, carrierPara.WaferCount, carrierPara.SlotMap, carrierPara.IsCompareWithSlotMap, true, Hand.Blade1))
                     {
@@ -860,7 +862,7 @@ namespace FurnaceRT.Equipments.Jobs
                                 //有job执行且在charging和discharge状态,先不执行mapping
                                 if (DATA.Poll("Scheduler.CurrentProcessJob") is ProcessJobInfo job && job != null &&
                           (job.ProcessingState == EnumProcessingState.CoolingBeforeDischarge || job.ProcessingState == EnumProcessingState.Charging || job.ProcessingState == EnumProcessingState.Discharging
-                         || (job.ProcessingState == EnumProcessingState.Processing && DATA.Poll("PM1.RemainTimeToEnterCooling") is double t && t <=SC.GetValue<double>("System.Scheduler.LoadMappingForecastTime"))))
+                         || (job.ProcessingState == EnumProcessingState.Processing && DATA.Poll("PM1.RemainTimeToEnterCooling") is double t && t <= SC.GetValue<double>("System.Scheduler.LoadMappingForecastTime"))))
                                 {
                                     continue;
                                 }
@@ -1046,9 +1048,9 @@ namespace FurnaceRT.Equipments.Jobs
                 foreach (var st in _lstFIMSs)
                 {
                     //有job执行且在charging和discharge状态,先不执行mapping
-                    if (DATA.Poll("Scheduler.CurrentProcessJob") is ProcessJobInfo job && job!=null&&
+                    if (DATA.Poll("Scheduler.CurrentProcessJob") is ProcessJobInfo job && job != null &&
                         (job.ProcessingState == EnumProcessingState.CoolingBeforeDischarge || job.ProcessingState == EnumProcessingState.Charging || job.ProcessingState == EnumProcessingState.Discharging
-                       ||(job.ProcessingState == EnumProcessingState.Processing&&DATA.Poll("PM1.RemainTimeToEnterCooling") is double t && t <= SC.GetValue<double>("System.Scheduler.LoadMappingForecastTime"))))
+                       || (job.ProcessingState == EnumProcessingState.Processing && DATA.Poll("PM1.RemainTimeToEnterCooling") is double t && t <= SC.GetValue<double>("System.Scheduler.LoadMappingForecastTime"))))
                     {
                         continue;
                     }

+ 65 - 2
Furnace/FurnaceRT/Equipments/PMs/PMN2Purge.cs

@@ -212,6 +212,18 @@ namespace FurnaceRT.Equipments.PMs
             }
             return true;
         }
+        public void SetN2PurgeModePhase(string setValue)
+        {
+            if (SC.ContainsItem("PM1.N2PurgeModePhase"))
+            {
+                var data = SC.GetStringValue("PM1.N2PurgeModePhase");
+                if (data != setValue)
+                {
+                    SC.SetItemValue("PM1.N2PurgeModePhase", setValue);
+                }
+
+            }
+        }
         /// <summary>
         /// TODO:这里展示数据的逻辑 不正确,待明确逻辑
         /// </summary>
@@ -222,8 +234,55 @@ namespace FurnaceRT.Equipments.PMs
             {
                 if ((SensorO2DetectSideFIMS1 != null && SensorO2DetectSideFIMS1.Value) || (SensorO2DetectSideFIMS2 != null && SensorO2DetectSideFIMS2.Value))
                 {
-                    return (float)SC.GetValue<double>("PM1.N2Purge.N2PurgeFOUPO2CheckSV");
-
+                    if (SC.ContainsItem("PM1.N2PurgeModePhase"))
+                    {
+                        var n2PurgeModePhase = SC.GetStringValue("PM1.N2PurgeModePhase");
+                        if (n2PurgeModePhase == N2PurgeModeEnum.WaferCharge.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.WaferCharge.FOUPO2CheckSV");
+                        }
+                        else if (n2PurgeModePhase == N2PurgeModeEnum.FoupEnter.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.FoupEnter.FOUPO2CheckSV");
+                        }
+                        else if (n2PurgeModePhase == N2PurgeModeEnum.WaferDisCharge.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.WaferDisCharge.FOUPO2CheckSV");
+                        }
+                        return (float)SC.GetValue<double>("System.N2PurgeData");
+                    }
+                }
+                if (CheckIsLASide())
+                {
+                    if (SC.ContainsItem("PM1.N2PurgeModePhase"))
+                    {
+                        var n2PurgeModePhase = SC.GetStringValue("PM1.N2PurgeModePhase");
+                        if (n2PurgeModePhase == N2PurgeModeEnum.BoatLoad.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.BoatLoad.LAO2CheckSV");
+                        }
+                        if (n2PurgeModePhase == N2PurgeModeEnum.BoatUnLoad.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.BoatUnLoad.LAO2CheckSV");
+                        }
+                        if (n2PurgeModePhase == N2PurgeModeEnum.FoupEnter.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.FoupEnter.LAO2CheckSV");
+                        }
+                        if (n2PurgeModePhase == N2PurgeModeEnum.WaferCharge.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.WaferCharge.LAO2CheckSV");
+                        }
+                        if (n2PurgeModePhase == N2PurgeModeEnum.WaferDisCharge.ToString())
+                        {
+                            return (float)SC.GetValue<double>("PM1.N2Purge.WaferDisCharge.LAO2CheckSV");
+                        }
+                        if (n2PurgeModePhase == N2PurgeModeEnum.Idle.ToString())
+                        {
+                            return (float)SC.GetValue<double>("System.N2PurgeData");
+                        }
+                        return (float)SC.GetValue<double>("System.N2PurgeData");
+                    }
                 }
                 return _n2PurgeData;
             }
@@ -709,6 +768,10 @@ namespace FurnaceRT.Equipments.PMs
                 var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToFOUPTime");
                 TrigN2PurgeExchangeFOUPTOFOUPWaitTime.SetAOTrigger(time, out _);
             }
+            if (SC.ContainsItem("PM1.N2PurgeModePhase"))
+            {
+                SC.SetItemValue("PM1.N2PurgeModePhase", n2PurgeModeEnum);
+            }
             //这2个SV下发值应该根据什么阶段下发什么值
             if (n2PurgeModeEnum == N2PurgeModeEnum.WaferCharge.ToString())
             {

+ 7 - 6
Furnace/FurnaceSimulator/Instances/SimulatorSystem.cs

@@ -1007,26 +1007,27 @@ namespace FurnaceSimulator.Instances
             if (IO.DI[$"{module}.DI_{fims}N2PurgeValveOpened"] != null && IO.DO[$"{module}.DO_{fims}N2PurgeValveOpen"] != null) IO.DI[$"{module}.DI_{fims}N2PurgeValveOpened"].Value = IO.DO[$"{module}.DO_{fims}N2PurgeValveOpen"].Value;
             if (IO.DI[$"{module}.DI_{fims}N2PurgeValveClosed"] != null && IO.DO[$"{module}.DO_{fims}N2PurgeValveClose"] != null) IO.DI[$"{module}.DI_{fims}N2PurgeValveClosed"].Value = IO.DO[$"{module}.DO_{fims}N2PurgeValveClose"].Value;
 
-
-            if (IO.DO[$"PM1.DO_N2PURGEPROCESS"] != null && IO.DO[$"PM1.DO_N2PURGEPROCESS"].Value && IO.DO[$"{module}.DO_{fims}LoadCommand"].Value)
+            if (IO.DO[$"{module}.DO_{fims}LoadCommand"].Value)
             {
                 IO.DI[$"PM1.DI_O2_Detect_Side_{fims}"].Value = true;
+                IO.DI[$"PM1.DI_O2_Detect_Side_LA"].Value = false;
             }
             else
             {
-
                 IO.DI[$"PM1.DI_O2_Detect_Side_{fims}"].Value = false;
-
             }
+
+
             if (IO.DI[$"PM1.DI_O2_Detect_Side_FIMS1"].Value || IO.DI[$"PM1.DI_O2_Detect_Side_FIMS2"].Value)
             {
                 IO.DI[$"PM1.DI_O2_Detect_Side_LA"].Value = false;
             }
-            else {
+            else
+            {
                 IO.DI[$"PM1.DI_O2_Detect_Side_LA"].Value = true;
 
             }
-        
+
         }
 
         private void MonitorBuffer()