Browse Source

transferJob走 foupEnter判定逻辑以及参数下发
Auto Job走WaferCharge与WaferDisCharge判定逻辑与参数下发

jiangjy 2 weeks ago
parent
commit
9485a62b49

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

@@ -23,7 +23,9 @@ namespace MECF.Framework.Common.CommonData.SorterDefines
         Manual_phase3,
         Manual_phase4,
         Manual_phase5,
-
-
+        
+        FoupEnter,
+        WaferCharge,
+        WaferDisCharge,
     }
 }

+ 2 - 0
FrameworkLocal/Common/Jobs/TransferJobInfo.cs

@@ -4,6 +4,7 @@ using System.Runtime.Serialization;
 using System;
 using MECF.Framework.Common.SubstrateTrackings;
 using MECF.Framework.Common.Equipment;
+using MECF.Framework.Common.Tolerance;
 namespace MECF.Framework.Common.Jobs
 {
     public enum EnumTransferJobType
@@ -60,6 +61,7 @@ namespace MECF.Framework.Common.Jobs
 
         [DataMember]
         public DateTime CreateTime { get; set; }
+        public Dictionary<string, Tuple<FilterChecker, double>> FimsCheckOxDensityDict { get; set; }
 
         public TransferJobInfo()
         {

+ 7 - 3
Furnace/FurnaceRT/Equipments/FIMSs/FIMSLoadRoutine.cs

@@ -5,9 +5,11 @@ using Aitex.Core.Util;
 using Caliburn.Micro.Core;
 using FurnaceRT.Equipments.PMs;
 using FurnaceRT.Equipments.Systems;
+using MECF.Framework.Common.CommonData.SorterDefines;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.SubstrateTrackings;
 using System;
+using System.ServiceModel;
 
 namespace FurnaceRT.Equipments.FIMSs
 {
@@ -24,6 +26,7 @@ namespace FurnaceRT.Equipments.FIMSs
         private FIMSModule _fimsModule;
         private PMModule _pmModule;
         private bool _isNeedN2Purge;
+        private string _transferMode;
 
         public FIMSLoadRoutine(FIMSModule fimsModule)
         {
@@ -33,9 +36,10 @@ namespace FurnaceRT.Equipments.FIMSs
             _pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
         }
 
-        public Result Init(bool isNeedN2Purge)
+        public Result Init(bool isNeedN2Purge, string transferMode)
         {
             _isNeedN2Purge = isNeedN2Purge;
+            _transferMode = transferMode;
             return Result.DONE;
         }
 
@@ -69,8 +73,8 @@ namespace FurnaceRT.Equipments.FIMSs
                 //        return Result.FAIL;
                 //    }
                 //}
-            
-                _pmModule?.SetN2PurgeParameters();
+
+                _pmModule?.SetN2PurgeParameters(_transferMode);
 
             }
 

+ 20 - 8
Furnace/FurnaceRT/Equipments/FIMSs/FIMSModule.cs

@@ -21,6 +21,7 @@ using MECF.Framework.Common.SubstrateTrackings;
 using System;
 using System.Collections.Generic;
 using System.Linq;
+using System.ServiceModel;
 using System.Text;
 using System.Threading.Tasks;
 
@@ -163,7 +164,7 @@ namespace FurnaceRT.Equipments.FIMSs
 
         private void InitData()
         {
-            
+
             DATA.Subscribe($"{Module}.MappingData", () => new List<AITWaterMappingData>()
             {
                 new AITWaterMappingData(){Slot = 1,Detect=2500, Base=2500,Diff = 0,Thickness = 10},
@@ -380,11 +381,16 @@ namespace FurnaceRT.Equipments.FIMSs
         private bool FsmStartLoad(object[] param)
         {
             bool isNeedN2Purge = false;
-            if(param.Length > 0)
+            string transferMode = "";
+            if (param.Length > 0)
             {
                 bool.TryParse(param[0].ToString(), out isNeedN2Purge);
             }
-            _loadRoutine.Init(isNeedN2Purge);
+            if (param.Length > 1)
+            {
+                transferMode = param[1].ToString();
+            }
+            _loadRoutine.Init(isNeedN2Purge, transferMode);
 
             QueueRoutine.Clear();
             QueueRoutine.Enqueue(_loadRoutine);
@@ -398,11 +404,17 @@ namespace FurnaceRT.Equipments.FIMSs
         private bool FsmStartUnload(object[] param)
         {
             bool isNeedN2Purge = false;
+            string transferMode = "";
             if (param.Length > 0)
             {
                 bool.TryParse(param[0].ToString(), out isNeedN2Purge);
             }
-            _unloadRoutine.Init(isNeedN2Purge);
+            if (param.Length > 1)
+            {
+                transferMode = param[1].ToString();
+            }
+
+            _unloadRoutine.Init(isNeedN2Purge, transferMode);
             QueueRoutine.Clear();
             Result ret = StartRoutine(_unloadRoutine);
             if (ret == Result.FAIL || ret == Result.DONE)
@@ -556,13 +568,13 @@ namespace FurnaceRT.Equipments.FIMSs
             if (FsmState == (int)STATE.InTransfer)
                 CheckToPostMessage(MSG.TransferComplete);
         }
-        public void InvokeLoad(bool isNeedN2Purge)
+        public void InvokeLoad(bool isNeedN2Purge, string transferMode)
         {
-            CheckToPostMessage((int)MSG.Load, isNeedN2Purge);
+            CheckToPostMessage((int)MSG.Load, isNeedN2Purge, transferMode);
         }
-        public void InvokeUnload(bool isNeedN2Purge)
+        public void InvokeUnload(bool isNeedN2Purge,string transferMode)
         {
-            CheckToPostMessage((int)MSG.Unload, isNeedN2Purge);
+            CheckToPostMessage((int)MSG.Unload, isNeedN2Purge, transferMode);
         }
         #endregion
 

+ 5 - 3
Furnace/FurnaceRT/Equipments/FIMSs/FIMSUnloadRoutine.cs

@@ -7,6 +7,7 @@ using FurnaceRT.Equipments.Systems;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.SubstrateTrackings;
 using System;
+using System.ServiceModel;
 
 namespace FurnaceRT.Equipments.FIMSs
 {
@@ -23,7 +24,7 @@ namespace FurnaceRT.Equipments.FIMSs
         private FIMSModule _fimsModule;
         private PMModule _pmModule;
         private bool _isNeedN2Purge;
-
+        private string _transferMode;
         public FIMSUnloadRoutine(FIMSModule fimsModule)
         {
             Module = fimsModule.Module.ToString();
@@ -32,9 +33,10 @@ namespace FurnaceRT.Equipments.FIMSs
             _pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
         }
 
-        public Result Init(bool isNeedN2Purge)
+        public Result Init(bool isNeedN2Purge,string transferMode)
         {
             _isNeedN2Purge = isNeedN2Purge;
+            _transferMode = transferMode;
             return Result.DONE;
         }
 
@@ -86,7 +88,7 @@ namespace FurnaceRT.Equipments.FIMSs
                 return Result.FAIL;
             }
             if (_isNeedN2Purge)
-                _pmModule?.SetN2PurgeParameters();
+                _pmModule?.SetN2PurgeParameters(_transferMode);
 
         
             return Result.RUN;

+ 34 - 26
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -618,12 +618,12 @@ namespace FurnaceRT.Equipments.Jobs
                     return Result.FAIL;
                 }
             }
-
+            var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
             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")));
+                    _fimsCheckOxDensityDict.Add(item.Module.ToString(), Tuple.Create(new FilterChecker(), pm.GetWaferChargeLAO2CheckSV()));
                 }
             }
 
@@ -1698,20 +1698,21 @@ namespace FurnaceRT.Equipments.Jobs
                     if (!CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsLoadCompleted)
                     {
                         var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
-
-                        var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
-
+                        var waferChargeFIMSN2purgeConfig = pm.GetWaferChargeFIMSN2purgeConfig();
+                        var waferChargeLAO2CheckSV = pm.GetWaferChargeLAO2CheckSV();
+                        var lACurrectN2purgeMode = pm.GetLACurrectN2purgeMode();
+                        var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(waferChargeFIMSN2purgeConfig, 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));
+                            _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(waferChargeLAO2CheckSV));
                             if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
                             {
-                                if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                                if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferCharge.ToString()))
                                 {
                                     _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");
+                                    LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={waferChargeFIMSN2purgeConfig},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={lACurrectN2purgeMode},pjStatus:{pj.ProcessingState},wait WaferCharge。A");
 
                                     return;
                                 }
