Bläddra i källkod

1、重新引用最新版本的SecsGem动态库,用于实现FA相应的功能;
2、完成了FA相应PPSelect、StartJob、Load和UnLoad指令,目前PPSELECT存在UI显示问题,StartJob系统未报错,但系统未正常运行;

chenkui 1 år sedan
förälder
incheckning
a3f01b0830

+ 5 - 1
Venus/Framework/Common/Jobs/SequenceInfo.cs

@@ -185,9 +185,13 @@ namespace MECF.Framework.Common.Jobs
                     LOG.WriteExeption(ex);
                     return null;
                 }
+                return info;
+            }
+            else
+            {
+                return null;
             }
 
-            return info;
         }
     }
 }

+ 2 - 2
Venus/Framework/Common/Routine/IRoutine.cs

@@ -29,8 +29,8 @@ namespace Aitex.Core.RT.Routine
         void StopJob(string jobName);
         void ResumeJob(string jobName);
         void PauseJob(string jobName);
-        void StartJob(string jobName);
-        void CreateJob(Dictionary<string, object> param);
+        bool StartJob(string jobName,out string reason);
+        bool CreateJob(Dictionary<string, object> param,out string reason);
         void Clear();
 
         bool ManualReturnWafer(object[] objs);

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


BIN
Venus/ThirdParty/SecsGem.Core.Application.pdb


BIN
Venus/ThirdParty/SecsGem.Core.dll


BIN
Venus/ThirdParty/SecsGem.Core.pdb


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


BIN
Venus/ThirdParty/SecsGem.Hsms.Core.pdb


BIN
Venus/ThirdParty/SecsGemSerial.Application.dll


BIN
Venus/ThirdParty/SecsGemSerial.Application.pdb


BIN
Venus/ThirdParty/SecsGemSerial.Core.dll


BIN
Venus/ThirdParty/SecsGemSerial.Core.pdb


+ 2 - 0
Venus/Venus_Core/EventDefine.cs

@@ -97,5 +97,7 @@ namespace Aitex.Core.RT.Log{
 		ERR_LL = 6000,
 		INFO_LL = 6001,
 		WARN_LL = 6002,
+		ERR_FA = 6003,
+		WARN_FA = 6004,
 	}
 }

+ 18 - 0
Venus/Venus_RT/Config/LogDefine.json

@@ -863,5 +863,23 @@
     "GlobalDescription_en": "{0}",
     "Module": "LL",
     "Note": "LL warning"
+  },
+  {
+    "Id": 6003,
+    "Level": "Error",
+    "LogEnum": "ERR_FA",
+    "GlobalDescription_zh": "{0}",
+    "GlobalDescription_en": "{0}",
+    "Module": "FA",
+    "Note": "FA Alarm"
+  },
+  {
+    "Id": 6004,
+    "Level": "Warning",
+    "LogEnum": "WARN_FA",
+    "GlobalDescription_zh": "{0}",
+    "GlobalDescription_en": "{0}",
+    "Module": "FA",
+    "Note": "FA warning"
   }
 ]

+ 2 - 1
Venus/Venus_RT/Devices/EFEM/Loadport.cs

@@ -8,6 +8,7 @@ using Aitex.Sorter.Common;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.SubstrateTrackings;
 using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.LoadPorts;
+using SecsGem.Core.Application.E87;
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -131,7 +132,7 @@ namespace Venus_RT.Devices.EFEM
 
             OP.Subscribe($"{Module}.SetThick", (cmd, args) => { SetThick(); return true; });
             OP.Subscribe($"{Module}.SetThin", (cmd, args) => { SetThin(); return true; });
-
+            _lpCallBack = E87LoadPortManager.Instance.GetLoadPort((int)mod - (int)ModuleName.LP1 + 1);
         }
 
         // Methods

+ 3 - 1
Venus/Venus_RT/Instances/ToolLoader.cs

@@ -81,7 +81,6 @@ namespace Venus_RT.Instances
 
             Singleton<DeviceEntity>.Instance.Initialize();
 
-            SecGemApplication.Instance.Initialize(PathManager.GetCfgDir() + "EquipmentVariables.xml", 0);
 
             DataCollectionManager.Instance.Initialize(RtInstance.DatabaseName);
 
