Преглед на файлове

add Analysis of EFEM Hardware Error Codes && Monitor of Current Application Resources

zhouhr преди 1 година
родител
ревизия
4e5194bce2

+ 3 - 0
Venus/Venus_Core/EventDefine.cs

@@ -81,5 +81,8 @@ namespace Aitex.Core.RT.Log{
 		EV_EFEM_ROBOT = 4100,
 		WARN_EFEM_ROBOT = 4101,
 		ERR_EFEM_ROBOT = 4102,
+		INFO_WINRESOURCE = 5000,
+		WARN_WINRESOURCE = 5001,
+		ERR_WINRESOURCE = 5002,
 	}
 }

+ 27 - 0
Venus/Venus_RT/Config/LogDefine.json

@@ -719,5 +719,32 @@
     "GlobalDescription_en": "{0}.",
     "Module": "EFEM",
     "Note": "EFEM Failed"
+  },
+  {
+    "Id": 5000,
+    "Level": "Info",
+    "LogEnum": "INFO_WINRESOURCE",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "System",
+    "Note": "System Notify"
+  },
+  {
+    "Id": 5001,
+    "Level": "Warning",
+    "LogEnum": "WARN_WINRESOURCE",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "System",
+    "Note": "System  Failed"
+  },
+  {
+    "Id": 5002,
+    "Level": "Error",
+    "LogEnum": "ERR_WINRESOURCE",
+    "GlobalDescription_zh": "{0}。",
+    "GlobalDescription_en": "{0}.",
+    "Module": "System",
+    "Note": "System Failed"
   }
 ]

+ 1 - 1
Venus/Venus_RT/Config/System.sccfg

@@ -20,7 +20,7 @@
 		<config default="2" name="MaxInternalWaferCount" nameView="Max Internal wafer count" description="系统可允许进入的wafer数" max="8" min="1" paramter="" tag="" unit="" visible="true" type="Integer" />		
 		<config default="00000000,00000000,00000000,00000000,00000000,00000000,00000000,00000000" name="COMLogFlag" description="Flag for print COM data log" max="" min="" paramter="" tag="" unit="" visible="false" type="String" />
 		<config default="True" name="IsIgnoreSaveDB" nameView="IsIgnoreSaveDB" description="IO实时数据是否保存数据库,2023/09/02暂时加参数设计" max="" min="" paramter="" tag="" unit="" type="Bool" visible="false"/>
-
+		<config default="10"  name="CheckResourceInterval" nameView="CheckResourceInterval" description="进程资源监视间隔,单位为分钟,0为不监视" max="60" min="0" paramter="" tag="" unit="min" type="Integer"/>
 		
 		<!--FA-->
 		<configs name="FA" nameView="FA" visible="false">

+ 1 - 1
Venus/Venus_RT/Devices/EFEM/EfemDevice.cs

@@ -208,7 +208,7 @@ namespace Venus_RT.Devices
         public void ChangeLightStatus(LightType light, LightStatus st)
         {
             if (!_lights.ContainsKey(light))
-                throw new ApplicationException($"NO {light} configured");
+                LOG.Write(eEvent.WARN_EFEM_COMMON_WARN, ModuleName.EFEM, $"NO {light} configured");
 
             _lights[light] = st;
         }

+ 424 - 4
Venus/Venus_RT/Devices/EFEM/EfemMessage.cs

@@ -5,7 +5,9 @@ using System.Reflection;
 using System.Runtime.Serialization;
 using System.Runtime.Serialization.Formatters.Binary;
 using System.Text.RegularExpressions;
+using Aitex.Core.Backend;
 using Aitex.Core.RT.Event;
+using Aitex.Core.RT.Log;
 using Aitex.Sorter.Common;
 using MECF.Framework.Common.Equipment;
 using Venus_Core;
@@ -15,6 +17,7 @@ namespace Venus_RT.Devices.YASKAWA
     [Serializable]
     public sealed class EfemMessage : IEfemMessage, ICloneable
     {
+
         public enum MsgHead
         {
             MOV, GET, ACK, INF, SET, CAN, ABS, EVT, NAK
@@ -236,19 +239,27 @@ namespace Venus_RT.Devices.YASKAWA
                         int a4 = messageBody.IndexOf('|');
                         int a5 = messageBody.IndexOf(';');
 
-                        
+                        // ABS:LOAD/LLLB01/ARM2|ERROR/RB|2B80;
+
 
                     string errStr = messageBody.Substring(a4 + 1, a5 - a4 - 1);
-                    string[] a6 = errStr.Split('/');
+                        //分割位置和因素 最后一位是需要处理
+                    string[] a6 = errStr.Split('/','|');
 
                     if (a6.Length < 3)
                     {
-                        throw new ApplicationException($"ABS 格式错误 {errStr}");
+                        LOG.Write(eEvent.WARN_EFEM_COMMON_WARN, ModuleName.EFEM, $"ABS 格式错误 {errStr}");
                     }
 
                     msg.Factor = a6[0];
                     msg.Data.Add(a6[1]);
-                    msg.Data.Add(a6[2]);
+                    string errorcode = a6[2].Substring(1);
+                        if (Constant._EFEMHWErrorCode2Msg.ContainsKey(errorcode))
+                            msg.Data.Add(Constant._EFEMHWErrorCode2Msg[errorcode]);
+                        else if (!string.IsNullOrEmpty(MatchError(errorcode)))
+                            msg.Data.Add(MatchError(errorcode));
+                        else
+                            msg.Data.Add(a6[2]);
                     break;
                 }
             }
