3 Commits 092ec850a8 ... 704b623708

Author SHA1 Message Date
  chenkui 704b623708 根据新的S2F49格式完成PPSelect功能的调整 3 months ago
  chenkui f88ca9b050 Merge branch 'master' of http://10.4.3.168:3000/JetPlasma/Mars200VCE 3 months ago
  chenkui 5445a76d4d 修复JobFinish Wafer count的问题 4 months ago

+ 48 - 48
FrameworkLocal/Common/Jobs/ControlJob.cs

@@ -1,48 +1,48 @@
-using System;
-using System.Collections.Generic;
-using Aitex.Core.Common;
-
-namespace MECF.Framework.Common.Jobs
-{
-
-    [Serializable]
-    public class ControlJobInfo
-    {
-        public string Name { get; set; }
-
-        public Guid InnerId { get; set; }
-
-        public string Module { get; set; }
-
-        public string[] CasseteModules { get; set; }
- 
-        public List<string> ProcessJobNameList { get; set; }
-
-        public EnumControlJobState State { get; set; }
-
-        public string LotName { get; set; }
-        public Guid LotInnerId { get; set; }
-        public List<WaferInfo> LotWafers { get; set; }
-
-        public string CarrierID { get; set; }
-        public bool IsPreJobCleanStart { get; set; }
-        public bool IsPreJobCleanDone { get; set; }
-
-        public bool IsPostJobCleanStart { get; set; }
-        public bool IsPostJobCleanDone { get; set; }
-        public DateTime CreateTime { get; set; }
-        public DateTime BeginTime { get; set; }
-        public DateTime EndTime { get; set; }
-        public ControlJobInfo()
-        {
-            ProcessJobNameList = new List<string>();
-            State = EnumControlJobState.Queued;
-            InnerId = Guid.NewGuid();
-        }
-
-        public void SetState(EnumControlJobState state)
-        {
-            State = state;
-        }
-    }
-}
+using System;
+using System.Collections.Generic;
+using Aitex.Core.Common;
+
+namespace MECF.Framework.Common.Jobs
+{
+
+    [Serializable]
+    public class ControlJobInfo
+    {
+        public string Name { get; set; }
+
+        public Guid InnerId { get; set; }
+
+        public string Module { get; set; }
+
+        public string[] CasseteModules { get; set; }
+ 
+        public List<string> ProcessJobNameList { get; set; }
+
+        public EnumControlJobState State { get; set; }
+
+        public string LotName { get; set; }
+        public Guid LotInnerId { get; set; }
+        public List<WaferInfo> LotWafers { get; set; }
+
+        public string CarrierID { get; set; }
+        public bool IsPreJobCleanStart { get; set; }
+        public bool IsPreJobCleanDone { get; set; }
+
+        public bool IsPostJobCleanStart { get; set; }
+        public bool IsPostJobCleanDone { get; set; }
+        public DateTime CreateTime { get; set; }
+        public DateTime BeginTime { get; set; }
+        public DateTime EndTime { get; set; }
+        public ControlJobInfo()
+        {
+            ProcessJobNameList = new List<string>();
+            State = EnumControlJobState.Queued;
+            InnerId = Guid.NewGuid();
+        }
+
+        public void SetState(EnumControlJobState state)
+        {
+            State = state;
+        }
+    }
+}

+ 34 - 12
FrameworkLocal/RTModuleLibrary/SystemModules/EquipmentManager.cs

@@ -1363,9 +1363,9 @@ namespace MECF.Framework.RT.ModuleLibrary.SystemModules
             reason = "";
             reason = "";
             int portID;
             int portID;
             string jobID;
             string jobID;
+            string[] modules;
             string[] lotId;
             string[] lotId;
-            string[] sequence;
-            string[] slotsequence;
+            List<string[]> slotsequence;
             VceModuleBase lp;
             VceModuleBase lp;
             switch (command.ToUpper())
             switch (command.ToUpper())
             {
             {
@@ -1375,11 +1375,12 @@ namespace MECF.Framework.RT.ModuleLibrary.SystemModules
                         reason = "system is not auto";
                         reason = "system is not auto";
                         return false;
                         return false;
                     }
                     }
