|
@@ -69,6 +69,7 @@ namespace EfemDualSchedulerLib
|
|
|
private R_TRIG _trigLp1JobComplete = new R_TRIG();
|
|
|
private R_TRIG _trigLp2JobComplete = new R_TRIG();
|
|
|
private R_TRIG _trigLp3JobComplete = new R_TRIG();
|
|
|
+ private Dictionary<ModuleName, R_TRIG> _checkNoCarrierByModule = new Dictionary<ModuleName, R_TRIG>();
|
|
|
|
|
|
private Dictionary<string, float> _temperatureSetpointDic = new Dictionary<string, float>();
|
|
|
private Dictionary<string, R_TRIG> _temperatureTrigDic = new Dictionary<string, R_TRIG>();
|
|
@@ -319,11 +320,20 @@ namespace EfemDualSchedulerLib
|
|
|
_lstCoolings.Add(_cooling2);
|
|
|
|
|
|
if (SC.GetValueOrDefault<bool>("System.SetUp.LP1.IsInstalled"))
|
|
|
+ {
|
|
|
_lstLps.Add(_lp1);
|
|
|
+ _checkNoCarrierByModule[_lp1.Module] = new R_TRIG();
|
|
|
+ }
|
|
|
if (SC.GetValueOrDefault<bool>("System.SetUp.LP2.IsInstalled"))
|
|
|
+ {
|
|
|
_lstLps.Add(_lp2);
|
|
|
+ _checkNoCarrierByModule[_lp2.Module] = new R_TRIG();
|
|
|
+ }
|
|
|
if (SC.GetValueOrDefault<bool>("System.SetUp.LP3.IsInstalled"))
|
|
|
+ {
|
|
|
_lstLps.Add(_lp3);
|
|
|
+ _checkNoCarrierByModule[_lp3.Module] = new R_TRIG();
|
|
|
+ }
|
|
|
_pmSwapWaitTimeOut.Clear();
|
|
|
_lstPms.ForEach(p=>_pmSwapWaitTimeOut[p.Module] = new Tuple<R_TRIG, DeviceTimer>(new R_TRIG(),new DeviceTimer()));
|
|
|
//临时办法,设备异常后进行reset,重新home后reset机械手task
|
|
@@ -2746,9 +2756,10 @@ namespace EfemDualSchedulerLib
|
|
|
if (!string.IsNullOrEmpty(cj.Module))
|
|
|
{
|
|
|
var lp = GetModule(cj.Module);
|
|
|
- if (CarrierManager.Instance.CheckNoCarrier(lp.Module, 0))
|
|
|
+ _checkNoCarrierByModule[lp.Module].CLK = CarrierManager.Instance.CheckNoCarrier(lp.Module, 0);
|
|
|
+ if (_checkNoCarrierByModule[lp.Module].Q)
|
|
|
{
|
|
|
- EV.PostAlarmLog("System", "Cassette removed while job not finished.");
|
|
|
+ EV.PostAlarmLog(lp.Module.ToString(), "Cassette removed while job not finished.");
|
|
|
|
|
|
//Singleton<RouteManager>.Instance.PostMsg(RouteManager.MSG.ERROR);
|
|
|
}
|
|
@@ -3585,9 +3596,11 @@ namespace EfemDualSchedulerLib
|
|
|
return;
|
|
|
|
|
|
int placeSlot = 1;
|
|
|
- if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot)
|
|
|
- && CheckCanPlaceWaferToPM(schedulerPm.Module, placeSlot, WaferManager.Instance.GetWafer(ModuleName.TMRobot, (int)placeBlade)))
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot))
|
|
|
{
|
|
|
+ if (!GetSameRecipeNameByHand(schedulerPm, placeSlot, out Hand newPlaceBlade))
|
|
|
+ return;
|
|
|
+ placeBlade = newPlaceBlade;
|
|
|
if (_PMA2Disabled)
|
|
|
return;
|
|
|
|
|
@@ -3609,10 +3622,11 @@ namespace EfemDualSchedulerLib
|
|
|
return;
|
|
|
|
|
|
int placeSlot = 0;
|
|
|
- if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot)
|
|
|
- && CheckCanPlaceWaferToPM(schedulerPm.Module, placeSlot, WaferManager.Instance.GetWafer(ModuleName.TMRobot, (int)placeBlade)))
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot))
|
|
|
{
|
|
|
-
|
|
|
+ if (!GetSameRecipeNameByHand(schedulerPm, placeSlot, out Hand newPlaceBlade))
|
|
|
+ return;
|
|
|
+ placeBlade = newPlaceBlade;
|
|
|
if (_PMA1Disabled)
|
|
|
return;
|
|
|
|
|
@@ -3729,9 +3743,11 @@ namespace EfemDualSchedulerLib
|
|
|
return;
|
|
|
|
|
|
int placeSlot = 1;
|
|
|
- if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot)
|
|
|
- && CheckCanPlaceWaferToPM(schedulerPm.Module, placeSlot, wafer))
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot))
|
|
|
{
|
|
|
+ if (!GetSameRecipeNameByHand(schedulerPm, placeSlot, out Hand newPlaceBlade))
|
|
|
+ return;
|
|
|
+ placeBlade = newPlaceBlade;
|
|
|
if (_PMB2Disabled)
|
|
|
return;
|
|
|
|
|
@@ -3753,10 +3769,11 @@ namespace EfemDualSchedulerLib
|
|
|
return;
|
|
|
|
|
|
int placeSlot = 0;
|
|
|
- if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot)
|
|
|
- && CheckCanPlaceWaferToPM(schedulerPm.Module, placeSlot, wafer))
|
|
|
+ if (WaferManager.Instance.CheckNoWafer(schedulerPm.Module, placeSlot))
|
|
|
{
|
|
|
-
|
|
|
+ if (!GetSameRecipeNameByHand(schedulerPm, placeSlot, out Hand newPlaceBlade))
|
|
|
+ return;
|
|
|
+ placeBlade = newPlaceBlade;
|
|
|
if (_PMB1Disabled)
|
|
|
return;
|
|
|
|
|
@@ -3777,6 +3794,24 @@ namespace EfemDualSchedulerLib
|
|
|
|
|
|
}
|
|
|
|
|
|
+ private bool GetSameRecipeNameByHand(SchedulerPM schedulerPm, int placeSlot, out Hand placeHand)
|
|
|
+ {
|
|
|
+ placeHand = Hand.Blade1;
|
|
|
+ if (_tmRobot.Blade1Enable && CheckHasWaferAndNeedProcess(Hand.Blade1) &&
|
|
|
+ CheckCanPlaceWaferToPM(schedulerPm.Module, placeSlot, WaferManager.Instance.GetWafer(ModuleName.TMRobot, (int)Hand.Blade1)))
|
|
|
+ {
|
|
|
+ placeHand = Hand.Blade1;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else if (_tmRobot.Blade2Enable && CheckHasWaferAndNeedProcess(Hand.Blade2) &&
|
|
|
+ CheckCanPlaceWaferToPM(schedulerPm.Module, placeSlot, WaferManager.Instance.GetWafer(ModuleName.TMRobot, (int)Hand.Blade2)))
|
|
|
+ {
|
|
|
+ placeHand = Hand.Blade2;
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
private void MonitorTmRobotPMAPickTask()
|
|
|
{
|
|
|
if (!_tmRobot.IsAvailable)
|