Browse Source

解析LayoutRecipe Config数据

jiangjy 2 weeks ago
parent
commit
33b65dce82

+ 2 - 2
Furnace/FurnaceRT/Devices/IoLP.cs

@@ -60,7 +60,7 @@ namespace FurnaceRT.Devices
         {
             get
             {
-               
+
                 if (_diInPosition1 != null && _diInPosition2 != null && _diInPosition3 != null && _doPresenceLight != null)
                 {
                     //  _doPresenceLight.Value = _diInPosition1.Value && _diInPosition2.Value && _diInPosition3.Value;
@@ -319,7 +319,7 @@ namespace FurnaceRT.Devices
                         faLoadPort.LoadPortTransferStateMachine.TransferState != FACore.E87FA.LPTransferState.READY_TO_UNLOAD)
                         {
 
-                            FALoadPortManager.Instance.EqpInformLoadPortTransferReady(PortID, IsFoupPresent);
+                            FALoadPortManager.Instance.EqpInformLoadPortTransferReady(PortID, IsFoupPresent, CurrentCarrier.CarrierId);
                         }
                     }
                 }

+ 20 - 5
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -298,7 +298,7 @@ namespace FurnaceRT.Equipments.Jobs
 
             List<Tuple<string, string, List<int>>> useStockers = new List<Tuple<string, string, List<int>>>();
 
-            if (RecipeParser.LayoutRecipeParse(layoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out reason))
+            if (RecipeParser.LayoutRecipeParse(layoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out reason))
             {
                 if (param.ContainsKey("CarrierPara"))
                 {
@@ -4597,7 +4597,7 @@ namespace FurnaceRT.Equipments.Jobs
             if (pj == null)
                 return null;
 
-            if (!RecipeParser.LayoutRecipeParse(pj.LayoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason))
+            if (!RecipeParser.LayoutRecipeParse(pj.LayoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out string reason))
             {
                 //Singleton<EquipmentManager>.Instance.ChargeWaferJobStartFailedWarning.Set($"Load layout recipe {pj.LayoutRecipe} failed, {reason}");
 
@@ -4672,7 +4672,7 @@ namespace FurnaceRT.Equipments.Jobs
             //needCheckPWafer = false;
             reason = string.Empty;
 
-            if (!RecipeParser.LayoutRecipeParse(pj.LayoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out reason))
+            if (!RecipeParser.LayoutRecipeParse(pj.LayoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out reason))
             {
                 //Singleton<EquipmentManager>.Instance.ChargeWaferJobStartFailedWarning.Set($"Load layout recipe {pj.LayoutRecipe} failed, {reason}");
 
@@ -4736,6 +4736,8 @@ namespace FurnaceRT.Equipments.Jobs
             //    reason = "extra dummy wafer are short.";
             //    return false;
             //}
+          
+
 
             if (SC.GetStringValue("System.ChargingOrderToBoat") == "FromTopToBottom")
             {
@@ -4753,7 +4755,19 @@ namespace FurnaceRT.Equipments.Jobs
                 monitor2Slots.Sort((x, y) => x.CompareTo(y));//升序
                 productSlots.Sort((x, y) => x.CompareTo(y));//升序
             }
+            //if (layoutRecipeDataConfig.FillDummyTransfer.ToLower() == "exist" && layoutRecipeDataConfig.ProductZeroNotFill.ToLower() == "exist" && layoutRecipeDataConfig.ProductTransferPosition.ToLower() == "none")
+            //{
+            //    int currentPWaferNum = GetCurrentDummyWaferNum(WaferType.P);
+            //    //dumy wafer补充p逻辑
+            //    var needPAndCurrect = productSlots.Count - iCurrentPWaferNum;
+            //    if (needPAndCurrect > 0)
+            //    {
 
+
+            //    }
+
+            //    return false;
+            //}
             pj.SideDummySlots = sideDummySlots;
             pj.ExtraDummySlots = extraDummySlots;
             pj.Monitor1Slots = monitor1Slots;
@@ -5301,7 +5315,7 @@ namespace FurnaceRT.Equipments.Jobs
             return iWaferNum;
         }
 
-        private int GetCurrentDummyWaferNum(WaferType targetWaferType)
+        private int GetCurrentDummyWaferNum(WaferType targetWaferType, bool isPWafer = false)
         {
             int iWaferNum = 0;
             var targetCarrierType = (CarrierType)(Enum.Parse(typeof(CarrierType), targetWaferType.ToString()));
@@ -5324,6 +5338,7 @@ namespace FurnaceRT.Equipments.Jobs
 
                 foreach (var wafer in wafers)
                 {
+
                     if (!wafer.IsEmpty && wafer.WaferType == targetWaferType)
                         iWaferNum++;
                 }
@@ -7310,7 +7325,7 @@ namespace FurnaceRT.Equipments.Jobs
             }
 
             List<Tuple<string, string, List<int>>> useStockers = new List<Tuple<string, string, List<int>>>();
-            if (RecipeParser.LayoutRecipeParse(layoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out reason))
+            if (RecipeParser.LayoutRecipeParse(layoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out reason))
             {
                 if (param.ContainsKey("CarrierPara"))
                 {

+ 29 - 0
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/RecipeLayoutEntity.cs

@@ -29,4 +29,33 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
         public string Name;
         public ObservableCollection<string> Items = new ObservableCollection<string>();
     }
+    public class RecipeLayoutEntityConfig
+    {
+        public string BoatMapDecisionMethod;
+        public string ProductAndFill;
+        public string ProductAndFillValue;
+        public string WaferSupplement;
+        public string WaferSupplementValue;
+        public string WaferChargeMonitor1;
+        public string WaferChargeMonitorValue1;
+
+        public string WaferChargeMonitor2;
+        public string WaferChargeMonitorValue2;
+        public string DispType;
+        public string BoatTotalSlot;
+        public string UpperSDNum;
+        public string ProductNum;
+        public string MonitorNum1;
+        public string MonitorNum2;
+        public string LowerSDNum;
+        public string VAxisMode;
+        public string TopSlotNo;
+        public string UpperSideDummyNum;
+        public string FillDummyTransfer;
+        public string ProductZeroNotFill;
+        public string ProductTransferPosition;
+        public string WaferDischargeMonitor1;
+        public string WaferDischargeMonitor2;
+        public string LowerSideDummyNum;
+    }
 }

+ 26 - 2
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/RecipeParser.cs

@@ -208,7 +208,7 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                         {
                             recipeHead.N2PurgeModeStr = nodeConfig.Attributes["N2PurgeMode"].Value;
                         }
-                    
+
 
                         if (string.IsNullOrEmpty(recipeHead.AbortRecipe))
                             recipeHead.AbortRecipe = SC.GetStringValue("System.Recipe.Abort Recipe");
@@ -1024,11 +1024,12 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
             }
             return true;
         }
-        public static bool LayoutRecipeParse(string recipeFile, string module, out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason)
+        public static bool LayoutRecipeParse(string recipeFile, string module, out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out string reason)
         {
             reason = string.Empty;
             layoutRecipeDataNormal = new RecipeLayoutEntityNormal();
             layoutRecipeDataExpert = new RecipeLayoutEntityExpert();
+            layoutRecipeDataConfig = new RecipeLayoutEntityConfig();
 
             string content = RecipeFileManager.Instance.LoadRecipe($"{SC.GetStringValue("System.Recipe.SupportedChamberType")}\\{SC.GetStringValue("System.Recipe.SupportedLayoutType")}", recipeFile, false);
 
@@ -1096,6 +1097,29 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                     }
                     layoutRecipeDataExpert.Name = strName;
                 }
