|
@@ -121,8 +121,6 @@ namespace Venus_RT.Modules
|
|
|
_LLBInSlot.RemoveAll(item => item >= _LLBSlotNumber);
|
|
|
_LLBOutSlot.RemoveAll(item => item >= _LLBSlotNumber);
|
|
|
|
|
|
- _cycledCount = 1;
|
|
|
- _cycledWafer = 2;
|
|
|
DATA.Subscribe("Scheduler.CycledCount", () => _cycledCount);
|
|
|
DATA.Subscribe("Scheduler.CycledWafer", () => _cycledWafer);
|
|
|
DATA.Subscribe("Scheduler.CycleSetPoint", () => _cycleSetPoint);
|
|
@@ -578,6 +576,9 @@ namespace Venus_RT.Modules
|
|
|
var inSlots = mod.Key == ModuleName.LLA ? _LLAInSlot : _LLBInSlot;
|
|
|
foreach(var slot in inSlots)
|
|
|
{
|
|
|
+ if (IsLoadLockReservedByEFEM(mod.Key))
|
|
|
+ continue;
|
|
|
+
|
|
|
if(WaferManager.Instance.CheckHasWafer(mod.Key, slot) && IsVacWaferReadyOut(mod.Key, slot))
|
|
|
{
|
|
|
_vacReadyOutSlots.Add(new SlotItem(mod.Key, slot));
|
|
@@ -587,7 +588,10 @@ namespace Venus_RT.Modules
|
|
|
var outSlots = mod.Key == ModuleName.LLA ? _LLAOutSlot : _LLBOutSlot;
|
|
|
foreach(var slot in outSlots)
|
|
|
{
|
|
|
- if(WaferManager.Instance.CheckNoWafer(mod.Key, slot))
|
|
|
+ if (IsLoadLockReservedByEFEM(mod.Key))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(mod.Key, slot))
|
|
|
{
|
|
|
_vacReadyInSlots.Add(new SlotItem(mod.Key, slot));
|
|
|
}
|
|
@@ -641,15 +645,19 @@ namespace Venus_RT.Modules
|
|
|
var validSlot = new List<int>();
|
|
|
if(ModuleHelper.IsLoadLock(mod))
|
|
|
{
|
|
|
- var inSlots = mod == ModuleName.LLA ? _LLAInSlot : _LLBInSlot;
|
|
|
- foreach (var slot in inSlots)
|
|
|
+ if(!IsLoadLockReservedByEFEM(mod))
|
|
|
{
|
|
|
- if (WaferManager.Instance.CheckNoWafer(mod, slot) && !_movingItems.Exists(item => item.DestinationModule == mod && item.DestinationSlot == slot) && !IsSlotReservedByEFEM(mod, slot))
|
|
|
- validSlot.Add(slot);
|
|
|
+ var inSlots = mod == ModuleName.LLA ? _LLAInSlot : _LLBInSlot;
|
|
|
+ foreach (var slot in inSlots)
|
|
|
+ {
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(mod, slot) && !_movingItems.Exists(item => item.DestinationModule == mod && item.DestinationSlot == slot))
|
|
|
+ validSlot.Add(slot);
|
|
|
|
|
|
- if (WaferManager.Instance.CheckHasWafer(mod, slot) && _movingItems.Exists(item => item.SourceModule == mod && item.SourceSlot == slot))
|
|
|
- validSlot.Add(slot);
|
|
|
+ if (WaferManager.Instance.CheckHasWafer(mod, slot) && _movingItems.Exists(item => item.SourceModule == mod && item.SourceSlot == slot))
|
|
|
+ validSlot.Add(slot);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
}
|
|
|
else if(ModuleHelper.IsPm(mod))
|
|
|
{
|
|
@@ -692,6 +700,9 @@ namespace Venus_RT.Modules
|
|
|
if (slot.Module == inModule && _vacModules[slot.Module].MovingStatus == MovingStatus.Moving)
|
|
|
continue;
|
|
|
|
|
|
+ if (IsLoadLockReservedByEFEM(slot.Module))
|
|
|
+ continue;
|
|
|
+
|
|
|
var wafer = WaferManager.Instance.GetWafer(slot.Module, slot.Slot);
|
|
|
|
|
|
if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null || wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
|
|
@@ -751,6 +762,9 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
if (ModuleHelper.IsLoadLock(slot.Module))
|
|
|
{
|
|
|
+ if (IsLoadLockReservedByEFEM(slot.Module))
|
|
|
+ continue;
|
|
|
+
|
|
|
if(SearchWaferDestination(slot, out SlotItem destSlot))
|
|
|
{
|
|
|
_movingItems.Add(new MoveItem(slot.Module, slot.Slot, destSlot.Module, destSlot.Slot, Hand.None));
|
|
@@ -773,8 +787,11 @@ namespace Venus_RT.Modules
|
|
|
var in_slots = SearchWaitInSlots(slot.Module);
|
|
|
foreach(var in_slot in in_slots)
|
|
|
{
|
|
|
- _movingItems.Add(in_slot);
|
|
|
- UpdateItemMovingStatus(in_slot);
|
|
|
+ if(_vacModules[in_slot.Module].MovingStatus == MovingStatus.Idle)
|
|
|
+ {
|
|
|
+ _movingItems.Add(in_slot);
|
|
|
+ UpdateItemMovingStatus(in_slot);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return;
|
|
@@ -799,7 +816,7 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
// check whether match double move pattern
|
|
|
var same_dest = SearchWaitInSlots(destSlot.Module);
|
|
|
- if(same_dest.Count > 0)
|
|
|
+ if(same_dest.Count > 0 && _vacModules[same_dest[0].SourceModule].MovingStatus == MovingStatus.Idle)
|
|
|
{
|
|
|
_movingItems.Add(same_dest[0]);
|
|
|
UpdateItemMovingStatus(same_dest[0]);
|
|
@@ -1032,7 +1049,7 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
private bool ProcessLLEFEMRobotTask(ModuleName ll)
|
|
|
{
|
|
|
- if (_vacModules[ll].MovingStatus != MovingStatus.Idle)
|
|
|
+ if (_vacModules[ll].MovingStatus != MovingStatus.Idle || IsLoadLockReservedByTM(ll))
|
|
|
return false;
|
|
|
|
|
|
var robotSlots = GetEfemRobotWaferReadyInHands(ll);
|
|
@@ -1041,7 +1058,7 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
if(robotSlots.Count >= 1)
|
|
|
{
|
|
|
- if(WaferManager.Instance.CheckNoWafer(ll, slot) && !IsSlotReservedByTM(ll, slot))
|
|
|
+ if(WaferManager.Instance.CheckNoWafer(ll, slot))
|
|
|
{
|
|
|
_efemMovingItems.Add(new MoveItem(ModuleName.EfemRobot, robotSlots.First(), ll, slot, (Hand)robotSlots.First()));
|
|
|
robotSlots.RemoveAt(0);
|
|
@@ -1095,17 +1112,17 @@ namespace Venus_RT.Modules
|
|
|
return (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 0) ? 1 : 0) + (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, 1) ? 1 : 0);
|
|
|
}
|
|
|
|
|
|
- private bool IsSlotReservedByEFEM(ModuleName ll, int slot)
|
|
|
+ private bool IsLoadLockReservedByEFEM(ModuleName ll)
|
|
|
{
|
|
|
- if (_efemMovingItems.Exists(item => item.DestinationModule == ll && item.DestinationSlot == slot))
|
|
|
+ if (_efemMovingItems.Exists(item => item.DestinationModule == ll || item.SourceModule == ll))
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- private bool IsSlotReservedByTM(ModuleName ll, int slot)
|
|
|
+ private bool IsLoadLockReservedByTM(ModuleName ll)
|
|
|
{
|
|
|
- if (_movingItems.Exists(item => item.DestinationModule == ll && item.DestinationSlot == slot))
|
|
|
+ if (_movingItems.Exists(item => item.DestinationModule == ll || item.SourceModule == ll))
|
|
|
return true;
|
|
|
|
|
|
return false;
|
|
@@ -1542,11 +1559,13 @@ namespace Venus_RT.Modules
|
|
|
if(!ModuleHelper.IsTMRobot(item.DestinationModule) && !ModuleHelper.IsEFEMRobot(item.DestinationModule))
|
|
|
{
|
|
|
var wafer = WaferManager.Instance.GetWafer(item.DestinationModule, item.DestinationSlot);
|
|
|
- if(!wafer.IsEmpty && (wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count || wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(item.DestinationModule)))
|
|
|
+ if(!wafer.IsEmpty && wafer.ProcessJob != null)
|
|
|
{
|
|
|
- wafer.NextSequenceStep++;
|
|
|
+ if (wafer.NextSequenceStep < wafer.ProcessJob.Sequence.Steps.Count && wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules.Contains(item.DestinationModule))
|
|
|
+ wafer.NextSequenceStep++;
|
|
|
}
|
|
|
- else
|
|
|
+
|
|
|
+ if(wafer.IsEmpty || wafer.ProcessJob == null)
|
|
|
{
|
|
|
// should not go here
|
|
|
LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"UpateSequenceStep() failed, location: {item.DestinationModule}:{item.DestinationSlot}, NextSequenceStep: {wafer.NextSequenceStep}");
|