@@ -1720,9 +1721,9 @@ namespace FurnaceRT.Equipments.Jobs
                         }
                         else
                         {
-                            if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                            if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferCharge.ToString()))
                             {
-                                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");
+                                LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={waferChargeFIMSN2purgeConfig},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={lACurrectN2purgeMode},pjStatus:{pj.ProcessingState},direct WaferCharge。B");
 
 
                                 return;
@@ -1748,17 +1749,21 @@ namespace FurnaceRT.Equipments.Jobs
                         if (CheckCarrierNoHasEmptySlot(st.Module) && !fimsDevice.IsLoadCompleted)
                         {
                             var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
-                            var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
+                            var waferDisChargeFIMSN2purgeConfig = pm.GetWaferDisChargeFIMSN2purgeConfig();
+                            var waferDisChargeLAO2CheckSV = pm.GetWaferDisChargeLAO2CheckSV();
+                            var lACurrectN2purgeMode = pm.GetLACurrectN2purgeMode();
+
+                            var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(waferDisChargeFIMSN2purgeConfig, 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));
+                                _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(waferDisChargeLAO2CheckSV));
                                 if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
                                 {
-                                    if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                                    if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferDisCharge.ToString()))
                                     {
                                         _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");
+                                        LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={waferDisChargeFIMSN2purgeConfig},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={lACurrectN2purgeMode},pjStatus:{pj.ProcessingState},wait WaferDisCharge Load。C");
 
                                         return;
                                     }
