|
@@ -87,6 +87,9 @@ namespace Venus_RT.Modules
|
|
|
Dictionary<SlotItem, Guid> _vacWaferTargets = new Dictionary<SlotItem, Guid>();
|
|
|
Dictionary<SlotItem, Guid> _atmWaferTargets = new Dictionary<SlotItem, Guid>();
|
|
|
|
|
|
+ R_TRIG _vacMoveFinishTrig = new R_TRIG();
|
|
|
+ R_TRIG _atmMoveFinishTrig = new R_TRIG();
|
|
|
+
|
|
|
private SchedulerFACallback _faCallback;
|
|
|
private SchedulerDBCallback _dbCallback;
|
|
|
|
|
@@ -453,6 +456,8 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
//ResetTraceFlag();
|
|
|
}
|
|
|
+
|
|
|
+ _cycleState = RState.Running;
|
|
|
}
|
|
|
|
|
|
public void Clear()
|
|
@@ -530,50 +535,7 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
private void epilogue()
|
|
|
{
|
|
|
- foreach(var mod in _vacSchedulers)
|
|
|
- {
|
|
|
- if(mod.Value.IsAvailable)
|
|
|
- {
|
|
|
- var tars = _vacWaferTargets.Where(item => item.Key.Module == mod.Key).ToArray();
|
|
|
- foreach(var tar in tars)
|
|
|
- {
|
|
|
- var wafer = WaferManager.Instance.GetWafer(tar.Key.Module, tar.Key.Slot);
|
|
|
- if (wafer.IsEmpty)
|
|
|
- continue;
|
|
|
-
|
|
|
- if(wafer.InnerId == tar.Value)
|
|
|
- {
|
|
|
- // wafer arrive
|
|
|
- _vacWaferTargets.Remove(tar.Key);
|
|
|
- wafer.NextSequenceStep++;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- foreach(var mod in _atmSchedulers)
|
|
|
- {
|
|
|
- if (mod.Value.IsAvailable)
|
|
|
- {
|
|
|
- var tars = _atmWaferTargets.Where(item => item.Key.Module == mod.Key).ToArray();
|
|
|
- foreach (var tar in tars)
|
|
|
- {
|
|
|
- var wafer = WaferManager.Instance.GetWafer(tar.Key.Module, tar.Key.Slot);
|
|
|
- if (wafer.IsEmpty)
|
|
|
- continue;
|
|
|
-
|
|
|
- if (wafer.InnerId == tar.Value)
|
|
|
- {
|
|
|
- // wafer arrive
|
|
|
- _atmWaferTargets.Remove(tar.Key);
|
|
|
-
|
|
|
- if (!ModuleHelper.IsLoadPort(tar.Key.Module))
|
|
|
- wafer.NextSequenceStep++;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
+ CheckWaferArrived();
|
|
|
StartNewJob();
|
|
|
}
|
|
|
|
|
@@ -587,6 +549,9 @@ namespace Venus_RT.Modules
|
|
|
#region Vacuum System
|
|
|
private void PumpingTMRobotTask()
|
|
|
{
|
|
|
+ if (!_tmRobot.IsAvailable)
|
|
|
+ return;
|
|
|
+
|
|
|
foreach(var mod in _vacSchedulers)
|
|
|
{
|
|
|
if (mod.Value.IsAvailable && _vacModules[mod.Key].MovingStatus == MovingStatus.Staying)
|
|
@@ -599,7 +564,6 @@ namespace Venus_RT.Modules
|
|
|
if(WaferManager.Instance.CheckHasWafer(mod.Key, slot) && IsVacWaferReadyOut(mod.Key, slot))
|
|
|
{
|
|
|
_vacReadyOutSlots.Add(new SlotItem(mod.Key, slot));
|
|
|
- _vacModules[mod.Key].MovingStatus = MovingStatus.Waiting;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -609,7 +573,6 @@ namespace Venus_RT.Modules
|
|
|
if(WaferManager.Instance.CheckNoWafer(mod.Key, slot))
|
|
|
{
|
|
|
_vacReadyInSlots.Add(new SlotItem(mod.Key, slot));
|
|
|
- _vacModules[mod.Key].MovingStatus = MovingStatus.Waiting;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -618,12 +581,10 @@ namespace Venus_RT.Modules
|
|
|
if(WaferManager.Instance.CheckHasWafer(mod.Key, 0) && IsVacWaferReadyOut(mod.Key, 0)) // processed?
|
|
|
{
|
|
|
_vacReadyOutSlots.Add(new SlotItem(mod.Key, 0));
|
|
|
- _vacModules[mod.Key].MovingStatus = MovingStatus.Waiting;
|
|
|
}
|
|
|
- else
|
|
|
+ else if(WaferManager.Instance.CheckNoWafer(mod.Key, 0))
|
|
|
{
|
|
|
_vacReadyInSlots.Add(new SlotItem(mod.Key, 0));
|
|
|
- _vacModules[mod.Key].MovingStatus = MovingStatus.Waiting;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -634,6 +595,9 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
destSlot = new SlotItem(ModuleName.System, -1);
|
|
|
var wafer = WaferManager.Instance.GetWafer(outSlot.Module, outSlot.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)
|
|
|
{
|
|
|
var validSlots = GetModuleValidSlots(next_module);
|
|
@@ -643,7 +607,7 @@ namespace Venus_RT.Modules
|
|
|
continue;
|
|
|
|
|
|
var ready_in = _vacReadyInSlots.Find(item => item.Module == next_module && item.Slot == nSlot);
|
|
|
- if (ready_in != null)
|
|
|
+ if (ready_in != null && _vacModules[ready_in.Module].MovingStatus != MovingStatus.Moving)
|
|
|
{
|
|
|
destSlot.Module = ready_in.Module;
|
|
|
destSlot.Slot = nSlot;
|
|
@@ -689,24 +653,52 @@ namespace Venus_RT.Modules
|
|
|
var validSlots = GetModuleValidSlots(inModule);
|
|
|
foreach(var slot in _vacReadyOutSlots)
|
|
|
{
|
|
|
- if (slot.Module == inModule)
|
|
|
+ if (slot.Module == inModule && _vacModules[slot.Module].MovingStatus == MovingStatus.Moving)
|
|
|
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)
|
|
|
+ continue;
|
|
|
+
|
|
|
foreach (var next_module in wafer.ProcessJob.Sequence.Steps[wafer.NextSequenceStep].StepModules)
|
|
|
{
|
|
|
- if(next_module == inModule && validSlots.Count > 0)
|
|
|
+ if(next_module == inModule && validSlots.Count > 0 && !_movingItems.Exists(item => item.SourceModule == slot.Module && item.SourceSlot == slot.Slot))
|
|
|
{
|
|
|
- inSlots.Add(new MoveItem(slot.Module, slot.Slot, inModule, validSlots.First(), Hand.None) );
|
|
|
+ if(!inSlots.Exists(item => item.SourceModule == slot.Module && item.SourceSlot == slot.Slot))
|
|
|
+ {
|
|
|
+ inSlots.Add(new MoveItem(slot.Module, slot.Slot, inModule, validSlots.First(), Hand.None));
|
|
|
+ }
|
|
|
+
|
|
|
validSlots.RemoveAt(0);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
return inSlots;
|
|
|
}
|
|
|
|
|
|
+ private void UpdateItemMovingStatus(MoveItem moveItem, MovingStatus status = MovingStatus.Moving)
|
|
|
+ {
|
|
|
+ if(!ModuleHelper.IsTMRobot(moveItem.DestinationModule))
|
|
|
+ {
|
|
|
+ _vacModules[moveItem.DestinationModule].MovingStatus = status;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!ModuleHelper.IsTMRobot(moveItem.SourceModule))
|
|
|
+ {
|
|
|
+ _vacModules[moveItem.SourceModule].MovingStatus = status;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void UpdateModuleMovingStatus(ModuleName module, MovingStatus status = MovingStatus.Moving)
|
|
|
+ {
|
|
|
+ if (!ModuleHelper.IsTMRobot(module))
|
|
|
+ {
|
|
|
+ _vacModules[module].MovingStatus = status;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private void ProcessTMRobotTask()
|
|
|
{
|
|
|
if(_tmRobot.IsAvailable)
|
|
@@ -718,11 +710,16 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
foreach(var slot in _vacReadyOutSlots)
|
|
|
{
|
|
|
- if(ModuleHelper.IsLoadLock(slot.Module))
|
|
|
+ if (_vacModules[slot.Module].MovingStatus == MovingStatus.Moving)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (ModuleHelper.IsLoadLock(slot.Module))
|
|
|
{
|
|
|
if(SearchWaferDestination(slot, out SlotItem destSlot))
|
|
|
{
|
|
|
_movingItems.Add(new MoveItem(slot.Module, slot.Slot, destSlot.Module, destSlot.Slot, Hand.None));
|
|
|
+ UpdateModuleMovingStatus(slot.Module);
|
|
|
+ UpdateModuleMovingStatus(destSlot.Module);
|
|
|
|
|
|
// check whether match double pick pattern
|
|
|
var out_slot_2 = _vacReadyOutSlots.Find(item => item.Module == slot.Module && item.Slot != slot.Slot);
|
|
@@ -731,6 +728,8 @@ namespace Venus_RT.Modules
|
|
|
if(SearchWaferDestination(out_slot_2, out SlotItem destSlot_2))
|
|
|
{
|
|
|
_movingItems.Add(new MoveItem(out_slot_2.Module, out_slot_2.Slot, destSlot_2.Module, destSlot_2.Slot, Hand.None));
|
|
|
+ UpdateModuleMovingStatus(out_slot_2.Module);
|
|
|
+ UpdateModuleMovingStatus(destSlot_2.Module);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -739,6 +738,7 @@ namespace Venus_RT.Modules
|
|
|
foreach(var in_slot in in_slots)
|
|
|
{
|
|
|
_movingItems.Add(in_slot);
|
|
|
+ UpdateItemMovingStatus(in_slot);
|
|
|
}
|
|
|
|
|
|
return;
|
|
@@ -749,12 +749,15 @@ namespace Venus_RT.Modules
|
|
|
if(SearchWaferDestination(slot, out SlotItem destSlot))
|
|
|
{
|
|
|
_movingItems.Add(new MoveItem(slot.Module, slot.Slot, destSlot.Module, destSlot.Slot, Hand.None));
|
|
|
+ UpdateModuleMovingStatus(slot.Module);
|
|
|
+ UpdateModuleMovingStatus(destSlot.Module);
|
|
|
|
|
|
// check whether match swap pattern
|
|
|
var in_slots = SearchWaitInSlots(slot.Module);
|
|
|
if(in_slots.Count >= 1)
|
|
|
{
|
|
|
_movingItems.Add(in_slots.First());
|
|
|
+ UpdateItemMovingStatus(in_slots.First());
|
|
|
}
|
|
|
else
|
|
|
{
|
|
@@ -763,6 +766,7 @@ namespace Venus_RT.Modules
|
|
|
foreach (var item in same_dest)
|
|
|
{
|
|
|
_movingItems.Add(item);
|
|
|
+ UpdateItemMovingStatus(item);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -770,6 +774,9 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ _vacReadyOutSlots.Clear();
|
|
|
+ _vacReadyInSlots.Clear();
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -786,6 +793,7 @@ namespace Venus_RT.Modules
|
|
|
if (wafer.IsEmpty)
|
|
|
{
|
|
|
// post alarm
|
|
|
+ _cycleState = RState.Failed;
|
|
|
LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"Cannot run TM moving task as Get {item.SourceModule}{item.SourceModule} Wafer Info failed");
|
|
|
return;
|
|
|
}
|
|
@@ -793,7 +801,6 @@ namespace Venus_RT.Modules
|
|
|
var slot = new SlotItem(item.DestinationModule, item.DestinationSlot);
|
|
|
_vacWaferTargets[slot] = wafer.InnerId;
|
|
|
}
|
|
|
- _movingItems.Clear();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -825,7 +832,7 @@ namespace Venus_RT.Modules
|
|
|
if (wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
{
|
|
|
// should not go here
|
|
|
- LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"Wafer:{wafer.WaferOrigin} NextSequenceStep {wafer.NextSequenceStep} exceeds {wafer.ProcessJob.Sequence.Name} max steps number");
|
|
|
+ //LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"Wafer:{wafer.WaferOrigin} NextSequenceStep {wafer.NextSequenceStep} exceeds {wafer.ProcessJob.Sequence.Name} max steps number");
|
|
|
return false;
|
|
|
}
|
|
|
|
|
@@ -926,7 +933,12 @@ namespace Venus_RT.Modules
|
|
|
if (wafer.ProcessJob == null || wafer.ProcessJob.Sequence == null)
|
|
|
return false;
|
|
|
|
|
|
- if (wafer.NextSequenceStep >= wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
+ if (wafer.NextSequenceStep == wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
+ {
|
|
|
+ // need return
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else if(wafer.NextSequenceStep > wafer.ProcessJob.Sequence.Steps.Count)
|
|
|
{
|
|
|
// should not go here
|
|
|
LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"Wafer:{wafer.WaferOrigin} NextSequenceStep {wafer.NextSequenceStep} exceeds {wafer.ProcessJob.Sequence.Name} max steps number");
|
|
@@ -949,6 +961,9 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
private bool ProcessLLEFEMRobotTask(ModuleName ll)
|
|
|
{
|
|
|
+ if (_vacModules[ll].MovingStatus != MovingStatus.Staying)
|
|
|
+ return false;
|
|
|
+
|
|
|
var robotSlots = GetEfemRobotWaferReadyInHands(ll);
|
|
|
var inSlots = ll == ModuleName.LLA ? _LLAInSlot : _LLBInSlot;
|
|
|
foreach(var slot in inSlots)
|
|
@@ -984,11 +999,11 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
int exist = 0;
|
|
|
int empty = 0;
|
|
|
- foreach (var atmModule in _atmModules)
|
|
|
+ foreach (var module in _vacModules)
|
|
|
{
|
|
|
- if (ModuleHelper.IsPm(atmModule.Key))
|
|
|
+ if (ModuleHelper.IsPm(module.Key))
|
|
|
{
|
|
|
- if (WaferManager.Instance.CheckHasWafer(atmModule.Key, 0))
|
|
|
+ if (WaferManager.Instance.CheckHasWafer(module.Key, 0))
|
|
|
exist++;
|
|
|
else
|
|
|
empty++;
|
|
@@ -1048,7 +1063,11 @@ namespace Venus_RT.Modules
|
|
|
var llaWaferStatus = GetLLProcessStatusCount(ModuleName.LLA);
|
|
|
var llbWaferStatus = GetLLProcessStatusCount(ModuleName.LLB);
|
|
|
var pmWaferStatus = GetPMWaferExistence();
|
|
|
- if (pmWaferStatus.Item2 <= (llaWaferStatus.Item2 + llbWaferStatus.Item2))
|
|
|
+
|
|
|
+ if (llaWaferStatus.Item1 + llbWaferStatus.Item1 > 0)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (_LLAInSlot.Count + _LLBInSlot.Count + pmWaferStatus.Item2 - llaWaferStatus.Item2 - llbWaferStatus.Item2 <= 2)
|
|
|
return false;
|
|
|
|
|
|
if (GetEfemRoborWaferCount() >= 1 && GetAtmInerWaferCount() > 0)
|
|
@@ -1190,14 +1209,19 @@ namespace Venus_RT.Modules
|
|
|
if (wafer.IsEmpty)
|
|
|
{
|
|
|
// post alarm
|
|
|
+ _cycleState = RState.Failed;
|
|
|
LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"Cannot run EFEM moving task as Get {item.SourceModule}{item.SourceModule} Wafer Info failed");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
var slot = new SlotItem(item.DestinationModule, item.DestinationSlot);
|
|
|
_atmWaferTargets[slot] = wafer.InnerId;
|
|
|
+
|
|
|
+ if(ModuleHelper.IsLoadLock(item.Module))
|
|
|
+ {
|
|
|
+ _vacModules[item.Module].MovingStatus = MovingStatus.Moving;
|
|
|
+ }
|
|
|
}
|
|
|
- _efemMovingItems.Clear();
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1206,8 +1230,11 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
for(int i = 0; i < 2; i++)
|
|
|
{
|
|
|
- if ((WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, i) && !_efemMovingItems.Exists(item => item.DestinationModule == ModuleName.EfemRobot && item.DestinationSlot == i)) ||
|
|
|
- (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, i) && _efemMovingItems.Exists(item => item.SourceModule == ModuleName.EfemRobot && item.SourceSlot == i)))
|
|
|
+ if ((WaferManager.Instance.CheckNoWafer(ModuleName.EfemRobot, i) &&
|
|
|
+ !_efemMovingItems.Exists(item => item.DestinationModule == ModuleName.EfemRobot && item.DestinationSlot == i)) ||
|
|
|
+ (WaferManager.Instance.CheckHasWafer(ModuleName.EfemRobot, i) &&
|
|
|
+ _efemMovingItems.Exists(item => item.SourceModule == ModuleName.EfemRobot && item.SourceSlot == i) &&
|
|
|
+ !_efemMovingItems.Exists(item => item.DestinationModule == ModuleName.EfemRobot && item.DestinationSlot == i)))
|
|
|
return (Hand)i;
|
|
|
}
|
|
|
|
|
@@ -1308,6 +1335,9 @@ namespace Venus_RT.Modules
|
|
|
if (!ModuleHelper.IsPm(stepModule))
|
|
|
break;
|
|
|
|
|
|
+ if (!_vacSchedulers.Keys.Contains(stepModule))
|
|
|
+ continue;
|
|
|
+
|
|
|
var pm = _vacSchedulers[stepModule] as SchedulerPM;
|
|
|
if (pm != null)
|
|
|
{
|
|
@@ -1376,7 +1406,7 @@ namespace Venus_RT.Modules
|
|
|
SequenceStepInfo stepInfo = seq.Steps[i];
|
|
|
foreach (var module in stepInfo.StepModules)
|
|
|
{
|
|
|
- if (ModuleHelper.IsPm(module))
|
|
|
+ if (ModuleHelper.IsPm(module) && _vacSchedulers.ContainsKey(module))
|
|
|
{
|
|
|
var pm = _vacSchedulers[module] as SchedulerPM;
|
|
|
|
|
@@ -1392,6 +1422,90 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
return result;
|
|
|
}
|
|
|
+
|
|
|
+ private void CheckWaferArrived()
|
|
|
+ {
|
|
|
+ if (_cycleState != RState.Running)
|
|
|
+ return;
|
|
|
+
|
|
|
+ foreach (var mod in _vacSchedulers.Append(new KeyValuePair<ModuleName, SchedulerModule>( ModuleName.TMRobot, _tmRobot)))
|
|
|
+ {
|
|
|
+ //if (mod.Value.IsAvailable)
|
|
|
+ {
|
|
|
+ var tars = _vacWaferTargets.Where(item => item.Key.Module == mod.Key).ToArray();
|
|
|
+ foreach (var tar in tars)
|
|
|
+ {
|
|
|
+ var wafer = WaferManager.Instance.GetWafer(tar.Key.Module, tar.Key.Slot);
|
|
|
+ if (wafer.IsEmpty)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (wafer.InnerId == tar.Value)
|
|
|
+ {
|
|
|
+ // wafer arrive
|
|
|
+ _vacWaferTargets.Remove(tar.Key);
|
|
|
+ if(!ModuleHelper.IsTMRobot(tar.Key.Module))
|
|
|
+ wafer.NextSequenceStep++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _vacMoveFinishTrig.CLK = _vacWaferTargets.Count == 0;
|
|
|
+ if (_vacMoveFinishTrig.Q)
|
|
|
+ {
|
|
|
+ foreach(var item in _movingItems)
|
|
|
+ {
|
|
|
+ if(!ModuleHelper.IsTMRobot(item.DestinationModule))
|
|
|
+ {
|
|
|
+ _vacModules[item.DestinationModule].MovingStatus = MovingStatus.Staying;
|
|
|
+ }
|
|
|
+
|
|
|
+ if(!ModuleHelper.IsTMRobot(item.SourceModule))
|
|
|
+ {
|
|
|
+ _vacModules[item.SourceModule].MovingStatus = MovingStatus.Staying;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _movingItems.Clear();
|
|
|
+ }
|
|
|
+
|
|
|
+ foreach (var mod in _atmSchedulers.Append(new KeyValuePair<ModuleName, SchedulerModule>(ModuleName.EfemRobot, _efemRobot)))
|
|
|
+ {
|
|
|
+ //if (mod.Value.IsAvailable)
|
|
|
+ {
|
|
|
+ var tars = _atmWaferTargets.Where(item => item.Key.Module == mod.Key).ToArray();
|
|
|
+ foreach (var tar in tars)
|
|
|
+ {
|
|
|
+ var wafer = WaferManager.Instance.GetWafer(tar.Key.Module, tar.Key.Slot);
|
|
|
+ if (wafer.IsEmpty)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ if (wafer.InnerId == tar.Value)
|
|
|
+ {
|
|
|
+ // wafer arrive
|
|
|
+ _atmWaferTargets.Remove(tar.Key);
|
|
|
+
|
|
|
+ if (!ModuleHelper.IsEFEMRobot(tar.Key.Module))
|
|
|
+ wafer.NextSequenceStep++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _atmMoveFinishTrig.CLK = _atmWaferTargets.Count == 0;
|
|
|
+ if(_atmMoveFinishTrig.Q)
|
|
|
+ {
|
|
|
+ foreach(var item in _efemMovingItems)
|
|
|
+ {
|
|
|
+ if(ModuleHelper.IsLoadLock(item.Module))
|
|
|
+ {
|
|
|
+ _vacModules[item.Module].MovingStatus = MovingStatus.Staying;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ _efemMovingItems.Clear();
|
|
|
+ }
|
|
|
+ }
|
|
|
private void PreJobClean(ControlJobInfo cj)
|
|
|
{
|
|
|
if (cj.IsPreJobCleanDone)
|