Procházet zdrojové kódy

update dummy recipe auto scheduler

chenkui před 11 hodinami
rodič
revize
ab3814c96e

+ 19 - 0
Framework/Common/RecipeCenter/RecipeFileManager.cs

@@ -1172,6 +1172,25 @@ namespace Aitex.Core.RT.RecipeCenter
             return folderEle;
         }
         /// <summary>
+        /// 加载
+        /// </summary>
+        /// <returns></returns>
+        public List<DqdrRecipe> GetProctionDqdrRecipes()
+        {
+            List<string> lst = GetSequenceList("dqdr", "Production");
+            List<DqdrRecipe> recipes = new List<DqdrRecipe>();
+            foreach(string item in lst)
+            {
+                string path = $"{PathManager.GetRecipeDir()}{ProductionFolder}\\{item}.dqdr.rcp";
+                DqdrRecipe recipe = LoadGenericityRecipe<DqdrRecipe>(path);
+                if(recipe != null)
+                {
+                    recipes.Add(recipe);
+                }
+            }
+            return recipes;
+        }
+        /// <summary>
         /// 获取Sequence(Recipes)文件路径的子目录
         /// </summary>
         /// <returns></returns>

+ 17 - 1
Framework/Common/RecipeCenter/SequenceRecipeManager.cs

@@ -41,7 +41,23 @@ namespace MECF.Framework.Common.RecipeCenter
                 return RecipeType.RES;
             }
         }
-
+        /// <summary>
+        /// 根据dep获取dummy recipe
+        /// </summary>
+        /// <param name="depRecipe"></param>
+        /// <returns></returns>
+        public DqdrRecipe GetDqdrRecipeByDepRecipe(string depRecipe)
+        {
+            List<DqdrRecipe> recipes = RecipeFileManager.Instance.GetProctionDqdrRecipes();
+            if (recipes.Count > 0)
+            {
+                return recipes.Find(O=>O.LinkedDepRecipeName == depRecipe);
+            }
+            else
+            {
+                return null;
+            }
+        }
         /// <summary>
         /// 获取模块类型
         /// </summary>

+ 3 - 2
PunkHPX8_RT/Dispatch/JobProcesser.cs

@@ -251,7 +251,8 @@ namespace PunkHPX8_RT.Dispatch
                     return false;
                 }
                 sequenceRecipe.SequenceType = sequenceType;
-                if (!SchedulerSequenceRecipeManager.Instance.CheckSequenceRecipeAvaible(sequenceRecipe,ref reason))
+                bool isOdd = pj.SlotWafers.Count % 2 == 1;
+                if (!SchedulerSequenceRecipeManager.Instance.CheckSequenceRecipeAvaible(sequenceRecipe,isOdd,ref reason))
                 {
                     ClearWafersSeqName(cj);
                     return false;
@@ -274,7 +275,7 @@ namespace PunkHPX8_RT.Dispatch
                     ClearWafersSeqName(cj);
                     return false;
                 }
