|
@@ -58,7 +58,6 @@ namespace Venus_RT.Modules
|
|
{
|
|
{
|
|
return Scheduler.IsAvailable ? 0 : (Scheduler.TimeToReady + 500) / 1000;
|
|
return Scheduler.IsAvailable ? 0 : (Scheduler.TimeToReady + 500) / 1000;
|
|
}
|
|
}
|
|
- break;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
return int.MaxValue;
|
|
return int.MaxValue;
|
|
@@ -75,146 +74,158 @@ namespace Venus_RT.Modules
|
|
{ }
|
|
{ }
|
|
public override RState Run()
|
|
public override RState Run()
|
|
{
|
|
{
|
|
- if (Scheduler.IsIdle)
|
|
|
|
|
|
+ if(_runingWaferTask.Value.Count == 0)
|
|
{
|
|
{
|
|
- switch (Status)
|
|
|
|
|
|
+ if(_pendingWaferTasks.Count > 0)
|
|
{
|
|
{
|
|
- case ModuleStatus.Idle:
|
|
|
|
- {
|
|
|
|
- if (WaferManager.Instance.CheckNoWafer(Module, 0) && Scheduler.IsOnline)
|
|
|
|
- {
|
|
|
|
- if (_pmScheduler.RunIdleCleanTask()) // Check Idle Clean
|
|
|
|
- {
|
|
|
|
- Status = ModuleStatus.StartIdleClean;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.WaitProcess:
|
|
|
|
|
|
+ _runingWaferTask = _pendingWaferTasks.Dequeue();
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if(Scheduler.IsIdle && Status == ModuleStatus.Idle)
|
|
|
|
+ {
|
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(Module, 0) && Scheduler.IsOnline)
|
|
{
|
|
{
|
|
- if(WaferManager.Instance.CheckHasWafer(Module, 0))
|
|
|
|
- {
|
|
|
|
- Scheduler.EventWaferArrived?.Invoke(this, new WaferMoveArgs(ModuleName.TMRobot, 0, Module, 0));
|
|
|
|
- Status = ModuleStatus.StartProcess;
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
|
|
+ if (_pmScheduler.RunIdleCleanTask()) // Check Idle Clean
|
|
{
|
|
{
|
|
- LOG.Write(eEvent.WARN_ROUTER, Module, $"Run process recipe failed, wafer existance{WaferManager.Instance.GetWafer(Module, 0).WaferOrigin}, pending job type: {_runingWaferTask.Value.First().Key}");
|
|
|
|
|
|
+ Status = ModuleStatus.StartIdleClean;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- break;
|
|
|
|
- case ModuleStatus.WaitPreJobClean:
|
|
|
|
- {
|
|
|
|
- if (WaferManager.Instance.CheckNoWafer(Module, 0))
|
|
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ if(Scheduler.IsIdle && Status == ModuleStatus.Idle)
|
|
|
|
+ {
|
|
|
|
+ switch(_runingWaferTask.Value.First().Key)
|
|
|
|
+ {
|
|
|
|
+ case RecipeJobType.PreClean:
|
|
{
|
|
{
|
|
- if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
|
|
|
|
+ if(WaferManager.Instance.CheckNoWafer(Module,0))
|
|
{
|
|
{
|
|
- Status = ModuleStatus.StartPreJobClean;
|
|
|
|
|
|
+ if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
|
|
+ {
|
|
|
|
+ Status = ModuleStatus.StartPreJobClean;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
|
|
+ Status = ModuleStatus.Idle;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- else
|
|
|
|
|
|
+ }
|
|
|
|
+ break;
|
|
|
|
+ case RecipeJobType.Process:
|
|
|
|
+ {
|
|
|
|
+ if (WaferManager.Instance.CheckHasWafer(Module, 0))
|
|
{
|
|
{
|
|
- LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
|
|
- TryDequeueRuningTask(Status);
|
|
|
|
- Status = ModuleStatus.Idle;
|
|
|
|
|
|
+ if(_wafer.waferId == _runingWaferTask.Key)
|
|
|
|
+ {
|
|
|
|
+ Scheduler.EventWaferArrived?.Invoke(this, new WaferMoveArgs(ModuleName.TMRobot, 0, Module, 0));
|
|
|
|
+ Status = ModuleStatus.StartProcess;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ LOG.Write(eEvent.WARN_ROUTER, Module, $"wafer id dismatch while launch {_wafer.sourceMod}.{_wafer.sourceSlot + 1} process recipe");
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- else
|
|
|
|
|
|
+ break;
|
|
|
|
+ case RecipeJobType.PostClean:
|
|
{
|
|
{
|
|
- LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Prejob clean failded, wafer existance{WaferManager.Instance.GetWafer(Module, 0).WaferOrigin}, pending job type: {_runingWaferTask.Value.First().Key}");
|
|
|
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(Module, 0))
|
|
|
|
+ {
|
|
|
|
+ if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
|
|
+ {
|
|
|
|
+ Status = ModuleStatus.StartPostJobClean;
|
|
|
|
+ }
|
|
|
|
+ else
|
|
|
|
+ {
|
|
|
|
+ LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Postjob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
|
|
+ Status = ModuleStatus.Idle;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.WaitPostJobClean:
|
|
|
|
- {
|
|
|
|
- if (WaferManager.Instance.CheckNoWafer(Module, 0))
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if(_runingWaferTask.Value.Count > 0 || Status != ModuleStatus.Idle)
|
|
|
|
+ {
|
|
|
|
+ if (Scheduler.IsIdle)
|
|
|
|
+ {
|
|
|
|
+ switch (Status)
|
|
|
|
+ {
|
|
|
|
+ case ModuleStatus.Processing:
|
|
{
|
|
{
|
|
- if (_pmScheduler.RunJobCleanTask(_runingWaferTask.Value.First().Value))
|
|
|
|
|
|
+ var wafer = WaferManager.Instance.GetWafer(Module, 0);
|
|
|
|
+ if (Scheduler.IsOnline)
|
|
{
|
|
{
|
|
- Status = ModuleStatus.StartPostJobClean;
|
|
|
|
|
|
+ if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
|
|
|
|
+ {
|
|
|
|
+ _wafer.Return();
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
|
|
+ Status = ModuleStatus.Idle;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- else
|
|
|
|
|
|
+ else // handle offline exception situation
|
|
{
|
|
{
|
|
- LOG.Write(eEvent.WARN_ROUTER, Module, $"Run Postjob clean recipe{_runingWaferTask.Value.First().Value} failed");
|
|
|
|
TryDequeueRuningTask(Status);
|
|
TryDequeueRuningTask(Status);
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- else
|
|
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.PreJobClean:
|
|
{
|
|
{
|
|
- LOG.Write(eEvent.WARN_ROUTER, Module, $"Run postJob clean failded, wafer existance{WaferManager.Instance.GetWafer(Module, 0).WaferOrigin}, pending job type: {_runingWaferTask.Value.First().Key}");
|
|
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
|
|
+ Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.Processing:
|
|
|
|
- {
|
|
|
|
- var wafer = WaferManager.Instance.GetWafer(Module, 0);
|
|
|
|
- if (Scheduler.IsOnline)
|
|
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.PostJobClean:
|
|
{
|
|
{
|
|
- if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
|
|
|
|
- {
|
|
|
|
- _wafer.Return();
|
|
|
|
- TryDequeueRuningTask(Status);
|
|
|
|
- Status = ModuleStatus.Idle;
|
|
|
|
- }
|
|
|
|
|
|
+ TryDequeueRuningTask(Status);
|
|
|
|
+ Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
- else // handle offline exception situation
|
|
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.IdleClean:
|
|
{
|
|
{
|
|
- TryDequeueRuningTask(Status);
|
|
|
|
Status = ModuleStatus.Idle;
|
|
Status = ModuleStatus.Idle;
|
|
}
|
|
}
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.PreJobClean:
|
|
|
|
- {
|
|
|
|
- TryDequeueRuningTask(Status);
|
|
|
|
- Status = ModuleStatus.Idle;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.PostJobClean:
|
|
|
|
- {
|
|
|
|
- TryDequeueRuningTask(Status);
|
|
|
|
- Status = ModuleStatus.Idle;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.IdleClean:
|
|
|
|
- {
|
|
|
|
- Status = ModuleStatus.Idle;
|
|
|
|
- }
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.StartProcess:
|
|
|
|
- {
|
|
|
|
- if (RouteManager.IsATMMode)
|
|
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.StartProcess:
|
|
{
|
|
{
|
|
- Status = ModuleStatus.Processing;
|
|
|
|
|
|
+ if (RouteManager.IsATMMode)
|
|
|
|
+ {
|
|
|
|
+ Status = ModuleStatus.Processing;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
- break;
|
|
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- switch (Status)
|
|
|
|
|
|
+ else
|
|
{
|
|
{
|
|
- case ModuleStatus.StartProcess:
|
|
|
|
- Status = ModuleStatus.Processing;
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.StartIdleClean:
|
|
|
|
- Status = ModuleStatus.IdleClean;
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.StartPreJobClean:
|
|
|
|
- Status = ModuleStatus.PreJobClean;
|
|
|
|
- break;
|
|
|
|
- case ModuleStatus.StartPostJobClean:
|
|
|
|
- Status = ModuleStatus.PostJobClean;
|
|
|
|
- break;
|
|
|
|
|
|
+ switch (Status)
|
|
|
|
+ {
|
|
|
|
+ case ModuleStatus.StartProcess:
|
|
|
|
+ Status = ModuleStatus.Processing;
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.StartIdleClean:
|
|
|
|
+ Status = ModuleStatus.IdleClean;
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.StartPreJobClean:
|
|
|
|
+ Status = ModuleStatus.PreJobClean;
|
|
|
|
+ break;
|
|
|
|
+ case ModuleStatus.StartPostJobClean:
|
|
|
|
+ Status = ModuleStatus.PostJobClean;
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- if (_runingWaferTask.Value.Count == 0 && _pendingWaferTasks.Count > 0)
|
|
|
|
- {
|
|
|
|
- _runingWaferTask = _pendingWaferTasks.Dequeue();
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
return RState.Running;
|
|
return RState.Running;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -268,30 +279,10 @@ namespace Venus_RT.Modules
|
|
public override void WaferArrived(WaferTask wafer, int slot)
|
|
public override void WaferArrived(WaferTask wafer, int slot)
|
|
{
|
|
{
|
|
_wafer = wafer;
|
|
_wafer = wafer;
|
|
- Status = ModuleStatus.WaitProcess;
|
|
|
|
}
|
|
}
|
|
|
|
|
|
public override void WaferLeaved(WaferTask wafer, int slot)
|
|
public override void WaferLeaved(WaferTask wafer, int slot)
|
|
{
|
|
{
|
|
- if(_runingWaferTask.Value.Count == 0)
|
|
|
|
- {
|
|
|
|
- if(_pendingWaferTasks.Count > 0)
|
|
|
|
- {
|
|
|
|
- _runingWaferTask = _pendingWaferTasks.Dequeue();
|
|
|
|
- if (_runingWaferTask.Value.First().Key == RecipeJobType.PreClean)
|
|
|
|
- {
|
|
|
|
- Status = ModuleStatus.WaitPreJobClean;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
- else
|
|
|
|
- {
|
|
|
|
- if (_runingWaferTask.Value.First().Key == RecipeJobType.PostClean)
|
|
|
|
- {
|
|
|
|
- Status = ModuleStatus.WaitPostJobClean;
|
|
|
|
- }
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
_wafer = null;
|
|
_wafer = null;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -327,6 +318,12 @@ namespace Venus_RT.Modules
|
|
_pendingWaferTasks.Enqueue(new KeyValuePair<Guid, Queue<KeyValuePair<RecipeJobType, string>>>(venusWaferTask.waferId, waferRecipes));
|
|
_pendingWaferTasks.Enqueue(new KeyValuePair<Guid, Queue<KeyValuePair<RecipeJobType, string>>>(venusWaferTask.waferId, waferRecipes));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ public bool ReadyMoveIn(WaferTask wafer)
|
|
|
|
+ {
|
|
|
|
+ return _runingWaferTask.Key == wafer.waferId && _runingWaferTask.Value.Count > 0 && _runingWaferTask.Value.First().Key == RecipeJobType.Process;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
class PreAlignTask : ModuleTask
|
|
class PreAlignTask : ModuleTask
|
|
@@ -1140,8 +1137,12 @@ namespace Venus_RT.Modules
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, alignerWafer.currentSlot, ModuleName.TMRobot, (int)Hand.Blade1, Hand.Blade1) });
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, alignerWafer.currentSlot, ModuleName.TMRobot, (int)Hand.Blade1, Hand.Blade1) });
|
|
if (emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
|
|
if (emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
|
|
{
|
|
{
|
|
- // move aligner wafer to PM
|
|
|
|
- _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)Hand.Blade1, alignerWafer.destMod, alignerWafer.destSlot, Hand.Blade1) });
|
|
|
|
|
|
+ var pmTask = _dictModuleTask[alignerWafer.destMod] as VenusPMTask;
|
|
|
|
+ if(pmTask.ReadyMoveIn(alignerWafer))
|
|
|
|
+ {
|
|
|
|
+ // move aligner wafer to PM
|
|
|
|
+ _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)Hand.Blade1, alignerWafer.destMod, alignerWafer.destSlot, Hand.Blade1) });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -1173,18 +1174,19 @@ namespace Venus_RT.Modules
|
|
}
|
|
}
|
|
else if(robotWafers.Count == 1)
|
|
else if(robotWafers.Count == 1)
|
|
{
|
|
{
|
|
|
|
+ var freeHand = robotWafers.First().currentSlot == 0 ? Hand.Blade2 : Hand.Blade1;
|
|
if (readyReturnWafers.Count >= 1)
|
|
if (readyReturnWafers.Count >= 1)
|
|
{
|
|
{
|
|
// return one wafer
|
|
// return one wafer
|
|
- var freeHand = robotWafers.First().currentSlot == 0 ? Hand.Blade2 : Hand.Blade1;
|
|
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyReturnWafers.First().currentMod, 0, ModuleName.TMRobot, (int)freeHand, freeHand) });
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyReturnWafers.First().currentMod, 0, ModuleName.TMRobot, (int)freeHand, freeHand) });
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)freeHand, readyReturnWafers.First().destMod, readyReturnWafers.First().destSlot, freeHand) });
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)freeHand, readyReturnWafers.First().destMod, readyReturnWafers.First().destSlot, freeHand) });
|
|
}
|
|
}
|
|
|
|
+ else
|
|
{
|
|
{
|
|
if (_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod)))
|
|
if (_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod)))
|
|
{
|
|
{
|
|
var alignerWafer = _lstWaferTasks.Where(wt => ModuleHelper.IsAligner(wt.currentMod)).First();
|
|
var alignerWafer = _lstWaferTasks.Where(wt => ModuleHelper.IsAligner(wt.currentMod)).First();
|
|
- _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, alignerWafer.currentSlot, ModuleName.TMRobot, (int)Hand.Blade1, Hand.Blade1) });
|
|
|
|
|
|
+ _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, alignerWafer.currentSlot, ModuleName.TMRobot, (int)freeHand, freeHand) });
|
|
|
|
|
|
if(!robotWafers.First().IsAligned)
|
|
if(!robotWafers.First().IsAligned)
|
|
{
|
|
{
|
|
@@ -1193,7 +1195,11 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
if (emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
|
|
if (emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
|
|
{
|
|
{
|
|
- _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)Hand.Blade1, alignerWafer.destMod, alignerWafer.destSlot, Hand.Blade1) });
|
|
|
|
|
|
+ var pmTask = _dictModuleTask[alignerWafer.destMod] as VenusPMTask;
|
|
|
|
+ if (pmTask.ReadyMoveIn(alignerWafer))
|
|
|
|
+ {
|
|
|
|
+ _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)freeHand, alignerWafer.destMod, alignerWafer.destSlot, freeHand) });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -1206,7 +1212,11 @@ namespace Venus_RT.Modules
|
|
}
|
|
}
|
|
else if (emptyAndReadyIn20sPMs.Contains(robotWafers.First().destMod))
|
|
else if (emptyAndReadyIn20sPMs.Contains(robotWafers.First().destMod))
|
|
{
|
|
{
|
|
- _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, robotWafers.First().currentSlot, robotWafers.First().destMod, robotWafers.First().destSlot, (Hand)(robotWafers.First().currentSlot)) });
|
|
|
|
|
|
+ var pmTask = _dictModuleTask[robotWafers.First().destMod] as VenusPMTask;
|
|
|
|
+ if (pmTask.ReadyMoveIn(robotWafers.First()))
|
|
|
|
+ {
|
|
|
|
+ _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, robotWafers.First().currentSlot, robotWafers.First().destMod, robotWafers.First().destSlot, (Hand)(robotWafers.First().currentSlot)) });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (ModuleHelper.IsLoadPort(robotWafers.First().destMod) && _dictModuleTask[robotWafers.First().destMod].Scheduler.IsAvailable)
|
|
else if (ModuleHelper.IsLoadPort(robotWafers.First().destMod) && _dictModuleTask[robotWafers.First().destMod].Scheduler.IsAvailable)
|
|
@@ -1231,7 +1241,11 @@ namespace Venus_RT.Modules
|
|
}
|
|
}
|
|
else if (emptyAndReadyIn20sPMs.Contains(wafer.destMod))
|
|
else if (emptyAndReadyIn20sPMs.Contains(wafer.destMod))
|
|
{
|
|
{
|
|
- _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
|
|
|
|
|
|
+ var pmTask = _dictModuleTask[wafer.destMod] as VenusPMTask;
|
|
|
|
+ if (pmTask.ReadyMoveIn(wafer))
|
|
|
|
+ {
|
|
|
|
+ _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (ModuleHelper.IsLoadPort(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsAvailable)
|
|
else if (ModuleHelper.IsLoadPort(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsAvailable)
|
|
@@ -1267,9 +1281,14 @@ namespace Venus_RT.Modules
|
|
var alignerWafer = _lstWaferTasks.Find(wt => ModuleHelper.IsAligner(wt.currentMod));
|
|
var alignerWafer = _lstWaferTasks.Find(wt => ModuleHelper.IsAligner(wt.currentMod));
|
|
if(emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
|
|
if(emptyAndReadyIn20sPMs.Contains(alignerWafer.destMod))
|
|
{
|
|
{
|
|
- // move aligner wafer to PM
|
|
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, 0, ModuleName.TMRobot, (int)validHand, validHand) });
|
|
_tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(alignerWafer.currentMod, 0, ModuleName.TMRobot, (int)validHand, validHand) });
|
|
- _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand, alignerWafer.destMod, alignerWafer.destSlot, validHand) });
|
|
|
|
|
|
+
|
|
|
|
+ // move aligner wafer to PM
|
|
|
|
+ var pmTask = _dictModuleTask[alignerWafer.destMod] as VenusPMTask;
|
|
|
|
+ if (pmTask.ReadyMoveIn(alignerWafer))
|
|
|
|
+ {
|
|
|
|
+ _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, (int)validHand, alignerWafer.destMod, alignerWafer.destSlot, validHand) });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
else
|
|
@@ -1300,7 +1319,11 @@ namespace Venus_RT.Modules
|
|
}
|
|
}
|
|
else if (emptyAndReadyIn20sPMs.Contains(wafer.destMod))
|
|
else if (emptyAndReadyIn20sPMs.Contains(wafer.destMod))
|
|
{
|
|
{
|
|
- _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
|
|
|
|
|
|
+ var pmTask = _dictModuleTask[wafer.destMod] as VenusPMTask;
|
|
|
|
+ if (pmTask.ReadyMoveIn(wafer))
|
|
|
|
+ {
|
|
|
|
+ _tmSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.TMRobot, wafer.currentSlot, wafer.destMod, wafer.destSlot, (Hand)(wafer.currentSlot)) });
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else if (ModuleHelper.IsLoadPort(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsAvailable)
|
|
else if (ModuleHelper.IsLoadPort(wafer.destMod) && _dictModuleTask[wafer.destMod].Scheduler.IsAvailable)
|
|
@@ -1825,12 +1848,12 @@ namespace Venus_RT.Modules
|
|
temperature,
|
|
temperature,
|
|
wafer.InnerId,
|
|
wafer.InnerId,
|
|
recipeName,
|
|
recipeName,
|
|
- wafer.ProcessJob.Sequence.WTWCleanRecipe,
|
|
|
|
|
|
+ String.Empty,
|
|
wafer.ProcessJob.Sequence.LLInOutPath,
|
|
wafer.ProcessJob.Sequence.LLInOutPath,
|
|
wafer.ProcessJob.Sequence.LLDelayTime,
|
|
wafer.ProcessJob.Sequence.LLDelayTime,
|
|
IsSequenceNeedAlign(wafer.ProcessJob.Sequence),
|
|
IsSequenceNeedAlign(wafer.ProcessJob.Sequence),
|
|
- wafer.ProcessJob.Sequence.WTWCleanRecipe, // pre clean
|
|
|
|
- wafer.ProcessJob.Sequence.WTWCleanRecipe); // post clean
|
|
|
|
|
|
+ wafer.ProcessJob.Sequence.PreWaferCleanRecipe, // pre clean
|
|
|
|
+ wafer.ProcessJob.Sequence.PostWaferCleanRecipe); // post clean
|
|
|
|
|
|
waferTask.OnWaferArrived += WaferArrived;
|
|
waferTask.OnWaferArrived += WaferArrived;
|
|
waferTask.OnWaferLeaved += WaferLeaved;
|
|
waferTask.OnWaferLeaved += WaferLeaved;
|