-                    string[] strAry = paras[0].ToString().Split(',');
-                    string[] modules=new string[strAry.Length];
-                    for(int i=0;i<strAry.Length;i++)
+
+                    object[] moduleObjects = (object[])paras[0];
+                    modules=new string[moduleObjects.Length];
+                    for(int i=0;i<moduleObjects.Length;i++)
                     {
                     {
-                        string module = strAry[i];
+                        string module = moduleObjects[i].ToString();
                         if(int.TryParse(module,out var lpNum))
                         if(int.TryParse(module,out var lpNum))
                         {
                         {
                             modules[i]=ModuleHelper.GetVCECassModule(lpNum).ToString();
                             modules[i]=ModuleHelper.GetVCECassModule(lpNum).ToString();
@@ -1391,12 +1392,33 @@ namespace MECF.Framework.RT.ModuleLibrary.SystemModules
                         }
                         }
                     }
                     }
                     jobID = paras[1].ToString();
                     jobID = paras[1].ToString();
-                    lotId = (string[])paras[2];
-                    sequence = (string[])paras[3];
-                    slotsequence = new string[25];
-                    for (int i = 0; i < 25; i++)
-                    {
-                        slotsequence[i] = sequence[i] == "*null*" ? "" : sequence[i];
+                    object[] lotIds = (object[])paras[2];
+                    lotId=new string[lotIds.Length];
+                    for(int i=0;i<lotIds.Length;i++)
+                    {
+                        lotId[i]=lotIds[i].ToString();
+                    }
+                    object[] sequenceObjects= (object[])paras[3];
+                    slotsequence = new List<string[]>();
+                    for(int i=0;i<sequenceObjects.Length;i++)
+                    {
+                        string[] strAry = sequenceObjects[i] as string[];
+                        for(int j=0;j<strAry.Length;j++)
+                        {
+                            strAry[j]= strAry[j]== "*null*" ? "" : strAry[j];
+                        }
+                        slotsequence.Add(strAry);
+                    }
+
+                    if(lotIds.Length!=slotsequence.Count)
+                    {
+                        reason = $"lotid length is not equals slot sequence length";
+                        return false;
+                    }
+                    if (lotIds.Length != modules.Length)
+                    {
+                        reason = $"lotid length is not equals module length";
+                        return false;
                     }
                     }
                     Dictionary<string, object> para = new Dictionary<string, object>();
                     Dictionary<string, object> para = new Dictionary<string, object>();
                     para.Add("JobId", jobID);
                     para.Add("JobId", jobID);

+ 1 - 1
Mars/EfemDualSchedulerLib/Schedulers/ISchedulerFACallback.cs

