2 Commits bddb0a1707 ... d6fef68970

Author SHA1 Message Date
  huangping d6fef68970 Merge branch 'Master_ELK02_Release_Development' of http://git.jetplasma-oa.com/Jet/FurnaceELK into Master_ELK02_Release_Development 6 days ago
  huangping bc17e26f27 transferjob load过程增加pjob状态判断 6 days ago

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

@@ -65,6 +65,7 @@
 			<config default="2" name="WaferCountBelowWhichStartNewProcessJob" description="Wafer Count Below Which Start New Process Job" max="25" min="1" paramter="" tag="" unit="" type="Integer" />
 			<config default="true" name="GroupWaferBySequence"  description="Group Wafer By Sequence" max="0" min="0" paramter="" tag="" unit="" type="Bool" />
 			<config default="true" name="IsRunInParallelMode"  description="IsRunInParallelMode" max="0" min="0" paramter="" tag="" unit="" type="Bool" visible="false"/>
+			<config default="15" name="LoadMappingForecastTime" description="Load Foup Operation Mapping wafer forcast time" max="1000" min="1" paramter="" tag="" unit="s" type="Double" />
 		</configs>
 
 

+ 17 - 5
Furnace/FurnaceRT/Equipments/Jobs/TransferJob.cs

@@ -674,7 +674,7 @@ namespace FurnaceRT.Equipments.Jobs
                     continue;
 
                 if (tj.CarrierParas.Any(x => x.Stocker == carrier.InternalModuleName))
-                {
+                {                 
                     var carrierPara = tj.CarrierParas.FirstOrDefault(x => x.Stocker == carrier.InternalModuleName);
                     if (carrierPara != null && _waferRobot.Map(fims.Module, carrierPara.WaferCount, carrierPara.SlotMap, carrierPara.IsCompareWithSlotMap, true, Hand.Blade1))
                     {
@@ -857,8 +857,16 @@ namespace FurnaceRT.Equipments.Jobs
                                 _lstFIMSs.Any(x => x.IsAvailable && x.IsReadyForPlace(ModuleName.CarrierRobot, 0)) &&
                                 !SC.GetValue<bool>("WaferRobot.BypassFIMSMap"))
                             {
+                                //有job执行且在charging和discharge状态,先不执行mapping
+                                if (DATA.Poll("Scheduler.CurrentProcessJob") is ProcessJobInfo job && job != null &&
+                          (job.ProcessingState == EnumProcessingState.CoolingBeforeDischarge || job.ProcessingState == EnumProcessingState.Charging || job.ProcessingState == EnumProcessingState.Discharging
+                         || (job.ProcessingState == EnumProcessingState.Processing && DATA.Poll("PM1.RemainTimeToEnterCooling") is double t && t <=SC.GetValue<double>("System.Scheduler.LoadMappingForecastTime"))))
+                                {
+                                    continue;
+                                }
                                 if (tj.CarrierParas.Any(x => x.Stocker == carrier.InternalModuleName))
                                 {
+
                                     stocker = st;
                                     break;
                                 }
@@ -910,10 +918,7 @@ namespace FurnaceRT.Equipments.Jobs
                     }
                 }
 
-                //map正常完成或者FIMS不具备map条件
-                if (stocker != null && ((carrier.IsMapped && carrier.IsMapOK) ||
-                    SC.GetValue<bool>("WaferRobot.BypassFIMSMap") ||
-                    !_lstFIMSs.Any(x => x.IsOnline && CarrierManager.Instance.CheckNoCarrier(x.Module, 0))))
+                if (stocker != null)
                 {
                     if (_carrierRobot.Place(stocker.Module, 0, Hand.Blade1))
                     {
@@ -1040,6 +1045,13 @@ namespace FurnaceRT.Equipments.Jobs
                 SchedulerFIMS fims = null;
                 foreach (var st in _lstFIMSs)
                 {
+                    //有job执行且在charging和discharge状态,先不执行mapping
+                    if (DATA.Poll("Scheduler.CurrentProcessJob") is ProcessJobInfo job && job!=null&&
+                        (job.ProcessingState == EnumProcessingState.CoolingBeforeDischarge || job.ProcessingState == EnumProcessingState.Charging || job.ProcessingState == EnumProcessingState.Discharging
+                       ||(job.ProcessingState == EnumProcessingState.Processing&&DATA.Poll("PM1.RemainTimeToEnterCooling") is double t && t <= SC.GetValue<double>("System.Scheduler.LoadMappingForecastTime"))))
+                    {
+                        continue;
+                    }
                     if (!st.IsAvailable || !st.IsReadyForPlace(ModuleName.CarrierRobot, 0))
                         continue;
                     var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");

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

@@ -399,8 +399,7 @@ namespace FurnaceRT.Equipments.PMs
             DATA.Subscribe($"{Name}.LoopCountSet", () => _recipeRunningInfo.LoopCountSet);
             DATA.Subscribe($"{Name}.LoopCountCurrent", () => _recipeRunningInfo.LoopCountCurrent);
             DATA.Subscribe($"{Name}.IsLooping", () => _recipeRunningInfo.IsLooping);
-
-
+            DATA.Subscribe($"{Name}.RemainTimeToEnterCooling", () => _recipeRunningInfo.RemainTimeExcludeEndStep-_recipeRunningInfo.TotalElapseTime,SubscriptionAttribute.FLAG.IgnoreSaveDB);
 
 
             DATA.Subscribe("ProcessFlow.Status", () => StringProcessFlowState);

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

@@ -204,6 +204,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
         private string _infoMFCWaitCondition = "";
         private Dictionary<int, Tuple<bool, int>> _callSubSteps = new Dictionary<int, Tuple<bool, int>>();
         private bool _isJumpStep = false;
+        private double _remainTimeExcludeEnd = 0;
 
         public Process(ModuleName module, PMModule pm) : base(module, pm)
         {
@@ -267,7 +268,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
             PMModule.RecipeRunningInfo.TotalTime = CalcRecipeTime();
             if (PMModule.RecipeRunningInfo.TotalTime < 0)
                 return Result.FAIL;
-
+            PMModule.RecipeRunningInfo.RemainTimeExcludeEndStep = _remainTimeExcludeEnd;
             IsSubReciep = false;
             IsExecuteAbort = false;
             IsJumpStepCancelCallLoop = false;
@@ -1468,6 +1469,10 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                     {
                         i = PMModule.RecipeRunningInfo.RecipeStepList[i].JumpStepNo - 1;// -1是因为i++
                     }
+                    if (i < PMModule.RecipeRunningInfo.RecipeStepList.Count - 1)
+                    {
+                        _remainTimeExcludeEnd = total;//获取除最后一步外的process时间,End步会cooling
+                    }
                 }
             }
             catch (Exception ex)

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

@@ -48,5 +48,6 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
         public string AbortRecipeName { get; set; }
 
         public bool IsLooping { get; set; }
+        public double RemainTimeExcludeEndStep { get; set; }
     }
 }