Browse Source

AlarmReport的触发

git-svn-id: http://10.4.3.168:50001/svn/Furnace@122 dbcde07d-dcf5-c148-8a84-ac3097b7778e
Jiangjinyuan 1 month ago
parent
commit
29d2758bc0

+ 17 - 0
FrameworkLocal/Common/CommonData/EnumData/MaintenanceProcessingCommandEnum.cs

@@ -9,6 +9,23 @@ using System.Threading.Tasks;
 
 namespace MECF.Framework.Common.CommonData.EnumData
 {
+    public class AlarmReportItem
+    {
+        private Action<string> _alarmReportExec;
+        private string _message;
+
+        public AlarmReportItem(Action<string> action, string msg)
+        {
+            _alarmReportExec = action;
+            _message = msg;
+        }
+
+        public void Exec()
+        {
+            _alarmReportExec?.Invoke(_message);
+        }
+    }
+
     public enum MaintenanceProcessingCommandEnum
     {
         None = 0,

+ 43 - 0
FrameworkLocal/UIClient/Converter/SecondsToHourMinConverter.cs

@@ -0,0 +1,43 @@
+using ExtendedGrid.Microsoft.Windows.Controls;
+using SciChart.Core.Extensions;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
+using System.Runtime.Remoting.Metadata.W3cXsd2001;
+using System.Text;
+using System.Threading.Tasks;
+using System.Windows.Data;
+
+namespace MECF.Framework.UI.Client.Converter
+{
+
+    public class SecondsToHourMinConverter : IValueConverter
+    {
+        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
+        {
+            if (value == null)
+                return "";
+
+            if (value.ToString() is string stringValue)
+            {
+                if (double.TryParse(stringValue, out double totalSeconds))
+                {
+                    var secondAll = Math.Round(totalSeconds, 1, MidpointRounding.AwayFromZero);
+                    // 将总秒数转换为时间跨度
+                    TimeSpan timeSpan = TimeSpan.FromSeconds(secondAll);
+
+                    // 格式化为 HH:mm:ss
+                    string formattedTime = $"{timeSpan.Hours:D2}:{timeSpan.Minutes:D2}:{timeSpan.Seconds:D2}.{timeSpan.Milliseconds / 10:D2}";
+                    return formattedTime;
+                }
+            }
+            return value;
+        }
+
+        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
+        {
+            throw new NotImplementedException();
+        }
+    }
+}

+ 1 - 0
FrameworkLocal/UIClient/UIClient.csproj

@@ -625,6 +625,7 @@
     <Compile Include="Converter\CheckAccessModeConverter.cs" />
     <Compile Include="Converter\FileNameConverter.cs" />
     <Compile Include="Converter\MultiLineXAxisLabelProvider.cs" />
+    <Compile Include="Converter\SecondsToHourMinConverter.cs" />
     <Compile Include="Core\Container\CachedTypeInfo.cs" />
     <Compile Include="Core\Container\ConstructorCache.cs" />
     <Compile Include="Core\Container\IContainer.cs" />

+ 8 - 0
Furnace/FurnaceRT/Config/FurnaceGemModel.xml

@@ -10822,6 +10822,14 @@
     <ALID id="10010032" logicalName="System.SetLotIDFailedWarning" description="Set lotID failed " category="EquipmentStatusWarning" enabled="false" eventSet="110010032" eventClear="210010032" />
     <ALID id="10010033" logicalName="System.TransferJobStartFailedWarning" description="Transfer job start failed " category="EquipmentStatusWarning" enabled="false" eventSet="110010033" eventClear="210010033" />
     <ALID id="10010034" logicalName="System.UnloadCassetteJobStartFailedWarning" description="UnloadCassette job start failed " category="EquipmentStatusWarning" enabled="false" eventSet="110010034" eventClear="210010034" />
+    <ALID id="10010035" logicalName="System.RecipeExecuteFreqAlarm" description="Recipe Exec Fre more then " category="EquipmentStatusWarning" enabled="false" eventSet="110010035" eventClear="210010035" />
+    <ALID id="10010036" logicalName="System.RecipeExecuteFreqWarning" description="Recipe Exec Fre more then " category="EquipmentStatusWarning" enabled="false" eventSet="110010036" eventClear="210010036" />
+    <ALID id="10010037" logicalName="System.ReatorStepRunFreqAlarm" description="Recipe Step Run Freq Alarm" category="EquipmentStatusWarning" enabled="false" eventSet="110010037" eventClear="210010037" />
+    <ALID id="10010038" logicalName="System.ReatorStepRunFreqWarning" description="Recipe Step Run Freq Warning" category="EquipmentStatusWarning" enabled="false" eventSet="110010038" eventClear="210010038" />
+    <ALID id="10010039" logicalName="System.ReatorStepThicknessAlarm" description="Recipe Step Run Thickness Alarm" category="EquipmentStatusWarning" enabled="false" eventSet="110010039" eventClear="210010039" />
+    <ALID id="10010040" logicalName="System.ReatorStepThicknessWarning" description="Recipe Step Run Thickness Warning" category="EquipmentStatusWarning" enabled="false" eventSet="110010040" eventClear="210010040" />
+    <ALID id="10010041" logicalName="System.RecipeThicknessAlarm" description="Recipe Thickness Alarm" category="EquipmentStatusWarning" enabled="false" eventSet="110010041" eventClear="210010041" />
+    <ALID id="10010042" logicalName="System.RecipeThicknessWarning" description="Recipe Thickness Warning " category="EquipmentStatusWarning" enabled="false" eventSet="110010042" eventClear="210010042" />
     <ALID id="10020001" logicalName="System.CHM.CommunicationError" description="Can not Communication " category="EquipmentStatusWarning" enabled="false" eventSet="110020001" eventClear="210020001" />
     <ALID id="10020002" logicalName="System.CHM.ConnectionError" description="Can not connect with " category="EquipmentStatusWarning" enabled="false" eventSet="110020002" eventClear="210020002" />
     <ALID id="10030001" logicalName="System.GasLine1.CommunicationError" description="Can not Communication " category="EquipmentStatusWarning" enabled="false" eventSet="110030001" eventClear="210030001" />

File diff suppressed because it is too large
+ 1 - 1
Furnace/FurnaceRT/Config/VIDs/_ALID.xml


+ 54 - 36
Furnace/FurnaceRT/Equipments/Jobs/AutoTransfer.cs

@@ -5907,6 +5907,7 @@ namespace FurnaceRT.Equipments.Jobs
 
         private bool CheckDummyWaferUse(ProcessJobInfo pj, ControlJobInfo cj)
         {
+            var pm = (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule);
             foreach (var module in Singleton<EquipmentManager>.Instance.Modules.Keys)
             {
                 if (!ModuleHelper.IsStocker(module) || !pj.Stockers.Any(x => x.Item1 == module.ToString()))
@@ -5945,23 +5946,29 @@ namespace FurnaceRT.Equipments.Jobs
                         bool IsEnableSDWaferUseTimeWarning = SDTimeWarning > 0;
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount > SDCountWarning && wafer.UseCount < SDCountAlarm)
                         {
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountWarning.Set, $"more than {SDCountWarning} 次");
+
+                            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);
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min");
+
+                            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)
                         {
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set, $"more than {SDThicknessWarning} nm");
+                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessWarning.Set, $"more than {SDThicknessWarning} nm"));
+
                         }
 
                         if (wafer.WaferType == WaferType.SD && IsEnableSDWaferUseCountWarning && wafer.UseCount >= SDCountAlarm)
                         {
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set, $"more than {SDCountAlarm} 次");
+                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDCarrierUseFreq.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeUseCountAlarm.Set, $"more than {SDCountAlarm} 次"));
+
                             return false;
                         }
 
