|
|
@@ -52,6 +52,7 @@ using System.Windows.Ink;
|
|
|
using Aitex.Core.UI.Control;
|
|
|
using MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory;
|
|
|
using MECF.Framework.Common.FAServices;
|
|
|
+using Newtonsoft.Json;
|
|
|
|
|
|
namespace FurnaceRT.Equipments.Jobs
|
|
|
{
|
|
|
@@ -76,6 +77,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
private SchedulerFACallback _faCallback;
|
|
|
private SchedulerDBCallback _dbCallback;
|
|
|
private ProcessJobInfo _secondPj;
|
|
|
+ private ProcessJobInfo _acitiveProcessJobInfo;
|
|
|
private Dictionary<string, int> _sideDummyWafers = new Dictionary<string, int>();
|
|
|
private Dictionary<string, int> _extraDummyWafers = new Dictionary<string, int>();
|
|
|
private List<int> _sideDummySlots = new List<int>();
|
|
|
@@ -690,7 +692,12 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
pj.CoolTimeSec = coolTime;
|
|
|
pj.IsEmptyLayout = !layoutRecipeDataExpert.Items.Any(x => x != "----");
|
|
|
pj.N2PurgeModeStr = recipeHead.N2PurgeModeStr;
|
|
|
- pj.IsJobAutoStartTrigger = param.ContainsKey("IsJobAutoStart") ? bool.Parse(param["IsJobAutoStart"].ToString()) : false;
|
|
|
+ var isJobAutoStart = param.ContainsKey("IsJobAutoStart") ? bool.Parse(param["IsJobAutoStart"].ToString()) : false;
|
|
|
+ if (isJobAutoStart)
|
|
|
+ {
|
|
|
+ pj.IsJobAutoStartTrigger = isJobAutoStart;
|
|
|
+ pj.scheduleMaintenanceDataItem = JsonConvert.DeserializeObject<ScheduleMaintenanceDataItem>(param["ScheduleMaintenanceDataItem"].ToString());
|
|
|
+ }
|
|
|
|
|
|
if (useStockers.Any() && !CheckChargeRule(pj, out bool waferShort, false, true, out reason))
|
|
|
{
|
|
|
@@ -1049,6 +1056,10 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
+ if (pj.ProcessingState == EnumProcessingState.WaitingProcess)
|
|
|
+ {
|
|
|
+ _acitiveProcessJobInfo = pj;
|
|
|
+ }
|
|
|
if (pj.State == EnumProcessJobState.Processing)
|
|
|
{
|
|
|
var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
|
|
|
@@ -1351,19 +1362,22 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
return;
|
|
|
_secondPj = GetSecondlyProcessJobV2();
|
|
|
|
|
|
- ControlJobInfo cjActived = null;
|
|
|
- DateTime dtMin = DateTime.MaxValue;
|
|
|
- foreach (var cj in _lstControlJobs)
|
|
|
+ ControlJobInfo cjActived = _lstControlJobs.FirstOrDefault(r => r.State == EnumControlJobState.Executing || r.State == EnumControlJobState.Paused);//已有执行cj,不再查找
|
|
|
+ if (cjActived == null)
|
|
|
{
|
|
|
- if (cj.State == EnumControlJobState.Completed)
|
|
|
- continue;
|
|
|
- if (cj.CreateTime.CompareTo(dtMin) < 0)
|
|
|
+ int level = _lstControlJobs.Max(r => r.PriorityExecuteLevel);
|
|
|
+ DateTime dtMin = DateTime.MaxValue;
|
|
|
+ foreach (var cj in _lstControlJobs)
|
|
|
{
|
|
|
- dtMin = cj.CreateTime;
|
|
|
- cjActived = cj;
|
|
|
+ if (cj.State == EnumControlJobState.Completed || cj.PriorityExecuteLevel < level)//优先级低的先不执行
|
|
|
+ continue;
|
|
|
+ if (cj.CreateTime.CompareTo(dtMin) < 0)
|
|
|
+ {
|
|
|
+ dtMin = cj.CreateTime;//记录第一个job的创建时间,获取最早的cj
|
|
|
+ cjActived = cj;
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
if (cjActived == null)
|
|
|
return;
|
|
|
|
|
|
@@ -4834,7 +4848,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
if (needPAndCurrect > 0)
|
|
|
{
|
|
|
//判断dumy是否够补充p类型
|
|
|
- var surplusDumyCount = ( currentEDWaferNum) - needPAndCurrect;
|
|
|
+ var surplusDumyCount = (currentEDWaferNum) - needPAndCurrect;
|
|
|
if (surplusDumyCount >= 0)
|
|
|
{
|
|
|
//判断剩余dumy是否足够Layout配置
|
|
|
@@ -4862,7 +4876,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
currentEDWaferNum--;
|
|
|
needPAndCurrect--;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -4889,7 +4903,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
currentEDWaferNum--;
|
|
|
needPAndCurrect--;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -6476,7 +6490,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
|
|
|
|
|
|
Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set(msg);
|
|
|
- pm.TriggerJobAutoStart(maintenanceItemCarrierUseFreq.AssociationProcessRecipeName, RecipeExecEntryEnum.SDWaferRangeTrigger);
|
|
|
+ pm.TriggerJobAutoStart(maintenanceItemCarrierUseFreq, RecipeExecEntryEnum.SDWaferRangeTrigger);
|
|
|
LOG.Info($"{msg} Trigger {maintenanceItemCarrierUseFreq.AssociationProcessRecipeName}");
|
|
|
// Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemCarrierUseFreq.Item, 0, true);
|
|
|
return false;
|
|
|
@@ -6506,7 +6520,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
}
|
|
|
|
|
|
Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set(msg);
|
|
|
- pm.TriggerJobAutoStart(maintenanceItemWaferUserTime.AssociationProcessRecipeName, RecipeExecEntryEnum.SDWaferRangeTrigger);
|
|
|
+ pm.TriggerJobAutoStart(maintenanceItemWaferUserTime, RecipeExecEntryEnum.SDWaferRangeTrigger);
|
|
|
LOG.Info($"{msg} Trigger {maintenanceItemWaferUserTime.AssociationProcessRecipeName}");
|
|
|
|
|
|
// Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemWaferUserTime.Item, 0, true);
|
|
|
@@ -6537,7 +6551,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
|
|
|
|
|
|
Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set(msg);
|
|
|
- pm.TriggerJobAutoStart(maintenanceItemWaferThickness.AssociationProcessRecipeName, RecipeExecEntryEnum.SDWaferRangeTrigger);
|
|
|
+ pm.TriggerJobAutoStart(maintenanceItemWaferThickness, RecipeExecEntryEnum.SDWaferRangeTrigger);
|
|
|
LOG.Info($"{msg} Trigger {maintenanceItemWaferThickness.AssociationProcessRecipeName}");
|
|
|
|
|
|
|
|
|
@@ -6613,7 +6627,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
return false;
|
|
|
}
|
|
|
Singleton<EquipmentManager>.Instance.FDWaferTypeUseCountAlarm.Set(msg);
|
|
|
- pm.TriggerJobAutoStart(maintenanceItemCarrierUseFreq.AssociationProcessRecipeName, RecipeExecEntryEnum.EDWaferRangeTrigger);
|
|
|
+ pm.TriggerJobAutoStart(maintenanceItemCarrierUseFreq, RecipeExecEntryEnum.EDWaferRangeTrigger);
|
|
|
LOG.Info($"{msg} Trigger {maintenanceItemCarrierUseFreq.AssociationProcessRecipeName}");
|
|
|
|
|
|
|
|
|
@@ -6648,7 +6662,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
}
|
|
|
|
|
|
Singleton<EquipmentManager>.Instance.FDWaferTypeUseTimeAlarm.Set(msg);
|
|
|
- pm.TriggerJobAutoStart(maintenanceItemWaferUserTime.AssociationProcessRecipeName, RecipeExecEntryEnum.EDWaferRangeTrigger);
|
|
|
+ pm.TriggerJobAutoStart(maintenanceItemWaferUserTime, RecipeExecEntryEnum.EDWaferRangeTrigger);
|
|
|
LOG.Info($"{msg} Trigger {maintenanceItemWaferUserTime.AssociationProcessRecipeName}");
|
|
|
|
|
|
// Singleton<ScheduleMaintenanceDataManager>.Instance.SetValue(maintenanceItemWaferUserTime.Item, 0, true);
|
|
|
@@ -6676,7 +6690,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
return false;
|
|
|
}
|
|
|
Singleton<EquipmentManager>.Instance.FDWaferTypeThicknessAlarm.Set(msg);
|
|
|
- pm.TriggerJobAutoStart(maintenanceItemWaferThickness.AssociationProcessRecipeName, RecipeExecEntryEnum.EDWaferRangeTrigger);
|
|
|
+ pm.TriggerJobAutoStart(maintenanceItemWaferThickness, RecipeExecEntryEnum.EDWaferRangeTrigger);
|
|
|
LOG.Info($"{msg} Trigger {maintenanceItemWaferThickness.AssociationProcessRecipeName}");
|
|
|
|
|
|
|
|
|
@@ -6858,14 +6872,14 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
(Singleton<EquipmentManager>.Instance.Modules[ModuleName.WaferRobot] as WaferRobotModule).Home(out _);
|
|
|
pj.RobotHomed = true;
|
|
|
}
|
|
|
+ pj.ProcessingState = EnumProcessingState.WaitingProcess;
|
|
|
|
|
|
- pj.ProcessingState = EnumProcessingState.Processing;
|
|
|
|
|
|
var _boatslotmap = GetBoatSlotMap();
|
|
|
_faCallback.EndCharge(pj, _boatslotmap);
|
|
|
|
|
|
pmModule?.SetN2PurgeLAO2CheckFirstEnable(false);
|
|
|
- if (pm.Process((string)pj.ProcessRecipe, false, true))
|
|
|
+ if (pm.Process((string)pj.ProcessRecipe, false, true, pj.IsJobAutoStartTrigger))
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
@@ -8073,5 +8087,13 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
}
|
|
|
return null;
|
|
|
}
|
|
|
+
|
|
|
+ public void SetPJState()
|
|
|
+ {
|
|
|
+ if (_acitiveProcessJobInfo == null)
|
|
|
+ return;
|
|
|
+
|
|
|
+ _acitiveProcessJobInfo.ProcessingState = EnumProcessingState.Processing;
|
|
|
+ }
|
|
|
}
|
|
|
}
|