Browse Source

* update IsRunInParallelMode scheduler
* add LOFF command in transporter reader;

chenkui 3 days ago
parent
commit
5d2bc5b6f0

+ 1 - 0
CyberX8_RT/Config/System.sccfg

@@ -195,6 +195,7 @@
 		<config default="20" name="TransporterTransferSeconds" nameView="TransporterTransferSeconds" description="Transporter Transfer WaferHolder Seconds." max="100" min="1" paramter="" tag="" unit="s" type="Integer" />
 		<config default="5" name="TransporterTransferOffSeconds" nameView="TransporterTransferOffSeconds" description="Transporter Transfer WaferHolder offset seconds between Max Seconds and Min Seconds." max="100" min="1" paramter="" tag="" unit="s" type="Integer" />
 		<config default="2" name="MaxPickTries" nameView="MaxPickTries" description="Transporter pick up max retry times." max="5" min="0" paramter="" tag="" unit="" type="Integer" />
+		<config default="false" name="EnableSendLOFF" nameView="EnableSendLOFF" description="Reader sends LOFF command after reading barcode" max="" min="" paramter="" tag="" unit="" type="Bool" />
 		<!--Loader Transporter-->
 		<configs name="Transporter2" nameView="Transporter2">
 			<config default="15" name="StartCellId" nameView="StartCellId" description="Loader Transporter transfer start cell id." max="40" min="1" paramter="" tag="" unit="" type="Integer" />

+ 44 - 1
CyberX8_RT/Dispatch/WaferHolderTaskManager.cs

@@ -18,6 +18,7 @@ using CyberX8_Core;
 using CyberX8_RT.Modules.Transporter;
 using MECF.Framework.Common.SubstrateTrackings;
 using MECF.Framework.Common.RecipeCenter;
+using Aitex.Core.RT.SCCore;
 
 namespace CyberX8_RT.Dispatch
 {
@@ -47,7 +48,8 @@ namespace CyberX8_RT.Dispatch
             {
                 return false;
             }
-            SequenceRecipe sequenceRecipe = jobs[0].SequenceRecipe;
+            ProcessJobInfo nextProcessJob = GetNextProcessJob(jobs);
+            SequenceRecipe sequenceRecipe = nextProcessJob.SequenceRecipe;
             List<string> chemistries = SchedulerSequenceRecipeManager.Instance.GetSequenceChemistry(sequenceRecipe);
             WaferSize waferSize = (WaferSize)sequenceRecipe.SubstrateSize;
             WaferHolderInfo waferHolderInfo = SchedulerManager.Instance.GetAvaibleBufferToLoaderWaferHolder(waferSize,sequenceRecipe.CrsType,chemistries);
@@ -146,6 +148,47 @@ namespace CyberX8_RT.Dispatch
             return false;
         }
         /// <summary>
+        /// 获取下一个执行的ProcessJob
+        /// </summary>
+        /// <param name="jobs"></param>
+        /// <returns></returns>
+        private ProcessJobInfo GetNextProcessJob(List<ProcessJobInfo> jobs)
+        {
+            try
+            {
+                bool isRunInParallelMode = SC.GetValue<Boolean>("Scheduler.IsRunInParallelMode");
+                if (!isRunInParallelMode)
+                {
+                    return jobs[0];
+                }
+                else
+                {
+                    if (_waferTaskList.Count == 0)
+                    {
+                        return jobs[0];
+                    }
+                    WaferHolderTask lastWaferHolderTask = _waferTaskList[_waferTaskList.Count - 1];
+                    if (lastWaferHolderTask.ProcessJobInfo == null || lastWaferHolderTask.ProcessJobInfo.SequenceRecipe == null)
+                    {
+                        return jobs[0];
+                    }
+                    string lastSequence = lastWaferHolderTask.ProcessJobInfo.SequenceRecipe?.Ppid;
+                    foreach (ProcessJobInfo jobInfo in jobs)
+                    {
+                        if (jobInfo.SequenceRecipe?.Ppid != lastSequence)
+                        {
+                            return jobInfo;
+                        }
+                    }
+                    return jobs[0];
+                }
+            }
+            catch
+            {
+                return jobs[0];
+            }
+        }
+        /// <summary>
         /// 查看Wafer对应的WaferHolderTask是否已经创建
         /// </summary>
         /// <param name="waferInfo"></param>

+ 3 - 3
CyberX8_RT/Dispatch/WaferTaskManager.cs

@@ -235,10 +235,10 @@ namespace CyberX8_RT.Dispatch
                             dummyInfo = dummyWafers[0];
                         }
                         CreateDummyWaferTaskSchedulerSequence(waferHolderInfo.SequenceRecipe, dummyInfo, pufModuleName, waferInfo.WaferID,dummySide);
-                        _waferTaskMatchDic[waferInfo.WaferID] = dummyWafers[0].WaferID;
-                        _waferTaskMatchDic[dummyWafers[0].WaferID] = waferInfo.WaferID;
+                        _waferTaskMatchDic[waferInfo.WaferID] = dummyInfo.WaferID;
+                        _waferTaskMatchDic[dummyInfo.WaferID] = waferInfo.WaferID;
                         _waferWaferHolderTaskDic[waferInfo.WaferID] = waferHolderTask;
-                        _waferWaferHolderTaskDic[dummyWafers[0].WaferID] = waferHolderTask;
+                        _waferWaferHolderTaskDic[dummyInfo.WaferID] = waferHolderTask;
                         return (1,1);
                     }
                     else

+ 18 - 2
Framework/Common/Device/BarcodeReader/BarcodeReaderSerialDevice.cs

@@ -19,6 +19,7 @@ namespace MECF.Framework.Common.Device.BarcodeReader
         #endregion
         #region 常量
         private const string CONSTANT_COMMAND = "LON\r";
+        private const string CONSTANT_OFF_COMMAND = "LOFF\r";
         private const char SPLIT_CHARACTER = '\t';
         #endregion
 
@@ -152,6 +153,16 @@ namespace MECF.Framework.Common.Device.BarcodeReader
         }
         #endregion
 
+        /// <summary>
+        /// 清除数据
+        /// </summary>
+        private void ClearData()
+        {
+            if (_serialPort.BytesToRead > 0)
+            {
+                _serialPort.ReadExisting();
+            }
+        }
 
         /// <summary>
         /// 读取数据
@@ -180,9 +191,14 @@ namespace MECF.Framework.Common.Device.BarcodeReader
                         Thread.Sleep(100);
                     }
                 }
-                if (!string.IsNullOrEmpty(str))
+                bool enableLOFF = SC.GetValue<bool>("Transporter.EnableSendLOFF");
+                if (enableLOFF)
                 {
-           
+                    _serialPort.WriteLine(CONSTANT_OFF_COMMAND);
+                    ClearData();
+                }
+                if (!string.IsNullOrEmpty(str))
+                {           
                     if (OnDataChanged != null)
                     {
                         OnDataChanged(_name, str);