@@ -5969,13 +5976,15 @@ namespace FurnaceRT.Equipments.Jobs
                         {
 
                             DateTimeUtil.ConvertSecondsToHoursAndMinutes(SDTimeAlarm, out var hours, out var minutes);
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {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)
                         {
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set, $"more than {SDThicknessAlarm} nm");
+                            pm.MaintenanceProcessingCommandExec(maintenanceItemSDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.SDWaferTypeThicknessAlarm.Set, $"more than {SDThicknessAlarm} nm"));
+
                             return false;
                         }
                         #endregion
@@ -6001,60 +6010,69 @@ namespace FurnaceRT.Equipments.Jobs
                         {
                             //Singleton<ScheduleMaintenanceDataManager>.Instance.MaintenanceProcessingCommandExec(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountWarning.Set, $"more than {EDCountWarning} 次");
                             //return false;
-                            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;
-
-                                }
-                            }
+                            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);
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeWarning.Set, $"more than {hours} hour {minutes} min");
+                            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)
                         {
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set, $"more than {EDThicknessWarning} nm");
+                            pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessWarning.Set, $"more than {EDThicknessWarning} nm"));
+
                         }
 
                         if (wafer.WaferType == WaferType.ED && IsEnableEDWaferUseCountWarning && wafer.UseCount >= EDCountAlarm)
                         {
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDCarrierUseFreq.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseCountAlarm.Set, $"more than {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);
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferUserTime.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeUseTimeAlarm.Set, $"more than {hours} hour {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)
                         {
-                            (Singleton<EquipmentManager>.Instance.Modules[ModuleName.PM1] as PMModule).MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set, $"more than {EDThicknessAlarm} nm");
+                            pm.MaintenanceProcessingCommandExec(maintenanceItemEDWaferThickness.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.EDWaferTypeThicknessAlarm.Set, $"more than {EDThicknessAlarm} nm"));
                             return false;
                         }
                         #endregion

