Browse Source

update scheduler issue

chenkui 4 days ago
parent
commit
76a2644a3d

+ 4 - 4
CyberX8_RT/Config/Layout/ToolLayoutConfiguration.xml

@@ -259,7 +259,7 @@
 		<!-- LOADER -->
 
 		<Item i:type="Loader">
-			<Installed>false</Installed>
+			<Installed>true</Installed>
 			<LoaderID>1</LoaderID>
 			<SubType>ThunderDualPUF</SubType>
 			<NominalGantryPositionInMilliMeters>-326</NominalGantryPositionInMilliMeters>
@@ -341,7 +341,7 @@
 		<!-- PUFs -->
 
 		<Item i:type="PUF">
-			<Installed>false</Installed>
+			<Installed>true</Installed>
 			<PufID>1</PufID>
 			<SubType>DualPUF_WithDistanceSensors</SubType>
 		</Item>
@@ -349,7 +349,7 @@
 		<!-- TRANSPORTERS -->
 
 		<Item i:type="Transporter">
-			<Installed>false</Installed>
+			<Installed>true</Installed>
 			<TransporterID>1</TransporterID>
 			<SubType>HighSpeedThunder</SubType>
 			<DripTrayType>NoDripTray</DripTrayType>
@@ -358,7 +358,7 @@
 			
 		</Item>
 		<Item i:type="Transporter">
-			<Installed>false</Installed>
+			<Installed>true</Installed>
 			<TransporterID>2</TransporterID>
 			<SubType>HighSpeedThunder</SubType>
 			<DripTrayType>NoDripTray</DripTrayType>

+ 1 - 1
CyberX8_RT/Devices/LinMot/LinMotStartContinueCurveRoutine.cs

@@ -54,7 +54,7 @@ namespace CyberX8_RT.Devices.LinMot
         {
             //Runner.Run(LinMotStartContinueStep.WriteCurveIdRam, () => { return _axis.WriteRamIntValue(0xC8, 0x14, 1); }, 100)
             //    .Delay(LinMotStartContinueStep.CurveIdDelay, 200)
-            Runner.Run(LinMotStartContinueStep.WriteAmplitudeRam, () => { return _axis.WriteRamIntValue(0xCA, 0x14, 50 * 10); }, 100)
+            Runner.Run(LinMotStartContinueStep.WriteAmplitudeRam, () => { return _axis.WriteRamIntValue(0xCA, 0x14, 100 * 10); }, 100)
                 .Delay(LinMotStartContinueStep.AmplitudeDelay, 100)
                 .Run(LinMotStartContinueStep.WriteTimeScaleRam, () => { return _axis.WriteRamIntValue(0xCB,0x14,_speed*100); }, 100)
                 .Delay(LinMotStartContinueStep.Delay, 100)

+ 1 - 0
CyberX8_RT/Dispatch/JobDispatcher.cs

@@ -479,6 +479,7 @@ namespace CyberX8_RT.Dispatch
                         continue;
                     }
                     tmpProcessJobs.Add(job);
+                    break;
                 }
             }
             else

+ 49 - 7
CyberX8_RT/Dispatch/WaferHolderTaskManager.cs

@@ -62,10 +62,13 @@ namespace CyberX8_RT.Dispatch
                     WaferHolderTask waferHolderTask = new WaferHolderTask(waferHolderInfo, jobs[0]);
                     waferHolderTask.OnTaskComplete += WaferHolderTask_OnTaskComplete;                   
                     WaferInfo waferInfo = GetPreLoaderHasWafer();