@@ -260,6 +271,16 @@ namespace Venus_RT.Devices.YASKAWA
             return msg;
         }
 
+        private static string MatchError(string errorcode)
+        {
+            foreach (KeyValuePair<Regex, string> item in Constant._EFEMHWRegexError2Msg) 
+            { 
+                if (item.Key.IsMatch(errorcode))
+                    return item.Value; 
+            }
+            return string.Empty;
+        }
+
         public static string ToHWString(this Position pos)
         {
             string res = string.Empty;
@@ -421,5 +442,404 @@ namespace Venus_RT.Devices.YASKAWA
             { "SYSTEM_FFF0", "Alarm at Z-axis driver in the robot" },
             { "SYSTEM_FFFF", "Robot control program malfunction" }
         };
+
+
+        #region 硬件错误码
+        public static readonly Dictionary<string, string> _EFEMHWErrorCode2Msg = new Dictionary<string, string>()
+        {
+            {"020","伺服电源关闭,运动指令失败"},
+            {"021","伺服电源开启,设置命令失败"},
+            {"040","命令被拒绝,因为主机命令是在控制器处于TEACH模式时发送的"},
+            {"050","命令被拒绝,因为当主机向同一单元发送另一个运动命令时,该单元正在执行运动命令"},
+            {"051","当间距生成方法设置为“自动计算模式”时,主机尝试在槽间设置间距"},
+            {"052","重新启动命令被拒绝,因为在电源打开后立即发生错误"},
+            {"053","Get/Put(或exchange)命令被拒绝,因为在此之前没有执行“移动到就绪位置”命令"},
+            {"054","晶圆片对准命令被拒绝,因为在对准命令之前,预对准器的“移动到对准就绪位置”命令没有被执行"},
+            {"055","指定了不可访问的站类型"},
+            {"058","命令被拒绝,因为发送的命令不被指定的单元支持"},
+            {"059","“传送点之间的移动”命令被拒绝,因为指定了一个无效点"},
+            {"05A","不能移动,因为机械手在线性运动不能执行的范围(或姿势)"},
+            {"05C","晶圆对中没有执行"},
+            {"05D","手臂校准被拒绝,因为预对准阶段没有记录"},
+            {"05E","映射数据引用命令被拒绝,因为映射从未执行过"},
+            {"05F","命令被拒绝,因为数据上传/下载命令正在进行中"},
+            {"061","无法从目前的操纵姿势安全回家"},
+            {"064","升降机与预对准器相撞"},
+            {"070","命令被拒绝,因为底部槽位没有被记录"},
+            {"071","命令被拒绝,因为当俯仰产生方法设置为“自动计算模式”时,没有记录顶部槽位"},
+            {"088","由教学位置计算出的转换位置(姿势)超出了运动极限"},
+            {"089","由教学位置计算出的转换位置(姿势)超出了运动极限"},
+            {"08A","由教学位置计算出的转换位置(姿势)超出了运动极限"},
+            {"08B","由教学位置计算出的转换位置(姿势)超出了运动极限"},
+            {"08C","由教学位置计算出的转换位置(姿势)超出了运动极限"},
+            {"08D","由教学位置计算出的转换位置(姿势)超出了运动极限"},
+            {"090","来自主机的通信命令的参数设置超出范围"},
+            {"0A0","未执行对齐运动,因为对齐器未准备好在具有对齐角度的put运动命令中运行"},
+            {"0E0","调整偏移量超过限额"},
+            {"0F0","输入电压太低" },
+            {"701","伺服控制板或ROM有缺陷"},
+            {"703","主控制板与伺服控制板之间发生通信错误"},
+            {"704","主控制板与伺服控制板之间发生通信错误"},
+            {"705","主控板与变频器之间发生通信错误"},
+            {"706","伺服控制板出现系统错误"},
+            {"707","伺服控制板出现系统错误"},
+            {"709","电流不正常"},
+            {"70A","检测到电源丢失"},
+            {"70B","防突电流继电器不正常"},
+            {"70C","转换器类型不匹配"},
+            {"70F","伺服控制板无响应"},
+            {"713","DB是不正常的"},
+            {"714","发生变换器充电错误"},
+            {"715","出现硬线基块错误"},
+            {"716","发生硬线基启用错误"},
+            {"717","发生基本块错误"},
+            {"718","发生基本启用错误"},
+            {"719","请求硬线座释放,但不释放"},
+            {"71A","刹车锁定错误"},
+            {"71B","刹车解锁错误"},
+            {"71C","电源继电器不正常"},
+            {"721","伺服参数异常"},
+            {"722","伺服参数异常"},
+            {"725","检测到转换器过热"},
+            {"726","检测到未定义的命令"},
+            {"727","检测到不支持的命令"},
+            {"728","检测到命令的数据异常"},
+            {"729","伺服控制板出现系统错误"},
+            {"72A","伺服控制板出现系统错误"},
+            {"72B","伺服参数值异常"},
+            {"730","Amp模块未安装"},
+            {"732","伺服参数异常"},
+            {"733","伺服参数异常"},
+            {"734","伺服参数异常"},
+            {"735","伺服参数异常"},
+            {"73F","从伺服控制板接收未定义的错误"},
+            {"740","发生错误时PG"},
+            {"741","请求多重伺服开启"},
+            {"742","伺服控制板出现系统错误"},
+            {"743","伺服控制板出现系统错误"},
+            {"744","伺服控制板出现系统错误"},
+            {"745","伺服控制板出现系统错误"},
+            {"746","伺服控制板出现系统错误"},
+            {"74A","伺服控制板出现系统错误"},
+            {"74B","伺服控制板出现系统错误"},
+            {"74C","伺服控制板出现系统错误"},
+            {"74D","伺服控制板出现系统错误"},
+            {"7A0","PAIF接收到一条未定义的命令"},
+            {"7A1","PAIF板检测到命令的参数值超出范围"},
+            {"7A2","检测到不支持的命令"},
+            {"7A3","数据缓冲区已满"},
+            {"7A4","检测到不支持的命令"},
+            {"7A5","编码器数据异常"},
+            {"7A6","检测到不支持的命令"},
+            {"7AE","PA板还没有准备好"},
+            {"7AF","PA板没有回应"},
+            {"7B0","CCD传感器头电源电压低"},
+            {"7B4","关闭CCD光源LED"},
+            {"7B5","CCD光源LED光强下降"},
+            {"7C0","发现PAIF板的看门狗"},
+            {"7C1","检测到低电压"},
+            {"7C2","异常中断发生"},
+            {"7C3","打开LED,但光强度为零"},
+            {"7CF","没有安装PAIF板"},
+            {"7D0","检测到过电压"},
+            {"7D1","数据采集失败"},
+            {"900","主机命令消息中断"},
+            {"910","从主机接收到的数据的总和是无效的"},
+            {"920","从主机接收到未定义单元的命令"},
+            {"930","从主机接收的命令未定义"},
+            {"940","附加到从主机接收到的命令的参数为"},
+            {"950","执行完成的确认报告没有从主机收到"},
+            {"960","从主机接收到的命令消息中序列号不正确"},
+            {"961","序列号与先前从主机接收到的命令消息上的序列号相同"},
+            {"970","没有定界符"},
+            {"9A1","当控制器收到来自主机的命令时,消息缓冲区已满"},
+            {"9C0","局域网设备设置无效"},
+            {"9C1","设置的IP地址无效"},
+            {"9C2","设置子网掩码无效"},
+            {"9C3","设置默认的门方式无效"},
+            {"9D0","主机消息接收失败(以太网)"},
+            {"9E0","来自主机的请求是不可接受的,因为在运行维护工具期间"},
+            {"9E1","由于使用维护工具获取数据时内部数据被破坏,无法获取"},
+            {"A01","重新检测电源电压的下降"},
+            {"A10","外部紧急停机(EXESP)由I/O启用"},
+            {"A20","TP紧急停止按钮被按下"},
+            {"A21","检测联锁板故障"},
+            {"A30","紧急停机由主机发出指令"},
+            {"A40","控制器冷却风扇1出现错误"},
+            {"A41","控制器冷却风扇2出现错误"},
+            {"A42","控制器冷却风扇3出现错误"},
+            {"A45","1号风机有故障"},
+            {"A46","2号机有故障"},
+            {"A4F","控制器的内存备份电池不足"},
+            {"AC0","从I/O输入一个安全栅栏(SAFF)信号"},
+            {"AC9","保护停止(ONEN)信号从I/O输入"},
+            {"AE0","由教学挂件控制,切换到“主机”模式"},
+            {"AE1","模式切换到“教导”,同时由主机控制"},
+            {"AE8","教学挂起过程中释放了死门开关"},
+            {"AF0","检测联锁板故障"},
+            {"AF1","检测联锁板故障"},
+            {"AF2","检测联锁板故障"},
+            {"AF3","检测联锁板故障"},
+            {"AF4","检测联锁板故障"},
+            {"AF5","检测联锁板故障"},
+            {"AF6","检测联锁板故障"},
+            {"AF8","交叉检查比较错误的教学挂件紧急停止"},
+            {"AF9","对联锁输入信号1进行交叉校验比较误差"},
+            {"AFA","对外部紧急停止信号的比较误差进行交叉检查"},
+            {"AFB","反复检查死区开关信号的比较误差"},
+            {"AFC","反复检查安全围栏信号(SAFF)的比较误差"},
+            {"AFD","反复检查保护停止信号(ONEN)的比较误差"},
+            {"AFE","对联锁输入信号2进行交叉校验比较误差"},
+            {"AFF","对联锁输入信号进行交叉校验比较误差3" },
+            {"B10","轴1超过允许速度"},
+            {"B11","轴2超过允许速度"},
+            {"B12","轴3超过允许速度"},
+            {"B13","轴4超过允许速度"},
+            {"B14","轴5超过允许速度"},
+            {"B20","超过正向轴对称-1运动范围"},
+            {"B21","在正方向超过轴-2运动范围"},
+            {"B22","在正方向超过轴-3运动范围"},
+            {"B23","在正方向超过轴-4运动范围"},
+            {"B24","超过轴-5正向运动范围"},
+            {"B28","当映射运动开始时,正向超过Axis-1运动范围"},
+            {"B29","当映射运动开始时,正向超过轴-2运动范围"},
+            {"B2A","当映射运动开始时,正向超过轴-3运动范围"},
+            {"B2B","当映射运动开始时,正向超过轴-4运动范围"},
+            {"B2C","当映射运动开始时,正向超过轴-5运动范围"},
+            {"B30","超轴向-1运动范围"},
+            {"B31","超过轴-2的负向运动范围"},
+            {"B32","超过轴-3向负方向的运动范围"},
+            {"B33","超过轴-4的负向运动范围"},
+            {"B34","超过轴-5的负向运动范围"},
+            {"B38","当映射运动开始时,在负方向上超过了Axis-1运动范围"},
+            {"B39","当映射运动开始时,超过轴-2的负向运动范围"},
+            {"B3A","当映射运动开始时,超过轴-3的负向运动范围"},
+            {"B3B","当映射运动开始时,超过轴-4的负向运动范围"},
+            {"B3C","当映射运动开始时,超过轴-5的负向运动范围"},
+            {"B40","超时访问权限信号1发生"},
+            {"B41","超时访问权限信号2发生"},
+            {"B42","超时访问权限信号3发生"},
+            {"B43","超时访问权限信号4发生"},
+            {"B44","超时访问权限信号5发生"},
+            {"B45","超时访问权限信号6发生"},
+            {"B46","超时访问权限信号7发生" },
+            {"B47","超时访问权限信号8发生"},
+            {"B48","超时访问权限信号9发生"},
+            {"B49","超时访问权限信号10发生"},
+            {"B4A","超时访问权限信号11发生"},
+            {"B4B","超时访问权限信号12发生"},
+            {"B4C","超时访问权限信号13发生"},
+            {"B4D","超时访问权限信号14发生"},
+            {"B4E","超时访问权限信号15发生"},
+            {"B4F","超时访问权限信号16发生"},
+            {"B60","预对准器在访问P/A阶段时正在运行(用于边缘对准器)"},
+            {"B61","预对准器在进入P/ a阶段时持晶圆片"},
+            {"B62","晶圆片在到达P/A阶段时不在预对准器上晶圆片在P/A阶段的预对准器上(用于边缘抓地力预平衡器)"},
+            {"B63","当P/A阶段访问时,预对准器没有处于“发布”状态(用于边缘对准器)"},
+            {"B64","当P/A阶段进入时,Lifer不是上/下端(用于边缘对准器)"},
+            {"B65","当P/A阶段进入时,预对准器未处于准备位置(用于边缘对准器)"},
+            {"B66","使用Get指定的P/A阶段不是指定的阶段(用于边缘对准器)"},
+            {"B68","由于机械手已经进入P/A阶段或机械手的进入阶段不理解预对准器无法移动(用于边缘对准器)"},
+            {"B70","操作过程中检测到软件停止信号"},
+            {"B80","真空/抓地力传感器未在规定时间内打开"},
+            {"B81","真空/抓地力传感器未在规定时间内关闭"},
+            {"B82","晶圆片存在/缺失传感器在规定的时间内没有打开"},
+            {"B83","晶圆片存在/缺失传感器没有在规定的时间内关闭"},
+            {"B88","抓地力传感器未在规定时间内打开(用于边缘对准器)"},
+            {"B89","抓地力传感器未在规定时间内关闭(用于边缘对准器)"},
+            {"B8A","松开传感器在规定时间内不打开(用于边缘对准器)"},
+            {"B8B","松开感测器未在规定时间内关闭(用于边缘对准器)"},
+            {"B8F","叉1的柱塞在观察时间内没有移动"},
+            {"B90","真空/抓地力传感器未在规定时间内打开"},
+            {"B91","真空/抓地力传感器未在规定时间内关闭"},
+            {"B92","晶圆片存在/缺失传感器在规定的时间内没有打开"},
+            {"B93","晶圆片存在/缺失传感器没有在规定的时间内关闭"},
+            {"B98","升降机上传感器在规定的时间内没有打开(用于边缘对准器)"},
+            {"B99","升降机上传感器没有在规定的时间内关闭(用于边缘对准器)"},
+            {"B9A","升降机下降传感器未在规定时间内打开(用于边缘对准器)"},
+            {"B9B","升降机下降传感器未在规定时间内关闭(用于边缘对准器)"},
+            {"B9F","叉2的柱塞在观察时间内没有移动"},
+            {"BA0","当机械手(Fork1)/预对准器传送晶圆时,真空/握把传感器或晶圆存在/缺失传感器关闭"},
+            {"BA1","Fork 1的真空/握把传感器是开着的,而wafer存在/缺失传感器是关着的"},
+            {"BA8","握力传感器在预对准器运动时关闭,握力传感器打开(用于边缘对准器)"},
+            {"BA9","抓地力传感器在预对准器运动时打开,抓地力传感器关闭(对于边缘抓地力预对准器)"},
+            {"BAA","在预对准过程中,松开传感器关闭,松开传感器打开(用于边缘对准器)"},
+            {"BAB","在预对准期间,松开传感器打开,松开传感器关闭(对于边缘握把预对准器)"},
+            {"BAC","握力传感器和反握力传感器都打开了(用于边缘对准器)"},
+            {"BAD","手柄传感器指示晶圆存在,升降机传感器指示lifer启动(用于边缘对准器)"},
+            {"BB0","吸/抓力传感器或晶圆片存在/缺失传感器在叉2保持和传送晶圆片时关闭"},
+            {"BB1","Fork 2的吸力/抓力传感器是开着的,而晶圆的存在/缺失传感器是关着时"},
+            {"BB8","升力传感器在预对准过程中处于关闭状态,升力传感器处于开启状态(用于边缘对准器)"},
+            {"BB9","在预对准过程中,升降传感器处于开启状态,升降传感器处于关闭状态(用于边缘抓地力预对准)"},
+            {"BBA","在预对准过程中,升降传感器处于关闭状态,升降传感器处于开启状态(用于边缘对准器)"},
+            {"BBB","在预对准过程中,升降传感器处于开启状态,升降传感器处于关闭状态(用于边缘抓地力预对准)"},
+            {"BBC","升降式传感器和升降式传感器均处于工作状态(用于边缘握把预对准器)"},
+            {"BF0","当机械手被保持信号停止时,运动请求被传送"},
+            {"C80","晶圆片对准的有效数据不足"},
+            {"C90","缺口/定位平面位置无法分辨"},
+            {"CA0","无法检测到准确的晶圆中心位置"},
+            {"CB0","晶圆偏心轮数量过多"},
+            {"CC0","无法检测到准确的缺口/定位平面位置"},
+            {"CD0","校正后的量超过允许的范围"},
+            {"CE0","无法正确执行手臂校准"},
+            {"D00","映射传感器波束在映射开始时就已经被阻塞"},
+            {"D10","无法正确执行映射校准"},
+            {"D20","从未执行映射校准"},
+            {"D30","测图或测图校准的采样数据异常"},
+            {"D40","在绘图或绘图校准时检测到晶圆突出"},
+            {"D50","在映射或映射校准时检测到抖动"},
+            {"D60","对于“顶面GET / PUT工作站”,映射或映射校准无法强制执行" },
+            {"E90","系统配置错误"},
+            {"E91","机械手配置错误"},
+            {"EA0","实型通用参数设置警告"},
+            {"EA1","整型通用参数设置警告"},
+            {"EA4","实型机组参数设置警告"},
+            {"EA5","整型单元参数设置警告"},
+            {"EB0","实型通用参数设置无效"},
+            {"EB1","整型通用参数设置无效"},
+            {"EB4","实型单元参数设置无效"},
+            {"EB5","整型单元参数设置无效"},
+            {"EC0","软件与设置参数不匹配"},
+            {"ED0","发生内存操作错误"},
+            {"ED1","发生内存操作错误"},
+            {"EE0","文件打开失败"},
+            {"EE1","关闭文件失败"},
+            {"EE2","读取文件失败"},
+            {"EE3","写入文件失败"},
+            {"EE4","删除文件失败"},
+            {"EE5","参数初始化文件大小无效"},
+            {"EE8","创建文件夹失败"},
+            {"EF0","“格式请求文件”中的数据无效"},
+            {"EF1","“自动更新请求文件”中的数据无效"},
+            {"EF2","“伺服参数文件”中的数据无效"},
+            {"EF3","“通用参数文件”中的无效数据"},
+            {"EF4","“单元参数文件”中的数据无效"},
+            {"EF5","“位置数据文件”中的数据无效"},
+            {"EF8","“伺服参数自动更新文件”中的数据无效"},
+            {"EF9","“常用参数自动更新文件”中的无效数据"},
+            {"EFA","“单元参数自动更新文件”中的无效数据"},
+            {"EFE","在控制器中记录数据异常1"},
+            {"EFF","文件数据异常2在控制器"},
+            {"F10","System error 1-0."},
+            {"F11","System error 1-1."},
+            {"F12","System error 1-2."},
+            {"F14","System error 1-4."},
+            {"F20","System error 2-0."},
+            {"F21","System error 2-1."},
+            {"F22","System error 2-2."},
+            {"F50","System error 5-0."},
+            {"F51","System error 5-1."},
+            {"F61","System Error 6-1."},
+            {"F62","System Error 6-2."},
+            {"F70","System Error 7-0."},
+            {"F82","System error 8-2."},
+            {"F83","System error 8-3."},
+            {"F84","System error 8-4."},
+            {"F86","System error 8-6."},
+            {"F88","System error 8-8."},
+            {"F90","System trap 9-0."},
+            {"F91","System trap 9-1."},
+            {"F92","System trap 9-2."},
+            {"F93","System trap 9-3."},
+            {"F94","System trap 9-4."},
+            {"F95","System trap 9-5."},
+            {"F98","System trap 9-8."},
+            {"F99","System trap 9-9."},
+            {"F9A","System trap 9-10."},
+            {"F9B","System trap 9-11."},
+            {"F9C","System trap 9-12."},
+            {"F9D","System trap 9-13."},
+            {"FA0","System trap A-0."},
+            {"FA1","System trap A-1."},
+            {"FA2","System trap A-2."},
+            {"FA3","System trap A-3."},
+            {"FA4","System trap A-4."},
+            {"FA8","System trap A-8."},
+            {"FA9","System trap A-9."},
+            {"FAA","System trap A-10."},
+            {"FAB","System trap A-11."},
+            {"FB0","System trap b-0."},
+            {"FB1","System trap b-1."},
+            {"FB8","System trap b-8."},
+            {"FB9","System trap b-9." },
+            {"FC0","System trap C-0."},
+            {"FC4","System trap C-4."},
+            {"FC5","System trap C-5."},
+            {"FC8","System trap C-8."},
+            {"FCC","System trap C-12."},
+            {"FD0","System trap d-0."},
+            {"FD1","System trap d-1."},
+            {"FD2","System trap d-2."},
+            {"FD3","System trap d-3."},
+            {"FD4","System trap d-4."},
+            {"FD5","System trap d-5."},
+            {"FD6","System trap d-6."},
+            {"FD7","System trap d-7."},
+            {"FD8","System trap d-8."},
+            {"FD9","System trap d-9."},
+            {"FDA","System trap d-10."},
+            {"FDB","System trap d-11."},
+            {"FDC","System trap d-12."},
+            {"FDD","System trap d-13."},
+            {"FDE","System trap d-14."},
+            {"FDF","System trap d-15."},
+            {"FE0","System trap E-0."},
+            {"FE2","System trap E-2."},
+            {"FE4","System trap E-4."},
+            {"FE6","System trap E-6."},
+            {"FE8","System trap E-8."},
+            {"FEA","System trap E-10."},
+            {"FEC","System trap E-12." },
+        };
+        #endregion
+        #region 含有缺省的错误码
+        public static readonly Dictionary<Regex, string> _EFEMHWRegexError2Msg = new Dictionary<Regex, string>()
+        {
+            { new Regex(@"(.)(?=06)"),"放大器类型不匹配"},
+            { new Regex(@"(.)(?=07)"),"编码器类型不匹配"},
+            { new Regex(@"(.)(?=10)"),"溢出电流已运行"},
+            { new Regex(@"(.)(?=30)"),"检测再生电路误差"},
+            { new Regex(@"(.)(?=40)"),"变换器电压异常高"},
+            { new Regex(@"(.)(?=41)"),"变换器电压低"},
+            { new Regex(@"(.)(?=45)"),"刹车被锁住了"},
+            { new Regex(@"(.)(?=46)"),"转换器出现错误"},
+            { new Regex(@"(.)(?=47)"),"输入功率出错"},
+            { new Regex(@"(.)(?=48)"),"变频器主电路出现错误"},
+            { new Regex(@"(.)(?=49)"),"放大器发生误差"},
+            { new Regex(@"(.)(?=51)"),"电机转速过高"},
+            { new Regex(@"(.)(?=71)"),"当扭矩很大程度上超过额定值时,应用几秒钟或几十秒钟"},
+            { new Regex(@"(.)(?=72)"),"一个很大程度上超过额定值的扭矩被连续施加"},
+            { new Regex(@"(.)(?=78)"),"转换器已经超载"},
+            { new Regex(@"(.)(?=7B)"),"放大器发生过热"},
+            { new Regex(@"(.)(?=7C)"),"当扭矩很大程度上超过额定值时,应用几秒钟或几十秒钟"},
+            { new Regex(@"(.)(?=7D)"),"一个很大程度上超过额定值的扭矩被连续施加"},
+            { new Regex(@"(.)(?=81)"),"绝对编码器的所有电源关闭,位置数据被清除"},
+            { new Regex(@"(.)(?=83)"),"编码器的后备电池的电压很低"},
+            { new Regex(@"(.)(?=84)"),"编码器内部数据错误"},
+            { new Regex(@"(.)(?=85)"),"开机时编码器高速旋转"},
+            { new Regex(@"(.)(?=86)"),"过热的任何类型的编码器"},
+            { new Regex(@"(.)(?=88)"),"编码器发生错误"},
+            { new Regex(@"(.)(?=89)"),"编码器的响应出现错误"},
+            { new Regex(@"(.)(?=8A)"),"编码器多圈范围错误发生"},
+            { new Regex(@"(.)(?=8C)"),"编码器复位未完成"},
+            { new Regex(@"(.)(?=98)"),"伺服参数异常"},
+            { new Regex(@"(.)(?=9A)"),"反馈发生溢出"},
+            { new Regex(@"(.)(?=B4)"),"发生微程序传输错误"},
+            { new Regex(@"(.)(?=BC)"),"编码器发生错误"},
+            { new Regex(@"(.)(?=C1)"),"伺服马达失去控制"},
+            { new Regex(@"(.)(?=C9)"),"编码器与伺服控制板之间的通信错误"},
+            { new Regex(@"(.)(?=CE)"),"编码器发生错误"},
+            { new Regex(@"(.)(?=CF)"),"编码器发生错误"},
+            { new Regex(@"(.)(?=D0)"),"位置偏移脉冲已超过设定值"},
+            { new Regex(@"(.)(?=D1)"),"位置偏差饱和"},
+            { new Regex(@"(.)(?=D2)"),"电机定向位置错误"},
+            { new Regex(@"(.)(?=D4)"),"伺服跟踪误差"},
+            { new Regex(@"(.)(?=F1)"),"阶段损失(转换器)"},
+            { new Regex(@"(?<=E)(.)(?=1)"),"命令发送后,轴定位无法完成"},
+            { new Regex(@"(?<=E)(.)(?=D)"),"不准备将命令发送到伺服控制板"},
+            { new Regex(@"(?<=E)(.)(?=E)"),"主控制板与伺服控制板之间发生通信错误"},
+            { new Regex(@"(?<=E)(.)(?=F)"),"伺服控制板无响应"},
+        };
+        #endregion
     }
 }