+ 5 - 1
Furnace/FurnaceRT/Equipments/PMs/PMModule.cs

@@ -960,7 +960,11 @@ namespace FurnaceRT.Equipments.PMs
             if (ret == Result.FAIL || ret == Result.DONE)
                 return false;
 
-            UpdateRecipeFre(_recipeRunningInfo.RecipeName);
+            UpdateRecipeFre(_recipeRunningInfo.RecipeName,out bool result);
+            if (!result)
+            {
+                return false;
+            }
 
             if (!IsJobProcess)
                 SensorPROCManualOK.Value = true;

+ 75 - 23
Furnace/FurnaceRT/Equipments/PMs/PMScheduleMaintenance.cs

@@ -8,12 +8,14 @@ using Aitex.Core.RT.OperationCenter;
 using Aitex.Core.RT.SCCore;
 using Aitex.Core.Util;
 using DocumentFormat.OpenXml.VariantTypes;
+using FurnaceRT.Equipments.Systems;
 using MECF.Framework.Common.CommonData.EnumData;
 using MECF.Framework.Common.DataCenter;
 using MECF.Framework.Common.Equipment;
 using MECF.Framework.Common.Event;
 using MECF.Framework.Common.OperationCenter;
 using MECF.Framework.Common.Utilities;
+using MECF.Framework.RT.EquipmentLibrary.HardwareUnits.PMs;
 using System;
 using System.Collections;
 using System.Collections.Generic;
@@ -84,7 +86,7 @@ namespace FurnaceRT.Equipments.PMs
 
         }
 
-        public void MaintenanceProcessingCommandExec(string maintenanceProcessing, Action<string> alarmReportExec, string warningMessage)
+        public void MaintenanceProcessingCommandExec(string maintenanceProcessing, AlarmReportItem alarmReportItem)
         {
             if (Enum.TryParse<MaintenanceProcessingCommandEnum>(maintenanceProcessing, out var command))
             {
@@ -93,7 +95,7 @@ namespace FurnaceRT.Equipments.PMs
                     case MaintenanceProcessingCommandEnum.None:
                         break;
                     case MaintenanceProcessingCommandEnum.AlarmReport:
-                        alarmReportExec(warningMessage);
+                        alarmReportItem?.Exec();
                         break;
                     case MaintenanceProcessingCommandEnum.JobProhibition:
                         break;
@@ -174,12 +176,22 @@ namespace FurnaceRT.Equipments.PMs
                 .Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepThickness}")
                 .Where(a => a.AdditionInformationDisplaySupplement.Split(',').Contains(stepNo))
                 .ToList();
-            if (list != null && list.Count > 0)
+            if (list == null || list.Count == 0)
+                return;
+
+            foreach (var item in list)
             {
-                foreach (var item in list)
-                {
-                    Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, thickness);
-                }
+                if (item == null)
+                    continue;
+                Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, thickness);
+
+
+                if (item.CurrentValue > item.StartValue && item.CurrentValue < item.LimitValue)
+                    MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.ReatorStepThicknessWarning.Set, $"more than {item.StartValue} Å"));
+
+                if (item.CurrentValue >= item.LimitValue)
+                    MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.ReatorStepThicknessAlarm.Set, $"more than {item.LimitValue} Å"));
+
             }
         }
         /// <summary>