-                    int waferTaskCount = 0;
+                    int productWaferCount = 0;
+                    int dummyWaferCount = 0;
                     if (waferInfo==null)
                     {
-                        waferTaskCount= WaferTaskManager.Instance.CreateWaferTask(jobs, waferHolderInfo, waferHolderTask);
+                        var result= WaferTaskManager.Instance.CreateWaferTask(jobs, waferHolderInfo, waferHolderTask);
+                        productWaferCount = result.productWaferCount;
+                        dummyWaferCount= result.dummyWaferCount;
                     }
                     else
                     {
@@ -76,14 +79,53 @@ namespace CyberX8_RT.Dispatch
                         string waferHasMatch = WaferTaskManager.Instance.CheckWaferHasMatch(waferInfo.WaferID);
                         if(string.IsNullOrEmpty(waferHasMatch))
                         {
-                            waferTaskCount = 1;
+                            if (waferInfo.WaferType == WaferType.Production)
+                            {
+                                productWaferCount = 1;
+                                dummyWaferCount = 0;
+                            }
+                            else
+                            {
+                                productWaferCount = 0;
+                                dummyWaferCount = 1;
+                            }
                         }
                         else
                         {
-                            waferTaskCount = 2;
+                            WaferInfo matchWafer = WaferManager.Instance.GetWaferByWaferId(waferHasMatch);
+                            if (matchWafer == null || matchWafer.IsEmpty)
+                            {
+                                if (waferInfo.WaferType == WaferType.Production)
+                                {
+                                    productWaferCount = 1;
+                                }
+                                else
+                                {
+                                    dummyWaferCount = 1;
+                                }
+                            }
+                            else
+                            {
+                                if (waferInfo.WaferType == WaferType.Production)
+                                {
+                                    productWaferCount = 1;
+                                }
+                                else
+                                {
+                                    dummyWaferCount = 1;
+                                }
+                                if (matchWafer.WaferType == WaferType.Production)
+                                {
+                                    productWaferCount += 1;
+                                }
+                                else
+                                {
+                                    dummyWaferCount += 1;
+                                }
+                            }
                         }
                     }
-                    if(waferTaskCount == 0)
+                    if(productWaferCount+dummyWaferCount == 0)
                     {
                         return false;
                     }
@@ -93,7 +135,7 @@ namespace CyberX8_RT.Dispatch
                         _waferTaskList.Add(waferHolderTask);
                     }
                     LOG.WriteLog(eEvent.EV_SEQUENCE, "Scheduler", $"Create wafer Shuttle {waferHolderInfo.Id} task");
-                    List<SchedulerSequence> sequences = SchedulerSequenceManager.Instance.AnalyWaferHolderAllSchedulerSequence(waferHolderInfo, jobs[0].SequenceRecipe,waferTaskCount);
+                    List<SchedulerSequence> sequences = SchedulerSequenceManager.Instance.AnalyWaferHolderAllSchedulerSequence(waferHolderInfo, jobs[0].SequenceRecipe,productWaferCount,dummyWaferCount);
                     waferHolderTask.InitialSchedulers(sequences);
 
                     return true;
@@ -238,7 +280,7 @@ namespace CyberX8_RT.Dispatch
                                     _waferTaskList.Add(waferHolderTask);
                                 }
                                 LOG.WriteLog(eEvent.EV_SEQUENCE, "Scheduler", $"Create dummy wafer Shuttle {waferHolderInfo.Id} task");
-                                List<SchedulerSequence> sequences = SchedulerSequenceManager.Instance.AnalyseDummyWaferHolderAllSchedulerSequence(waferHolderInfo, waferTaskCount);
+                                List<SchedulerSequence> sequences = SchedulerSequenceManager.Instance.AnalyseDummyWaferHolderAllSchedulerSequence(waferHolderInfo,0, waferTaskCount);
                                 waferHolderTask.InitialSchedulers(sequences);
                                 break;
                             }

+ 7 - 7
CyberX8_RT/Dispatch/WaferTaskManager.cs

@@ -122,14 +122,14 @@ namespace CyberX8_RT.Dispatch
         /// <summary>
         /// 创建Wafer任务
         /// </summary>
