Browse Source

fix Recipe N2Purge联动FIMSN2purgeConfig与LA N2pugre功能

jiangjy 1 month ago
parent
commit
8d2230cbfe

+ 1 - 0
FrameworkLocal/Common/Common.csproj

@@ -331,6 +331,7 @@
     <Compile Include="EtherCAT\Hongke\WcfCifx.cs" />
     <Compile Include="EtherCAT\Hongke\WcfCifxServiceClient.cs" />
     <Compile Include="Event\AlarmEventItem.cs" />
+    <Compile Include="Extens\DictionaryExtensions.cs" />
     <Compile Include="FAServices\DataVariables.cs" />
     <Compile Include="FAServices\E40s\FAProcessJob.cs" />
     <Compile Include="FAServices\E40s\ProcessJobState.cs" />

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

@@ -16,7 +16,8 @@ namespace MECF.Framework.Common.CommonData.SorterDefines
         ATMMode,
         [Description("Manual Mode")]
         ManualMode,
-
+        [Description("None")]
+        None,
         Manual_phase1,
         Manual_phase2,
         Manual_phase3,

+ 0 - 1
FrameworkLocal/Common/Jobs/ProcessJobInfo.cs

@@ -82,7 +82,6 @@ namespace MECF.Framework.Common.Jobs
         public bool IsMapBeforeDischarge { get; set; }
         public bool IsNeedChargeDummyWafer { get; set; }
         public bool IsStandbyStarted { get; set; }
-        public bool IsN2PurgeMode { get; set; }
         public string N2PurgeModeStr { get; set; }
 
         public ProcessJobInfo()

+ 137 - 18
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -44,6 +44,8 @@ using System.Threading;
 using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
 using System.Reflection;
 using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
+using MECF.Framework.Common.Tolerance;
+using MECF.Framework.Common.CommonData.SorterDefines;
 
 namespace FurnaceRT.Equipments.Jobs
 {
@@ -82,6 +84,7 @@ namespace FurnaceRT.Equipments.Jobs
         private Dictionary<string, R_TRIG> _waferStatusAlarmTrigDic = new Dictionary<string, R_TRIG>();
         private Dictionary<string, R_TRIG> _dummyWaferCheckTrigDic = new Dictionary<string, R_TRIG>();
         private Dictionary<string, R_TRIG> _logTrigDic = new Dictionary<string, R_TRIG>();
+        private Dictionary<string, Tuple<FilterChecker, double>> _fimsCheckOxDensityDict = new Dictionary<string, Tuple<FilterChecker, double>>();
         private bool _isCoolingSkip = false;
         public bool HasJobRunning
         {
@@ -608,6 +611,14 @@ namespace FurnaceRT.Equipments.Jobs
                 }
             }
 
+            foreach (var item in _lstFIMSs)
+            {
+                if (!_fimsCheckOxDensityDict.ContainsKey(item.Module.ToString()))
+                {
+                    _fimsCheckOxDensityDict.Add(item.Module.ToString(), Tuple.Create(new FilterChecker(), SC.GetValue<double>("PM1.N2Purge.N2PurgeFOUPO2CheckSV")));
+                }
+            }
+
             var pjJobId = param["PJID"].ToString();
             var cjJobId = param["CJID"].ToString();
             ControlJobInfo cj = null;
@@ -645,7 +656,6 @@ namespace FurnaceRT.Equipments.Jobs
             pj.ProcessingState = EnumProcessingState.WaitingMaterial;
             pj.CoolTimeSec = coolTime;
             pj.IsEmptyLayout = !layoutRecipeDataExpert.Items.Any(x => x != "----");
-            pj.IsN2PurgeMode = recipeHead.IsN2PurgeMode;
             pj.N2PurgeModeStr = recipeHead.N2PurgeModeStr;
 
             if (useStockers.Any() && !CheckChargeRule(pj, out bool waferShort, false, true, out reason))
@@ -1503,10 +1513,10 @@ namespace FurnaceRT.Equipments.Jobs
             pj.SetState(EnumProcessJobState.Processing);
             pj.ProcessingState = EnumProcessingState.Charging;
             pj.BeginTime = DateTime.Now;