@@ -5,7 +5,7 @@ namespace EfemDualSchedulerLib.Schedulers
 {
 {
     public interface ISchedulerFACallback
     public interface ISchedulerFACallback
     {
     {
-        void JobCreated(ControlJobInfo cj, ProcessJobInfo pj,string module);
+        void JobCreated(ControlJobInfo cj, ProcessJobInfo pj,string module,string lotId);
         void JobCreateFailed(string module, string lotID, string jobID, string sequenceID);
         void JobCreateFailed(string module, string lotID, string jobID, string sequenceID);
         void JobWaitingForStart(ControlJobInfo cj, ProcessJobInfo pj);
         void JobWaitingForStart(ControlJobInfo cj, ProcessJobInfo pj);
         void JobWaferStart(ProcessJobInfo pj,ModuleName moduleName, int slotID);
         void JobWaferStart(ProcessJobInfo pj,ModuleName moduleName, int slotID);

+ 30 - 24
Mars/EfemDualSchedulerLib/Schedulers/SchedulerFACallback.cs

@@ -160,14 +160,14 @@ namespace EfemDualSchedulerLib.Schedulers
 
 
         }
         }
 
 
-        public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj,string module)
+        public void JobCreated(ControlJobInfo cj, ProcessJobInfo pj,string module,string lotId)
         {
         {
             if (!string.IsNullOrEmpty(module))
             if (!string.IsNullOrEmpty(module))
             {
             {
                 ModuleName moduleName = ModuleHelper.Converter(module);
                 ModuleName moduleName = ModuleHelper.Converter(module);
                 EV.Notify(PortSequenceSelected, new SerializableDictionary<string, string>()
                 EV.Notify(PortSequenceSelected, new SerializableDictionary<string, string>()
                 {
                 {
-                    {DataVariables.LotID,  pj.LotName},
+                    {DataVariables.LotID,  lotId},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.PortID, PortId[moduleName] },
                     {DataVariables.PortID, PortId[moduleName] },
                     {DataVariables.SequenceID, pj.Sequence.Name }
                     {DataVariables.SequenceID, pj.Sequence.Name }
@@ -201,13 +201,14 @@ namespace EfemDualSchedulerLib.Schedulers
 
 
         public void JobStarted(ControlJobInfo cj, ProcessJobInfo pj)
         public void JobStarted(ControlJobInfo cj, ProcessJobInfo pj)
         {
         {
-            foreach (string casseteModule in cj.CasseteModules)
+            string[] lotId = cj.LotName.Split(',');
+            for (int i=0;i<cj.CasseteModules.Length;i++)
             {
             {
-                ModuleName module = ModuleHelper.Converter(casseteModule);
+                ModuleName module = ModuleHelper.Converter(cj.CasseteModules[i]);
 
 
                 EV.Notify(PortJobStarted, new SerializableDictionary<string, string>()
                 EV.Notify(PortJobStarted, new SerializableDictionary<string, string>()
                 {
                 {
-                    {DataVariables.LotID,  pj.LotName},
+                    {DataVariables.LotID,  lotId.Length>i?lotId[i]:""},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.SequenceID, pj.Sequence.Name }
                     {DataVariables.SequenceID, pj.Sequence.Name }
@@ -231,14 +232,15 @@ namespace EfemDualSchedulerLib.Schedulers
         }
         }
 
 
         public void JobStopped(ControlJobInfo cj, ProcessJobInfo pj)
         public void JobStopped(ControlJobInfo cj, ProcessJobInfo pj)
-        {
-            foreach (string casseteModule in cj.CasseteModules)
+        {
+            string[] lotId = cj.LotName.Split(',');
+            for (int i=0;i< cj.CasseteModules.Length;i++)
             {
             {
-                ModuleName module = ModuleHelper.Converter(casseteModule);
+                ModuleName module = ModuleHelper.Converter(cj.CasseteModules[i]);
 
 
                 EV.Notify(PortJobStopped, new SerializableDictionary<string, string>()
                 EV.Notify(PortJobStopped, new SerializableDictionary<string, string>()
                 {
                 {
-                    {DataVariables.LotID,  pj.LotName},
+                    {DataVariables.LotID,  lotId.Length>i?lotId[i]:""},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.SequenceID, pj.Sequence.Name }
                     {DataVariables.SequenceID, pj.Sequence.Name }
@@ -249,13 +251,14 @@ namespace EfemDualSchedulerLib.Schedulers
 
 
         public void JobPaused(ControlJobInfo cj, ProcessJobInfo pj)
         public void JobPaused(ControlJobInfo cj, ProcessJobInfo pj)
         {
         {
-            foreach (string casseteModule in cj.CasseteModules)
+            string[] lotId = cj.LotName.Split(',');
+            for (int i = 0; i < cj.CasseteModules.Length; i++)
             {
             {
-                ModuleName module = ModuleHelper.Converter(casseteModule);
+                ModuleName module = ModuleHelper.Converter(cj.CasseteModules[i]);
 
 
                 EV.Notify(PortJobPaused, new SerializableDictionary<string, string>()
                 EV.Notify(PortJobPaused, new SerializableDictionary<string, string>()
                 {
                 {
-                    {DataVariables.LotID,  pj.LotName},
+                    {DataVariables.LotID,  lotId.Length>i?lotId[i]:""},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.SequenceID, pj.Sequence.Name }
                     {DataVariables.SequenceID, pj.Sequence.Name }
@@ -266,13 +269,14 @@ namespace EfemDualSchedulerLib.Schedulers
 
 
         public void JobResumed(ControlJobInfo cj, ProcessJobInfo pj)
         public void JobResumed(ControlJobInfo cj, ProcessJobInfo pj)
         {
         {
-            foreach (string casseteModule in cj.CasseteModules)
+            string[] lotId = cj.LotName.Split(',');
+            for (int i = 0; i < cj.CasseteModules.Length; i++)
             {
             {
-                ModuleName module = ModuleHelper.Converter(casseteModule);
+                ModuleName module = ModuleHelper.Converter(cj.CasseteModules[i]);
 
 
                 EV.Notify(PortJobResumed, new SerializableDictionary<string, string>()
                 EV.Notify(PortJobResumed, new SerializableDictionary<string, string>()
                 {
                 {
-                    {DataVariables.LotID,  pj.LotName},
+                    {DataVariables.LotID,  lotId.Length>i?lotId[i]:""},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.SequenceID, pj.Sequence.Name }
                     {DataVariables.SequenceID, pj.Sequence.Name }
@@ -283,13 +287,14 @@ namespace EfemDualSchedulerLib.Schedulers
 
 
         public void JobAborted(ControlJobInfo cj, ProcessJobInfo pj)
         public void JobAborted(ControlJobInfo cj, ProcessJobInfo pj)
         {
         {
-            foreach (string casseteModule in cj.CasseteModules)
+            string[] lotId = cj.LotName.Split(',');
+            for (int i = 0; i < cj.CasseteModules.Length; i++)
             {
             {
-                ModuleName module = ModuleHelper.Converter(casseteModule);
+                ModuleName module = ModuleHelper.Converter(cj.CasseteModules[i]);
 
 
                 EV.Notify(PortJobAborted, new SerializableDictionary<string, string>()
                 EV.Notify(PortJobAborted, new SerializableDictionary<string, string>()
                 {
                 {
-                    {DataVariables.LotID,  cj.LotName},
+                    {DataVariables.LotID,  lotId.Length> i ? lotId[i] : ""},
                     {DataVariables.JobID,  cj.Name},
                     {DataVariables.JobID,  cj.Name},
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.SequenceID, "" }
                     {DataVariables.SequenceID, "" }
@@ -300,14 +305,15 @@ namespace EfemDualSchedulerLib.Schedulers
 
 
         public void JobFinished(ControlJobInfo cj, ProcessJobInfo pj)
         public void JobFinished(ControlJobInfo cj, ProcessJobInfo pj)
         {
         {
-            foreach (string casseteModule in cj.CasseteModules)
+            string[] lotId = cj.LotName.Split(',');
+            for (int i = 0; i < cj.CasseteModules.Length; i++)
             {
             {
-                ModuleName module = ModuleHelper.Converter(casseteModule);
+                ModuleName module = ModuleHelper.Converter(cj.CasseteModules[i]);
 
 
-                int count = pj.SlotWafers.Count;
+                int count = CalculateModuleWaferCount(module);
                 EV.Notify(PortJobFinished, new SerializableDictionary<string, string>()
                 EV.Notify(PortJobFinished, new SerializableDictionary<string, string>()
                 {
                 {
-                    {DataVariables.LotID,  pj.LotName},
+                    {DataVariables.LotID,  lotId.Length > i ? lotId[i] : ""},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.JobID,  pj.ControlJobName},
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.PortID, PortId[module] },
                     {DataVariables.SequenceID, pj.Sequence.Name },
                     {DataVariables.SequenceID, pj.Sequence.Name },
@@ -317,10 +323,10 @@ namespace EfemDualSchedulerLib.Schedulers
             OP.DoOperation(E94ControlJobStateChanged, cj.Name, cj.State);
             OP.DoOperation(E94ControlJobStateChanged, cj.Name, cj.State);
         }
         }
 
 
-        private int CalculateProcessJobWaferCount(ProcessJobInfo pj)
+        private int CalculateModuleWaferCount(ModuleName module)
         {
         {
             int count = 0;
             int count = 0;
-           WaferInfo[] wafers= WaferManager.Instance.GetWaferByProcessJob(pj.Name);
+           WaferInfo[] wafers= WaferManager.Instance.GetWafers(module);
             if(wafers!=null)
             if(wafers!=null)
             {
             {
                 for(int i=0;i<wafers.Length;i++)
                 for(int i=0;i<wafers.Length;i++)

+ 29 - 28
Mars/EfemDualSchedulerLib/VCEDualAutoTransfer.cs

@@ -418,7 +418,7 @@ namespace EfemDualSchedulerLib
         public bool CreateJob(Dictionary<string, object> param,out string reason)
         public bool CreateJob(Dictionary<string, object> param,out string reason)
         {
         {
             reason = "";
             reason = "";
-            string[] slotSequence = null;
+            List<string[]> slotSequenceList = null;
             if(!param.ContainsKey("SlotSequence"))
             if(!param.ContainsKey("SlotSequence"))
             {
             {
                 reason = "dictionary does not have SlotSequence key";
                 reason = "dictionary does not have SlotSequence key";
@@ -426,7 +426,7 @@ namespace EfemDualSchedulerLib
             }
             }
             else
             else
             {
             {
-                slotSequence= (string[])param["SlotSequence"];
+                slotSequenceList = (List<string[]>)param["SlotSequence"];
             }
             }
 
 
             string jobId = "";
             string jobId = "";
@@ -475,8 +475,10 @@ namespace EfemDualSchedulerLib
 
 
 
 
             string mod = "";
             string mod = "";
-            foreach (string module in modules)
+            for (int i=0;i<modules.Length;i++)
             {
             {
+                string module = modules[i];
+                string[] slotSequence = slotSequenceList[i];
                 if (slotSequence.Length != 25)
                 if (slotSequence.Length != 25)
                 {
                 {
                     reason = $"slot sequence parameter not valid, length is {slotSequence.Length}, should be 25";
                     reason = $"slot sequence parameter not valid, length is {slotSequence.Length}, should be 25";
@@ -566,7 +568,7 @@ namespace EfemDualSchedulerLib
                 }
                 }
             }
             }
 
 
-            bool matched = CheckModuleMatched(modules, mod, slotSequence, out reason);
+            bool matched = CheckModuleMatched(modules, mod, slotSequenceList, out reason);
             if (!matched)
             if (!matched)
             {
             {
                 EV.PostAlarmLog(LogSource, reason);
                 EV.PostAlarmLog(LogSource, reason);
@@ -575,24 +577,22 @@ namespace EfemDualSchedulerLib
 
 
             ControlJobInfo cj = new ControlJobInfo();
             ControlJobInfo cj = new ControlJobInfo();
             cj.Name = jobId;
             cj.Name = jobId;
-            cj.Module = mod;
-            if (lotId.Count > 1 && lotId[0] != lotId[1])
-                cj.LotName = lotId[0] + "," + lotId[1];
-            else
-                cj.LotName = lotId[0];
+            cj.Module = mod;
+            cj.LotName = string.Join(",",lotId);
             cj.LotInnerId = Guid.NewGuid();
             cj.LotInnerId = Guid.NewGuid();
             cj.LotWafers = new List<WaferInfo>();
             cj.LotWafers = new List<WaferInfo>();
             cj.SetState(EnumControlJobState.Queued);
             cj.SetState(EnumControlJobState.Queued);
             cj.CasseteModules = modules;
             cj.CasseteModules = modules;
 
 
-            Dictionary<string, bool[]> seqSlot = new Dictionary<string, bool[]>();
-            Dictionary<string, List<Tuple<ModuleName, int>>> seqSlotWafers = new Dictionary<string, List<Tuple<ModuleName, int>>>();
-            Dictionary<string, string> indexSequence = new Dictionary<string, string>();
-
             List<ProcessJobInfo> pjs = new List<ProcessJobInfo>();
             List<ProcessJobInfo> pjs = new List<ProcessJobInfo>();
             bool enableGroupBySequence = SC.GetValue<bool>("System.Scheduler.GroupWaferBySequence");
             bool enableGroupBySequence = SC.GetValue<bool>("System.Scheduler.GroupWaferBySequence");
-            foreach (string module in modules)
-            {
+            for (int j=0;j<modules.Length;j++)
+            {
+                Dictionary<string, bool[]> seqSlot = new Dictionary<string, bool[]>();
+                Dictionary<string, List<Tuple<ModuleName, int>>> seqSlotWafers = new Dictionary<string, List<Tuple<ModuleName, int>>>();
+                Dictionary<string, string> indexSequence = new Dictionary<string, string>();
+                string[] slotSequence = slotSequenceList[j];
+                string module = modules[j];
                 for (int i = 0; i < 25; i++)
                 for (int i = 0; i < 25; i++)
                 {
                 {
                     if (string.IsNullOrEmpty(slotSequence[i]) || string.IsNullOrEmpty(slotSequence[i].Trim()))
                     if (string.IsNullOrEmpty(slotSequence[i]) || string.IsNullOrEmpty(slotSequence[i].Trim()))
@@ -651,6 +651,7 @@ namespace EfemDualSchedulerLib
                     return false;
                     return false;
                 }
                 }
 
 
+
                 string[] seqs = seqSlot.Keys.ToArray();
                 string[] seqs = seqSlot.Keys.ToArray();
                 for (int i = 0; i < seqs.Length; i++)
                 for (int i = 0; i < seqs.Length; i++)
                 {
                 {
@@ -658,10 +659,7 @@ namespace EfemDualSchedulerLib
                     pj.Name = jobId + "_" + (i + 1);
                     pj.Name = jobId + "_" + (i + 1);
                     pj.Sequence = SequenceInfoHelper.GetInfo(indexSequence[seqs[i]]);
                     pj.Sequence = SequenceInfoHelper.GetInfo(indexSequence[seqs[i]]);
                     pj.ControlJobName = cj.Name;
                     pj.ControlJobName = cj.Name;
-                    if (lotId.Count > 1 && lotId[0] != lotId[1])
-                        pj.LotName = lotId[0] + "," + lotId[1];
-                    else
-                        pj.LotName = lotId[0];
+                    pj.LotName = lotId[j];
                     pj.SlotWafers = seqSlotWafers[seqs[i]];
                     pj.SlotWafers = seqSlotWafers[seqs[i]];
                     pj.SetState(EnumProcessJobState.Queued);
                     pj.SetState(EnumProcessJobState.Queued);
 
 
@@ -732,11 +730,11 @@ namespace EfemDualSchedulerLib
             }
             }
 
 
             string carrierid = "";
             string carrierid = "";
-            foreach (string module in modules)
+            for(int i=0;i<modules.Length;i++)
             {
             {
-                _faCallback.JobCreated(cj, GetFirstProcessJob(cj),module);
+                _faCallback.JobCreated(cj, GetFirstProcessJob(cj), modules[i], lotId[i]);
 
 
-                CarrierInfo carrier = CarrierManager.Instance.GetCarrier(module);
+                CarrierInfo carrier = CarrierManager.Instance.GetCarrier(modules[i]);
                 if (!string.IsNullOrEmpty(carrierid))
                 if (!string.IsNullOrEmpty(carrierid))
                     carrierid += ",";
                     carrierid += ",";
                 carrierid += carrier.InnerId.ToString();
                 carrierid += carrier.InnerId.ToString();
@@ -754,23 +752,26 @@ namespace EfemDualSchedulerLib
         /// <param name="slotSequence"></param>
         /// <param name="slotSequence"></param>
         /// <param name="reason"></param>
         /// <param name="reason"></param>
         /// <returns></returns>
         /// <returns></returns>
-        private bool CheckModuleMatched(string[] modules,string mod,string[] slotSequence, out string reason)
+        private bool CheckModuleMatched(string[] modules,string mod,List<string[]> slotSequence, out string reason)
         {
         {
             reason = "";
             reason = "";
             ModuleName[] moduleNames = ModuleHelper.GetCassetteByVce(mod);
             ModuleName[] moduleNames = ModuleHelper.GetCassetteByVce(mod);
             
             
             for(int i=0;i<25;i++)
             for(int i=0;i<25;i++)
             {
             {
-                if (string.IsNullOrEmpty(slotSequence[i]) || string.IsNullOrEmpty(slotSequence[i].Trim()))
-                    continue;
                 bool leftHasWafer = WaferManager.Instance.CheckHasWafer(moduleNames[0], i);
                 bool leftHasWafer = WaferManager.Instance.CheckHasWafer(moduleNames[0], i);
                 bool rightHasWafer = WaferManager.Instance.CheckHasWafer(moduleNames[1], i);
                 bool rightHasWafer = WaferManager.Instance.CheckHasWafer(moduleNames[1], i);
-                if(!leftHasWafer&&!rightHasWafer)
+                if (!leftHasWafer &&!string.IsNullOrEmpty(slotSequence[0][i]))
+                {
+                    reason = $"job wafer: {modules[0]} slot {i + 1} not in the carrier";
+                    return false;
+                }
+                if (!rightHasWafer && !string.IsNullOrEmpty(slotSequence[1][i]))
                 {
                 {
-                    reason = $"job wafer: slot {i + 1} not in the carrier";
+                    reason = $"job wafer: {modules[1]} slot {i + 1} not in the carrier";
                     return false;
                     return false;
                 }
                 }
-                if(modules.Length==1)
+                if (modules.Length==1)
                 {
                 {
                     if (leftHasWafer == rightHasWafer)
                     if (leftHasWafer == rightHasWafer)
                     {
                     {

BIN
ThirdParty/dlls/SecsGem.Core.Application.dll


BIN
ThirdParty/dlls/SecsGem.Core.dll


BIN
ThirdParty/dlls/SecsGem.Hsms.Core.dll