-        public int CreateWaferTask(List<ProcessJobInfo> processJobInfos, WaferHolderInfo waferHolderInfo,WaferHolderTask waferHolderTask)
+        public (int productWaferCount,int dummyWaferCount) CreateWaferTask(List<ProcessJobInfo> processJobInfos, WaferHolderInfo waferHolderInfo,WaferHolderTask waferHolderTask)
         {
             int count = 0;
             string mateWaferTask = "";
             List<WaferInfo> wafers = new List<WaferInfo>();
             if (processJobInfos.Count == 0)
             {
-                return 0;
+                return (0,0);
             }
             for(int i=0; i<processJobInfos.Count;i++)
             {
@@ -233,20 +233,20 @@ namespace CyberX8_RT.Dispatch
                         _waferTaskMatchDic[dummyWafers[0].WaferID] = waferInfo.WaferID;
                         _waferWaferHolderTaskDic[waferInfo.WaferID] = waferHolderTask;
                         _waferWaferHolderTaskDic[dummyWafers[0].WaferID] = waferHolderTask;
-                        return 2;
+                        return (1,1);
                     }
                     else
                     {
                         CreateWaferTaskSchedulerSequence(waferInfo, pufModuleName, waferHolderInfo, waferInfo.ProcessJob.SequenceRecipe, "",waferSide);
                         _waferWaferHolderTaskDic[waferInfo.WaferID] = waferHolderTask;
-                        return 1;
+                        return (1,0);
                     }
                 }
                 else
                 {
                     CreateWaferTaskSchedulerSequence(waferInfo, pufModuleName, waferHolderInfo, waferInfo.ProcessJob.SequenceRecipe, "",waferSide);
                     _waferWaferHolderTaskDic[waferInfo.WaferID] = waferHolderTask;
-                    return 1;
+                    return (1, 0);
                 }
             }
             else if (wafers.Count >= 2)
@@ -285,9 +285,9 @@ namespace CyberX8_RT.Dispatch
                 _waferTaskMatchDic[wafers[1].WaferID] = wafers[0].WaferID;
                 _waferWaferHolderTaskDic[wafers[0].WaferID] = waferHolderTask;
                 _waferWaferHolderTaskDic[wafers[1].WaferID] = waferHolderTask;
-                return 2;
+                return (2, 0);
             }
-            return 0;
+            return (0,0);
         }
         /// <summary>
         /// 检验Loader两边是不是尺寸一致

+ 11 - 10
CyberX8_RT/Schedulers/SchedulerSequenceManager.cs

@@ -139,22 +139,23 @@ namespace CyberX8_RT.Schedulers
         /// <param name="waferHolderInfo"></param>
         /// <param name="sequenceRecipe"></param>
         /// <returns></returns>
-        public List<SchedulerSequence> AnalyWaferHolderAllSchedulerSequence(WaferHolderInfo waferHolderInfo, SequenceRecipe sequenceRecipe,int waferCount)
+        public List<SchedulerSequence> AnalyWaferHolderAllSchedulerSequence(WaferHolderInfo waferHolderInfo, SequenceRecipe sequenceRecipe,int productWaferCount,int dummyWaferCount)
         {
+            int totalWaferCount = productWaferCount + dummyWaferCount;
             int index = 0;
             List<SchedulerSequence> schedulerSequences = new List<SchedulerSequence>();
             //Buffer To Loader
             ModuleName currentLocationModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), waferHolderInfo.CurrentLocation);
             TransporterAction transporterAction = GenerateTransporterTransferAction(currentLocationModuleName, ModuleType.Buffer, ModuleName.Loader1, ModuleType.Loader);
-            string strTRNP = AnalyseLoadTransporterSide(sequenceRecipe, waferCount);
+            string strTRNP = AnalyseLoadTransporterSide(sequenceRecipe, productWaferCount,dummyWaferCount);
             List<SchedulerSyncModuleMessage> synModules = GenerateLoaderTransporterSyncModuleMessage(strTRNP);
             SchedulerSequence bufferToLoaderSequence = CreateLoaderTransporterSequence(transporterAction,synModules,waferHolderInfo.WaferSize, ref index);
             schedulerSequences.Add(bufferToLoaderSequence);
             //尺寸不一致
-            bool needFlip = CheckLoaderWaferSizeNotEqual() && waferCount == 2;
+            bool needFlip = CheckLoaderWaferSizeNotEqual() && totalWaferCount == 2;
             //Loader
             LoaderParameter parameter = new LoaderParameter();
-            parameter.WaferCount= needFlip?1: waferCount;
+            parameter.WaferCount= needFlip?1: totalWaferCount;
             parameter.LoadCompleteToTransporterSide = strTRNP;
             parameter.NeedWaitFlip = needFlip;
             SchedulerSequence loaderSequence = CreateLoaderSequence(parameter,sequenceRecipe.SubstrateSize, ref index);
@@ -184,12 +185,12 @@ namespace CyberX8_RT.Schedulers
         /// <param name="sequenceRecipe"></param>
         /// <param name="waferCount"></param>
         /// <returns></returns>