-
-            if (pj.IsN2PurgeMode)
+            var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
+            var laIsNeedXxygenPressure = pmModule.CheckLAIsNeedOxygenPressure(pj.N2PurgeModeStr);
+            if (laIsNeedXxygenPressure)
             {
-                var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
                 //pmModule?.SetN2PurgeProcess(true);
                 //if (SC.ContainsItem("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable"))
                 //    pmModule?.SetN2PurgeLAO2CheckFirstEnable(true);
@@ -1658,6 +1668,7 @@ namespace FurnaceRT.Equipments.Jobs
                 MonitorCassetteRobotPlaceStockerTask();
             }
         }
+
         private void MonitorFIMSTask()
         {
             if (!_lstProcessJobs.Any())
@@ -1676,9 +1687,41 @@ namespace FurnaceRT.Equipments.Jobs
                         continue;
 
                     var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
-                    if (!CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsLoadCompleted && st.Load(pj.IsN2PurgeMode, "Charging"))
+                    if (!CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsLoadCompleted)
                     {
-                        return;
+                        var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+
+                        var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
+
+                        if (isCheckO2)
+                        {
+
+                            _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
+                            _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(_fimsCheckOxDensityDict[st.Module.ToString()].Item2));
+                            if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
+                            {
+                                if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                                {
+                                    _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Restart();
+                                    LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},wait load Charging。A");
+
+                                    return;
+                                }
+                            }
+
+                        }
+                        else
+                        {
+                            if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                            {
+                                LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},direct load Charging。B");
+
+
+                                return;
+                            }
+
+                        }
+
                     }
                 }
             }
@@ -1694,9 +1737,37 @@ namespace FurnaceRT.Equipments.Jobs
                     var wafers = WaferManager.Instance.GetWafers(st.Module);
                     if (wafers != null)
                     {
-                        if (CheckCarrierNoHasEmptySlot(st.Module) && !fimsDevice.IsLoadCompleted && st.Load(pj.IsN2PurgeMode, "Discharging"))
+                        if (CheckCarrierNoHasEmptySlot(st.Module) && !fimsDevice.IsLoadCompleted)
                         {
-                            return;
+                            var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+                            var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
+                            if (isCheckO2)
+                            {
+                                _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
+                                _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(_fimsCheckOxDensityDict[st.Module.ToString()].Item2));
+                                if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
+                                {
+                                    if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                                    {
+                                        _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Restart();
+                                        LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},wait load Charging。C");
+
+                                        return;
+                                    }
+                                }
+
+                            }
+                            else
+                            {
+                                if (st.Load(CheckFimsIsNeedOxygenPressure, "Discharging"))
+                                {
+                                    LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},direct load Charging。D");
+
+                                    return;
+                                }
+
+                            }
+
                         }
                     }
                 }
@@ -1709,9 +1780,37 @@ namespace FurnaceRT.Equipments.Jobs
                     var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
                     if (carrier != null)
                     {
-                        if (!CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && !fimsDevice.IsLoadCompleted && st.Load(pj.IsN2PurgeMode, "Discharging"))
+
+                        if (!CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && !fimsDevice.IsLoadCompleted)
                         {
-                            return;
+                            var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+                            var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
+                            if (isCheckO2)
+                            {
+                                _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
+                                _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(_fimsCheckOxDensityDict[st.Module.ToString()].Item2));
+                                if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
+                                {
+                                    if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                                    {
+                                        _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Restart();
+                                        LOG.Info($"FIMS :{st.Module}  FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},wait load Charging");
+
+                                        return;
+                                    }
+                                }
+                            }
+                            else
+                            {
+                                if (st.Load(CheckFimsIsNeedOxygenPressure, "Discharging"))
+                                {
+                                    LOG.Info($"FIMS :{st.Module}  FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},direct load Discharging");
+
+                                    return;
+                                }
+
+                            }
+
                         }
                     }
                 }
@@ -1726,7 +1825,8 @@ namespace FurnaceRT.Equipments.Jobs
                         continue;
 
                     var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
-                    if (CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsUnloadCompleted && st.Unload(pj.IsN2PurgeMode, "Charging"))
+                    //    var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
+                    if (CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsUnloadCompleted && st.Unload(false, "Charging"))
                     {
                         return;
                     }
@@ -1751,9 +1851,15 @@ namespace FurnaceRT.Equipments.Jobs
                             continue;
                         GetWaferSlotsAndWaferType(carrier, out List<int> slots, out WaferType waferType);
 