@@ -1767,9 +1772,9 @@ namespace FurnaceRT.Equipments.Jobs
                             }
                             else
                             {
-                                if (st.Load(CheckFimsIsNeedOxygenPressure, "Discharging"))
+                                if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferDisCharge.ToString()))
                                 {
-                                    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");
+                                    LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={waferDisChargeFIMSN2purgeConfig},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={lACurrectN2purgeMode},pjStatus:{pj.ProcessingState},direct WaferDisCharge Load。D");
 
                                     return;
                                 }
@@ -1792,17 +1797,20 @@ namespace FurnaceRT.Equipments.Jobs
                         if (!CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && !fimsDevice.IsLoadCompleted)
                         {
                             var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
-                            var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
+                            var waferDisChargeFIMSN2purgeConfig = pm.GetWaferDisChargeFIMSN2purgeConfig();
+                            var waferDisChargeLAO2CheckSV = pm.GetWaferDisChargeLAO2CheckSV();
+                            var lACurrectN2purgeMode = pm.GetLACurrectN2purgeMode();
+                            var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(waferDisChargeFIMSN2purgeConfig, 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));
+                                _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(waferDisChargeLAO2CheckSV));
                                 if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
                                 {
-                                    if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
+                                    if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferDisCharge.ToString()))
                                     {
                                         _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");
+                                        LOG.Info($"FIMS :{st.Module}  FIMS N2PurgeConfig={waferDisChargeFIMSN2purgeConfig},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={lACurrectN2purgeMode},wait WaferDisCharge laod ");
 
                                         return;
                                     }
@@ -1810,9 +1818,9 @@ namespace FurnaceRT.Equipments.Jobs
                             }
                             else
                             {
-                                if (st.Load(CheckFimsIsNeedOxygenPressure, "Discharging"))
+                                if (st.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.WaferDisCharge.ToString()))
                                 {
-                                    LOG.Info($"FIMS :{st.Module}  FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},direct load Discharging");
+                                    LOG.Info($"FIMS :{st.Module}  FIMS N2PurgeConfig={waferDisChargeFIMSN2purgeConfig},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={lACurrectN2purgeMode},direct WaferDisCharge load");
 
                                     return;
                                 }
@@ -1834,7 +1842,7 @@ namespace FurnaceRT.Equipments.Jobs
 
                     var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
                     //    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"))
+                    if (CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsUnloadCompleted && st.Unload(false, N2PurgeModeEnum.WaferCharge.ToString()))
                     {
                         return;
                     }
