|
@@ -856,6 +856,7 @@ namespace Venus_RT.Modules
|
|
|
private List<WaferTask> _lstWaferTasks = new List<WaferTask>();
|
|
|
private Dictionary<ModuleName, ModuleTask> _dictModuleTask = new Dictionary<ModuleName, ModuleTask>();
|
|
|
private Queue<WaferInfo> _qeReturnWafers = new Queue<WaferInfo>();
|
|
|
+ private Queue<Guid> _qeWaitInWafers = new Queue<Guid>();
|
|
|
|
|
|
private Queue<List<MoveItem>> _efemSchdActions = new Queue<List<MoveItem>>();
|
|
|
private Queue<List<MoveItem>> _tmSchdActions = new Queue<List<MoveItem>>();
|
|
@@ -1391,6 +1392,7 @@ namespace Venus_RT.Modules
|
|
|
_lpThroughput = new Dictionary<ModuleName, float> { { ModuleName.LP1, 0 }, { ModuleName.LP2, 0 }, { ModuleName.LP3, 0 } };
|
|
|
|
|
|
_lstWaferTasks.Clear();
|
|
|
+ _qeWaitInWafers.Clear();
|
|
|
_tmSchdActions.Clear();
|
|
|
_curTmAction.Clear();
|
|
|
_efemSchdActions.Clear();
|
|
@@ -2186,6 +2188,7 @@ namespace Venus_RT.Modules
|
|
|
waferTask.OnWaferLeaved += WaferLeaved;
|
|
|
|
|
|
_lstWaferTasks.Add(waferTask);
|
|
|
+ _qeWaitInWafers.Enqueue(wafer.InnerId);
|
|
|
}
|
|
|
|
|
|
private void ReDispatchBlockingWafers()
|
|
@@ -2210,45 +2213,40 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool ForwardATMWafers(ModuleName ll)
|
|
|
{
|
|
|
- var emptySlots = _LLSlotInOutOption == LLSlotInOutOpt.AllInAllOut ? GetLLReadyInOutSlots(ll).emptySlot : GetLLFixedReadyInOutSlots(ll).eInSlot;
|
|
|
+ if (_qeWaitInWafers.Count == 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ var emptySlots = GetLLReadyInOutSlots(ll).emptySlot;
|
|
|
var atmWafers = _lstWaferTasks.Where(wafer => (wafer.movingStatus == RState.End ||wafer.movingStatus == RState.Init) && (ModuleHelper.IsEFEMRobot(wafer.currentMod) || ModuleHelper.IsAligner(wafer.currentMod))).ToList();
|
|
|
var notAlignedWafer = atmWafers.Where(wafer => !wafer.IsAligned).ToList();
|
|
|
- var readyInWafers = _lstWaferTasks.Where(wafer => ModuleHelper.IsLoadPort(wafer.currentMod) && IsCtrlJobExecuting(wafer.currentMod) && wafer.movingStatus == RState.Init && wafer.pressureStatus == RState.Init && CanWaferGotoLL(wafer, ll)).OrderBy(wafer => wafer.currentSlot).ToArray();
|
|
|
var freeHands = GetEFEMFreeHand();
|
|
|
+ var waitInWafer = _lstWaferTasks.Find(wt => wt.waferId == _qeWaitInWafers.First());
|
|
|
|
|
|
- if ((atmWafers.Count >= 2 && !atmWafers.Exists(wafer => !wafer.IsAligned)) || freeHands.Count == 0 || readyInWafers.Length == 0)
|
|
|
+ if (atmWafers.Count >= 2 && freeHands.Count == 0 || waitInWafer == null)
|
|
|
return false;
|
|
|
|
|
|
-
|
|
|
- if (notAlignedWafer.Count > 0 && _lstWaferTasks.Count(wafer => ModuleHelper.IsAligner(wafer.currentMod)) == 0)
|
|
|
+
|
|
|
+ if (waitInWafer.IsAligned)
|
|
|
{
|
|
|
- notAlignedWafer.First().RouteTo(ModuleName.Aligner1, 0);
|
|
|
- _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(notAlignedWafer.First().currentMod, notAlignedWafer.First().currentSlot, ModuleName.Aligner1, 0, (Hand)notAlignedWafer.First().currentSlot) });
|
|
|
- }
|
|
|
-
|
|
|
- else if (atmWafers.Count == 1 && emptySlots.Count >= 2 && ModuleHelper.IsAligner(atmWafers.First().currentMod) && freeHands.Count > 1)
|
|
|
- {
|
|
|
- atmWafers.First().RouteTo(ModuleName.EfemRobot, (int)freeHands[1]);
|
|
|
-
|
|
|
- _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(atmWafers.First().currentMod, atmWafers.First().currentSlot, ModuleName.EfemRobot, (int)freeHands[1], freeHands[1]) });
|
|
|
+ _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(waitInWafer.currentMod, waitInWafer.currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
|
|
|
+ _qeWaitInWafers.Dequeue();
|
|
|
}
|
|
|
-
|
|
|
- else if ((readyInWafers.Length > 0) && (atmWafers.Count == 0 || (atmWafers.Count == 1 && emptySlots.Count >= 2)))
|
|
|
+ else
|
|
|
{
|
|
|
- if(readyInWafers[0].IsAligned)
|
|
|
+ if (atmWafers.Count == 0)
|
|
|
{
|
|
|
-
|
|
|
- _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyInWafers[0].currentMod, readyInWafers[0].currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
|
|
|
+
|
|
|
+ _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(waitInWafer.currentMod, waitInWafer.currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
|
|
|
+ _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[0], ModuleName.Aligner1, 0, freeHands[0]) });
|
|
|
+ _qeWaitInWafers.Dequeue();
|
|
|
}
|
|
|
- else if(!_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod)))
|
|
|
+ else if (_lstWaferTasks.Exists(wt => ModuleHelper.IsAligner(wt.currentMod)) && freeHands.Count == 2)
|
|
|
{
|
|
|
- readyInWafers[0].RouteTo(ModuleName.Aligner1, 0);
|
|
|
-
|
|
|
-
|
|
|
- _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(readyInWafers[0].currentMod, readyInWafers[0].currentSlot, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
|
|
|
-
|
|
|
-
|
|
|
- _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[0], ModuleName.Aligner1, 0, freeHands[0]) });
|
|
|
+
|
|
|
+ _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(waitInWafer.currentMod, waitInWafer.currentSlot, ModuleName.EfemRobot, (int)freeHands[1], freeHands[1]) });
|
|
|
+ _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.Aligner1, 0, ModuleName.EfemRobot, (int)freeHands[0], freeHands[0]) });
|
|
|
+ _efemSchdActions.Enqueue(new List<MoveItem> { new MoveItem(ModuleName.EfemRobot, (int)freeHands[1], ModuleName.Aligner1, 0, freeHands[1]) });
|
|
|
+ _qeWaitInWafers.Dequeue();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -2522,7 +2520,8 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
if (needAlign)
|
|
|
{
|
|
|
- if (atmWaferCount == 0 || (atmWaferCount == 1 && inLLWaferStatus.emptySlot.Count == 2 && _efemRobotSingleArmOption == 0))
|
|
|
+ if (atmWaferCount == 0 ||
|
|
|
+ (inLLModule.ReayForEfemInTime(20) && Math.Min(validHands, inLLWaferStatus.emptySlot.Count) > atmWaferCount))
|
|
|
{
|
|
|
if (ForwardATMWafers(inLL))
|
|
|
return;
|
|
@@ -2538,10 +2537,7 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
|
|
|
if (inLLModule.ReayForEfemInTime(5) &&
|
|
|
- inLLWaferStatus.emptySlot.Count > 0 && atmWaferCount > 0 &&
|
|
|
- (inLLWaferStatus.emptySlot.Count == atmWaferCount ||
|
|
|
- !_lstWaferTasks.Exists(wt => ModuleHelper.IsLoadPort(wt.currentMod) && ModuleHelper.IsPm(wt.destMod)) ||
|
|
|
- _efemRobotSingleArmOption != 0))
|
|
|
+ (Math.Min(validHands, inLLWaferStatus.emptySlot.Count) == atmWaferCount || _qeWaitInWafers.Count == 0))
|
|
|
{
|
|
|
if (ExchangeWaferWithLL(inLL))
|
|
|
return;
|