-                if (pj.SlotWafers.Count % 2 == 1)
+                if (isOdd)
                 {
                     int dummyCount = 0;
                     DummyDevice dummy1Device = Singleton<RouteManager>.Instance.EFEM.GetDummyDevice(0);

+ 2 - 1
PunkHPX8_RT/Modules/PlatingCell/DummyRinseRunRecipeRoutine.cs

@@ -1,5 +1,6 @@
 using Aitex.Core.RT.Device;
 using Aitex.Core.RT.Log;
+using Aitex.Core.RT.RecipeCenter;
 using Aitex.Core.RT.Routine;
 using Aitex.Core.Util;
 using MECF.Framework.Common.Beckhoff.AxisProvider;
@@ -293,7 +294,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
             _platingCellEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellEntity>(Module);
             //获取match的platingcell的dep recipe
             _matchPlatingCellEntity = Singleton<RouteManager>.Instance.GetModule<PlatingCellEntity>(MatchModule);
-            _matchPlatingCellDepDeprecipe = _matchPlatingCellEntity.CurrentRecipe;
+            _matchPlatingCellDepDeprecipe = (DepRecipe)SequenceRecipeManager.Instance.LoadSequenceTypeRecipe("Production", _recipe.LinkedDepRecipeName, MECF.Framework.Common.RecipeCenter.RecipeType.DEP);
             //获取对应reservoir eneity
             string reservoir = ReservoirItemManager.Instance.GetReservoirByPlatingCell(Module);
             _reservoirEntity = Singleton<RouteManager>.Instance.GetModule<ReservoirEntity>(reservoir);

+ 1 - 1
PunkHPX8_RT/Modules/PlatingCell/PlatingCellInitializeRoutine.cs

@@ -193,7 +193,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         {
             if(_verticalEntity != null )
             {
-                return _verticalEntity.CheckToPostMessage<PlatingCellVerticalState,PlatingCellVerticalEntity.VerticalMsg>(eEvent.INFO_PLATINGCELL, Module, (int)PlatingCellVerticalEntity.VerticalMsg.Initialize);
+                return _verticalEntity.CheckToPostMessage<PlatingCellVerticalState,PlatingCellVerticalEntity.VerticalMsg>(eEvent.INFO_PLATINGCELL, _verticalEntity.Module.ToString(), (int)PlatingCellVerticalEntity.VerticalMsg.Initialize);
             }
             else
             {

+ 1 - 1
PunkHPX8_RT/Modules/PlatingCell/PlatingCellUnloadRoutine.cs

@@ -73,7 +73,7 @@ namespace PunkHPX8_RT.Modules.PlatingCell
         private bool StartVertical(string positionName)
         {
             return _verticalEntity.CheckToPostMessage<PlatingCellVerticalState, PlatingCellVerticalEntity.VerticalMsg>(Aitex.Core.RT.Log.eEvent.INFO_PLATINGCELL,
-                    Module, (int)PlatingCellVerticalEntity.VerticalMsg.Position, positionName,0);
+                    _verticalEntity.Module.ToString(), (int)PlatingCellVerticalEntity.VerticalMsg.Position, positionName,0);
         }
         /// <summary>
         /// 检验垂直电机是否运动完成

+ 44 - 6
PunkHPX8_RT/Schedulers/EfemRobot/SchedulerRobot.cs

@@ -158,7 +158,7 @@ namespace PunkHPX8_RT.Schedulers.EfemRobot
             }
             if (moveItem.DestinationModule == ModuleName.Unknown)
             {
-                bool result= UpdateUnkownTargetModule(schedulerSequences, moveItem, sequenceIndex);
+                bool result= UpdateUnkownTargetModule(schedulerSequences,materialId, moveItem, sequenceIndex);
                 if (!result)
                 {
                     reason = "efem robot confirm target module failed";
@@ -313,7 +313,7 @@ namespace PunkHPX8_RT.Schedulers.EfemRobot
         /// <summary>
         /// 更新未知目标模块
         /// </summary>
-        private bool UpdateUnkownTargetModule(List<SchedulerSequence> schedulerSequences, MoveItem moveItem, int sequenceIndex)
+        private bool UpdateUnkownTargetModule(List<SchedulerSequence> schedulerSequences,string materialId, MoveItem moveItem, int sequenceIndex)
         {
             SchedulerSequence currentSchedulerSequence= schedulerSequences[sequenceIndex];
             if (sequenceIndex >= schedulerSequences.Count - 1)
@@ -341,11 +341,49 @@ namespace PunkHPX8_RT.Schedulers.EfemRobot
             }
             else if (moveItem.DestinationType == ModuleType.PlatingCell)
             {
-                DepRecipe depRecipe = (DepRecipe)nextSequence.Recipe;
-                List<PlatingCellEntity> platingCellEntities= SchedulerSequenceManager.Instance.GetAvaiblePlatingCellList(depRecipe.Chemistry, nextSequence.SequenceType, nextSequence.WaferSize, true);
-                if (platingCellEntities.Count > 0)
+                WaferTask waferTask = WaferTaskManager.Instance.GetWaferTask(materialId);
+                if (waferTask == null)
                 {
-                    moduleName = platingCellEntities[0].Module;
+                    return false;
+                }
+                //第一片
+                if (string.IsNullOrEmpty(waferTask.MateWaferTask))
+                {
+                    DepRecipe depRecipe = (DepRecipe)nextSequence.Recipe;
+                    List<PlatingCellEntity> platingCellEntities = SchedulerSequenceManager.Instance.GetAvaiblePlatingCellList(depRecipe.Chemistry, nextSequence.SequenceType, nextSequence.WaferSize, true);
+                    if (platingCellEntities.Count > 0)
+                    {
+                        moduleName = platingCellEntities[0].Module;
+                    }
+                }
+                else
+                {
+                    //第二片查询第一片所在的plating cell模块
+                    WaferTask matchWaferTask = WaferTaskManager.Instance.GetWaferTask(waferTask.MateWaferTask);
+                    if (matchWaferTask == null)
+                    {
+                        return false;
+                    }
+                    SchedulerSequence schedulerSequence = matchWaferTask.GetCurrentSchedulerSequence();
+                    if(schedulerSequence == null)
+                    {
+                        return false;
+                    }
+                    if (schedulerSequence.ModuleType != ModuleType.PlatingCell)
+                    {
+                        return false;
+                    }
+                    if (schedulerSequence.ModuleName == ModuleName.Unknown)
+                    {
+                        return false;
+                    }
+                    string matchModule = schedulerSequence.ModuleName.ToString();
+                    string materialModule = ModuleMatcherManager.Instance.GetMatcherByModule(matchModule);
+                    if (string.IsNullOrEmpty(materialModule))
+                    {
+                        return false;
+                    }
+                    Enum.TryParse(materialModule, out moduleName);
                 }
             }
             else

+ 10 - 7
PunkHPX8_RT/Schedulers/PlatingCell/SchedulerPlatingCell.cs

@@ -58,15 +58,18 @@ namespace PunkHPX8_RT.Schedulers.Srd
         /// <returns></returns>
         public override bool RunProcess(object recipe, object parameter, List<SchedulerSyncModuleMessage> syncModuleMessages)
         {
-            if (!(recipe is DepRecipe))
+            _isStartRunRecipe = false;
+            bool result = false;
+            if (recipe is DepRecipe)
             {
-                _state = RState.Failed;
-                LOG.WriteLog(eEvent.ERR_PLATINGCELL, Module.ToString(), "recipe is invalid");
-                return false;
+                DepRecipe depRecipe = (DepRecipe)recipe; 
+                result = _entity.CheckToPostMessage<PlatingCellState, PlatingCellMsg>(eEvent.INFO_PLATINGCELL, Module.ToString(), (int)PlatingCellMsg.RunRecipe, depRecipe,false, 1);
+            }
+            else
+            {
+                DqdrRecipe dqdrRecipe = (DqdrRecipe)recipe;
+                result = _entity.CheckToPostMessage<PlatingCellState, PlatingCellMsg>(eEvent.INFO_PLATINGCELL, Module.ToString(), (int)PlatingCellMsg.RunRecipe,dqdrRecipe,true, 1);
             }
-            _isStartRunRecipe = false;
-            DepRecipe depRecipe = (DepRecipe)recipe;
-            bool result = _entity.CheckToPostMessage<PlatingCellState, PlatingCellMsg>(eEvent.INFO_PLATINGCELL, Module.ToString(), (int)PlatingCellMsg.RunRecipe, depRecipe, 1);
             if (result)
             {
                 _state = RState.Running;

+ 40 - 2
PunkHPX8_RT/Schedulers/SchedulerSequenceManager.cs

@@ -257,7 +257,26 @@ namespace PunkHPX8_RT.Schedulers
                 schedulerSequence.SequenceIndex=i;
                 schedulerSequence.WaferSize = sequenceRecipe.SubstrateSize;
                 MECF.Framework.Common.RecipeCenter.RecipeType recipeType =SequenceRecipeManager.Instance.GetRecipeType(item);
-                schedulerSequence.Recipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType,item, recipeType);
+                if (item.ToLower().EndsWith("dep.rcp"))
+                {
+                    if (isDummy)
+                    {
+                        DqdrRecipe dqdrRecipe=SequenceRecipeManager.Instance.GetDqdrRecipeByDepRecipe(item);
+                        if (dqdrRecipe == null)
+                        {
+                            return schedulerSequences;
+                        }
+                        schedulerSequence.Recipe=dqdrRecipe;
+                    }
+                    else
+                    {
+                        schedulerSequence.Recipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, item, recipeType);
+                    }
+                }
+                else
+                {
+                    schedulerSequence.Recipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, item, recipeType);
+                }
                 schedulerSequence.SequenceType = sequenceRecipe.SequenceType;
                 schedulerSequence.State = RState.Init;
                 schedulerSequence.MaterialType = MaterialType.Wafer;
@@ -267,7 +286,26 @@ namespace PunkHPX8_RT.Schedulers
                     string nextModule = sequenceRecipe.Recipes[i + 1];
                     schedulerSequence.NextModuleType = SequenceRecipeManager.Instance.GetModuleType(nextModule);
                     MECF.Framework.Common.RecipeCenter.RecipeType nextRecipeType = SequenceRecipeManager.Instance.GetRecipeType(nextModule);
-                    schedulerSequence.NextRecipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, nextModule, nextRecipeType);
+                    if (item.ToLower().EndsWith("dep.rcp"))
+                    {
+                        if (isDummy)
+                        {
+                            DqdrRecipe dqdrRecipe = SequenceRecipeManager.Instance.GetDqdrRecipeByDepRecipe(nextModule);
+                            if (dqdrRecipe == null)
+                            {
+                                return schedulerSequences;
+                            }
+                            schedulerSequence.NextRecipe = dqdrRecipe;
+                        }
+                        else
+                        {
+                            schedulerSequence.NextRecipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, nextModule, nextRecipeType);
+                        }
+                    }
+                    else
+                    {
+                        schedulerSequence.NextRecipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, nextModule, nextRecipeType);
+                    }
                 }
                 schedulerSequence.IsProcessSequece = true;
                 if(i==processResult.lastIndex)