@@ -91,6 +90,9 @@ namespace Venus_RT.Instances
 
             Singleton<RouteManager>.Instance.Initialize();
 
+            SecGemApplication.Instance.Initialize(PathManager.GetCfgDir() + "EquipmentVariables.xml", 0);
+            SecGemApplication.Instance.EquipmentCommand = Singleton<RouteManager>.Instance;
+
             Singleton<EventManager>.Instance.FireEvent += InstanceOnOnEvent;
 
             string s1 = System.Diagnostics.FileVersionInfo.GetVersionInfo(Path.Combine(PathManager.GetAppDir(), "Venus_RT.exe")).ProductVersion;

+ 41 - 23
Venus/Venus_RT/Modules/AutoCycle.cs

@@ -206,8 +206,9 @@ namespace Venus_RT.Modules
         {
         }
 
-        public void CreateJob(Dictionary<string, object> param)
+        public bool CreateJob(Dictionary<string, object> param,out string reason)
         {
+            reason = "";
             _isCycleMode = SC.GetValue<bool>("System.IsCycleMode");
             _cycleSetPoint = _isCycleMode ? SC.GetValue<int>("System.CycleCount") : 0;
 
@@ -225,16 +226,18 @@ namespace Venus_RT.Modules
 
             if (slotSequence.Length != SC.GetValue<int>("EFEM.LoadPort.SlotNumber"))
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"slot sequence parameter not valid, length is {slotSequence.Length}, should be {SC.GetValue<int>("EFEM.LoadPort.SlotNumber")}");
+                reason = $"slot sequence parameter not valid, length is {slotSequence.Length}, should be {SC.GetValue<int>("EFEM.LoadPort.SlotNumber")}";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             if (!ModuleHelper.IsLoadPort(ModuleHelper.Converter(module)))
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"{module} should be LoadPort");
+                reason = $"{module} should be LoadPort";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             if (string.IsNullOrEmpty(jobId))
@@ -244,17 +247,19 @@ namespace Venus_RT.Modules
 
             if (_lstControlJobs.Exists(x => x.Name == jobId))
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"{jobId} already created");
+                reason = $"{jobId} already created";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System,reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             SchedulerLoadPort lp = _atmSchedulers[ModuleHelper.Converter(module)] as SchedulerLoadPort;
             if (!lp.CheckReadyRunJob())
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"{module} not ready");
+                reason = $"{module} not ready";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             ControlJobInfo cj = new ControlJobInfo();
@@ -292,21 +297,24 @@ namespace Venus_RT.Modules
 
                 if (!WaferManager.Instance.CheckHasWafer(module, i))
                 {
-                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job wafer: {module} slot {i + 1} not in the carrier");
-                    return;
+                    reason = $"job wafer: {module} slot {i + 1} not in the carrier";
+                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
+                    return false;
                 }
                 if (!WaferManager.Instance.CheckWafer(ModuleHelper.Converter(module), i, WaferStatus.Normal))
                 {
-                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job wafer: {module} slot {i + 1} status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).Status}");
+                    reason = $"job wafer: {module} slot {i + 1} status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).Status}";
+                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 if (WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).ProcessState != EnumWaferProcessStatus.Idle)
                 {
-                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job wafer: {module} slot {i + 1} process status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).ProcessState}");
+                    reason = $"job wafer: {module} slot {i + 1} process status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).ProcessState}";
+                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 cj.LotWafers.Add(WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i));
@@ -321,9 +329,10 @@ namespace Venus_RT.Modules
 
             if (seqSlotWafers.Count == 0)
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job has not assign wafer");
+                reason = $"job has not assign wafer";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             List<ProcessJobInfo> pjs = new List<ProcessJobInfo>();
@@ -333,23 +342,28 @@ namespace Venus_RT.Modules
                 ProcessJobInfo pj = new ProcessJobInfo();
                 pj.Name = jobId + "_" + (i + 1);
                 pj.Sequence = SequenceInfoHelper.GetInfo(indexSequence[seqs[i]]);