-                        if (fims != null && slots != null && GetWaferCountRelatedToWaferRobot(waferType, false) <= slots.Count && CheckCarrierCanPickFromStocker(ModuleName.CarrierRobot) && fims.Unload(pj.IsN2PurgeMode, "Charging"))
+                        if (fims != null && slots != null && GetWaferCountRelatedToWaferRobot(waferType, false) <= slots.Count && CheckCarrierCanPickFromStocker(ModuleName.CarrierRobot))
                         {
-                            return;
+                            //var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
+                            if (fims.Unload(false, "Charging"))
+                            {
+                                return;
+
+                            }
+
                         }
                     }
                 }
@@ -1770,9 +1876,14 @@ namespace FurnaceRT.Equipments.Jobs
                     var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
                     if (carrier != null)
                     {
-                        if (!CheckCarrierHasEmptySlot(st.Module) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted && st.Unload(pj.IsN2PurgeMode, "Discharging"))
+                        //   var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr);
+
+                        if (!CheckCarrierHasEmptySlot(st.Module) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted)
                         {
-                            return;
+                            if (st.Unload(false, "Discharging"))
+                            {
+                                return;
+                            }
                         }
                     }
                 }
@@ -1785,9 +1896,16 @@ namespace FurnaceRT.Equipments.Jobs
                     var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
                     if (carrier != null)
                     {
-                        if (CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted && st.Unload(pj.IsN2PurgeMode, "Discharging"))
+                        //  var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr);
+
+
+                        if (CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted)
                         {
-                            return;
+                            if (st.Unload(false, "Discharging"))
+                            {
+                                return;
+
+                            }
                         }
                     }
                 }
@@ -6441,7 +6559,8 @@ namespace FurnaceRT.Equipments.Jobs
                             var _boatslotmap = GetBoatSlotMap();
                             _faCallback.StartDischarge(pj, _boatslotmap);
                             LOG.Write($"Cooling completed {pj.CoolTimeSec}");