@@ -1862,7 +1870,7 @@ namespace FurnaceRT.Equipments.Jobs
                         if (fims != null && slots != null && GetWaferCountRelatedToWaferRobot(waferType, false) <= slots.Count && CheckCarrierCanPickFromStocker(ModuleName.CarrierRobot))
                         {
                             //var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
-                            if (fims.Unload(false, "Charging"))
+                            if (fims.Unload(false, N2PurgeModeEnum.WaferCharge.ToString()))
                             {
                                 return;
 
@@ -1888,7 +1896,7 @@ namespace FurnaceRT.Equipments.Jobs
 
                         if (!CheckCarrierHasEmptySlot(st.Module) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted)
                         {
-                            if (st.Unload(false, "Discharging"))
+                            if (st.Unload(false, N2PurgeModeEnum.WaferDisCharge.ToString()))
                             {
                                 return;
                             }
@@ -1909,7 +1917,7 @@ namespace FurnaceRT.Equipments.Jobs
 
                         if (CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted)
                         {
-                            if (st.Unload(false, "Discharging"))
+                            if (st.Unload(false, N2PurgeModeEnum.WaferDisCharge.ToString()))
                             {
                                 return;
 

+ 54 - 7
Furnace/FurnaceRT/Equipments/Jobs/TransferJob.cs

@@ -26,6 +26,10 @@ using Aitex.Core.RT.Log;
 using FurnaceRT.Equipments.FIMSs;
 using Aitex.Core.RT.DataCenter;
 using FurnaceRT.Devices;
+using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
+using FurnaceRT.Equipments.PMs;
+using MECF.Framework.Common.Tolerance;
+using MECF.Framework.Common.CommonData.SorterDefines;
 
 namespace FurnaceRT.Equipments.Jobs
 {
@@ -42,7 +46,6 @@ namespace FurnaceRT.Equipments.Jobs
         {
             get { return _lstTransferJobs.Count > 0; }
         }
-
         public TransferJob()
         {
             _faCallback = new SchedulerFACallback();
@@ -126,6 +129,7 @@ namespace FurnaceRT.Equipments.Jobs
             tj.Type = (EnumTransferJobType)Enum.Parse(typeof(EnumTransferJobType), transferTypeString);
             tj.State = EnumTransferJobState.Created;
             tj.CarrierParas = new List<CarrierPara>();
+            tj.FimsCheckOxDensityDict = new Dictionary<string, Tuple<FilterChecker, double>>();
 
             List<string> carrierIdLst = new List<string>();
             List<ModuleName> moduleLst = new List<ModuleName>();
@@ -251,8 +255,18 @@ namespace FurnaceRT.Equipments.Jobs
 
             }
 
+
             _lstTransferJobs.Add(tj);
 
+            var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+
+            foreach (var item in _lstFIMSs)
+            {
+                if (!tj.FimsCheckOxDensityDict.ContainsKey(item.Module.ToString()))
+                {
+                    tj.FimsCheckOxDensityDict.Add(item.Module.ToString(), Tuple.Create(new FilterChecker(), pm.GetFoupEnterLAO2CheckSV()));
+                }
+            }
             return Result.RUN;
         }
         internal void AbortJob(string jobName)
@@ -495,6 +509,8 @@ namespace FurnaceRT.Equipments.Jobs
         }
         private void MonitorFIMSTask()
         {
+            var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+
             if (!_lstTransferJobs.Any() || SC.GetValue<bool>("WaferRobot.BypassFIMSMap"))
                 return;
 
@@ -544,7 +560,7 @@ namespace FurnaceRT.Equipments.Jobs
                     var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{fims.Module}");
                     if (CarrierManager.Instance.CheckNoCarrier(fims.Module, 0))
                     {
-                        if (hasNotMappedCarrier && fimsDevice.IsWaferRobotEX1AxisHomePosition && fimsDevice.IsWaferRobotEX2AxisHomePosition && 
+                        if (hasNotMappedCarrier && fimsDevice.IsWaferRobotEX1AxisHomePosition && fimsDevice.IsWaferRobotEX2AxisHomePosition &&
                             !fimsDevice.IsUnloadCompleted && fims.Unload())
                         {
                             return;
@@ -558,13 +574,44 @@ namespace FurnaceRT.Equipments.Jobs
                         if (tj.CarrierParas.Any(x => x.Stocker == carrier.InternalModuleName && x.IsLoaded))
                         {
                             if (carrier.IsMapped && fimsDevice.IsWaferRobotEX1AxisHomePosition && fimsDevice.IsWaferRobotEX2AxisHomePosition &&
-                                !fimsDevice.IsUnloadCompleted && fims.Unload())
+                                !fimsDevice.IsUnloadCompleted)
                             {
-                                return;
+                                if (fims.Unload())
+                                {
+                                    return;
+                                }
                             }
-                            if (!haveLoadingFims && !carrier.IsMapped && !fimsDevice.IsLoadCompleted && fims.Load())
+                            if (!haveLoadingFims && !carrier.IsMapped && !fimsDevice.IsLoadCompleted)
                             {
-                                return;
+                                var foupEnterFIMSN2purgeConfig = pm.GetFoupEnterFIMSN2purgeConfig();
+                                var foupEnterLAO2CheckSV = pm.GetFoupEnterLAO2CheckSV();
+                                var lACurrectN2purgeMode = pm.GetLACurrectN2purgeMode();
+
+                                var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(foupEnterFIMSN2purgeConfig, "", out var isCheckO2, false);
+                                if (isCheckO2)
+                                {
+                                    tj.FimsCheckOxDensityDict[fims.Module.ToString()].Item1.CheckInterval = 1;
+                                    tj.FimsCheckOxDensityDict[fims.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(foupEnterLAO2CheckSV));
+                                    if (tj.FimsCheckOxDensityDict[fims.Module.ToString()].Item1.Trig)
+                                    {
+                                        if (fims.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.FoupEnter.ToString()))
+                                        {
+                                            tj.FimsCheckOxDensityDict[fims.Module.ToString()].Item1.Restart();
+                                            LOG.Info($"FIMS={fims.Module} , FIMS N2PurgeConfig={foupEnterFIMSN2purgeConfig},Currect N2Purge={lACurrectN2purgeMode},Limit O2 Data={foupEnterLAO2CheckSV},transferJob Load,wait FoupEnter 。a");
+                                            return;
+                                        }
+                                    }
+
+                                }
+                                else
+                                {
+                                    if (fims.Load(CheckFimsIsNeedOxygenPressure, N2PurgeModeEnum.FoupEnter.ToString()))
+                                    {
+                                        LOG.Info($"FIMS={fims.Module} , FIMS N2PurgeConfig={foupEnterFIMSN2purgeConfig},Currect N2Purge={lACurrectN2purgeMode},Limit O2 Data={foupEnterLAO2CheckSV},transferJob Load, direct FoupEnter 。b");
+                                        return;
+                                    }
+                                }
+
                             }
                         }
                     }
@@ -888,7 +935,7 @@ namespace FurnaceRT.Equipments.Jobs
                             continue;
 
                         var lpDevice = DEVICE.GetDevice<IoLP>($"PM1.{lp.Module}");
-                        if (lp.IsReadyForPick(_carrierRobot.Module, 0) && (lpDevice.IsLoadCompleted|| lpDevice.IsUnloadCompleted))
+                        if (lp.IsReadyForPick(_carrierRobot.Module, 0) && (lpDevice.IsLoadCompleted || lpDevice.IsUnloadCompleted))
                         {
                             var carrierPara = tj.CarrierParas.First(x => x.TargetPort == lp.Module && !x.IsLoaded);
                             if (carrierPara != null && _carrierRobot.Load(lp.Module, 0, Hand.Blade1, carrierPara.Stocker, carrierPara.CarrierType, carrierPara.CarrierID, carrierPara))

+ 1 - 33
Furnace/FurnaceRT/Equipments/PMs/PMModule.cs

@@ -1272,39 +1272,7 @@ namespace FurnaceRT.Equipments.PMs
             return true;
         }
 
-        public string GetN2PurgeModeEnumByStr(string str)
-        {
-            if ((str == N2PurgeModeEnum.ATMMode.ToString()) || (str == N2PurgeModeEnum.ATMMode.ToDescription()) || (str.StartsWith("ATM")))
-            {
-                return N2PurgeModeEnum.ATMMode.ToString();
-            }
-            else if ((str == N2PurgeModeEnum.N2PurgeMode.ToString()) || (str == N2PurgeModeEnum.N2PurgeMode.ToDescription()) || (str.StartsWith("N2")))
-            {
-                return N2PurgeModeEnum.N2PurgeMode.ToString();
-            }
-            else
-            {
-                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)
         {
             return true;

+ 5 - 5
Furnace/FurnaceRT/Equipments/PMs/PMModuleDevice.cs

@@ -866,7 +866,7 @@ namespace FurnaceRT.Equipments.PMs
         [Tag("AlarmSignalGLBoxPG31CNT1Alarm")]
         public IoAlarmSignal AlarmSignalGLBoxPG31CNT1Alarm { get; set; }
         [Tag("AlarmSignalGLBoxPG31CNT2Alarm")]
-        public IoAlarmSignal AlarmSignalGLBoxPG31CNT2Alarm { get; set; }   
+        public IoAlarmSignal AlarmSignalGLBoxPG31CNT2Alarm { get; set; }
         [Tag("AlarmSignalMS6")]
         public IoAlarmSignal AlarmSignalMS6Alarm { get; set; }
         [Tag("AlarmSignalGLBoxPG32CNT1Alarm")]
@@ -1679,9 +1679,9 @@ namespace FurnaceRT.Equipments.PMs
         public IoTrigger TrigCREFON { get; set; }
 
         [Tag("TrigSIREFON")]
-        public IoTrigger TrigSIREFON { get; set; }  
+        public IoTrigger TrigSIREFON { get; set; }
         [Tag("SensorHREFILK")]
-        public IoSensor SensorHREFILK { get; set; }    
+        public IoSensor SensorHREFILK { get; set; }
         [Tag("SensorHCDTANKH")]
         public IoSensor SensorHCDTANKH { get; set; }
 
@@ -2026,8 +2026,8 @@ namespace FurnaceRT.Equipments.PMs
             var hSPEED = SC.GetValue<double>($"FFU.HSPEED");
             TrigFFUHSPEED?.SetAOTrigger((float)hSPEED, out _);
 
-            SetN2PurgeLAO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.N2PurgeLAO2CheckSV"));
-            SetN2PurgeFOUPO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.N2PurgeFOUPO2CheckSV"));
+            SetN2PurgeLAO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.FoupEnter.LAO2CheckSV"));
+            SetN2PurgeFOUPO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.FoupEnter.FOUPO2CheckSV"));
         }
         private void SensorLidClosed_OnSignalChanged(IoSensor sender, bool isTriggered)
         {

+ 151 - 62
Furnace/FurnaceRT/Equipments/PMs/PMN2Purge.cs

@@ -13,6 +13,7 @@ using FurnaceRT.Extraction;
 using MECF.Framework.Common.CommonData.SorterDefines;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Tolerance;
+using MECF.Framework.Common.Utilities;
 using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts.TDK;
 using System;
 using System.Collections.Generic;
@@ -197,6 +198,10 @@ namespace FurnaceRT.Equipments.PMs
             }
             return true;
         }
+        /// <summary>
+        /// TODO:这里展示数据的逻辑 不正确,待明确逻辑
+        /// </summary>
+        /// <returns></returns>
         private double GetN2PurgeLimitData()
         {
             if (_N2PurgeMode == N2PurgeModeEnum.N2PurgeMode)
@@ -488,6 +493,7 @@ namespace FurnaceRT.Equipments.PMs
 
         /// <summary>
         /// 获取当前O2检测位置的设定值
+        /// TODO:这里展示数据的逻辑也不正确,待明确逻辑
         /// </summary>
         /// <returns></returns>
         private string GetO2SetCheckSetPoint()
@@ -557,7 +563,6 @@ namespace FurnaceRT.Equipments.PMs
         }
         public bool GetN2PurgeUnder20PPMStatus(double value = 20)
         {
-
             return ConcentrationO2.Value < value;
         }
         private bool GetN2PurgeAIRStatus()
@@ -634,37 +639,11 @@ namespace FurnaceRT.Equipments.PMs
             if (TrigN2PurgeFOUPO2CheckSV != null)
                 TrigN2PurgeFOUPO2CheckSV?.SetAOTrigger(value, out _);
         }
-        public bool FIMSLoadCheckLAO2(out string reason)
-        {
-            var scLAO2 = (float)SC.GetValue<double>("PM1.N2Purge.N2PurgeLAO2CheckSV");
-            reason = $"LA O2 concentration has not reached below {scLAO2}ppm";
-            if (SensorO2DetectSideLA == null || !SensorO2DetectSideLA.Value)
-            {
-                reason = $"Oxygen analyzer not switched to LA";
-                return false;
-            }
 
-            return ((int)(ConcentrationO2.Value)) < scLAO2;
-        }
-        public void SetAVParameter(ModuleName fims, bool isEable)
-        {
-            if (fims == ModuleName.FIMS1)
-            {
-                var avValve58 = DEVICE.GetDevice<IoValve>($"{ModuleName.PM1}.ValveAV58");
-                avValve58?.TurnValve(isEable, out _);
-            }
-
-            if (fims == ModuleName.FIMS2)
-            {
-                var avValve59 = DEVICE.GetDevice<IoValve>($"{ModuleName.PM1}.ValveAV59");
-                avValve59?.TurnValve(isEable, out _);
-            }
-
-        }
         /// <summary>
         /// N2Purge相关时间参数,电气要求设定为秒,实际下发按照毫秒
         /// </summary>
-        public void SetN2PurgeParameters()
+        public void SetN2PurgeParameters(string n2PurgeModeEnum)
         {
             if (SC.ContainsItem("PM1.N2Purge.TransferRoomArrivalWaitTime") && TrigN2PurgeLAO2CheckTime != null)
             {
@@ -707,8 +686,22 @@ namespace FurnaceRT.Equipments.PMs
                 var time = (float)SC.GetValue<double>("PM1.N2Purge.O2DetectorFOUPToFOUPTime");
                 TrigN2PurgeExchangeFOUPTOFOUPWaitTime.SetAOTrigger(time, out _);
             }
-            SetN2PurgeLAO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.N2PurgeLAO2CheckSV"));
-            SetN2PurgeFOUPO2CheckSV((float)SC.GetValue<double>("PM1.N2Purge.N2PurgeFOUPO2CheckSV"));
+            //这2个SV下发值应该根据什么阶段下发什么值
+            if (n2PurgeModeEnum == N2PurgeModeEnum.WaferCharge.ToString())
+            {
+                SetN2PurgeFOUPO2CheckSV((float)GetWaferChargeFOUPO2CheckSV());
+                SetN2PurgeLAO2CheckSV((float)GetWaferChargeLAO2CheckSV());
+            }
+            if (n2PurgeModeEnum == N2PurgeModeEnum.FoupEnter.ToString())
+            {
+                SetN2PurgeFOUPO2CheckSV((float)GetFoupEnterFOUPO2CheckSV());
+                SetN2PurgeLAO2CheckSV((float)GetFoupEnterLAO2CheckSV());
+            }
+            if (n2PurgeModeEnum == N2PurgeModeEnum.WaferDisCharge.ToString())
+            {
+                SetN2PurgeFOUPO2CheckSV((float)GetWaferDisChargeFOUPO2CheckSV());
+                SetN2PurgeLAO2CheckSV((float)GetWaferDisChargeLAO2CheckSV());
+            }
         }
 
         /// <summary>
@@ -735,55 +728,75 @@ namespace FurnaceRT.Equipments.PMs
             }
         }
 
-        public bool CheckFimsIsNeedOxygenPressure(string recipeN2PurgeModeStr, out bool isCheckO2)
+        public bool CheckFimsIsNeedOxygenPressure(bool fimsN2PurgeConfig, string recipeN2PurgeModeStr, out bool isCheckO2, bool isCheckRecipeHeader = true)
         {
             isCheckO2 = false;
-            if (string.IsNullOrEmpty(recipeN2PurgeModeStr))
-                return false;
+            var currectN2PurgeModel = GetLACurrectN2purgeMode();
 
-            if (recipeN2PurgeModeStr.ToLower().Equals("n2 purge"))
-            {
-                recipeN2PurgeModeStr = N2PurgeModeEnum.N2PurgeMode.ToString();
-            }
-            if (recipeN2PurgeModeStr.ToLower().Contains("atm"))
+            if (isCheckRecipeHeader)
             {
-                recipeN2PurgeModeStr = IsATMMode(recipeN2PurgeModeStr);
-            }
+                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 n2PurgeEnum = (N2PurgeModeEnum)Enum.Parse(typeof(N2PurgeModeEnum), recipeN2PurgeModeStr);
 
-            var currectN2PurgeModel = GetLACurrectN2purgeMode();
-            var fimsN2PurgeConfig = GetFIMStN2purgeConfig();
-
-            if (n2PurgeEnum == N2PurgeModeEnum.N2PurgeMode)
-            {
+                if (n2PurgeEnum == N2PurgeModeEnum.ATMMode)
+                    return false;
 
-                if (currectN2PurgeModel == N2PurgeModeEnum.N2PurgeMode.ToString() || currectN2PurgeModel == N2PurgeModeEnum.ATMMode.ToString() || currectN2PurgeModel == N2PurgeModeEnum.ManualMode.ToString())
+                if (n2PurgeEnum == N2PurgeModeEnum.N2PurgeMode)
                 {
-                    if (fimsN2PurgeConfig)
+
+                    if (currectN2PurgeModel == N2PurgeModeEnum.N2PurgeMode.ToString() || currectN2PurgeModel == N2PurgeModeEnum.ATMMode.ToString() || currectN2PurgeModel == N2PurgeModeEnum.ManualMode.ToString())
                     {
-                        isCheckO2 = true;
-                        return true;
+                        if (fimsN2PurgeConfig)
+                        {
+                            isCheckO2 = true;
+                            return true;
+                        }
+                        else
+                        {
+                            return false;
+                        }
                     }
-                    else
+
+                }
+                if (n2PurgeEnum == N2PurgeModeEnum.None)
+                {
+
+                    if (currectN2PurgeModel == N2PurgeModeEnum.ATMMode.ToString() || currectN2PurgeModel == N2PurgeModeEnum.ManualMode.ToString())
                     {
                         return false;
                     }
-                }
+                    if (currectN2PurgeModel == N2PurgeModeEnum.N2PurgeMode.ToString())
+                    {
+                        if (fimsN2PurgeConfig)
+                        {
+                            isCheckO2 = true;
+                            return true;
+                        }
+                        else
+                        {
+                            return false;
+                        }
+                    }
+
 
+                }
             }
-            if (n2PurgeEnum == N2PurgeModeEnum.None)
+            else
             {
 
-                if (currectN2PurgeModel == N2PurgeModeEnum.ATMMode.ToString()|| currectN2PurgeModel == N2PurgeModeEnum.ManualMode.ToString())
-                {
-                    return false;
-                }
-                if (currectN2PurgeModel == N2PurgeModeEnum.N2PurgeMode.ToString())
+                if (currectN2PurgeModel == N2PurgeModeEnum.N2PurgeMode.ToString() || currectN2PurgeModel == N2PurgeModeEnum.ManualMode.ToString())
                 {
                     if (fimsN2PurgeConfig)
                     {
@@ -795,10 +808,13 @@ namespace FurnaceRT.Equipments.PMs
                         return false;
                     }
                 }
-              
-
+                if (currectN2PurgeModel == N2PurgeModeEnum.ATMMode.ToString())
+                {
+                    return false;
+                }
             }
 
+
             return false;
         }
         public bool CheckLAIsNeedOxygenPressure(string recipeN2PurgeModeStr)
@@ -827,5 +843,78 @@ namespace FurnaceRT.Equipments.PMs
 
             return false;
         }
