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