|
@@ -92,7 +92,7 @@ namespace Venus_RT.Modules
|
|
break;
|
|
break;
|
|
case ModuleStatus.WaitProcess:
|
|
case ModuleStatus.WaitProcess:
|
|
{
|
|
{
|
|
- if(WaferManager.Instance.CheckHasWafer(Module, 0) && _runingWaferTask.Value.First().Key == RecipeJobType.Process)
|
|
|
|
|
|
+ if(WaferManager.Instance.CheckHasWafer(Module, 0))
|
|
{
|
|
{
|
|
Scheduler.EventWaferArrived?.Invoke(this, new WaferMoveArgs(ModuleName.TMRobot, 0, Module, 0));
|
|
Scheduler.EventWaferArrived?.Invoke(this, new WaferMoveArgs(ModuleName.TMRobot, 0, Module, 0));
|
|
Status = ModuleStatus.StartProcess;
|
|
Status = ModuleStatus.StartProcess;
|
|
@@ -105,7 +105,7 @@ namespace Venus_RT.Modules
|
|
break;
|
|
break;
|
|
case ModuleStatus.WaitPreJobClean:
|
|
case ModuleStatus.WaitPreJobClean:
|
|
{
|
|
{
|
|
- if (WaferManager.Instance.CheckNoWafer(Module, 0) && _runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
|
|
|
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(Module, 0))
|
|
{
|
|
{
|
|
if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
{
|
|
{
|
|
@@ -114,7 +114,7 @@ namespace Venus_RT.Modules
|
|
else
|
|
else
|
|
{
|
|
{
|
|
LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
- _runingWaferTask.Value.Dequeue();
|
|
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -126,7 +126,7 @@ namespace Venus_RT.Modules
|
|
break;
|
|
break;
|
|
case ModuleStatus.WaitPostJobClean:
|
|
case ModuleStatus.WaitPostJobClean:
|
|
{
|
|
{
|
|
- if (WaferManager.Instance.CheckNoWafer(Module, 0) && _runingWaferTask.Value.First().Key == RecipeJobType.PostClean)
|
|
|
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(Module, 0))
|
|
{
|
|
{
|
|
if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
{
|
|
{
|
|
@@ -135,7 +135,7 @@ namespace Venus_RT.Modules
|
|
else
|
|
else
|
|
{
|
|
{
|
|
LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Postjob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Postjob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
- _runingWaferTask.Value.Dequeue();
|
|
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -153,30 +153,26 @@ namespace Venus_RT.Modules
|
|
if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
|
|
if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
|
|
{
|
|
{
|
|
_wafer.Return();
|
|
_wafer.Return();
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else // handle offline exception situation
|
|
else // handle offline exception situation
|
|
{
|
|
{
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
-
|
|
|
|
- if(_runingWaferTask.Value.Count > 0 && _runingWaferTask.Value.First().Key == RecipeJobType.Process)
|
|
|
|
- _runingWaferTask.Value.Dequeue();
|
|
|
|
-
|
|
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case ModuleStatus.PreJobClean:
|
|
case ModuleStatus.PreJobClean:
|
|
{
|
|
{
|
|
- if(_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
|
|
|
|
- _runingWaferTask.Value.Dequeue();
|
|
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
case ModuleStatus.PostJobClean:
|
|
case ModuleStatus.PostJobClean:
|
|
{
|
|
{
|
|
- if (_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
|
|
|
|
- _runingWaferTask.Value.Dequeue();
|
|
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
break;
|
|
break;
|
|
@@ -222,6 +218,53 @@ namespace Venus_RT.Modules
|
|
return RState.Running;
|
|
return RState.Running;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ void TryDequeueRuningTask( ModuleStatus status)
|
|
|
|
+ {
|
|
|
|
+ bool bMatch = false;
|
|
|
|
+ if (_runingWaferTask.Value.Count > 0)
|
|
|
|
+ {
|
|
|
|
+ switch(status)
|
|
|
|
+ {
|
|
|
|
+ case ModuleStatus.PreJobClean:
|
|
|
|
+ if(_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
|
|
|
|
+ {
|
|
|
|
+ _runingWaferTask.Value.Dequeue();
|
|
|
|
+ bMatch = true;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.Processing:
|
|
|
|
+ if(_runingWaferTask.Value.First().Key == RecipeJobType.Process)
|
|
|
|
+ {
|
|
|
|
+ _runingWaferTask.Value.Dequeue();
|
|
|
|
+ bMatch = true;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.PostJobClean:
|
|
|
|
+ if(_runingWaferTask.Value.First().Key == RecipeJobType.PostClean)
|
|
|
|
+ {
|
|
|
|
+ _runingWaferTask.Value.Dequeue();
|
|
|
|
+ bMatch = true;
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.WaitPreJobClean:
|
|
|
|
+ _runingWaferTask.Value.Dequeue();
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.WaitProcess:
|
|
|
|
+ _runingWaferTask.Value.Dequeue();
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.WaitPostJobClean:
|
|
|
|
+ _runingWaferTask.Value.Dequeue();
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(!bMatch)
|
|
|
|
+ {
|
|
|
|
+ string runingTask = _runingWaferTask.Value.Count > 0 ? _runingWaferTask.Value.First().ToString() : "Empty";
|
|
|
|
+ LOG.Write(eEvent.WARN_ROUTER, Module, $"PM Status: {status}, runing task : {runingTask}");
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
public override void WaferArrived(WaferTask wafer, int slot)
|
|
public override void WaferArrived(WaferTask wafer, int slot)
|
|
{
|
|
{
|
|
_wafer = wafer;
|
|
_wafer = wafer;
|