+ 2 - 0
Venus/Venus_RT/Instances/ToolLoader.cs

@@ -92,6 +92,8 @@ namespace Venus_RT.Instances
             string s1 = System.Diagnostics.FileVersionInfo.GetVersionInfo(Path.Combine(PathManager.GetAppDir(), "Venus_RT.exe")).ProductVersion;
 
             DATA.Subscribe("GetRTPath", () => AppDomain.CurrentDomain.BaseDirectory);
+
+            Singleton<ResourceMonitor>.Instance.Initialize();
         }
         private void InstanceOnOnEvent(EventItem obj)
         {

+ 199 - 0
Venus/Venus_RT/Modules/ResourceMonitor.cs

@@ -0,0 +1,199 @@
+using Aitex.Core.RT.Device.Unit;
+using Aitex.Core.RT.Log;
+using Aitex.Core.RT.SCCore;
+using MECF.Framework.Common.Equipment;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Reflection;
+using System.ServiceModel.Channels;
+using System.Text;
+using System.Timers;
+using System.Windows;
+
+namespace Venus_RT.Modules
+{
+    public class ResourceMonitor
+    {
+        private string processname = Process.GetCurrentProcess().ProcessName;
+        private int _stringlen = 20;
+        private int threshold = 800;
+        //数据波动监测可用
+        //List<double> _Numberofhandlesopened = new List<double>() { };
+        //List<double> _Numberofmodules = new List<double>() { };
+        //List<double> _Basicpriority = new List<double>() { };
+        //List<double> _processor = new List<double>() { };
+        //List<double> _Minimumworkingset = new List<double>() { };
+        //List<double> _MaximumWorkingSet = new List<double>() { };
+        //List<double> _Workset = new List<double>() { };
+        //List<double> _Peakworkingset = new List<double>() { };
+        //List<double> _Dedicatedmemorysize = new List<double>() { };
+        //List<double> _UnpagedMemorySize = new List<double>() { };
+        //List<double> _PagingMemorySize = new List<double>() { };
+        //List<double> _Peakpagingmemorysize = new List<double>() { };
+        //List<double> _VirtualMemorySize = new List<double>() { };
+        //List<double> _PeakVirtualMemorySize = new List<double>() { };
+
+        //string ProcessName              = string.Empty;
+        //string ProcessID                = string.Empty;
+        //string Starttime                = string.Empty;
+        string Response                 = string.Empty;
+        string MainWindowHandle         = string.Empty;
+        //string MainWindowTitle          = string.Empty;
+        string AssociatedProcessHandle  = string.Empty;
+        string Numberofhandlesopened    = string.Empty;
+        string Numberofmodules          = string.Empty;
+        string Basicpriority            = string.Empty;
+        string Increasepriority         = string.Empty;
+        string processor                = string.Empty;
+        string Minimumworkingset        = string.Empty;
+        string MaximumWorkingSet        = string.Empty;
+        string Workset                  = string.Empty;
+        string Peakworkingset           = string.Empty;
+        string Dedicatedmemorysize      = string.Empty;
+        string UnpagedMemorySize        = string.Empty;
+        string PagingMemorySize         = string.Empty;
+        string Peakpagingmemorysize     = string.Empty;
+        string VirtualMemorySize        = string.Empty;
+        string PeakVirtualMemorySize    = string.Empty;
+        string Occupytime               = string.Empty;
+        string PrivilegeOccupancytime   = string.Empty;
+        string Useroccupiedtime         = string.Empty;
+        public ResourceMonitor() 
+        {
+
+            //ProcessName = "进程名称";
+            //ProcessID = "进程ID".PadRight(_stringlen - 2, ' ');
+            //Starttime = "启动时间";
+            Response = "是否响应";
+            MainWindowHandle = "主窗口句柄";
+            //MainWindowTitle = "主窗口标题";
+            AssociatedProcessHandle = "关联进程句柄";
+            Numberofhandlesopened = "进程打开的句柄数";
+            Numberofmodules = "模块数量";
+            Basicpriority = "基本优先级";
+            Increasepriority = "提升优先级";
+            processor = "处理器";
+            Minimumworkingset = "最小工作集";
+            MaximumWorkingSet = "最大工作集";
+            Workset = "工作集";
+            Peakworkingset = "峰值工作集";
+            Dedicatedmemorysize = "专用内存大小";
+            UnpagedMemorySize = "未分页内存大小";
+            PagingMemorySize = "分页内存大小";
+            Peakpagingmemorysize = "峰值分页内存大小";
+            VirtualMemorySize = "虚拟内存大小";
+            PeakVirtualMemorySize = "峰值虚拟内存大小";
+            Occupytime = "占用时间";
+            PrivilegeOccupancytime = "特权占用时间";
+            Useroccupiedtime = "用户占用时间";
+        }
+
+        public bool Initialize()
+        {
+            //>0 开启否则不开启
+            if (SC.GetValue<int>("System.CheckResourceInterval") > 0)
+            {
+                Timer _timer = new Timer();
+                _timer.Enabled = true;
+                _timer.Interval = SC.GetValue<int>("System.CheckResourceInterval") * 60 * 1000;
+                _timer.Elapsed += GetProcessInfo;
+                _timer.Start();
+                //LOG.Write($"{ProcessName}" +
+                //$"{ProcessID}" +
+                ////$"{Starttime}"+
+                //$"{Response}" +
+                //$"{MainWindowHandle}" +
+                ////$"{MainWindowTitle}"+
+                //$"{AssociatedProcessHandle}" +
+                //$"{Numberofhandlesopened}" +
+                //$"{Numberofmodules}" +
+                //$"{Basicpriority}" +
+                //$"{Increasepriority}" +
+                //$"{processor}" +
+                //$"{Minimumworkingset}" +
+                //$"{MaximumWorkingSet}" +
+                //$"{Workset}" +
+                //$"{Peakworkingset}" +
+                //$"{Dedicatedmemorysize}" +
+                //$"{UnpagedMemorySize}" +
+                //$"{PagingMemorySize}" +
+                //$"{Peakpagingmemorysize}" +
+                //$"{VirtualMemorySize}" +
+                //$"{PeakVirtualMemorySize}" +
+                //$"{Occupytime}" +
+                //$"{PrivilegeOccupancytime}" +
+                //$"{Useroccupiedtime}");
+            }
+            return true;
+        }
+
+
+        private void GetProcessInfo(object sender, ElapsedEventArgs e)
+        {
+            try
+            {
+                //判断是否存在该进程
+                //有就开始记录
+                if (Process.GetProcessesByName(processname).Length > 0)
+                {
+                    Process pro = Process.GetProcessesByName(processname)[0];
+
+                    //_Numberofhandlesopened.Add(pro.HandleCount);         //进程打开的句柄数
+                    //_Numberofmodules.Add(pro.Modules.Count);               //模块数量
+                    //_Basicpriority.Add(pro.BasePriority);                 //基本优先级
+                    //_processor.Add(pro.ProcessorAffinity.ToInt32());                     //处理器
+                    //_Minimumworkingset.Add(pro.MinWorkingSet.ToInt32());             //最小工作集
+                    //_MaximumWorkingSet.Add(pro.MaxWorkingSet.ToInt32());             //最大工作集
+                    //_Workset.Add(Convert.ToInt32(pro.WorkingSet64));                       //工作集
+                    //_Peakworkingset.Add(Convert.ToInt32(pro.PeakWorkingSet64));                //峰值工作集
+                    //_Dedicatedmemorysize.Add(Convert.ToInt32(pro.PrivateMemorySize64 / 1048576));           //专用内存大小
+                    //_UnpagedMemorySize.Add(Convert.ToInt32(pro.NonpagedSystemMemorySize64 / 1048576));             //未分页内存大小
+                    //_PagingMemorySize.Add(Convert.ToInt32(pro.PagedMemorySize64 / 1048576));              //分页内存大小
+                    //_Peakpagingmemorysize.Add(Convert.ToInt32(pro.PeakPagedMemorySize64 / 1048576));          //峰值分页内存大小
+                    //_VirtualMemorySize.Add(Convert.ToInt32(pro.VirtualMemorySize64 / 1024));             //虚拟内存大小
+                    //_PeakVirtualMemorySize.Add(Convert.ToInt32(pro.PeakVirtualMemorySize64 / 1048576));         //峰值虚拟内存大小
+
+                    LOG.Write(eEvent.INFO_WINRESOURCE, ModuleName.System,
+                    //$"{ProcessName}:{pro.ProcessName}" +
+                    //$"{pro.StartTime.ToLongDateString() + pro.StartTime.ToLongTimeString()}" +
+                    $"{Response}:{pro.Responding.ToString()}\t" +
+                    $"{MainWindowHandle}:{pro.MainWindowHandle.ToString()}\t" +
+                    //$"{pro.MainWindowTitle}" +
+                    $"{AssociatedProcessHandle}:{pro.Handle.ToString()}\t" +
+                    $"{Numberofhandlesopened}:{pro.HandleCount.ToString()}\t" +
+                    $"{Numberofmodules}:{pro.Modules.Count.ToString()}\t" +
+                    $"{Basicpriority}:{pro.BasePriority.ToString()} \t" +
+                    $"{Increasepriority}:{pro.PriorityBoostEnabled.ToString()}\t" +
+                    $"{processor}:{pro.ProcessorAffinity.ToInt32().ToString()}\t" +
+                    $"{Minimumworkingset}:{pro.MinWorkingSet.ToInt32().ToString()}\t" +
+                    $"{MaximumWorkingSet}:{pro.MaxWorkingSet.ToInt32().ToString()}\t" +
+                    $"{Workset}:{pro.WorkingSet64.ToString()}\t" +
+                    $"{Peakworkingset}:{pro.PeakWorkingSet64.ToString()}\t" +
+                    $"{Dedicatedmemorysize}:{(pro.PrivateMemorySize64 / 1048576).ToString()}\t" +
+                    $"{UnpagedMemorySize}:{(pro.NonpagedSystemMemorySize64 / 1048576).ToString()}\t" +
+                    $"{PagingMemorySize}:{(pro.PagedMemorySize64 / 1048576).ToString()}\t" +
+                    $"{Peakpagingmemorysize}:{(pro.PeakPagedMemorySize64 / 1048576).ToString()}\t" +
+                    $"{VirtualMemorySize}:{(pro.VirtualMemorySize64 / 1048576).ToString()}\t" +
+                    $"{PeakVirtualMemorySize}:{(pro.PeakVirtualMemorySize64 / 1048576).ToString()}\t" +
+                    $"{Occupytime}:{pro.TotalProcessorTime.ToString()}\t" +
+                    $"{PrivilegeOccupancytime}:{pro.PrivilegedProcessorTime.ToString()}\t" +
+                    $"{Useroccupiedtime}:{pro.UserProcessorTime.ToString()}\t");
+
+                    //如果虚拟内存大于800MB 即报警
+                    if (pro.PagedMemorySize64 / 1048576 >= threshold)
+                    {
+                        LOG.Write(eEvent.WARN_WINRESOURCE, ModuleName.System, $"警告!内存异常增长,超过{threshold}MB阈值!");
+                        MessageBox.Show($"警告!内存异常增长,超过{threshold}MB阈值!");
+                    }
+                }
+                //没有就不做任何操作
+            }
+            catch (Exception ex)
+            {
+                LOG.Write(eEvent.ERR_WINRESOURCE, ModuleName.System,$"Monitor Error happened: {ex}");
+            }
+        }
+    }
+}

+ 1 - 0
Venus/Venus_RT/Venus_RT.csproj

@@ -230,6 +230,7 @@
     <Compile Include="Modules\PMs\VentRoutine.cs" />
     <Compile Include="Modules\PMs\VenusRecipeFileContext.cs" />
     <Compile Include="Modules\PMs\VenusSequenceFileContext.cs" />
+    <Compile Include="Modules\ResourceMonitor.cs" />
     <Compile Include="Modules\RouteManager.cs" />
     <Compile Include="Modules\Schedulers\ISchedulerDBCallback.cs" />
     <Compile Include="Modules\Schedulers\SchedulerAligner.cs" />

+ 2 - 1
Venus/Venus_Themes/Themes/Generic.xaml

@@ -1320,5 +1320,6 @@ Header,RelativeSource={RelativeSource TemplatedParent}}" />
                 </ControlTemplate>
             </Setter.Value>
         </Setter>
-    </Style>

+    </Style>
+
 </ResourceDictionary>