Browse Source

update check dumy use

jiangjy 1 month ago
parent
commit
cef6207452

+ 8 - 239
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -42,6 +42,7 @@ using DocumentFormat.OpenXml.Drawing.Charts;
 using MECF.Framework.Common.Utilities;
 using System.Threading;
 using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
+using System.Reflection;
 
 namespace FurnaceRT.Equipments.Jobs
 {
@@ -652,6 +653,7 @@ namespace FurnaceRT.Equipments.Jobs
                 return Result.FAIL;
             }
 
+
             foreach (var stocker in useStockers)
             {
                 if (CarrierManager.Instance.CheckHasCarrier($"{stocker.Item1}", 0) &&
@@ -660,6 +662,7 @@ namespace FurnaceRT.Equipments.Jobs
                     Singleton<EquipmentManager>.Instance.ChargeWaferJobStartFailedWarning.Set($"Carrier of {stocker.Item1} is not match stocker module name {CarrierManager.Instance.GetCarrier($"{stocker.Item1}", 0).InternalModuleName}");
                     return Result.FAIL;
                 }
+
             }
 
             _lstProcessJobs.Add(pj);
@@ -2886,6 +2889,7 @@ namespace FurnaceRT.Equipments.Jobs
                                 var wafers = WaferManager.Instance.GetWafers(target.Module);
                                 if (wafers != null && stockerInfo != null)
                                 {
+
                                     foreach (var wafer in wafers)
                                     {
                                         if (wafer == null || wafer.IsEmpty || wafer.ProcessState != EnumWaferProcessStatus.Idle)
@@ -5905,6 +5909,7 @@ namespace FurnaceRT.Equipments.Jobs
 
         #region dummy use 
 
+
         private bool CheckDummyWaferUse(ProcessJobInfo pj, ControlJobInfo cj)
         {
             var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
@@ -5917,246 +5922,10 @@ namespace FurnaceRT.Equipments.Jobs
 
                 if (wafers == null)
                     continue;
-
-                foreach (var wafer in wafers)
+                if (!pm.CheckDumyWafer(wafers))
                 {
-                    if (wafer.IsEmpty)
-                        continue;
-                    #region New
-                    var isScheduleMaintenance = SC.ContainsItem("System.EnableScheduleMaintenance") && SC.GetValue<bool>("System.EnableScheduleMaintenance");
-                    if (isScheduleMaintenance)
-                    {
-                        #region  SD Dummy 时间/次数/膜厚限制
-
-                        var maintenanceItemSDCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDCarrierUseFreq.ToString());
-                        var maintenanceItemSDWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferThickness.ToString());
-                        var maintenanceItemSDWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferUserTime.ToString());
-
-                        int SDCountWarning = (int)maintenanceItemSDCarrierUseFreq.StartValue;
-                        int SDCountAlarm = (int)maintenanceItemSDCarrierUseFreq.LimitValue;
-                        bool IsEnableSDWaferUseCountWarning = SDCountWarning > 0;
-
-
-                        int SDThicknessWarning = (int)maintenanceItemSDWaferThickness.StartValue;
-                        int SDThicknessAlarm = (int)maintenanceItemSDWaferThickness.LimitValue;
-                        bool IsEnableSDWaferThicknessWarning = SDThicknessWarning > 0;
-
-                        int SDTimeWarning = DateTimeUtil.GetSecond(maintenanceItemSDWaferUserTime.StartValue);
-                        int SDTimeAlarm = DateTimeUtil.GetSecond(maintenanceItemSDWaferUserTime.LimitValue);
-                        bool IsEnableSDWaferUseTimeWarning = SDTimeWarning > 0;
-                        if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount > SDCountWarning && wafer.UseCount < SDCountAlarm)
-                        {
-
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set, $"more than {SDCountWarning} 次"));
-
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseTimeWarning && wafer.UseTime > SDTimeWarning && wafer.UseTime < SDTimeAlarm)
-                        {
-                            DateTimeUtil.ConvertSecondsToHoursAndMinutes(SDTimeWarning, out var hours, out var minutes);
-
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min"));
-
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && IsEnableSDWaferThicknessWarning && wafer.UseThick > SDThicknessWarning && wafer.UseThick < SDThicknessAlarm)
-                        {
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set, $"more than {SDThicknessWarning} nm"));
-
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount >= SDCountAlarm)
-                        {
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set, $"more than {SDCountAlarm} 次"));
-
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseTimeWarning && wafer.UseTime >= SDTimeAlarm)
-                        {
-
-                            DateTimeUtil.ConvertSecondsToHoursAndMinutes(SDTimeAlarm, out var hours, out var minutes);
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}"));
-
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && IsEnableSDWaferThicknessWarning && wafer.UseThick >= SDThicknessAlarm)
-                        {
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set, $"more than {SDThicknessAlarm} nm"));
-
-                            return false;
-                        }
-                        #endregion
-
-                        #region ED
-                        var maintenanceItemEDCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDCarrierUseFreq.ToString());
-                        var maintenanceItemEDWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferThickness.ToString());
-                        var maintenanceItemEDWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferUserTime.ToString());
-
-                        int EDCountWarning = (int)maintenanceItemEDCarrierUseFreq.StartValue;
-                        int EDCountAlarm = (int)maintenanceItemEDCarrierUseFreq.LimitValue;
-                        bool IsEnableEDWaferUseCountWarning = EDCountWarning > 0;
-
-
-                        int EDThicknessWarning = (int)maintenanceItemEDWaferThickness.StartValue;
-                        int EDThicknessAlarm = (int)maintenanceItemEDWaferThickness.LimitValue;
-                        bool IsEnableEDWaferThicknessWarning = EDThicknessWarning > 0;
-
-                        int EDTimeWarning = DateTimeUtil.GetSecond(maintenanceItemEDWaferUserTime.StartValue);
-                        int EDTimeAlarm = DateTimeUtil.GetSecond(maintenanceItemEDWaferUserTime.LimitValue);
-                        bool IsEnableEDWaferUseTimeWarning = EDTimeWarning > 0;
-                        if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseCountWarning && maintenanceItemEDCarrierUseFreq.CurrentValue > EDCountWarning && wafer.UseCount < EDCountAlarm)
-                        {
-                            //Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set, $"more than {EDCountWarning} 次");
-                            //return false;
-                            pm.MaintenanceProcessingCommandExec(
-                                maintenanceItemEDCarrierUseFreq.MaintenanceProcessing,
-                                new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set, $"more than {EDCountWarning} 次")
-                                );
-
-
-                            //if (Enum.TryParse<MaintenanceProcessingCommandEnum>(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, out var command))
-                            //{
-                            //    switch (command)
-                            //    {
-                            //        case MaintenanceProcessingCommandEnum.None:
-                            //            break;
-                            //        case MaintenanceProcessingCommandEnum.AlarmReport:
-                            //            Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set($"more than {EDCountWarning} 次");
-                            //            break;
-                            //        case MaintenanceProcessingCommandEnum.JobProhibition:
-                            //            break;
-                            //        case MaintenanceProcessingCommandEnum.JobManualStart:
-                            //            break;
-                            //        case MaintenanceProcessingCommandEnum.JobAutoStart:
-
-                            //            Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set($"more than {EDCountWarning} 次");
-                            //            Singleton<EquipmentManager>.Instance.CheckToPostMessage((int)EquipmentManager.MSG.JobAutoStart, cj.Name);
-                            //            var pmModule = Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule;
-                            //            if (pmModule != null)
-                            //                pmModule.Process(maintenanceItemEDCarrierUseFreq.AssociationProcessRecipeName, false, true, out string reson);
-
-                            //            return false;
-
-                            //    }
-                            //}
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseTimeWarning && wafer.UseTime > EDTimeWarning && wafer.UseTime < EDTimeAlarm)
-                        {
-                            DateTimeUtil.ConvertSecondsToHoursAndMinutes(EDTimeWarning, out var hours, out var minutes);
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min"));
-
-
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && IsEnableEDWaferThicknessWarning && wafer.UseThick > EDThicknessWarning && wafer.UseThick < EDThicknessAlarm)
-                        {
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set, $"more than {EDThicknessWarning} nm"));
-
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseCountWarning && wafer.UseCount >= EDCountAlarm)
-                        {
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountAlarm.Set, $"more than {EDCountAlarm} 次"));
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseTimeWarning && wafer.UseTime >= EDTimeAlarm)
-                        {
-                            DateTimeUtil.ConvertSecondsToHoursAndMinutes(EDTimeAlarm, out var hours, out var minutes);
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}"));
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && IsEnableEDWaferThicknessWarning && wafer.UseThick >= EDThicknessAlarm)
-                        {
-                            pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set, $"more than {EDThicknessAlarm} nm"));
-                            return false;
-                        }
-                        #endregion
-                    }
-                    else
-                    {
-                        // SD Dummy
-                        if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseCountWarning") && wafer.UseCount > SC.GetValue<int>($"PM1.WaferCycleTime.SDCountWarning") && wafer.UseCount < SC.GetValue<int>($"PM1.WaferCycleTime.SDCountAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.SDCountWarning")} 次");
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseTimeWarning") && wafer.UseTime / 3600 > SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeWarning") && wafer.UseTime / 3600 < SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeWarning")} hour");
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferThicknessWarning") && wafer.UseThick > SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessWarning") && wafer.UseThick < SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessWarning")} nm");
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseCountWarning") && wafer.UseCount >= SC.GetValue<int>($"PM1.WaferCycleTime.SDCountAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.SDCountAlarm")} 次");
-
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseTimeWarning") && wafer.UseTime / 3600 >= SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeAlarm")} hour");
-
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferThicknessWarning") && wafer.UseThick >= SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessAlarm")} nm");
-
-                            return false;
-                        }
-
-                        // Extra Dummy
-                        if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseCountWarning") && wafer.UseCount > SC.GetValue<int>($"PM1.WaferCycleTime.EDCountWarning") && wafer.UseCount < SC.GetValue<int>($"PM1.WaferCycleTime.EDCountAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.EDCountWarning")} 次");
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseTimeWarning") && wafer.UseTime / 3600 > SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeWarning") && wafer.UseTime / 3600 < SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeWarning")} hour");
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferThicknessWarning") && wafer.UseThick > SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessWarning") && wafer.UseThick < SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessWarning")} nm");
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseCountWarning") && wafer.UseCount >= SC.GetValue<int>($"PM1.WaferCycleTime.EDCountAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountAlarm.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.EDCountAlarm")} 次");
-
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseTimeWarning") && wafer.UseTime / 3600 >= SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeAlarm")} hour");
-
-                            return false;
-                        }
-
-                        if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferThicknessWarning") && wafer.UseThick >= SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessAlarm"))
-                        {
-                            Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessAlarm")} nm");
-
-                            return false;
-                        }
-
-                    }
-                    #endregion
-
-                }
+                    return false;
+                };
             }
 
             return true;