-        private string AnalyseLoadTransporterSide(SequenceRecipe sequenceRecipe,int waferCount)
+        private string AnalyseLoadTransporterSide(SequenceRecipe sequenceRecipe,int productWaferCount,int dummyWaferCount)
         {
             int sideAWaferSize = SC.GetValue<int>($"Loader1.SideAWaferSize");
             int sideBWaferSize = SC.GetValue<int>($"Loader1.SideBWaferSize");
             //单片,同时loader两边尺寸不一致
-            if (waferCount == 1 && sideAWaferSize != sideBWaferSize)
+            if ((productWaferCount == 1||dummyWaferCount==1) && sideAWaferSize != sideBWaferSize)
             {
                 //recipe使用B面工艺,但loader A面与recipe尺寸一致
                 if (sequenceRecipe.LastSingleWaferToSideB && sequenceRecipe.SubstrateSize == sideAWaferSize)
@@ -270,11 +271,11 @@ namespace CyberX8_RT.Schedulers
         /// </summary>
         /// <param name="waferHolderInfo"></param>
         /// <returns></returns>
-        public List<SchedulerSequence> AnalyseDummyWaferHolderAllSchedulerSequence(WaferHolderInfo waferHolderInfo,int waferCount)
+        public List<SchedulerSequence> AnalyseDummyWaferHolderAllSchedulerSequence(WaferHolderInfo waferHolderInfo,int productWaferCount,int dummyWaferCount)
         {
             int index = 0;
             List<SchedulerSequence> schedulerSequences = new List<SchedulerSequence>();
-            string strTRNP = AnalyseLoadTransporterSide(waferHolderInfo.SequenceRecipe, waferCount);
+            string strTRNP = AnalyseLoadTransporterSide(waferHolderInfo.SequenceRecipe, productWaferCount,dummyWaferCount);
             //Buffer To Loader
             ModuleName currentLocationModuleName = (ModuleName)Enum.Parse(typeof(ModuleName), waferHolderInfo.CurrentLocation);
             ModuleName bufferModule = (ModuleName)Enum.Parse(typeof(ModuleName), waferHolderInfo.OriginalBuffer);
@@ -284,10 +285,10 @@ namespace CyberX8_RT.Schedulers
             schedulerSequences.Add(bufferToLoaderSequence);
 
             //尺寸不一致
-            bool needFlip = CheckLoaderWaferSizeNotEqual() && waferCount == 2;
+            bool needFlip = CheckLoaderWaferSizeNotEqual() && dummyWaferCount == 2;
             //Loader
             LoaderParameter parameter = new LoaderParameter();
-            parameter.WaferCount = needFlip ? 1 : waferCount; ;
+            parameter.WaferCount = needFlip ? 1 : dummyWaferCount; ;
             parameter.LoadCompleteToTransporterSide = strTRNP;
             parameter.NeedWaitFlip = needFlip;
             SchedulerSequence loaderSequence = CreateLoaderSequence(parameter,waferHolderInfo.WaferSize,ref index);

+ 3 - 3
CyberX8_RT/Schedulers/Transporter/SchedulerLoaderTransporter.cs

@@ -391,14 +391,14 @@ namespace CyberX8_RT.Schedulers.Transporter
             }
             else if (action.ActionMsg == TransporterMSG.Flip)
             {
-                LoaderTransporterFlip();
+                LoaderTransporterFlip(action.Parameter.ToString());
             }
             return true;
         }
         /// <summary>
         /// Flip
         /// </summary>
-        private void LoaderTransporterFlip()
+        private void LoaderTransporterFlip(string strTransporter)
         {
             if(_transporterFlip==TransporterFlip.WaitPickUp)
             {
@@ -424,7 +424,7 @@ namespace CyberX8_RT.Schedulers.Transporter
             }
             else if (_transporterFlip == TransporterFlip.LoaderFlip)
             {
-                bool result = _loaderEntity.CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.WARN_LOADER, Module.ToString(), (int)LoaderMSG.PrepareForPlace, "TRNPB");
+                bool result = _loaderEntity.CheckToPostMessage<LOADERSTATE, LoaderMSG>(eEvent.WARN_LOADER, Module.ToString(), (int)LoaderMSG.PrepareForPlace, strTransporter);
                 if (result)
                 {
                     _transporterFlip = TransporterFlip.WaitLoader;