|
@@ -113,6 +113,8 @@ namespace Venus_RT.Modules
|
|
|
private int _cycleSetPoint = 0;
|
|
|
private int _cycledCount = 0;
|
|
|
private int _cycledWafer = 0;
|
|
|
+ private float _throughput = 0.0f;
|
|
|
+ private Stopwatch _cycleWatch = new Stopwatch();
|
|
|
|
|
|
public bool HasJobRunning => _lstControlJobs.Count > 0;
|
|
|
|
|
@@ -138,6 +140,7 @@ namespace Venus_RT.Modules
|
|
|
DATA.Subscribe("Scheduler.CycledCount", () => _cycledCount,SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe("Scheduler.CycledWafer", () => _cycledWafer, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
DATA.Subscribe("Scheduler.CycleSetPoint", () => _cycleSetPoint, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
+ DATA.Subscribe("Scheduler.Throughput", () => _throughput, SubscriptionAttribute.FLAG.IgnoreSaveDB);
|
|
|
|
|
|
|
|
|
DATA.Subscribe("Scheduler.PjIdList", () => Array.ConvertAll(_lstProcessJobs.ToArray(), x => x.InnerId.ToString()).ToList());
|
|
@@ -149,6 +152,7 @@ namespace Venus_RT.Modules
|
|
|
_cycleSetPoint = _isCycleMode ? SC.GetValue<int>("System.CycleCount") : 0;
|
|
|
_cycledWafer = 0;
|
|
|
_cycledCount = 0;
|
|
|
+ _cycleWatch.Stop();
|
|
|
|
|
|
return RState.Running;
|
|
|
}
|
|
@@ -486,6 +490,11 @@ namespace Venus_RT.Modules
|
|
|
//ResetTraceFlag();
|
|
|
}
|
|
|
|
|
|
+ if(!_cycleWatch.IsRunning)
|
|
|
+ {
|
|
|
+ _cycleWatch.Restart();
|
|
|
+ }
|
|
|
+
|
|
|
_cycleState = RState.Running;
|
|
|
}
|
|
|
|
|
@@ -1009,6 +1018,13 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
if(ModuleHelper.IsAligner(scheduler.Key))
|
|
|
{
|
|
|
+ if(_atmModules[scheduler.Key].MovingStatus != MovingStatus.Idle)
|
|
|
+ {
|
|
|
+ ProcessAlignerTask();
|
|
|
+ if (_atmModules[scheduler.Key].MovingStatus != MovingStatus.Idle)
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (ProcessAlignerEFEMRobotTask(scheduler.Key))
|
|
|
return;
|
|
|
}
|
|
@@ -1121,16 +1137,31 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- var outSlots = ll == ModuleName.LLA ? _LLAOutSlot : _LLBOutSlot;
|
|
|
+ var slotNumber = ll == ModuleName.LLA ? _LLASlotNumber : _LLBSlotNumber;
|
|
|
+ Dictionary<int, long> slot_delays = new Dictionary<int, long>();
|
|
|
+ for (int i = 0; i < slotNumber; i++)
|
|
|
+ {
|
|
|
+ if(IsAtmWaferReadyOut(ll, i))
|
|
|
+ {
|
|
|
+ slot_delays[i] = _atmSchedulers[ll].WaferArrivedTicks(i);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- foreach(var slot in outSlots)
|
|
|
+ slot_delays = slot_delays.OrderByDescending(item => item.Value).ToDictionary(k => k.Key, v => v.Value);
|
|
|
+ if(slot_delays.Count > 0)
|
|
|
{
|
|
|
- if(IsAtmWaferReadyOut(ll, slot))
|
|
|
+ var robotHand = GetEFEMRobotFreeHand();
|
|
|
+ if (robotHand != Hand.None)
|
|
|
+ {
|
|
|
+ _efemMovingItems.Add(new MoveItem(ll, slot_delays.ElementAt(0).Key, ModuleName.EfemRobot, (int)robotHand, robotHand));
|
|
|
+ }
|
|
|
+
|
|
|
+ if(slot_delays.Count > 1)
|
|
|
{
|
|
|
- var robotHand = GetEFEMRobotFreeHand();
|
|
|
- if(robotHand != Hand.None)
|
|
|
+ var secondHand = GetEFEMRobotFreeHand();
|
|
|
+ if(secondHand != Hand.None)
|
|
|
{
|
|
|
- _efemMovingItems.Add(new MoveItem(ll, slot, ModuleName.EfemRobot, (int)robotHand, robotHand));
|
|
|
+ _efemMovingItems.Add(new MoveItem(ll, slot_delays.ElementAt(1).Key, ModuleName.EfemRobot, (int)secondHand, secondHand));
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -1750,7 +1781,7 @@ namespace Venus_RT.Modules
|
|
|
if(!ModuleHelper.IsTMRobot(tar.Key.Module))
|
|
|
_vacSchedulers[tar.Key.Module].WaferArrived(tar.Key.Slot);
|
|
|
|
|
|
- LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"wafer {wafer.WaferOrigin}: {wafer.InnerId} arrived {tar.Key.Module}{tar.Key.Slot + 1}");
|
|
|
+ //LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"wafer {wafer.WaferOrigin}: {wafer.InnerId} arrived {tar.Key.Module}{tar.Key.Slot + 1}");
|
|
|
if (ModuleHelper.IsPm(tar.Key.Module))
|
|
|
{
|
|
|
_vacModules[tar.Key.Module].MovingStatus = MovingStatus.WaitProcess;
|
|
@@ -1793,7 +1824,7 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
if (wafer.InnerId == tar.Value)
|
|
|
{
|
|
|
- LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"wafer {wafer.WaferOrigin}: {wafer.InnerId} arrived {tar.Key.Module}{tar.Key.Slot + 1}");
|
|
|
+ //LOG.Write(eEvent.EV_ROUTER, ModuleName.System, $"wafer {wafer.WaferOrigin}: {wafer.InnerId} arrived {tar.Key.Module}{tar.Key.Slot + 1}");
|
|
|
// wafer arrive
|
|
|
|
|
|
if(!ModuleHelper.IsLoadPort(tar.Key.Module) && !ModuleHelper.IsEFEMRobot(tar.Key.Module))
|
|
@@ -2072,6 +2103,10 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
|
|
|
_cycledWafer = _cycledCount * countPerCycle + countProcessed;
|
|
|
+ if(_cycledWafer >= 25)
|
|
|
+ {
|
|
|
+ _throughput = (float)(_cycledWafer / _cycleWatch.Elapsed.TotalHours);
|
|
|
+ }
|
|
|
|
|
|
if (allControlJobComplete)
|
|
|
{
|