+ 216 - 0
Furnace/FurnaceRT/Equipments/PMs/PMMethods.cs

@@ -1,4 +1,5 @@
 using Aitex.Common.Util;
+using Aitex.Core.Common;
 using Aitex.Core.Common.DeviceData;
 using Aitex.Core.RT.DataCenter;
 using Aitex.Core.RT.DBCore;
@@ -430,6 +431,221 @@ namespace FurnaceRT.Equipments.PMs
             }
             return result;
         }
+
+        public bool CheckDumyWafer(WaferInfo[] wafers)
+        {
+            var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
+            foreach (var wafer in wafers)
+            {
+                if (wafer==null||wafer.IsEmpty || (wafer.WaferType != WaferType.SD && wafer.WaferType != WaferType.ED))
+                    continue;
+                #region New
+                var isScheduleMaintenance = SC.ContainsItem("System.EnableScheduleMaintenance") && SC.GetValue<bool>("System.EnableScheduleMaintenance");
+                if (isScheduleMaintenance)
+                {
+                    #region  SD Dummy 时间/次数/膜厚限制
+
+                    var maintenanceItemSDCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDCarrierUseFreq.ToString());
+                    var maintenanceItemSDWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferThickness.ToString());
+                    var maintenanceItemSDWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.SDWaferUserTime.ToString());
+
+                    int SDCountWarning = (int)maintenanceItemSDCarrierUseFreq.StartValue;
+                    int SDCountAlarm = (int)maintenanceItemSDCarrierUseFreq.LimitValue;
+                    bool IsEnableSDWaferUseCountWarning = SDCountWarning > 0;
+
+
+                    int SDThicknessWarning = (int)maintenanceItemSDWaferThickness.StartValue;
+                    int SDThicknessAlarm = (int)maintenanceItemSDWaferThickness.LimitValue;
+                    bool IsEnableSDWaferThicknessWarning = SDThicknessWarning > 0;
+
+                    int SDTimeWarning = DateTimeUtil.GetSecond(maintenanceItemSDWaferUserTime.StartValue);
+                    int SDTimeAlarm = DateTimeUtil.GetSecond(maintenanceItemSDWaferUserTime.LimitValue);
+                    bool IsEnableSDWaferUseTimeWarning = SDTimeWarning > 0;
+                    if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount > SDCountWarning && wafer.UseCount < SDCountAlarm)
+                    {
+
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set, $"more than {SDCountWarning} 次"));
+
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseTimeWarning && wafer.UseTime > SDTimeWarning && wafer.UseTime < SDTimeAlarm)
+                    {
+                        DateTimeUtil.ConvertSecondsToHoursAndMinutes(SDTimeWarning, out var hours, out var minutes);
+
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min"));
+
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && IsEnableSDWaferThicknessWarning && wafer.UseThick > SDThicknessWarning && wafer.UseThick < SDThicknessAlarm)
+                    {
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set, $"more than {SDThicknessWarning} nm"));
+
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount >= SDCountAlarm)
+                    {
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set, $"more than {SDCountAlarm} 次"));
+
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseTimeWarning && wafer.UseTime >= SDTimeAlarm)
+                    {
+
+                        DateTimeUtil.ConvertSecondsToHoursAndMinutes(SDTimeAlarm, out var hours, out var minutes);
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}"));
+
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && IsEnableSDWaferThicknessWarning && wafer.UseThick >= SDThicknessAlarm)
+                    {
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set, $"more than {SDThicknessAlarm} nm"));
+
+                        return false;
+                    }
+                    #endregion
+
+                    #region ED
+                    var maintenanceItemEDCarrierUseFreq = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDCarrierUseFreq.ToString());
+                    var maintenanceItemEDWaferThickness = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferThickness.ToString());
+                    var maintenanceItemEDWaferUserTime = ScheduleMaintenanceDataManager.Instance.GetItem(MaintenanceItemEnum.FDWaferUserTime.ToString());
+
+                    int EDCountWarning = (int)maintenanceItemEDCarrierUseFreq.StartValue;
+                    int EDCountAlarm = (int)maintenanceItemEDCarrierUseFreq.LimitValue;
+                    bool IsEnableEDWaferUseCountWarning = EDCountWarning > 0;
+
+
+                    int EDThicknessWarning = (int)maintenanceItemEDWaferThickness.StartValue;
+                    int EDThicknessAlarm = (int)maintenanceItemEDWaferThickness.LimitValue;
+                    bool IsEnableEDWaferThicknessWarning = EDThicknessWarning > 0;
+
+                    int EDTimeWarning = DateTimeUtil.GetSecond(maintenanceItemEDWaferUserTime.StartValue);
+                    int EDTimeAlarm = DateTimeUtil.GetSecond(maintenanceItemEDWaferUserTime.LimitValue);
+                    bool IsEnableEDWaferUseTimeWarning = EDTimeWarning > 0;
+                    if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseCountWarning && maintenanceItemEDCarrierUseFreq.CurrentValue > EDCountWarning && wafer.UseCount < EDCountAlarm)
+                    {
+                        pm.MaintenanceProcessingCommandExec(
+                            maintenanceItemEDCarrierUseFreq.MaintenanceProcessing,
+                            new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set, $"more than {EDCountWarning} 次")
+                            );
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseTimeWarning && wafer.UseTime > EDTimeWarning && wafer.UseTime < EDTimeAlarm)
+                    {
+                        DateTimeUtil.ConvertSecondsToHoursAndMinutes(EDTimeWarning, out var hours, out var minutes);
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min"));
+
+
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && IsEnableEDWaferThicknessWarning && wafer.UseThick > EDThicknessWarning && wafer.UseThick < EDThicknessAlarm)
+                    {
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set, $"more than {EDThicknessWarning} nm"));
+
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseCountWarning && wafer.UseCount >= EDCountAlarm)
+                    {
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountAlarm.Set, $"more than {EDCountAlarm} 次"));
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseTimeWarning && wafer.UseTime >= EDTimeAlarm)
+                    {
+                        DateTimeUtil.ConvertSecondsToHoursAndMinutes(EDTimeAlarm, out var hours, out var minutes);
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {minutes}"));
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && IsEnableEDWaferThicknessWarning && wafer.UseThick >= EDThicknessAlarm)
+                    {
+                        pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set, $"more than {EDThicknessAlarm} nm"));
+                        return false;
+                    }
+                    #endregion
+                }
+                else
+                {
+                    // SD Dummy
+                    if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseCountWarning") && wafer.UseCount > SC.GetValue<int>($"PM1.WaferCycleTime.SDCountWarning") && wafer.UseCount < SC.GetValue<int>($"PM1.WaferCycleTime.SDCountAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.SDCountWarning")} 次");
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseTimeWarning") && wafer.UseTime / 3600 > SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeWarning") && wafer.UseTime / 3600 < SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeWarning")} hour");
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferThicknessWarning") && wafer.UseThick > SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessWarning") && wafer.UseThick < SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessWarning")} nm");
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseCountWarning") && wafer.UseCount >= SC.GetValue<int>($"PM1.WaferCycleTime.SDCountAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.SDCountAlarm")} 次");
+
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferUseTimeWarning") && wafer.UseTime / 3600 >= SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDTimeAlarm")} hour");
+
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.SD && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableSDWaferThicknessWarning") && wafer.UseThick >= SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.SDThicknessAlarm")} nm");
+
+                        return false;
+                    }
+
+                    // Extra Dummy
+                    if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseCountWarning") && wafer.UseCount > SC.GetValue<int>($"PM1.WaferCycleTime.EDCountWarning") && wafer.UseCount < SC.GetValue<int>($"PM1.WaferCycleTime.EDCountAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.EDCountWarning")} 次");
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseTimeWarning") && wafer.UseTime / 3600 > SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeWarning") && wafer.UseTime / 3600 < SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeWarning")} hour");
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferThicknessWarning") && wafer.UseThick > SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessWarning") && wafer.UseThick < SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessWarning")} nm");
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseCountWarning") && wafer.UseCount >= SC.GetValue<int>($"PM1.WaferCycleTime.EDCountAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountAlarm.Set($"more than {SC.GetValue<int>($"PM1.WaferCycleTime.EDCountAlarm")} 次");
+
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferUseTimeWarning") && wafer.UseTime / 3600 >= SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDTimeAlarm")} hour");
+
+                        return false;
+                    }
+
+                    if (wafer.WaferType == WaferType.ED && SC.GetValue<bool>($"PM1.WaferCycleTime.IsEnableEDWaferThicknessWarning") && wafer.UseThick >= SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessAlarm"))
+                    {
+                        Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set($"more than {SC.GetValue<double>($"PM1.WaferCycleTime.EDThicknessAlarm")} nm");
+
+                        return false;
+                    }
+
+                }
+                #endregion
+            }
+            return true;
+        }
     }
 
     public enum BackUpDireEnum