+
+                nodeModule = rcpDataDoc.SelectSingleNode("/Aitex/TableRecipeData/Module[@Name='PM1']/Config");
+                if (nodeModule == null)
+                {
+                    return false;
+                }
+                else
+                {
+                    Type t = layoutRecipeDataConfig.GetType();
+                    foreach (FieldInfo pi in t.GetFields())
+                    {
+                        XmlElement stepNode = nodeModule as XmlElement;
+
+                        //遍历Step节点
+                        foreach (XmlAttribute att in stepNode.Attributes)
+                        {
+                            if (pi.Name == att.Name)
+                            {
+                                pi.SetValue(layoutRecipeDataConfig, att.Value);
+                            }
+                        }
+                    }
+                }
             }
             catch (Exception ex)
             {

+ 3 - 3
Furnace/FurnaceRT/Equipments/Schedulers/SchedulerDBCallback.cs

@@ -84,7 +84,7 @@ namespace FurnaceRT.Equipments.Schedulers
             _processJobInfo.LotName = jobName;
             _processJobInfo.InnerId = Guid.NewGuid();
 
-            RecipeParser.LayoutRecipeParse(layoutName, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason);
+            RecipeParser.LayoutRecipeParse(layoutName, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out string reason);
 
             string layoutData = String.Join(",", layoutRecipeDataExpert.Items);
 
@@ -107,7 +107,7 @@ namespace FurnaceRT.Equipments.Schedulers
             _processJobInfo.LotName = jobRecipe;
             _processJobInfo.InnerId = Guid.NewGuid();
 
-            RecipeParser.LayoutRecipeParse(layoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason);
+            RecipeParser.LayoutRecipeParse(layoutRecipe, ModuleName.PM1.ToString(), out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out string reason);
 
             string layoutData = String.Join(",", layoutRecipeDataExpert.Items);
 
@@ -126,7 +126,7 @@ namespace FurnaceRT.Equipments.Schedulers
             var batchId = DateTime.Now.ToString("yyyyMMddHHmmssffff");
 
             RecipeParser.LayoutRecipeParse(_processJobInfo.LayoutRecipe, ModuleName.PM1.ToString(),
-                out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out string reason);
+                out RecipeLayoutEntityNormal layoutRecipeDataNormal, out RecipeLayoutEntityExpert layoutRecipeDataExpert, out RecipeLayoutEntityConfig layoutRecipeDataConfig, out string reason);
 
             string layoutData = String.Join(",", layoutRecipeDataExpert.Items);
 

+ 1 - 1
Furnace/FurnaceRT/Equipments/Schedulers/SchedulerFACallback.cs

@@ -510,7 +510,7 @@ namespace FurnaceRT.Equipments.Schedulers
             EV.Notify("SLOT_MAP_AVAILABLE", dvid);
             try
             {
-                Singleton<FAJobController>.Instance.Eqp_NoteCarrierSlotMapRead(carrier.PortID, slotMap, carrier.CarrierId);
+                Singleton<FAJobController>.Instance.Eqp_NoteCarrierSlotMapRead(carrier.PortID, slotMap, carrier.CarrierId??"");
 
             }
             catch (Exception ex)

BIN
Furnace/FurnaceRT/dependence/MECF.Framework.MyFA.Core.dll