+                if(pj.Sequence==null)
+                {
+                    reason = $"invalid sequence[{seqs[i]}]";
+                    return false;
+                }
                 pj.ControlJobName = cj.Name;
                 pj.LotName = lotId;
                 pj.SlotWafers = seqSlotWafers[seqs[i]];
                 pj.SetState(EnumProcessJobState.Queued);
 
-                if (!CheckSequencePmReady(pj.Sequence, null, out _, out string reason))
+                if (!CheckSequencePmReady(pj.Sequence, null, out _, out reason))
                 {
                     LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"no valid chamber for the {reason}");
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 if (!RouteManager.IsATMMode && !CheckSequenceRecipeFileValid(pj.Sequence, out reason))
                 {
                     LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"recipe file not valid in the sequence, {reason}");
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 pjs.Add(pj);
@@ -366,6 +380,7 @@ namespace Venus_RT.Modules
             //AssociatedPMWithLP(cj);
 
             _faCallback.JobCreated(cj, GetFirstProcessJob(cj));
+            return true;
         }
 
         public bool CheckAllJobDone()
@@ -507,13 +522,15 @@ namespace Venus_RT.Modules
         }
 
 
-        public void StartJob(string jobName)
+        public bool StartJob(string jobName,out string reason)
         {
+            reason = "";
             ControlJobInfo cj = _lstControlJobs.Find(x => x.Name == jobName);
             if (cj == null)
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"start job rejected, not found job with id {jobName}");
-                return;
+                reason = $"start job rejected, not found job with id {jobName}";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
+                return false;
             }
 
             if (cj.State == EnumControlJobState.WaitingForStart)
@@ -548,6 +565,7 @@ namespace Venus_RT.Modules
             }
 
             _cycleState = RState.Running;
+            return true;
         }
 
         public void Clear()

+ 171 - 4
Venus/Venus_RT/Modules/RouteManager.cs