+ 19 - 0
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/PreProcess.cs

@@ -6,6 +6,8 @@ using FurnaceRT.Equipments.PMs.Routines;
 using System.Collections.Generic;
 using FurnaceRT.Equipments.Systems;
 using Aitex.Core.Util;
+using MECF.Framework.Common.SubstrateTrackings;
+using System.Linq;
 
 namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 {
@@ -43,9 +45,13 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
             Dictionary<int, List<RecipeStep>> subRecipe;
             Dictionary<int, string> subRecipeName;
             string reason = string.Empty;
+
+
             if (_isProcessRecipe)
             {
 
+                
+            
 
                 if (!RecipeParser.Parse(_recipeName, Module, out recipeHead, out recipeSteps, out reason, "Process"))
                 {
@@ -54,6 +60,9 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
                 }
 
                 #region MyRegion
+
+            
+
                 var isScheduleMaintenance = SC.ContainsItem("System.EnableScheduleMaintenance") && SC.GetValue<bool>("System.EnableScheduleMaintenance");
                 if (isScheduleMaintenance)
                 {
@@ -62,6 +71,16 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 
                     pm.GetAllDBRecord();
 
+                    var wafers = WaferManager.Instance.GetWafers(ModuleName.PM1);
+                    if (wafers != null && wafers.Count() > 0)
+                    {
+                        if (!pm.CheckDumyWafer(wafers))
+                        {
+                            return Result.FAIL;
+                        };
+                    }
+
+
                     pm.CheckRecipeThicknessMoreThan(_recipeName, out var isPause);
                     if (isPause)
                         return Result.FAIL;