|
@@ -684,6 +684,30 @@ namespace Venus_RT.Modules
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
+ bool SearchCanReplaceSlot(SlotItem llSlot, out SlotItem replaceSlot, out SlotItem destSlot)
|
|
|
+ {
|
|
|
+ replaceSlot = new SlotItem(ModuleName.System, -1);
|
|
|
+ destSlot = new SlotItem(ModuleName.System, -1);
|
|
|
+ var wafer = WaferManager.Instance.GetWafer(llSlot.Module, llSlot.Slot);
|
|
|
+ if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null || wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ foreach (var next_module in wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules)
|
|
|
+ {
|
|
|
+ if (!ModuleHelper.IsPm(next_module) || WaferManager.Instance.CheckNoWafer(next_module, 0))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (SearchWaferDestination(new SlotItem(next_module, 0), out destSlot))
|
|
|
+ {
|
|
|
+ replaceSlot.Module = next_module;
|
|
|
+ replaceSlot.Slot = 0;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
List<int> GetModuleValidSlots(ModuleName mod)
|
|
|
{
|
|
|
var validSlot = new List<int>();
|
|
@@ -796,10 +820,22 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
if(WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 0) || WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, 1))
|
|
|
{
|
|
|
+ for(int i = 0; i < 2; i++)
|
|
|
+ {
|
|
|
+ if (WaferManager.Instance.CheckHasWafer(ModuleName.TMRobot, i))
|
|
|
+ {
|
|
|
+ if (SearchWaferDestination(new SlotItem(ModuleName.TMRobot, i), out SlotItem destSlot))
|
|
|
+ {
|
|
|
+ _movingItems.Add(new MoveItem(ModuleName.TMRobot, i, destSlot.Module, destSlot.Slot, (Hand)i));
|
|
|
+ UpdateModuleMovingStatus(destSlot.Module);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- foreach(var slot in _vacReadyOutSlots)
|
|
|
+ foreach (var slot in _vacReadyOutSlots)
|
|
|
{
|
|
|
if (_vacModules[slot.Key.Module].MovingStatus != MovingStatus.Idle)
|
|
|
continue;
|
|
@@ -809,27 +845,49 @@ namespace Venus_RT.Modules
|
|
|
if (IsLoadLockReservedByEFEM(slot.Key.Module))
|
|
|
continue;
|
|
|
|
|
|
+ var llStatus = GetLLProcessStatusCount(slot.Key.Module);
|
|
|
if(SearchWaferDestination(slot.Key, out SlotItem destSlot))
|
|
|
{
|
|
|
_movingItems.Add(new MoveItem(slot.Key.Module, slot.Key.Slot, destSlot.Module, destSlot.Slot, Hand.None));
|
|
|
UpdateModuleMovingStatus(slot.Key.Module);
|
|
|
UpdateModuleMovingStatus(destSlot.Module);
|
|
|
|
|
|
- // check whether match double pick pattern
|
|
|
- foreach(var item in _vacReadyOutSlots)
|
|
|
+ if(llStatus.Item2 > 1)
|
|
|
{
|
|
|
- if(item.Key.Module == slot.Key.Module && item.Key.Slot != slot.Key.Slot)
|
|
|
+ // check whether match double pick pattern
|
|
|
+ foreach (var item in _vacReadyOutSlots)
|
|
|
{
|
|
|
- if (SearchWaferDestination(item.Key, out SlotItem destSlot_2))
|
|
|
+ if (item.Key.Module == slot.Key.Module && item.Key.Slot != slot.Key.Slot)
|
|
|
{
|
|
|
- _movingItems.Add(new MoveItem(item.Key.Module, item.Key.Slot, destSlot_2.Module, destSlot_2.Slot, Hand.None));
|
|
|
- UpdateModuleMovingStatus(item.Key.Module);
|
|
|
- UpdateModuleMovingStatus(destSlot_2.Module);
|
|
|
- break;
|
|
|
+ if (SearchWaferDestination(item.Key, out SlotItem destSlot_2))
|
|
|
+ {
|
|
|
+ _movingItems.Add(new MoveItem(item.Key.Module, item.Key.Slot, destSlot_2.Module, destSlot_2.Slot, Hand.None));
|
|
|
+ UpdateModuleMovingStatus(destSlot_2.Module);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if(_movingItems.Count == 1)
|
|
|
+ {
|
|
|
+ foreach (var item in _vacReadyOutSlots)
|
|
|
+ {
|
|
|
+ if (item.Key.Module == slot.Key.Module && item.Key.Slot != slot.Key.Slot)
|
|
|
+ {
|
|
|
+ if(SearchCanReplaceSlot(item.Key, out SlotItem replaceSlot, out SlotItem destSlot_2))
|
|
|
+ {
|
|
|
+ _movingItems.Add(new MoveItem(item.Key.Module, item.Key.Slot, replaceSlot.Module, replaceSlot.Slot, Hand.None));
|
|
|
+ _movingItems.Add(new MoveItem(replaceSlot.Module, replaceSlot.Slot, destSlot_2.Module, destSlot_2.Slot, Hand.None));
|
|
|
+ UpdateModuleMovingStatus(replaceSlot.Module);
|
|
|
+ UpdateModuleMovingStatus(destSlot.Module);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+
|
|
|
// check whether match swap pattern
|
|
|
int inCount = 0;
|
|
|
var in_slots = SearchWaitInSlots(slot.Key.Module);
|
|
@@ -1199,10 +1257,18 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private bool IsLoadLockReservedByEFEM(ModuleName ll)
|
|
|
{
|
|
|
- if (_efemMovingItems.Exists(item => item.DestinationModule == ll || item.SourceModule == ll))
|
|
|
- return true;
|
|
|
+ List<ModuleName> unfinished = new List<ModuleName>();
|
|
|
+ foreach (var item in _atmWaferTargets)
|
|
|
+ {
|
|
|
+ var moving = _efemMovingItems.Find(m_item => m_item.DestinationModule == item.Key.Module && m_item.DestinationSlot == item.Key.Slot);
|
|
|
+ if (!unfinished.Contains(moving.SourceModule))
|
|
|
+ unfinished.Add(moving.SourceModule);
|
|
|
|
|
|
- return false;
|
|
|
+ if (!unfinished.Contains(moving.DestinationModule))
|
|
|
+ unfinished.Add(moving.DestinationModule);
|
|
|
+ }
|
|
|
+
|
|
|
+ return unfinished.Contains(ll);
|
|
|
}
|
|
|
|
|
|
private bool IsLoadLockReservedByTM(ModuleName ll)
|
|
@@ -1267,12 +1333,14 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
if(_LLInOutPath == SequenceLLInOutPath.AInBOut)
|
|
|
{
|
|
|
- return _LLASlotNumber + pmWaferStatus.Item2 - llaWaferStatus.Item1 - llaWaferStatus.Item2
|
|
|
+ return llbWaferStatus.Item1 == _LLBSlotNumber ? 0 :
|
|
|
+ _LLASlotNumber + pmWaferStatus.Item2 - llaWaferStatus.Item1 - llaWaferStatus.Item2
|
|
|
- GetTMRobotWaferCount() - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
|
|
|
}
|
|
|
else if(_LLInOutPath == SequenceLLInOutPath.BInAOut)
|
|
|
{
|
|
|
- return _LLBSlotNumber + pmWaferStatus.Item2 - llbWaferStatus.Item1 - llbWaferStatus.Item2
|
|
|
+ return llaWaferStatus.Item1 == _LLASlotNumber ? 0 :
|
|
|
+ _LLBSlotNumber + pmWaferStatus.Item2 - llbWaferStatus.Item1 - llbWaferStatus.Item2
|
|
|
- GetTMRobotWaferCount() - GetAtmInerWaferCount() - GetEfemRoborWaferCount();
|
|
|
}
|
|
|
else if(_LLInOutPath == SequenceLLInOutPath.AInAOut || (_LLInOutPath == SequenceLLInOutPath.DInDOut && _vacSchedulers[ModuleName.LLA].IsOnline && !_vacSchedulers[ModuleName.LLB].IsOnline))
|
|
@@ -1779,7 +1847,7 @@ namespace Venus_RT.Modules
|
|
|
if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
|
|
|
continue;
|
|
|
|
|
|
- if (wafer.InnerId == tar.Value)
|
|
|
+ if (wafer.InnerId == tar.Value && _tmRobot.RobotStatus != RState.Running)
|
|
|
{
|
|
|
// wafer arrive
|
|
|
_vacWaferTargets.Remove(tar.Key);
|
|
@@ -1791,23 +1859,15 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
_vacModules[tar.Key.Module].MovingStatus = MovingStatus.WaitProcess;
|
|
|
}
|
|
|
+
|
|
|
+ if(!ModuleHelper.IsTMRobot(tar.Key.Module))
|
|
|
+ wafer.NextSequenceStep++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if(ModuleHelper.IsLoadLock(mod.Key))
|
|
|
{
|
|
|
- List<ModuleName> unfinished = new List<ModuleName>();
|
|
|
- foreach(var item in _vacWaferTargets)
|
|
|
- {
|
|
|
- var moving = _movingItems.Find(m_item => m_item.DestinationModule == item.Key.Module && m_item.DestinationSlot == item.Key.Slot);
|
|
|
- if (!unfinished.Contains(moving.SourceModule))
|
|
|
- unfinished.Add(moving.SourceModule);
|
|
|
-
|
|
|
- if (!unfinished.Contains(moving.DestinationModule))
|
|
|
- unfinished.Add(moving.DestinationModule);
|
|
|
- }
|
|
|
-
|
|
|
- if(!unfinished.Contains(mod.Key) && mod.Value.IsAvailable)
|
|
|
+ if(!IsLoadLockReservedByTM(mod.Key) && mod.Value.IsAvailable)
|
|
|
{
|
|
|
_vacModules[mod.Key].MovingStatus = MovingStatus.Idle;
|
|
|
}
|
|
@@ -1830,7 +1890,7 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- UpateSequenceStep(_movingItems);
|
|
|
+ //UpateSequenceStep(_movingItems);
|
|
|
_movingItems.Clear();
|
|
|
}
|
|
|
|
|
@@ -1844,7 +1904,7 @@ namespace Venus_RT.Modules
|
|
|
if (wafer.IsEmpty || wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
|
|
|
continue;
|
|
|
|
|
|
- if (wafer.InnerId == tar.Value)
|
|
|
+ if (wafer.InnerId == tar.Value && _efemRobot.RobotStatus != RState.Running)
|
|
|
{
|
|
|
//LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"wafer {wafer.WaferOrigin}: {wafer.InnerId} arrived {tar.Key.Module}{tar.Key.Slot + 1}");
|
|
|
// wafer arrive
|
|
@@ -1858,9 +1918,19 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
_atmModules[tar.Key.Module].MovingStatus = MovingStatus.WaitAlign;
|
|
|
}
|
|
|
+
|
|
|
+ if (!ModuleHelper.IsEFEMRobot(tar.Key.Module))
|
|
|
+ wafer.NextSequenceStep++;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ if (ModuleHelper.IsLoadLock(mod.Key))
|
|
|
+ {
|
|
|
+ if (!IsLoadLockReservedByEFEM(mod.Key) && mod.Value.IsAvailable)
|
|
|
+ {
|
|
|
+ _vacModules[mod.Key].MovingStatus = MovingStatus.Idle;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
_atmMoveFinishTrig.CLK = _atmWaferTargets.Count == 0 && _efemRobot.RobotStatus != RState.Running;
|
|
@@ -1874,12 +1944,11 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- UpateSequenceStep(_efemMovingItems);
|
|
|
+ //UpateSequenceStep(_efemMovingItems);
|
|
|
_efemMovingItems.Clear();
|
|
|
}
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
private void PreJobClean(ControlJobInfo cj)
|
|
|
{
|
|
|
if (cj.IsPreJobCleanDone)
|
|
@@ -1893,6 +1962,7 @@ namespace Venus_RT.Modules
|
|
|
pm.PreJobClean();
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
private bool ActiveProcessJob(ProcessJobInfo pj)
|
|
|
{
|
|
|
foreach (var pjSlotWafer in pj.SlotWafers)
|
|
@@ -1916,6 +1986,7 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
return true;
|
|
|
}
|
|
|
+
|
|
|
private void StartNewJob()
|
|
|
{
|
|
|
ControlJobInfo cjActived = null;
|
|
@@ -2045,6 +2116,7 @@ namespace Venus_RT.Modules
|
|
|
pm.CompleteJobClean();
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
private void UpdateControlJobStatus()
|
|
|
{
|
|
|
if (_lstControlJobs.Count == 0)
|