|
|
@@ -92,6 +92,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
private Dictionary<string, R_TRIG> _logTrigDic = new Dictionary<string, R_TRIG>();
|
|
|
private Dictionary<string, Tuple<FilterChecker, double>> _fimsCheckOxDensityDict = new Dictionary<string, Tuple<FilterChecker, double>>();
|
|
|
private bool _isCoolingSkip = false;
|
|
|
+ private R_TRIG r_Trig_DisChargeEndEvent = new R_TRIG();
|
|
|
public bool HasJobRunning
|
|
|
{
|
|
|
get { return _lstControlJobs.Count > 0; }
|
|
|
@@ -1051,12 +1052,16 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
if (pj.State == EnumProcessJobState.Processing)
|
|
|
{
|
|
|
var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
|
|
|
+ r_Trig_DisChargeEndEvent.CLK = CheckAllWaferReturned(pj, true);
|
|
|
+ if (r_Trig_DisChargeEndEvent.Q)
|
|
|
+ {
|
|
|
+ _faCallback.EndDischarge(pj);
|
|
|
|
|
|
+ }
|
|
|
if (CheckAllWaferReturned(pj, true) && pmModule.CheckRecipeIsCompleted(pj))
|
|
|
{
|
|
|
pj.SetState(EnumProcessJobState.ProcessingComplete);
|
|
|
JobDataRecorder.EndPJ(pj.InnerId.ToString(), 0, 0);
|
|
|
- _faCallback.EndDischarge(pj);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
@@ -1066,7 +1071,6 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
{
|
|
|
pj.SetState(EnumProcessJobState.ProcessingComplete);
|
|
|
JobDataRecorder.EndPJ(pj.InnerId.ToString(), 0, 0);
|
|
|
- _faCallback.EndDischarge(pj);
|
|
|
|
|
|
}
|
|
|
}
|
|
|
@@ -1347,22 +1351,19 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
return;
|
|
|
_secondPj = GetSecondlyProcessJobV2();
|
|
|
|
|
|
- ControlJobInfo cjActived = _lstControlJobs.FirstOrDefault(r => r.State == EnumControlJobState.Executing || r.State == EnumControlJobState.Paused);//已有执行cj,不再查找
|
|
|
- if (cjActived == null)
|
|
|
+ ControlJobInfo cjActived = null;
|
|
|
+ DateTime dtMin = DateTime.MaxValue;
|
|
|
+ foreach (var cj in _lstControlJobs)
|
|
|
{
|
|
|
- int level = _lstControlJobs.Max(r => r.PriorityExecuteLevel);
|
|
|
- DateTime dtMin = DateTime.MaxValue;
|
|
|
- foreach (var cj in _lstControlJobs)
|
|
|
+ if (cj.State == EnumControlJobState.Completed)
|
|
|
+ continue;
|
|
|
+ if (cj.CreateTime.CompareTo(dtMin) < 0)
|
|
|
{
|
|
|
- if (cj.State == EnumControlJobState.Completed || cj.PriorityExecuteLevel < level)//优先级低的先不执行
|
|
|
- continue;
|
|
|
- if (cj.CreateTime.CompareTo(dtMin) < 0)
|
|
|
- {
|
|
|
- dtMin = cj.CreateTime;//记录第一个job的创建时间,获取最早的cj
|
|
|
- cjActived = cj;
|
|
|
- }
|
|
|
+ dtMin = cj.CreateTime;
|
|
|
+ cjActived = cj;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
if (cjActived == null)
|
|
|
return;
|
|
|
|
|
|
@@ -4833,7 +4834,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
if (needPAndCurrect > 0)
|
|
|
{
|
|
|
//判断dumy是否够补充p类型
|
|
|
- var surplusDumyCount = (currentEDWaferNum) - needPAndCurrect;
|
|
|
+ var surplusDumyCount = ( currentEDWaferNum) - needPAndCurrect;
|
|
|
if (surplusDumyCount >= 0)
|
|
|
{
|
|
|
//判断剩余dumy是否足够Layout配置
|
|
|
@@ -4861,7 +4862,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
currentEDWaferNum--;
|
|
|
needPAndCurrect--;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -4888,7 +4889,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
currentEDWaferNum--;
|
|
|
needPAndCurrect--;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -6837,6 +6838,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
isProcessed = true;
|
|
|
}
|
|
|
}
|
|
|
+ var asd = CheckChargeFinished(pj, pm.Module);
|
|
|
|
|
|
if (isNeedProcess && CheckChargeFinished(pj, pm.Module) && pj.ProcessingState != EnumProcessingState.Processing &&
|
|
|
pmModule.CheckStandbyCondition() && pm.IsAvailable)
|
|
|
@@ -6863,8 +6865,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
_faCallback.EndCharge(pj, _boatslotmap);
|
|
|
|
|
|
pmModule?.SetN2PurgeLAO2CheckFirstEnable(false);
|
|
|
-
|
|
|
- if (pm.Process((string)pj.ProcessRecipe, false, true, pj.IsJobAutoStartTrigger))
|
|
|
+ if (pm.Process((string)pj.ProcessRecipe, false, true))
|
|
|
return;
|
|
|
}
|
|
|
|