|
@@ -44,6 +44,8 @@ using System.Threading;
|
|
|
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
|
|
using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
|
|
|
using System.Reflection;
|
|
using System.Reflection;
|
|
|
using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
|
|
using MECF.Framework.UI.Client.CenterViews.Editors.Recipe;
|
|
|
|
|
+using MECF.Framework.Common.Tolerance;
|
|
|
|
|
+using MECF.Framework.Common.CommonData.SorterDefines;
|
|
|
|
|
|
|
|
namespace FurnaceRT.Equipments.Jobs
|
|
namespace FurnaceRT.Equipments.Jobs
|
|
|
{
|
|
{
|
|
@@ -82,6 +84,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
private Dictionary<string, R_TRIG> _waferStatusAlarmTrigDic = new Dictionary<string, R_TRIG>();
|
|
private Dictionary<string, R_TRIG> _waferStatusAlarmTrigDic = new Dictionary<string, R_TRIG>();
|
|
|
private Dictionary<string, R_TRIG> _dummyWaferCheckTrigDic = new Dictionary<string, R_TRIG>();
|
|
private Dictionary<string, R_TRIG> _dummyWaferCheckTrigDic = new Dictionary<string, R_TRIG>();
|
|
|
private Dictionary<string, R_TRIG> _logTrigDic = new Dictionary<string, R_TRIG>();
|
|
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 bool _isCoolingSkip = false;
|
|
|
public bool HasJobRunning
|
|
public bool HasJobRunning
|
|
|
{
|
|
{
|
|
@@ -608,6 +611,14 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ foreach (var item in _lstFIMSs)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (!_fimsCheckOxDensityDict.ContainsKey(item.Module.ToString()))
|
|
|
|
|
+ {
|
|
|
|
|
+ _fimsCheckOxDensityDict.Add(item.Module.ToString(), Tuple.Create(new FilterChecker(), SC.GetValue<double>("PM1.N2Purge.N2PurgeFOUPO2CheckSV")));
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
var pjJobId = param["PJID"].ToString();
|
|
var pjJobId = param["PJID"].ToString();
|
|
|
var cjJobId = param["CJID"].ToString();
|
|
var cjJobId = param["CJID"].ToString();
|
|
|
ControlJobInfo cj = null;
|
|
ControlJobInfo cj = null;
|
|
@@ -645,7 +656,6 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
pj.ProcessingState = EnumProcessingState.WaitingMaterial;
|
|
pj.ProcessingState = EnumProcessingState.WaitingMaterial;
|
|
|
pj.CoolTimeSec = coolTime;
|
|
pj.CoolTimeSec = coolTime;
|
|
|
pj.IsEmptyLayout = !layoutRecipeDataExpert.Items.Any(x => x != "----");
|
|
pj.IsEmptyLayout = !layoutRecipeDataExpert.Items.Any(x => x != "----");
|
|
|
- pj.IsN2PurgeMode = recipeHead.IsN2PurgeMode;
|
|
|
|
|
pj.N2PurgeModeStr = recipeHead.N2PurgeModeStr;
|
|
pj.N2PurgeModeStr = recipeHead.N2PurgeModeStr;
|
|
|
|
|
|
|
|
if (useStockers.Any() && !CheckChargeRule(pj, out bool waferShort, false, true, out reason))
|
|
if (useStockers.Any() && !CheckChargeRule(pj, out bool waferShort, false, true, out reason))
|
|
@@ -1503,10 +1513,10 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
pj.SetState(EnumProcessJobState.Processing);
|
|
pj.SetState(EnumProcessJobState.Processing);
|
|
|
pj.ProcessingState = EnumProcessingState.Charging;
|
|
pj.ProcessingState = EnumProcessingState.Charging;
|
|
|
pj.BeginTime = DateTime.Now;
|
|
pj.BeginTime = DateTime.Now;
|
|
|
-
|
|
|
|
|
- if (pj.IsN2PurgeMode)
|
|
|
|
|
|
|
+ var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
|
|
|
|
|
+ var laIsNeedXxygenPressure = pmModule.CheckLAIsNeedOxygenPressure(pj.N2PurgeModeStr);
|
|
|
|
|
+ if (laIsNeedXxygenPressure)
|
|
|
{
|
|
{
|
|
|
- var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
|
|
|
|
|
//pmModule?.SetN2PurgeProcess(true);
|
|
//pmModule?.SetN2PurgeProcess(true);
|
|
|
//if (SC.ContainsItem("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable"))
|
|
//if (SC.ContainsItem("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable"))
|
|
|
// pmModule?.SetN2PurgeLAO2CheckFirstEnable(true);
|
|
// pmModule?.SetN2PurgeLAO2CheckFirstEnable(true);
|
|
@@ -1658,6 +1668,7 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
MonitorCassetteRobotPlaceStockerTask();
|
|
MonitorCassetteRobotPlaceStockerTask();
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
private void MonitorFIMSTask()
|
|
private void MonitorFIMSTask()
|
|
|
{
|
|
{
|
|
|
if (!_lstProcessJobs.Any())
|
|
if (!_lstProcessJobs.Any())
|
|
@@ -1676,9 +1687,41 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
continue;
|
|
continue;
|
|
|
|
|
|
|
|
var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
|
|
var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
|
|
|
- if (!CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsLoadCompleted && st.Load(pj.IsN2PurgeMode, "Charging"))
|
|
|
|
|
|
|
+ if (!CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsLoadCompleted)
|
|
|
{
|
|
{
|
|
|
- return;
|
|
|
|
|
|
|
+ var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
|
|
|
|
|
+
|
|
|
|
|
+ var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
|
|
|
|
|
+
|
|
|
|
|
+ if (isCheckO2)
|
|
|
|
|
+ {
|
|
|
|
|
+
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(_fimsCheckOxDensityDict[st.Module.ToString()].Item2));
|
|
|
|
|
+ if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Restart();
|
|
|
|
|
+ LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},wait load Charging。A");
|
|
|
|
|
+
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},direct load Charging。B");
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1694,9 +1737,37 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
var wafers = WaferManager.Instance.GetWafers(st.Module);
|
|
var wafers = WaferManager.Instance.GetWafers(st.Module);
|
|
|
if (wafers != null)
|
|
if (wafers != null)
|
|
|
{
|
|
{
|
|
|
- if (CheckCarrierNoHasEmptySlot(st.Module) && !fimsDevice.IsLoadCompleted && st.Load(pj.IsN2PurgeMode, "Discharging"))
|
|
|
|
|
|
|
+ if (CheckCarrierNoHasEmptySlot(st.Module) && !fimsDevice.IsLoadCompleted)
|
|
|
{
|
|
{
|
|
|
- return;
|
|
|
|
|
|
|
+ var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
|
|
|
|
|
+ var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
|
|
|
|
|
+ if (isCheckO2)
|
|
|
|
|
+ {
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(_fimsCheckOxDensityDict[st.Module.ToString()].Item2));
|
|
|
|
|
+ if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Restart();
|
|
|
|
|
+ LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},wait load Charging。C");
|
|
|
|
|
+
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ if (st.Load(CheckFimsIsNeedOxygenPressure, "Discharging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ LOG.Info($"FIMS={st.Module} , FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},pjStatus:{pj.ProcessingState},direct load Charging。D");
|
|
|
|
|
+
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1709,9 +1780,37 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
|
|
var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
|
|
|
if (carrier != null)
|
|
if (carrier != null)
|
|
|
{
|
|
{
|
|
|
- if (!CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && !fimsDevice.IsLoadCompleted && st.Load(pj.IsN2PurgeMode, "Discharging"))
|
|
|
|
|
|
|
+
|
|
|
|
|
+ if (!CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && !fimsDevice.IsLoadCompleted)
|
|
|
{
|
|
{
|
|
|
- return;
|
|
|
|
|
|
|
+ var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
|
|
|
|
|
+ var CheckFimsIsNeedOxygenPressure = pm.CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
|
|
|
|
|
+ if (isCheckO2)
|
|
|
|
|
+ {
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.CheckInterval = 1;
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Monitor(pm.GetN2PurgeUnder20PPMStatus(_fimsCheckOxDensityDict[st.Module.ToString()].Item2));
|
|
|
|
|
+ if (_fimsCheckOxDensityDict[st.Module.ToString()].Item1.Trig)
|
|
|
|
|
+ {
|
|
|
|
|
+ if (st.Load(CheckFimsIsNeedOxygenPressure, "Charging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ _fimsCheckOxDensityDict[st.Module.ToString()].Item1.Restart();
|
|
|
|
|
+ LOG.Info($"FIMS :{st.Module} FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},wait load Charging");
|
|
|
|
|
+
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ else
|
|
|
|
|
+ {
|
|
|
|
|
+ if (st.Load(CheckFimsIsNeedOxygenPressure, "Discharging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ LOG.Info($"FIMS :{st.Module} FIMS N2PurgeConfig={pm.GetFIMStN2purgeConfig()},Recipe N2purge Set={pj.N2PurgeModeStr},Currect N2Purge={pm.GetLACurrectN2purgeMode()},direct load Discharging");
|
|
|
|
|
+
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1726,7 +1825,8 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
continue;
|
|
continue;
|
|
|
|
|
|
|
|
var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
|
|
var fimsDevice = DEVICE.GetDevice<IoFIMS>($"PM1.{st.Module}");
|
|
|
- if (CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsUnloadCompleted && st.Unload(pj.IsN2PurgeMode, "Charging"))
|
|
|
|
|
|
|
+ // var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
|
|
|
|
|
+ if (CheckCarrierCanPickFromFIMS(st.Module) && !fimsDevice.IsUnloadCompleted && st.Unload(false, "Charging"))
|
|
|
{
|
|
{
|
|
|
return;
|
|
return;
|
|
|
}
|
|
}
|
|
@@ -1751,9 +1851,15 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
continue;
|
|
continue;
|
|
|
GetWaferSlotsAndWaferType(carrier, out List<int> slots, out WaferType waferType);
|
|
GetWaferSlotsAndWaferType(carrier, out List<int> slots, out WaferType waferType);
|
|
|
|
|
|
|
|
- if (fims != null && slots != null && GetWaferCountRelatedToWaferRobot(waferType, false) <= slots.Count && CheckCarrierCanPickFromStocker(ModuleName.CarrierRobot) && fims.Unload(pj.IsN2PurgeMode, "Charging"))
|
|
|
|
|
|
|
+ if (fims != null && slots != null && GetWaferCountRelatedToWaferRobot(waferType, false) <= slots.Count && CheckCarrierCanPickFromStocker(ModuleName.CarrierRobot))
|
|
|
{
|
|
{
|
|
|
- return;
|
|
|
|
|
|
|
+ //var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr, out var isCheckO2);
|
|
|
|
|
+ if (fims.Unload(false, "Charging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1770,9 +1876,14 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
|
|
var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
|
|
|
if (carrier != null)
|
|
if (carrier != null)
|
|
|
{
|
|
{
|
|
|
- if (!CheckCarrierHasEmptySlot(st.Module) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted && st.Unload(pj.IsN2PurgeMode, "Discharging"))
|
|
|
|
|
|
|
+ // var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr);
|
|
|
|
|
+
|
|
|
|
|
+ if (!CheckCarrierHasEmptySlot(st.Module) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted)
|
|
|
{
|
|
{
|
|
|
- return;
|
|
|
|
|
|
|
+ if (st.Unload(false, "Discharging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -1785,9 +1896,16 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
|
|
var carrier = CarrierManager.Instance.GetCarrier(st.Module, 0);
|
|
|
if (carrier != null)
|
|
if (carrier != null)
|
|
|
{
|
|
{
|
|
|
- if (CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted && st.Unload(pj.IsN2PurgeMode, "Discharging"))
|
|
|
|
|
|
|
+ // var CheckFimsIsNeedOxygenPressure = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).CheckFimsIsNeedOxygenPressure(pj.N2PurgeModeStr);
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ if (CheckCarrierCanPickFromFIMSInDischarge(carrier.InternalModuleName) && _waferRobot.IsAvailable && !fimsDevice.IsUnloadCompleted)
|
|
|
{
|
|
{
|
|
|
- return;
|
|
|
|
|
|
|
+ if (st.Unload(false, "Discharging"))
|
|
|
|
|
+ {
|
|
|
|
|
+ return;
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -6441,7 +6559,8 @@ namespace FurnaceRT.Equipments.Jobs
|
|
|
var _boatslotmap = GetBoatSlotMap();
|
|
var _boatslotmap = GetBoatSlotMap();
|
|
|
_faCallback.StartDischarge(pj, _boatslotmap);
|
|
_faCallback.StartDischarge(pj, _boatslotmap);
|
|
|
LOG.Write($"Cooling completed {pj.CoolTimeSec}");
|
|
LOG.Write($"Cooling completed {pj.CoolTimeSec}");
|
|
|
- if (pj.IsN2PurgeMode)
|
|
|
|
|
|
|
+ var laIsNeedXxygenPressure = pmModule.CheckLAIsNeedOxygenPressure(pj.N2PurgeModeStr);
|
|
|
|
|
+ if (laIsNeedXxygenPressure)
|
|
|
{
|
|
{
|
|
|
//pmModule?.SetN2PurgeProcess(true);
|
|
//pmModule?.SetN2PurgeProcess(true);
|
|
|
//if (SC.ContainsItem("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable"))
|
|
//if (SC.ContainsItem("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable") && SC.GetValue<bool>("PM1.N2Purge.WaferCharge.TransferRoomN2PurgeEnable"))
|