|
@@ -104,7 +104,7 @@ namespace Venus_RT.Modules
|
|
|
IsAligned = false;
|
|
|
|
|
|
pressureStatus = RState.Init;
|
|
|
- temperatureStatus = RState.Init;
|
|
|
+ temperatureStatus = RState.End;
|
|
|
movingStatus = RState.Init;
|
|
|
_scheduledTime = DateTime.Now;
|
|
|
}
|
|
@@ -134,15 +134,16 @@ namespace Venus_RT.Modules
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- if (ModuleHelper.IsPm(destMod) && temperatureStatus == RState.Init)
|
|
|
- {
|
|
|
- var pmScheduler = Singleton<TransferModule>.Instance.GetScheduler(destMod) as SchedulerPM;
|
|
|
- if (pmScheduler != null && pmScheduler.IsAvailable)
|
|
|
- {
|
|
|
- pmScheduler.Preheating(temperature);
|
|
|
- temperatureStatus = RState.Running;
|
|
|
- }
|
|
|
- }
|
|
|
+ // remove heating function
|
|
|
+ //if (ModuleHelper.IsPm(destMod) && temperatureStatus == RState.Init)
|
|
|
+ //{
|
|
|
+ // var pmScheduler = Singleton<TransferModule>.Instance.GetScheduler(destMod) as SchedulerPM;
|
|
|
+ // if (pmScheduler != null && pmScheduler.IsAvailable)
|
|
|
+ // {
|
|
|
+ // pmScheduler.Preheating(temperature);
|
|
|
+ // temperatureStatus = RState.Running;
|
|
|
+ // }
|
|
|
+ //}
|
|
|
|
|
|
return RState.Running;
|
|
|
}
|
|
@@ -341,13 +342,13 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
public override RState Run()
|
|
|
{
|
|
|
- if(Scheduler.IsAvailable)
|
|
|
+ if(Scheduler.IsIdle)
|
|
|
{
|
|
|
switch (Status)
|
|
|
{
|
|
|
case ModuleStatus.Idle:
|
|
|
{
|
|
|
- if(WaferManager.Instance.CheckNoWafer(Module, 0))
|
|
|
+ if(WaferManager.Instance.CheckNoWafer(Module, 0) && Scheduler.IsOnline)
|
|
|
{
|
|
|
if (_pendingCleanTask.Count > 0)
|
|
|
{
|
|
@@ -428,9 +429,16 @@ namespace Venus_RT.Modules
|
|
|
case ModuleStatus.Processing:
|
|
|
{
|
|
|
var wafer = WaferManager.Instance.GetWafer(Module, 0);
|
|
|
- if(!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
|
|
|
+ if(Scheduler.IsOnline)
|
|
|
+ {
|
|
|
+ if (!wafer.IsEmpty && wafer.ProcessState == EnumWaferProcessStatus.Completed)
|
|
|
+ {
|
|
|
+ _wafer.Return();
|
|
|
+ Status = ModuleStatus.Idle;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else // handle offline exception situation
|
|
|
{
|
|
|
- _wafer.Return();
|
|
|
Status = ModuleStatus.Idle;
|
|
|
}
|
|
|
}
|
|
@@ -969,7 +977,7 @@ namespace Venus_RT.Modules
|
|
|
_faCallback.JobCreateFailed(module, lotId, jobId, "");
|
|
|
return false;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (!RouteManager.IsATMMode && !CheckSequenceRecipeFileValid(pj.Sequence, out reason))
|
|
|
{
|
|
|
LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, $"recipe file not valid in the sequence, {reason}");
|
|
@@ -1165,6 +1173,7 @@ namespace Venus_RT.Modules
|
|
|
LOG.Write(eEvent.WARN_ROUTER, ModuleName.System, reason);
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
if (RtInstance.ConfigType == ConfigType.Kepler2200)
|
|
|
{
|
|
|
if (!CheckSequenceKepler2200TemperatureReady(GetFirstProcessJob(cj).Sequence))
|
|
@@ -1172,6 +1181,7 @@ namespace Venus_RT.Modules
|
|
|
return false;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
if (cj.State == EnumControlJobState.WaitingForStart)
|
|
|
{
|
|
|
cj.SetState(EnumControlJobState.Executing);
|
|
@@ -1300,6 +1310,12 @@ namespace Venus_RT.Modules
|
|
|
LOG.Write(eEvent.ERR_ROUTER, destLP, $"The destination Loadport {destLP} is not ready for return wafer.");
|
|
|
return RState.Failed;
|
|
|
}
|
|
|
+
|
|
|
+ if(!ModuleHelper.IsLoadPort(destLP))
|
|
|
+ {
|
|
|
+ LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"The wafer {wafer.WaferOrigin} cannot be return, please manually drag it.");
|
|
|
+ return RState.Failed;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1782,6 +1798,7 @@ namespace Venus_RT.Modules
|
|
|
private void WaferArrived(WaferTask wafer, MoveItem item)
|
|
|
{
|
|
|
_dictModuleTask[item.DestinationModule].WaferArrived(wafer, item.DestinationSlot);
|
|
|
+
|
|
|
//--2024-03-21 增加了PortJobWaferEnd 上报事件 start--
|
|
|
if (ModuleHelper.IsLoadPort(item.DestinationModule))
|
|
|
{
|
|
@@ -1797,6 +1814,7 @@ namespace Venus_RT.Modules
|
|
|
private void WaferLeaved(WaferTask wafer, MoveItem item)
|
|
|
{
|
|
|
_dictModuleTask[item.SourceModule].WaferLeaved(wafer, item.DestinationSlot);
|
|
|
+
|
|
|
//--2024-03-21 增加了PortJobWaferStart 上报事件 start--
|
|
|
if (ModuleHelper.IsLoadPort(item.SourceModule))
|
|
|
{
|
|
@@ -1818,12 +1836,22 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
foreach(var pm in wafer.ProcessJob.Sequence.PMs)
|
|
|
{
|
|
|
- if (!lstInProcessPMs.Contains(pm))
|
|
|
+ if (!lstInProcessPMs.Contains(pm) && _dictModuleTask[pm].Scheduler.IsOnline)
|
|
|
lstInProcessPMs.Add(pm);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // blocking check while only one loadlock in out
|
|
|
+ if (LLInOutPath == SequenceLLInOutPath.AInAOut ||
|
|
|
+ LLInOutPath == SequenceLLInOutPath.BInBOut ||
|
|
|
+ !_dictModuleTask[ModuleName.LLA].Scheduler.IsOnline ||
|
|
|
+ !_dictModuleTask[ModuleName.LLB].Scheduler.IsOnline)
|
|
|
+ {
|
|
|
+ if (_lstWaferTasks.Count >= lstInProcessPMs.Count + _LLASlotNumber / 2)
|
|
|
+ return ModuleName.System;
|
|
|
+ }
|
|
|
+
|
|
|
Dictionary<ModuleName, int> pmAssociatedWaferCount = new Dictionary<ModuleName, int>();
|
|
|
foreach (var mod in _dictModuleTask)
|
|
|
{
|
|
@@ -1882,12 +1910,12 @@ namespace Venus_RT.Modules
|
|
|
{
|
|
|
temperature = temp;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
var waferTask = new WaferTask((ModuleName)wafer.OriginStation,
|
|
|
wafer.OriginSlot,
|
|
|
pm,
|
|
|
+ 0,
|
|
|
temperature,
|
|
|
- (float)Convert.ToDouble(recipe.Header.Temperature),
|
|
|
wafer.InnerId,
|
|
|
recipeName,
|
|
|
wafer.ProcessJob.Sequence.WTWCleanRecipe,
|
|
@@ -2317,7 +2345,25 @@ namespace Venus_RT.Modules
|
|
|
foreach (var action in _curEfemAction)
|
|
|
{
|
|
|
var waferTask = _lstWaferTasks.Find(wafer => (wafer.movingStatus == RState.End || wafer.movingStatus == RState.Init) && wafer.currentMod == action.SourceModule && wafer.currentSlot == action.SourceSlot);
|
|
|
- waferTask.MoveTo(action.DestinationModule, action.DestinationSlot);
|
|
|
+ waferTask.MoveTo(action.DestinationModule, action.DestinationSlot);
|
|
|
+ //--2024-03-21 增加了PortJobWaferStart 上报事件 start--
|
|
|
+ if (ModuleHelper.IsLoadPort(action.SourceModule))
|
|
|
+ {
|
|
|
+ ControlJobInfo currentControlJob = GetLoadPortCurrentControlJob(action.SourceModule);
|
|
|
+ if(currentControlJob!=null)
|
|
|
+ {
|
|
|
+ _faCallback.JobWaferStart(currentControlJob, action.SourceSlot);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if(ModuleHelper.IsLoadPort(action.DestinationModule))
|
|
|
+ {
|
|
|
+ ControlJobInfo currentControlJob = GetLoadPortCurrentControlJob(action.DestinationModule);
|
|
|
+ if (currentControlJob != null)
|
|
|
+ {
|
|
|
+ _faCallback.JobWaferEnd(currentControlJob, action.SourceSlot);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //--2024-03-21 增加了PortJobWaferStart 上报事件 end--
|
|
|
}
|
|
|
|
|
|
(_dictModuleTask[ModuleName.EfemRobot].Scheduler as SchedulerEfemRobot).PostMoveItems(_curEfemAction.ToArray());
|
|
@@ -3500,6 +3546,7 @@ namespace Venus_RT.Modules
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
+
|
|
|
private bool CheckSequenceKepler2200TemperatureReady(SequenceInfo seq)
|
|
|
{
|
|
|
for (int i = 0; i < seq.Steps.Count; i++)
|
|
@@ -3536,7 +3583,7 @@ namespace Venus_RT.Modules
|
|
|
currentChamberTemperature = 0;
|
|
|
break;
|
|
|
}
|
|
|
- if (recipe.Header.Temperature!=null && recipe.Header.Temperature!="" && (currentChamberTemperature > Convert.ToSingle(recipe.Header.Temperature) + 10 || currentChamberTemperature < Convert.ToSingle(recipe.Header.Temperature) - 10))
|
|
|
+ if (recipe.Header.Temperature != null && recipe.Header.Temperature != "" && (currentChamberTemperature > Convert.ToSingle(recipe.Header.Temperature) + 10 || currentChamberTemperature < Convert.ToSingle(recipe.Header.Temperature) - 10))
|
|
|
{
|
|
|
LOG.Write(eEvent.ERR_ROUTER, ModuleName.System, $"Start job失败,由于{module}腔体温度{currentChamberTemperature}与{recipeName} Recipe温度{recipe.Header.Temperature}不匹配");
|
|
|
return false;
|