@@ -192,13 +204,20 @@ namespace FurnaceRT.Equipments.PMs
                 return;
             var stepNo = stepName.Split(':').FirstOrDefault();
             var list = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepRunTime}" && a.AdditionInformationDisplay == stepNo).ToList();
-            if (list != null && list.Count > 0)
+            if (list == null || list.Count == 0)
+                return;
+            foreach (var item in list)
             {
-                foreach (var item in list)
-                {
-                    Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, (float)stepTime);
-                }
+                if (item == null)
+                    continue;
+           //     var data=Math.Round(stepTime, 1, MidpointRounding.AwayFromZero);
+
+                Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, (float)stepTime);
+
+
+
             }
+
         }
         /// <summary>
         /// 根据RecipeStep统计 Step执行 累计次数
@@ -210,43 +229,76 @@ namespace FurnaceRT.Equipments.PMs
                 return;
             var stepNo = stepName.Split(':').FirstOrDefault();
             var list = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.StepRunFreq}" && a.AdditionInformationDisplay == stepNo).ToList();
-            if (list != null && list.Count > 0)
+            if (list == null || list.Count == 0)
+                return;
+            foreach (var item in list)
             {
-                foreach (var item in list)
-                {
-                    Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item);
-                }
+                if (item == null)
+                    continue;
+                Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item);
+
+
+                if (item.CurrentValue > item.StartValue && item.CurrentValue < item.LimitValue)
+                    MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.ReatorStepRunFreqWarning.Set, $"more than {item.StartValue} times"));
+
+                if (item.CurrentValue >= item.LimitValue)
+                    MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.ReatorStepRunFreqAlarm.Set, $"more than {item.LimitValue} times"));
+
             }
+
         }
         /// <summary>
         /// 根据RecipeName统计 Recipe执行 累计次数
         /// </summary>
         /// <param name="processRecipeName"></param>
-        public void UpdateRecipeFre(string recipeName)
+        public void UpdateRecipeFre(string recipeName, out bool result)
         {
+            result = true;
+
             if (string.IsNullOrEmpty(recipeName))
                 return;
             var item = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Item == MaintenanceItemEnum.RecipeExecuteFreq.ToString() && a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.Recipe}" && a.AdditionInformationDisplay == recipeName).FirstOrDefault();
-            if (item != null && item.Item == MaintenanceItemEnum.RecipeExecuteFreq.ToString())
+            if (item == null)
+                return;
+
+            if (item.CurrentValue > item.StartValue && item.CurrentValue < item.LimitValue)
+                MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.RecipeExecuteFreqWarning.Set, $"more than {item.StartValue} times"));
+
+            if (item.CurrentValue >= item.LimitValue)
             {
-                Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item);
+                MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.RecipeExecuteFreqAlarm.Set, $"more than {item.LimitValue} times"));
+                result = false;
+                return;
             }
+
+            if (item != null && item.Item == MaintenanceItemEnum.RecipeExecuteFreq.ToString())
+                Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item);
+
+
         }
         /// <summary>
         /// 根据RecipeName统计累计膜厚
         /// </summary>
         /// <param name="recipeName"></param>
         /// <param name="thickness"></param>
-        public void UpdateRecipeTotalThickness(string recipeName, float thickness)
+        public void UpdateRecipeThickness(string recipeName, float thickness)
         {
             if (string.IsNullOrEmpty(recipeName) || thickness <= 0)
                 return;
             var item = Singleton<ScheduleMaintenanceDataManager>.Instance.Item.Values.Where(a => a.Item == MaintenanceItemEnum.RecipeThickness.ToString() && a.Path == $"{DataItemEnum.Reactor}.{ReactorsEnum.Recipe}" && a.AdditionInformationDisplay == recipeName).FirstOrDefault();
 
+            if (item == null)
+                return;
+
             if (item != null && item.Item == MaintenanceItemEnum.RecipeThickness.ToString())
-            {
                 Singleton<ScheduleMaintenanceDataManager>.Instance.Increase(item.Item, thickness);
-            }
+
+            if (item.CurrentValue > item.StartValue && item.CurrentValue < item.LimitValue)
+                MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.RecipeThicknessWarning.Set, $"more than {item.StartValue} Å"));
+
+            if (item.CurrentValue >= item.LimitValue)
+                MaintenanceProcessingCommandExec(item.MaintenanceProcessing, new AlarmReportItem(Singleton<EquipmentManager>.Instance.RecipeThicknessAlarm.Set, $"more than {item.LimitValue} Å"));
+
 
         }
 