@@ -25,7 +25,7 @@ using SecsGem.Core.Application;
 
 namespace Venus_RT.Modules
 {
-    class RouteManager : Entity, IEntity
+    class RouteManager : Entity, IEntity, IEquipmentCommand
     {
 
         public enum MSG
@@ -915,13 +915,12 @@ namespace Venus_RT.Modules
 
         private bool FsmCreateJob(object[] objs)
         {
-            _AutoCycle.CreateJob((Dictionary<string, object>)objs[0]);
-            return true;
+            return _AutoCycle.CreateJob((Dictionary<string, object>)objs[0],out var reason);
         }
 
         private bool FsmStartJob(object[] objs)
         {
-            _AutoCycle.StartJob((string)objs[0]);
+            _AutoCycle.StartJob((string)objs[0],out var reason);
             return true;
         }
 
@@ -1136,5 +1135,173 @@ namespace Venus_RT.Modules
             seTM.CheckToPostMessage((int)SETMEntity.MSG.Abort);
             return true;
         }
+
+        #region Fa接口
+        /// <summary>
+        /// 接口指令
+        /// </summary>
+        /// <param name="command"></param>
+        /// <param name="paras"></param>
+        /// <param name="reason"></param>
+        /// <returns></returns>
+        public bool ExcuteCommand(string command, object[] paras, out string reason)
+        {
+            reason = "";
+            switch(command)
+            {
+                case "PP-SELECT":
+                    return FaCreateJob(paras, out reason);
+                case "StartJob":
+                    return FaStartJob(paras[0].ToString(), out reason);
+                case "Load":
+                    return FaLoad(paras[0].ToString());
+                case "Unload":
+                    return FaUnLoad(paras[0].ToString());
+                    
+            }
+            return true;
+        }
+        /// <summary>
+        /// Fa创建任务
+        /// </summary>
+        /// <param name="paras"></param>
+        /// <param name="reason"></param>
+        /// <returns></returns>
+        private bool FaCreateJob(object[] paras,out string reason)
+        {
+            if(!CheckAuto())
+            {
+                reason = "System is not in Auto,cannot create job";
+                return false;
+            }
+            else
+            {
+                Dictionary<string, object> createParams = new Dictionary<string, object>();
+                createParams["Module"] = $"LP{paras[0]}";
+                createParams["JobId"] = paras[1].ToString();
+                createParams["SlotSequence"] = (string[])paras[3];
+                createParams["AutoStart"] = true;
+                if (paras.Length >= 5)
+                {
+                    createParams["PreCleanRecipeName"] = paras[4].ToString();
+                }
+                if (paras.Length >= 6)
+                {
+                    createParams["PostCleabRecipeName"] = paras[5].ToString();
+                }
+                return _AutoCycle.CreateJob(createParams,out reason);                
+            }
+        }
+        /// <summary>
+        /// Fa启动任务
+        /// </summary>
+        /// <param name="jobName"></param>
+        /// <param name="reason"></param>
+        /// <returns></returns>
+        private bool FaStartJob(string jobName,out string reason)
+        {
+            return _AutoCycle.StartJob(jobName,out reason);
+        }
+        /// <summary>
+        /// Fa Load
+        /// </summary>
+        /// <param name="lp"></param>
+        /// <returns></returns>
+        private bool FaLoad(string lp)
+        {
+            return EFEM.EfemDevice.Load(ModuleHelper.Converter($"LP{lp}"));
+        }
+        /// <summary>
+        /// Fa Unload
+        /// </summary>
+        /// <param name="lp"></param>
+        /// <returns></returns>
+        private bool FaUnLoad(string lp)
+        {
+            return EFEM.EfemDevice.Unload(ModuleHelper.Converter($"LP{lp}"));
+        }
+        public string[] GetSequenceList()
+        {
+            return null;
+        }
+
+        public string GetSequenceBody(string ppid)
+        {
+            return "";
+        }
+
+        public List<string> GetFormatedSequence(string ppid)
+        {
+            return null;
+        }
+
+        public bool deleteSequence(string ppid)
+        {
+            return true;
+        }
+
+        public bool UpdateSequence(string ppid, string body)
+        {
+            return true;
+        }
+
+        public void ShowTerminalMessage(string message)
+        {
+        }
+
+        public bool CreateProcessJob(string processJobId, string sequenceName, string carrierId, out string reason)
+        {
+            reason = "";
+            return true;
+        }
+
+        public void UpdateProcessJobCarrierSlot(string processJobId, string moduleName, List<int> slots)
+        {
+        }
+
+        public void CreateControlJob(string controlJobId, string carrierId, List<string> processJobs)
+        {
+        }
+
+        public bool CheckCreateControlJobCondition(List<string> modules, out string reason)
+        {
+            reason = "";
+            return true;
+        }
+
+        public bool StartControlJob(string controlJob)
+        {
+            return true;
+        }
+
+        public bool StopControlJob(string controlJob)
+        {
+            return true;
+        }
+
+        public bool AbortControlJob(string controlJob)
+        {
+            return true;
+        }
+
+        public bool PauseControlJob(string controlJob)
+        {
+            return true;
+        }
+
+        public bool ResumeControlJob(string controlJob)
+        {
+            return true;
+        }
+
+        public bool CheckAuto()
+        {
+            return fsm.State == (int)RtState.AutoIdle;
+        }
+
+        public void UpdateControlJobModule(string controlJobId, string moduleName)
+        {
+        }
+        #endregion
     }
 }

+ 31 - 20
Venus/Venus_RT/Modules/SystemDispatcher.cs

@@ -608,8 +608,9 @@ namespace Venus_RT.Modules
         }
 
 