-                            if (pj.IsN2PurgeMode)
+                            var laIsNeedXxygenPressure = pmModule.CheckLAIsNeedOxygenPressure(pj.N2PurgeModeStr);
+                            if (laIsNeedXxygenPressure)
                             {
                                 //pmModule?.SetN2PurgeProcess(true);
                                 //if (SC.ContainsItem("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable"))

+ 21 - 2
Furnace/FurnaceRT/Equipments/PMs/PMModule.cs

@@ -38,6 +38,8 @@ using MECF.Framework.Common.Utilities;
 using System.Windows.Documents;
 using MECF.Framework.Common.CommonData.EnumData;
 using MECF.Framework.Common.CommonData;
+using System.ServiceModel;
+using FabConnect.SecsGemInterface.Application.Objects.ObjectService;
 
 namespace FurnaceRT.Equipments.PMs
 {
@@ -1269,9 +1271,26 @@ namespace FurnaceRT.Equipments.PMs
             }
             else
             {
-                return SC.ContainsItem("PM1.SelectN2PurgeMode") ? SC.GetStringValue("PM1.SelectN2PurgeMode") : N2PurgeModeEnum.ManualMode.ToString();
-
+                return GetLACurrectN2purgeMode();
+            }
+        }
+        public string IsATMMode(string str)
+        {
+            if ((str == N2PurgeModeEnum.ATMMode.ToString()) || (str == N2PurgeModeEnum.ATMMode.ToDescription()) || (str.StartsWith("ATM")))
+            {
+                return N2PurgeModeEnum.ATMMode.ToString();
             }
+            return str;
+        }
+        public bool GetFIMStN2purgeConfig()
+        {
+
+            return SC.ContainsItem("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") ? SC.GetValue<bool>("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") : false;
+        }
+        public string GetLACurrectN2purgeMode()
+        {
+
+            return SC.ContainsItem("PM1.SelectN2PurgeMode") ? SC.GetStringValue("PM1.SelectN2PurgeMode") : N2PurgeModeEnum.ManualMode.ToString();
         }
         private bool FsmStartContinue(object[] param)
         {

+ 112 - 3
Furnace/FurnaceRT/Equipments/PMs/PMN2Purge.cs

@@ -555,7 +555,7 @@ namespace FurnaceRT.Equipments.PMs
         {
             return ValveAV202.DOOpen.Value;
         }
-        private bool GetN2PurgeUnder20PPMStatus(double value = 20)
+        public bool GetN2PurgeUnder20PPMStatus(double value = 20)
         {
 
             return ConcentrationO2.Value < value;
@@ -711,11 +711,21 @@ namespace FurnaceRT.Equipments.PMs
             SetN2PurgeFOUPO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.N2PurgeFOUPO2CheckSV"));
         }
 
-        public void InitN2PurgeMode(string n2PurgeModeStr, bool isN2Purge)
+        /// <summary>
+        /// Job start的时候,就根据Process的配置判定是否需要进行LA压氧
+        /// </summary>
+        /// <param name="n2PurgeModeStr"></param>
+        public void InitN2PurgeMode(string n2PurgeModeStr)
         {
-            if (!isN2Purge)
+
+
+            if (string.IsNullOrEmpty(n2PurgeModeStr))
                 return;
 
+            if (n2PurgeModeStr.ToLower() == "none")
+                return;
+
+
             if (SC.ContainsItem("PM1.RecipeRelevancyN2Purge") && SC.GetValue<bool>("PM1.RecipeRelevancyN2Purge") && SC.ContainsItem("PM1.SelectN2PurgeMode"))
             {
 
@@ -724,5 +734,104 @@ namespace FurnaceRT.Equipments.PMs
                 RestAllN2PrugeRD();
             }
         }
+
+        public bool CheckFimsIsNeedOxygenPressure(string recipeN2PurgeModeStr, out bool isCheckO2)
+        {
+            isCheckO2 = false;
+            if (string.IsNullOrEmpty(recipeN2PurgeModeStr))
+                return false;
+
+            if (recipeN2PurgeModeStr.ToLower().Equals("n2 purge"))
+            {
+                recipeN2PurgeModeStr = N2PurgeModeEnum.N2PurgeMode.ToString();
+            }
+            if (recipeN2PurgeModeStr.ToLower().Contains("atm"))
+            {
+                recipeN2PurgeModeStr = IsATMMode(recipeN2PurgeModeStr);
+            }
+
+
+            var n2PurgeEnum = (N2PurgeModeEnum)Enum.Parse(typeof(N2PurgeModeEnum), recipeN2PurgeModeStr);
+
+            if (n2PurgeEnum == N2PurgeModeEnum.ATMMode)
+                return false;
+
+            var currectN2PurgeModel = GetLACurrectN2purgeMode();
+            var fimsN2PurgeConfig = GetFIMStN2purgeConfig();
+
+            if (n2PurgeEnum == N2PurgeModeEnum.N2PurgeMode)
+            {
+
+                if (currectN2PurgeModel == N2PurgeModeEnum.N2PurgeMode.ToString())
+                {
+                    if (fimsN2PurgeConfig)
+                    {
+                        isCheckO2 = true;
+                        return true;
+                    }
+                    else
+                    {
+                        return false;
+                    }
+                }
+                if (currectN2PurgeModel == N2PurgeModeEnum.ATMMode.ToString())
+                {
+                    if (fimsN2PurgeConfig)
+                    {
+                        isCheckO2 = true;
+                        return true;
+                    }
+                    else
+                    {
+                        return false;
+                    }
+                }
+
+            }
+            if (n2PurgeEnum == N2PurgeModeEnum.None)
+            {
+
+                if (currectN2PurgeModel == N2PurgeModeEnum.ATMMode.ToString())
+                {
+                    return false;
+                }
+                if (currectN2PurgeModel == N2PurgeModeEnum.N2PurgeMode.ToString())
+                {
+                    if (fimsN2PurgeConfig)
+                    {
+                        isCheckO2 = true;
+                        return true;
+                    }
+                    else
+                    {
+                        return false;
+                    }
+                }
+
+            }
+
+            return false;
+        }
+        public bool CheckLAIsNeedOxygenPressure(string recipeN2PurgeModeStr)
+        {
+            if (string.IsNullOrEmpty(recipeN2PurgeModeStr))
+                return false;
+
+            if (recipeN2PurgeModeStr.ToLower() == "none")
+                return false;
+
+            if (recipeN2PurgeModeStr.ToLower() == "atm")
+            {
+                recipeN2PurgeModeStr = N2PurgeModeEnum.ATMMode.ToString();
+
+            }
+            var n2PurgeEnum = (N2PurgeModeEnum)Enum.Parse(typeof(N2PurgeModeEnum), recipeN2PurgeModeStr);
+
+            if (n2PurgeEnum == N2PurgeModeEnum.N2PurgeMode || n2PurgeEnum == N2PurgeModeEnum.ATMMode)
+                return true;
+
+
+            return false;
+        }
     }
 }

