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