+ 2 - 1
Furnace/FurnaceRT/Equipments/PMs/RecipeExecutions/Process.cs

@@ -755,7 +755,8 @@ namespace FurnaceRT.Equipments.PMs.RecipeExecutions
 
                                         WaferManager.Instance.UpdateWaferStatistics(ModuleHelper.Converter(Module), i, useCount, useTime, useThick);
                                     }
-                                    PMModule.UpdateRecipeTotalThickness(PMModule.RecipeRunningInfo.RecipeName, thickness);
+                                
+                                    PMModule.UpdateRecipeThickness(PMModule.RecipeRunningInfo.RecipeName, thickness);
                                     PMModule.UpdateRecipeStepFre(stepName);
                                     PMModule.UpdateRecipeStepRunTime(stepName, stepTime);
                                     PMModule.UpdateRecipeStepGroupThickness(stepName, thickness);

+ 107 - 0
Furnace/FurnaceRT/Equipments/Systems/EquipmentManagerAlarmDefine.cs

@@ -40,6 +40,21 @@ namespace FurnaceRT.Equipments.Systems
         public AlarmEventItem EDWaferTypeThicknessAlarm { get; set; }
         public AlarmEventItem EquipmentEmergencyStopAlarm { get; set; }
         public AlarmEventItem TransferJobStartFailedWarning { get; set; }
+
+        #region MyRegion
+        public AlarmEventItem RecipeExecuteFreqAlarm { get; set; }
+        public AlarmEventItem RecipeExecuteFreqWarning { get; set; }
+
+        public AlarmEventItem RecipeThicknessAlarm { get; set; }
+        public AlarmEventItem RecipeThicknessWarning { get; set; }
+
+        public AlarmEventItem ReatorStepRunFreqWarning { get; set; }
+        public AlarmEventItem ReatorStepRunFreqAlarm { get; set; }
+
+        public AlarmEventItem ReatorStepThicknessAlarm { get; set; }
+        public AlarmEventItem ReatorStepThicknessWarning { get; set; }
+        #endregion
+
         private void InitAlarmDefine()
         {
             PLCDisconnectAlarm = SubscribeAlarm(new AlarmEventItem()
@@ -294,6 +309,98 @@ namespace FurnaceRT.Equipments.Systems
                 Category = "SystemAlarm",
             }, () => { return true; });
 
+            RecipeExecuteFreqWarning = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.RecipeExecuteFreqWarning",
+                Description = $"Recipe Exec Fre more then ",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Warning,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+            RecipeExecuteFreqAlarm = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.RecipeExecuteFreqAlarm",
+                Description = $"Recipe Exec Fre more then ",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Alarm,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+
+            RecipeThicknessWarning = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.RecipeThicknessWarning",
+                Description = $"Recipe Thickness Warning ",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Warning,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+            RecipeThicknessAlarm = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.RecipeThicknessAlarm",
+                Description = $"Recipe Thickness Alarm",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Alarm,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+
+
+            ReatorStepRunFreqWarning = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.ReatorStepRunFreqWarning",
+                Description = $"Recipe Step Run Freq Warning",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Warning,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+            ReatorStepRunFreqAlarm = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.ReatorStepRunFreqAlarm",
+                Description = $"Recipe Step Run Freq Alarm",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Alarm,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+            ReatorStepThicknessWarning = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.ReatorStepThicknessWarning",
+                Description = $"Recipe Step Run Thickness Warning",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Warning,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+            ReatorStepThicknessAlarm = SubscribeAlarm(new AlarmEventItem()
+            {
+                EventEnum = $"{Name}.ReatorStepThicknessAlarm",
+                Description = $"Recipe Step Run Thickness Alarm",
+                Solution = "No information available. Press[Clear] to delete alarm message.",
+                Explaination = "No information available.",
+                AutoRecovery = false,
+                Level = EventLevel.Alarm,
+                Action = EventAction.Clear,
+                Category = "SystemAlarm",
+            }, () => { return true; });
+
             SDWaferTypeUseTimeAlarm = SubscribeAlarm(new AlarmEventItem()
             {
                 EventEnum = $"{Name}.SDWaferTypeUseTimeAlarm",