|
@@ -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()
|