-        public void CreateJob(Dictionary<string, object> param)
+        public bool CreateJob(Dictionary<string, object> param,out string reason)
         {
+            reason = "";
             _isCycleMode = SC.GetValue<bool>("System.IsCycleMode");
             _cycleSetPoint = _isCycleMode ? SC.GetValue<int>("System.CycleCount") : 0;
 
@@ -627,16 +628,18 @@ namespace Venus_RT.Modules
 
             if (slotSequence.Length != SC.GetValue<int>("EFEM.LoadPort.SlotNumber"))
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"slot sequence parameter not valid, length is {slotSequence.Length}, should be {SC.GetValue<int>("EFEM.LoadPort.SlotNumber")}");
+                reason = $"slot sequence parameter not valid, length is {slotSequence.Length}, should be {SC.GetValue<int>("EFEM.LoadPort.SlotNumber")}";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             if (!ModuleHelper.IsLoadPort(ModuleHelper.Converter(module)))
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"{module} should be LoadPort");
+                reason = $"{module} should be LoadPort";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             if (string.IsNullOrEmpty(jobId))
@@ -646,9 +649,10 @@ namespace Venus_RT.Modules
 
             if (_lstControlJobs.Exists(x => x.Name == jobId))
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"{jobId} already created");
+                reason = $"{jobId} already created";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             ControlJobInfo cj = new ControlJobInfo();
@@ -687,20 +691,22 @@ namespace Venus_RT.Modules
                 if (!WaferManager.Instance.CheckHasWafer(module, i))
                 {
                     LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job wafer: {module} slot {i + 1} not in the carrier");
-                    return;
+                    return false;
                 }
                 if (!WaferManager.Instance.CheckWafer(ModuleHelper.Converter(module), i, WaferStatus.Normal))
                 {
-                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job wafer: {module} slot {i + 1} status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).Status}");
+                    reason = $"job wafer: {module} slot {i + 1} status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).Status}";
+                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 if (WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).ProcessState != EnumWaferProcessStatus.Idle)
                 {
-                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job wafer: {module} slot {i + 1} process status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).ProcessState}");
+                    reason = $"job wafer: {module} slot {i + 1} process status is {WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i).ProcessState}";
+                    LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 cj.LotWafers.Add(WaferManager.Instance.GetWafer(ModuleHelper.Converter(module), i));
@@ -715,9 +721,10 @@ namespace Venus_RT.Modules
 
             if (seqSlotWafers.Count == 0)
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"job has not assign wafer");
+                reason = $"job has not assign wafer";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System,reason );
                 _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                return;
+                return false;
             }
 
             List<ProcessJobInfo> pjs = new List<ProcessJobInfo>();
@@ -732,18 +739,18 @@ namespace Venus_RT.Modules
                 pj.SlotWafers = seqSlotWafers[seqs[i]];
                 pj.SetState(EnumProcessJobState.Queued);
 
-                if (!CheckSequencePmReady(pj.Sequence, out string reason))
+                if (!CheckSequencePmReady(pj.Sequence, out reason))
                 {
                     LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"no valid chamber for the {reason}");
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 if (!RouteManager.IsATMMode && !CheckSequenceRecipeFileValid(pj.Sequence, out reason))
                 {
                     LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"recipe file not valid in the sequence, {reason}");
                     _faCallback.JobCreateFailed(module, lotId, jobId, "");
-                    return;
+                    return false;
                 }
 
                 pjs.Add(pj);
@@ -760,6 +767,7 @@ namespace Venus_RT.Modules
             //AssociatedPMWithLP(cj);
 
             _faCallback.JobCreated(cj, GetFirstProcessJob(cj));
+            return true;
         }
 
         public bool CheckAllJobDone()
@@ -901,13 +909,15 @@ namespace Venus_RT.Modules
         }
 
 
-        public void StartJob(string jobName)
+        public bool StartJob(string jobName,out string reason)
         {
+            reason = "";
             ControlJobInfo cj = _lstControlJobs.Find(x => x.Name == jobName);
             if (cj == null)
             {
-                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"start job rejected, not found job with id {jobName}");
-                return;
+                reason = $"start job rejected, not found job with id {jobName}";
+                LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
+                return false;
             }
 
             if (cj.State == EnumControlJobState.WaitingForStart)
@@ -940,6 +950,7 @@ namespace Venus_RT.Modules
             }
 
             _cycleState = RState.Running;
+            return true;
         }
 
         public void Clear()

+ 0 - 4
Venus/Venus_RT/Venus_RT.csproj

@@ -494,10 +494,6 @@
       <Project>{7c395751-abe6-4b5b-8f3a-bda0fce08f6c}</Project>
       <Name>RTModuleLibrary</Name>
     </ProjectReference>
-    <ProjectReference Include="..\Framework\SimulatorCore\SimulatorCore.csproj">
-      <Project>{ebe55e3f-6dce-47b9-ac61-54a8b9b3482a}</Project>
-      <Name>SimulatorCore</Name>
-    </ProjectReference>
     <ProjectReference Include="..\Framework\UICore\UICore.csproj">
       <Project>{2c9e1df3-1aba-4972-be60-41dd9b3c47a7}</Project>
       <Name>UICore</Name>