|
|
@@ -4667,6 +4667,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
return slots;
|
|
|
}
|
|
|
#region charge rule
|
|
|
+
|
|
|
private bool CheckChargeRule(ProcessJobInfo pj, out bool waferShort, bool needCheckPWafer, bool needCheckMWafer, out string reason)
|
|
|
{
|
|
|
waferShort = false;
|
|
|
@@ -4700,7 +4701,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
var monitor2Slots = GetWaferSlots(layoutRecipeDataExpert, WaferType.M2);
|
|
|
var sideDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.SD);
|
|
|
var extraDummySlots = GetWaferSlots(layoutRecipeDataExpert, WaferType.ED);
|
|
|
-
|
|
|
+ bool isFileDumy = false;
|
|
|
if (layoutRecipeDataConfig.FillDummyTransfer.ToLower() == "exist" && layoutRecipeDataConfig.ProductZeroNotFill.ToLower() == "exist" && layoutRecipeDataConfig.ProductTransferPosition.ToLower() == "none")
|
|
|
{
|
|
|
var pjPWaferCount = GetCurrentWaferNum(pj, WaferType.P, out bool pSlotSelectA);
|
|
|
@@ -4718,10 +4719,19 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
if (needPAndCurrect > 0)
|
|
|
{
|
|
|
//判断dumy是否够补充p类型
|
|
|
- var edAndSdComparePWafer = (currentSDWaferNum + currentEDWaferNum) >= needPAndCurrect;
|
|
|
- if (edAndSdComparePWafer)
|
|
|
+ var surplusDumyCount = (currentSDWaferNum + currentEDWaferNum) - needPAndCurrect;
|
|
|
+ if (surplusDumyCount >= 0)
|
|
|
{
|
|
|
+ //判断剩余dumy是否足够Layout配置
|
|
|
+ if (surplusDumyCount < (extraDummySlots.Count + sideDummySlots.Count))
|
|
|
+ {
|
|
|
+ reason = $"layout recipe P waferNumber={productSlots.Count}, " +
|
|
|
+ $"select P waferNumber={pjPWaferCount},current SD waferNumber={currentSDWaferNum},current ED Wafer {currentEDWaferNum}," +
|
|
|
+ $"supplement P wafer {needPAndCurrect}, surplusDumyCount={surplusDumyCount},Not enough dummy ";
|
|
|
+ return false;
|
|
|
+ }
|
|
|
|
|
|
+ isFileDumy = true;
|
|
|
for (int i = 0; i < layoutRecipeDataExpert.Items.Count; i++)
|
|
|
{
|
|
|
if (layoutRecipeDataExpert.Items[i].ToLower() == WaferType.P.ToDescription())
|
|
|
@@ -4861,14 +4871,14 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
if (!needCheckPWafer)
|
|
|
return true;
|
|
|
|
|
|
- if (iNeedPWaferNum > iCurrentPWaferNum)
|
|
|
+ if (!isFileDumy && iNeedPWaferNum > iCurrentPWaferNum)
|
|
|
{
|
|
|
reason = "layout recipe production wafer number greater than current production wafer number";
|
|
|
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- if (pSlotSelect && iNeedPWaferNum != iCurrentPWaferNum)
|
|
|
+ if (!isFileDumy && pSlotSelect && iNeedPWaferNum != iCurrentPWaferNum)
|
|
|
{
|
|
|
reason = $"layout recipe production wafer number={iNeedPWaferNum}, current production wafer number={iCurrentPWaferNum}, not match";
|
|
|
|
|
|
@@ -6644,8 +6654,12 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
isProcessed = true;
|
|
|
}
|
|
|
}
|
|
|
+ var asd = CheckChargeFinished(pj, pm.Module);
|
|
|
+ if (asd)
|
|
|
+ {
|
|
|
|
|
|
- if (isNeedProcess && CheckChargeFinished(pj, pm.Module) && pj.ProcessingState != EnumProcessingState.Processing &&
|
|
|
+ }
|
|
|
+ if (isNeedProcess && asd && pj.ProcessingState != EnumProcessingState.Processing &&
|
|
|
pmModule.CheckStandbyCondition() && pm.IsAvailable)
|
|
|
{
|
|
|
if (SC.GetValue<bool>("System.IsEnableBoatChargeMapping") && !pj.IsMapAfterCharge)
|