3 Commits 2c4db59606 ... d480e50453

Author SHA1 Message Date
  SenGao d480e50453 transferjob load过程增加pjob状态判断 & LoadMappingForecastTime时间调整为默认3min 5 days ago
  SenGao e918f5b919 fix 温度sv加延迟 5 days ago
  SenGao db72d42815 code base 5 days ago

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+.vs/
+packages/
+obj/
+bin/
+Output/

+ 17 - 0
FrameworkLocal/Common/IOCore/IOAccessor.cs

@@ -330,6 +330,23 @@ namespace Aitex.Core.RT.IOCore
                 provider.SetValue(this, value);
             }
         }
+
+        public async Task<bool> SetPulseValue(float value, int milliSecondsDelay)
+        {
+
+            IIoProvider provider = IoProviderManager.Instance.GetProvider(this.Provider);
+
+            await Task.Delay(milliSecondsDelay);
+
+            if (_floatValues[index] != value)
+            {
+                LOG.Write($"Write AO[{Name}] from {_floatValues[index]} to {value}");
+            }
+
+            _floatValues[index] = value;
+            return true;
+
+        }
     }
 
 

+ 2 - 3
Furnace/Furnace.sln

@@ -1,7 +1,7 @@
 
 Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-VisualStudioVersion = 16.0.34301.259
+# Visual Studio Version 17
+VisualStudioVersion = 17.14.36603.0 d17.14
 MinimumVisualStudioVersion = 10.0.40219.1
 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FurnaceSimulator", "FurnaceSimulator\FurnaceSimulator.csproj", "{FDF5BB48-689B-4B88-BABC-110F3DC07C67}"
 	ProjectSection(ProjectDependencies) = postProject
@@ -80,7 +80,6 @@ Global
 		{290FE38F-45F9-408C-B25B-C899B467E3F8}.Release|x86.ActiveCfg = Release|Any CPU
 		{290FE38F-45F9-408C-B25B-C899B467E3F8}.Release|x86.Build.0 = Release|Any CPU
 		{C842F167-DB8E-4827-ACDD-74215AF5100A}.Debug|Any CPU.ActiveCfg = Debug|x86
-		{C842F167-DB8E-4827-ACDD-74215AF5100A}.Debug|Any CPU.Build.0 = Debug|x86
 		{C842F167-DB8E-4827-ACDD-74215AF5100A}.Debug|x86.ActiveCfg = Debug|x86
 		{C842F167-DB8E-4827-ACDD-74215AF5100A}.Debug|x86.Build.0 = Debug|x86
 		{C842F167-DB8E-4827-ACDD-74215AF5100A}.Release|Any CPU.ActiveCfg = Release|x86

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

@@ -47,6 +47,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="180" name="LoadMappingForecastTime" description="Load Foup Operation Mapping wafer forcast time" max="1000" min="1" paramter="" tag="" unit="s" type="Double" />
     </configs>
     
     <configs name="SetUp" display="" >

+ 8 - 2
Furnace/FurnaceRT/Devices/IoHeater.cs

@@ -230,12 +230,18 @@ namespace FurnaceRT.Devices
                         if(ControlMode == 0)
                         {
                             if (Math.Abs(_aoCascadeControlModeSetPoint.FloatValue - value) > 0.0001)
-                                _aoCascadeControlModeSetPoint.FloatValue = value;
+                            {
+                                _aoCascadeControlModeSetPoint.SetPulseValue(value, 1500);
+                            }
+                                
                         }
                         else
                         {
                             if (Math.Abs(_aoHeaterControlModeSetPoint.FloatValue - value) > 0.0001)
-                                _aoHeaterControlModeSetPoint.FloatValue = value;
+                            {
+                                _aoHeaterControlModeSetPoint.SetPulseValue(value, 1500);
+                            }
+                                
                         }
                     }
                 }

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

@@ -800,8 +800,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;
                                 }
@@ -853,10 +861,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))
                     {
@@ -983,6 +988,14 @@ 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}");

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

@@ -333,6 +333,8 @@ 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

@@ -196,6 +196,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)
         {
@@ -259,7 +260,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;
@@ -1392,6 +1393,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

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