+
+
+
+
+
+        public string GetN2PurgeModeEnumByStr(string str)
+        {
+            if ((str == N2PurgeModeEnum.ATMMode.ToString()) || (str == N2PurgeModeEnum.ATMMode.ToDescription()) || (str.StartsWith("ATM")))
+            {
+                return N2PurgeModeEnum.ATMMode.ToString();
+            }
+            else if ((str == N2PurgeModeEnum.N2PurgeMode.ToString()) || (str == N2PurgeModeEnum.N2PurgeMode.ToDescription()) || (str.StartsWith("N2")))
+            {
+                return N2PurgeModeEnum.N2PurgeMode.ToString();
+            }
+            else
+            {
+                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 double GetFoupEnterLAO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.FoupEnter.LAO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.FoupEnter.LAO2CheckSV") : 20;
+        }
+        public double GetFoupEnterFOUPO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.FoupEnter.FOUPO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.FoupEnter.FOUPO2CheckSV") : 20;
+        }
+        public bool GetFoupEnterFIMSN2purgeConfig()
+        {
+            return SC.ContainsItem("PM1.N2Purge.FoupEnter.FOUPN2PurgeEnable") ? SC.GetValue<bool>("PM1.N2Purge.FoupEnter.FOUPN2PurgeEnable") : false;
+
+        }
+        public double GetWaferChargeLAO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.WaferCharge.LAO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.WaferCharge.LAO2CheckSV") : 20;
+        }
+        public double GetWaferChargeFOUPO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.WaferCharge.FOUPO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.WaferCharge.FOUPO2CheckSV") : 20;
+        }
+
+        public bool GetWaferChargeFIMSN2purgeConfig()
+        {
+            return SC.ContainsItem("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") ? SC.GetValue<bool>("PM1.N2Purge.WaferCharge.FOUPN2PurgeEnable") : false;
+        }
+        public double GetWaferDisChargeLAO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.WaferDisCharge.LAO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.WaferDisCharge.LAO2CheckSV") : 20;
+        }
+        public double GetWaferDisChargeFOUPO2CheckSV()
+        {
+            return SC.ContainsItem("PM1.N2Purge.WaferDisCharge.FOUPO2CheckSV") ? SC.GetValue<double>("PM1.N2Purge.WaferDisCharge.FOUPO2CheckSV") : 20;
+        }
+
+        public bool GetWaferDisChargeFIMSN2purgeConfig()
+        {
+            return SC.ContainsItem("PM1.N2Purge.WaferDisCharge.FOUPN2PurgeEnable") ? SC.GetValue<bool>("PM1.N2Purge.WaferDisCharge.FOUPN2PurgeEnable") : false;
+        }
+        public string GetLACurrectN2purgeMode()
+        {
+            return SC.ContainsItem("PM1.SelectN2PurgeMode") ? SC.GetStringValue("PM1.SelectN2PurgeMode") : N2PurgeModeEnum.ManualMode.ToString();
+        }
+
+
     }
 }

+ 5 - 5
Furnace/FurnaceRT/Equipments/Schedulers/SchedulerFIMS.cs

@@ -93,17 +93,17 @@ namespace FurnaceRT.Equipments.Schedulers
         public bool Load(bool isN2PurgeMode = false, string transferMode = "")
         {
             _task = TaskType.Load;
-       
-            _pm.InvokeLoad(isN2PurgeMode);
 
-            LogTaskStart(_task, $"{Module} load start, N2 purge={isN2PurgeMode}");
+            _pm.InvokeLoad(isN2PurgeMode, transferMode);
+
+            LogTaskStart(_task, $"{Module} load start, N2 purge={isN2PurgeMode},transferMode={transferMode}");
             return true;
         }
         public bool Unload(bool isN2PurgeMode = false, string transferMode = "")
         {
             _task = TaskType.Unload;
-     
-            _pm.InvokeUnload(isN2PurgeMode);
+
+            _pm.InvokeUnload(isN2PurgeMode, transferMode);
 
             LogTaskStart(_task, $"{Module} unload start, N2 purge={isN2PurgeMode}");
             return true;