+ 11 - 1
PunkHPX8_RT/Schedulers/SchedulerSequenceRecipeManager.cs

@@ -149,7 +149,7 @@ namespace PunkHPX8_RT.Schedulers
         /// </summary>
         /// <param name="sequenceRecipe"></param>
         /// <returns></returns>
-        public bool CheckSequenceRecipeAvaible(SequenceRecipe sequenceRecipe,ref string reason)
+        public bool CheckSequenceRecipeAvaible(SequenceRecipe sequenceRecipe,bool isOdd,ref string reason)
         {
             if (sequenceRecipe == null)
             {
@@ -165,6 +165,16 @@ namespace PunkHPX8_RT.Schedulers
                     continue;
                 }
                 RecipeType recipeType= SequenceRecipeManager.Instance.GetRecipeType(item);
+                if (recipeType == RecipeType.DEP&&isOdd)
+                {
+                    DqdrRecipe dqdrRecipe = SequenceRecipeManager.Instance.GetDqdrRecipeByDepRecipe(item);
+                    if (dqdrRecipe == null)
+                    {
+                        reason = $"no dummy recipe link {item}";
+                        LOG.WriteLog(eEvent.ERR_SEQUENCE, "System", reason);
+                        return false;
+                    }
+                }
                 object recipe = SequenceRecipeManager.Instance.LoadSequenceTypeRecipe(sequenceRecipe.SequenceType, item, recipeType);
                 if (recipe == null)
                 {