+ 3 - 1
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/Process.cs

@@ -290,7 +290,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 
             PMModule.InitAlarmCondition(PMModule.RecipeRunningInfo.Head.AlarmCondition);
             PMModule.InitLeakCheck(PMModule.RecipeRunningInfo.Head.LeakCheck);
-            PMModule.InitN2PurgeMode(PMModule.RecipeRunningInfo.Head.N2PurgeModeStr, PMModule.RecipeRunningInfo.Head.IsN2PurgeMode);
+            PMModule.InitN2PurgeMode(PMModule.RecipeRunningInfo.Head.N2PurgeModeStr);
             ResetTrig();
 
             Notify($"Start");
@@ -1795,5 +1795,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                     curSteps[currentStepNumber].StepName, (float)curSteps[currentStepNumber].StepTime, "", "", 0, "");
             _fdc.Start(curSteps[currentStepNumber].RecipeCommands);
         }
+
+     
     }
 }

+ 0 - 1
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/RecipeHead.cs

@@ -14,7 +14,6 @@
         public string TempCorrect { get; set; }
         public string TempPID { get; set; }
         public string ProfileCondition { get; set; }
-        public bool IsN2PurgeMode { get; set; }
 
         public string N2PurgeModeStr { get; set; }
     }

+ 1 - 5
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/RecipeParser.cs

@@ -206,13 +206,9 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                         recipeHead.ProfileCondition = nodeConfig.HasAttribute("Combination.ProfileCondition") ? nodeConfig.Attributes["Combination.ProfileCondition"].Value : "";
                         if (nodeConfig.HasAttribute("N2PurgeMode"))
                         {
-                            recipeHead.IsN2PurgeMode = nodeConfig.Attributes["N2PurgeMode"].Value.Replace(" ", "").ToLower() != "none";
                             recipeHead.N2PurgeModeStr = nodeConfig.Attributes["N2PurgeMode"].Value;
                         }
-                        else
-                        {
-                            recipeHead.IsN2PurgeMode = false;
-                        }
+                    
 
                         if (string.IsNullOrEmpty(recipeHead.AbortRecipe))
                             recipeHead.AbortRecipe = SC.GetStringValue("System.Recipe.Abort Recipe");

+ 6 - 22
Furnace/FurnaceRT/Equipments/Schedulers/SchedulerFIMS.cs

@@ -93,35 +93,19 @@ namespace FurnaceRT.Equipments.Schedulers
         public bool Load(bool isN2PurgeMode = false, string transferMode = "")
         {
             _task = TaskType.Load;
-            bool isNeedN2Purge = false;
-            if(isN2PurgeMode)
-            {
-                if (transferMode == "Charging" && SC.ContainsItem("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable"))
-                    isNeedN2Purge = true;
-
-                if (transferMode == "Discharging" && SC.ContainsItem("PM1.N2Purge.WaferDischarge.FOUPN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferDischarge.FOUPN2PurgeEnable"))
-                    isNeedN2Purge = true;
-            }
-            _pm.InvokeLoad(isNeedN2Purge);
+       
+            _pm.InvokeLoad(isN2PurgeMode);
 
-            LogTaskStart(_task, $"{Module} load start, N2 purge={isNeedN2Purge}");
+            LogTaskStart(_task, $"{Module} load start, N2 purge={isN2PurgeMode}");
             return true;
         }
         public bool Unload(bool isN2PurgeMode = false, string transferMode = "")
         {
             _task = TaskType.Unload;
-            bool isNeedN2Purge = false;
-            if (isN2PurgeMode)
-            {
-                if (transferMode == "Charging" && SC.ContainsItem("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable"))
-                    isNeedN2Purge = true;
-
-                if (transferMode == "Discharging" && SC.ContainsItem("PM1.N2Purge.WaferDischarge.FOUPN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferDischarge.FOUPN2PurgeEnable"))
-                    isNeedN2Purge = true;
-            }
-            _pm.InvokeUnload(isNeedN2Purge);
+     
+            _pm.InvokeUnload(isN2PurgeMode);
 
-            LogTaskStart(_task, $"{Module} unload start, N2 purge={isNeedN2Purge}");
+            LogTaskStart(_task, $"{Module} unload start, N2 purge={isN2PurgeMode}");
             return true;
         }
         public bool CheckTaskDone()