lixun 2 years ago
parent
commit
414722dd46

+ 2 - 2
src/YSAI.DAQ/YSAI.Can/CanOperator.cs

@@ -227,7 +227,7 @@ namespace YSAI.Can
                             string? Value = VAM.Read(item);
 
                             //数据处理
-                            AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(item, Value);
+                            AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(item, Value);
 
                             //数据添加
                             param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);
@@ -250,7 +250,7 @@ namespace YSAI.Can
                                 string? Value = candata.StrByteData;
 
                                 //数据处理
-                                AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(item, Value);
+                                AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(item, Value);
 
                                 //数据添加
                                 param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);

+ 23 - 10
src/YSAI.DAQ/YSAI.Core/data/AddressDetails.cs

@@ -69,17 +69,30 @@ namespace YSAI.Core.data
         /// <returns></returns>
         public override bool Equals(object obj)
         {
-            AddressDetails? addressDetails = obj as AddressDetails;
-            if (addressDetails == null) return false;
-            if (addressDetails.AddressName == this.AddressName &&
-                addressDetails.AddressAnotherName == this.AddressAnotherName &&
-                addressDetails.AddressPropertyName == this.AddressPropertyName &&
-                addressDetails.AddressDescribe == this.AddressDescribe &&
-                addressDetails.AddressDataType == this.AddressDataType&&
-                addressDetails.IsEnable == this.IsEnable&&
-                addressDetails.AddressType == this.AddressType)
+            AddressDetails? data = obj as AddressDetails;
+            if (data == null) return false;
+            if (data.SN == this.SN &&
+                data.AddressName == this.AddressName &&
+                data.AddressAnotherName == this.AddressAnotherName &&
+                data.AddressPropertyName == this.AddressPropertyName &&
+                data.AddressDescribe == this.AddressDescribe &&
+                data.AddressDataType == this.AddressDataType&&
+                data.IsEnable == this.IsEnable&&
+                data.AddressType == this.AddressType&&
+                data?.AddressExtendParam?.ToString() == this?.AddressExtendParam?.ToString())
             {
-                return true;
+                if (data.AddressParseParam == this.AddressParseParam)
+                {
+                    return true;
+                }
+                else
+                {
+                    if (data.AddressParseParam != null && this.AddressParseParam != null)
+                    {
+                        return data.AddressParseParam.Equals(this.AddressParseParam);
+                    }
+                    return false;
+                }
             }
             else
             {

+ 47 - 41
src/YSAI.DAQ/YSAI.Core/data/AddressHandler.cs

@@ -17,6 +17,7 @@ using YSAI.Log;
 using YSAI.Unility;
 using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData.ClassData;
 using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData;
+using YSAI.Core.@interface.unify;
 
 namespace YSAI.Core.data
 {
@@ -25,27 +26,38 @@ namespace YSAI.Core.data
     /// </summary>
     public class AddressHandler
     {
+        /// <summary>
+        /// 转发失败数据的日志输出文件
+        /// </summary>
+        private readonly static string FailDataLog = "FailData.log";
+        /// <summary>
+        /// 处理异常日志输出文件
+        /// </summary>
+        private readonly static string ExecuteDisposeLog = "ExecuteDispose.log";
+        /// <summary>
+        /// 解析异常日志输出文件
+        /// </summary>
+        private readonly static string ParseLog = "Parse.log";
+
         /// <summary>
         /// 反射操作
         /// </summary>
-        public readonly static ReflectionOperate reflectionOperate = ReflectionOperate.Instance();
+        private readonly static ReflectionOperate reflectionOperate = ReflectionOperate.Instance();
 
         /// <summary>
         /// 动态对象,用于转发失败存入本地记录
         /// </summary>
-        public static dynamic DynamicObj = new ExpandoObject();
+        private static dynamic DynamicObj = new ExpandoObject();
 
         /// <summary>
-        /// 执行数据解析
+        /// 执行数据处理
         /// 收到的底层数据,调用此方法,直接返回
         /// </summary>
         /// <param name="addressDetails">地址详情数据</param>
         /// <param name="value">底层硬件返回的值</param>
         /// <returns></returns>
-        public static AddressValue? Execute(AddressDetails addressDetails, string value)
+        public static AddressValue? ExecuteDispose(AddressDetails addressDetails, string value)
         {
-            //日志文件名称
-            string logName = "Handler.log";
             try
             {
                 //原始值
@@ -63,13 +75,21 @@ namespace YSAI.Core.data
                 addressValue.Quality = 1;
 
                 //转发
-                Relay(addressValue);
+                OperateResult operateResult = Relay(PacketType.Message, addressValue);
+                if (!operateResult.State)
+                {
+                    //当数据转发失败,就存到本地
+                    DynamicObj.Value = addressValue.ToJson();
+                    DynamicObj.State = operateResult.State;
+                    DynamicObj.Exception = operateResult.Message;
+                    LogHelper.FailData(DynamicObj.ToJson(), FailDataLog);
+                }
 
                 return addressValue;
             }
             catch (Exception ex)
             {
-                LogHelper.Error($"处理异常:{ex.Message}", logName);
+                LogHelper.Error($"执行数据处理异常:{ex.Message}", ExecuteDisposeLog);
             }
             return null;
         }
@@ -86,9 +106,6 @@ namespace YSAI.Core.data
             string? NewValue = value;
             if (addressDetails.AddressParseParam != null)
             {
-                //日志文件名称
-                string logName = "Parse.log";
-
                 try
                 {
                     switch (addressDetails.AddressParseParam.ParseType)
@@ -115,7 +132,7 @@ namespace YSAI.Core.data
                 }
                 catch (Exception ex)
                 {
-                    LogHelper.Error("解析异常:" + ex.ToString(), logName);
+                    LogHelper.Error("解析异常:" + ex.ToString(), ParseLog);
                 }
             }
             return value;
@@ -124,13 +141,10 @@ namespace YSAI.Core.data
         /// <summary>
         /// 数据转发
         /// </summary>
-        /// <param name="addressValue">地址详情</param>
-        /// <returns></returns>
-        public static void Relay(AddressValue addressValue)
+        /// <param name="PType">转发类型</param>
+        /// <param name="Content">内容</param>
+        public static OperateResult Relay(PacketType PType, object Content)
         {
-            //日志文件名称
-            string logName = "Relay.log";
-
             try
             {
                 //类的唯一标识符
@@ -138,42 +152,34 @@ namespace YSAI.Core.data
                 //方法的唯一标识符
                 string MethodSN = "[Produce]";
                 //执行转发方法
-                OperateResult operateResult = reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { PacketType.Message.ToString(), addressValue.ToJson().JsonFormatting() }) as OperateResult;
-                //状态判断
-                if (!operateResult.State)
-                {
-                    DynamicObj.Value = addressValue;
-                    DynamicObj.State = operateResult.State;
-                    DynamicObj.Exception = operateResult.Message;
-                    LogHelper.Error(DynamicObj.ToJson(), logName);
-                }
+                return reflectionOperate.ExecuteMethod($"{ClassSN}{MethodSN}", new object[] { PType.ToString(), Content.ToJson() }) as OperateResult;
             }
             catch (Exception ex)
             {
-                LogHelper.Error("转发异常:" + ex.ToString(), logName);
+                return new OperateResult(false, $"数据转发异常:{ex.Message}", 0.1);
             }
         }
 
         /// <summary>
-        /// 转发事件外部注册
+        /// 转发事件注册
         /// </summary>
         /// <returns></returns>
-        public static bool RelayEventRegister(Action<object, object> action)
+        public static OperateResult RelayEventRegister(Action<object, object> action, bool Register = true)
         {
-            //类的唯一标识符
-            string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
-            //事件的唯一标识符
-            string EventSN = "[OnEvent]";
-            //注册事件
-            OperateResult operateResult = reflectionOperate.RegisterEvent($"{ClassSN}{EventSN}", true, P2: action);
-            if (!operateResult.State)
+            try
             {
-                throw new Exception($"注册事件失败:{operateResult.Message}");
+                //类的唯一标识符
+                string ClassSN = "YSAI.RelayManage.RelayManageOperate[Instance]";
+                //事件的唯一标识符
+                string EventSN = "[OnEvent]";
+                //注册事件
+                return reflectionOperate.RegisterEvent($"{ClassSN}{EventSN}", Register, P2: action);
+            }
+            catch (Exception ex)
+            {
+                return new OperateResult(false, $"转发事件注册异常:{ex.Message}", 0.1);
             }
-            return operateResult.State;
         }
 
-       
-
     }
 }

+ 21 - 0
src/YSAI.DAQ/YSAI.Core/data/AddressParse.cs

@@ -33,5 +33,26 @@ namespace YSAI.Core.data
         /// 通过脚本来执行解析
         /// </summary>
         public ScriptData.Basics Script { get; set; }
+
+        /// <summary>
+        /// 重写Equals
+        /// </summary>
+        /// <param name="obj"></param>
+        /// <returns></returns>
+        public override bool Equals(object obj)
+        {
+            AddressParse? ap = obj as AddressParse;
+            if (ap == null) return false;
+            if (ap.ParseType == this.ParseType &&
+                ap.ReflectionSN == this.ReflectionSN &&
+                ap.Script.Equals(this.Script))
+            {
+                return true;
+            }
+            else
+            {
+                return false;
+            }
+        }
     }
 }

+ 33 - 14
src/YSAI.DAQ/YSAI.Core/data/AddressValue.cs

@@ -34,14 +34,18 @@ namespace YSAI.Core.data
         /// <param name="addressDetails"></param>
         public AddressValue SET(AddressDetails addressDetails)
         {
-            this.AddressAnotherName = addressDetails.AddressAnotherName;
             this.SN = addressDetails.SN;
+            this.AddressName = addressDetails.AddressName;
+            this.AddressAnotherName = addressDetails.AddressAnotherName;
             this.AddressPropertyName = addressDetails.AddressPropertyName;
             this.AddressDescribe = addressDetails.AddressDescribe;
             this.AddressParseParam = addressDetails.AddressParseParam;
             this.AddressExtendParam = addressDetails.AddressExtendParam;
+            this.IsEnable = addressDetails.IsEnable;
             this.AddressDataType = addressDetails.AddressDataType;
             this.AddressType = addressDetails.AddressType;
+
+
             return this;
         }
 
@@ -53,20 +57,35 @@ namespace YSAI.Core.data
         /// <returns></returns>
         public override bool Equals(object obj)
         {
-            AddressValue? addressDetails = obj as AddressValue;
-            if (addressDetails == null) return false;
-            if (addressDetails.AddressName == this.AddressName &&
-                addressDetails.AddressAnotherName == this.AddressAnotherName &&
-                addressDetails.AddressPropertyName == this.AddressPropertyName &&
-                addressDetails.AddressDescribe == this.AddressDescribe &&
-                addressDetails.AddressDataType == this.AddressDataType &&
-                addressDetails.IsEnable == this.IsEnable &&
-                addressDetails.AddressType == this.AddressType &&
-                addressDetails.Value == this.Value&&
-                addressDetails.Quality==this.Quality&&
-                addressDetails.OriginalValue==this.OriginalValue)
+            AddressValue? data = obj as AddressValue;
+            if (data == null) return false;
+            if (data.SN == this.SN &&
+                data.AddressName == this.AddressName &&
+                data.AddressAnotherName == this.AddressAnotherName &&
+                data.AddressPropertyName == this.AddressPropertyName &&
+                data.AddressDescribe == this.AddressDescribe &&
+                data.AddressDataType == this.AddressDataType &&
+                data.IsEnable == this.IsEnable &&
+                data.AddressType == this.AddressType&&
+                data?.AddressExtendParam?.ToString() == this?.AddressExtendParam?.ToString() &&
+
+                data.Value == this.Value&&
+                data.Quality==this.Quality&&
+                data.OriginalValue==this.OriginalValue&&
+                data.Time==this.Time)
             {
-                return true;
+                if (data.AddressParseParam == this.AddressParseParam)
+                {
+                    return true;
+                }
+                else
+                {
+                    if (data.AddressParseParam != null && this.AddressParseParam != null)
+                    {
+                        return data.AddressParseParam.Equals(this.AddressParseParam);
+                    }
+                    return false;
+                }
             }
             else
             {

+ 22 - 0
src/YSAI.DAQ/YSAI.Core/script/ScriptData.cs

@@ -5,6 +5,7 @@ using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
+using YSAI.Core.data;
 
 namespace YSAI.Core.script
 {
@@ -31,6 +32,27 @@ namespace YSAI.Core.script
             /// 脚本函数
             /// </summary>
             public string? ScriptFunction { get; set; }
+
+            /// <summary>
+            /// 重写Equals
+            /// </summary>
+            /// <param name="obj"></param>
+            /// <returns></returns>
+            public override bool Equals(object obj)
+            {
+                Basics? basics = obj as Basics;
+                if (basics == null) return false;
+                if (basics.ScriptType == this.ScriptType &&
+                    basics.ScriptCode == this.ScriptCode &&
+                    basics.ScriptFunction ==this.ScriptFunction)
+                {
+                    return true;
+                }
+                else
+                {
+                    return false;
+                }
+            }
         }
 
         /// <summary>

+ 2 - 2
src/YSAI.DAQ/YSAI.DB/DBOperate.cs

@@ -446,7 +446,7 @@ namespace YSAI.DB
                 string value = VAM.Read(addressDetails);
 
                 //处理
-                AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(addressDetails, value);
+                AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, value);
 
                 //添加进字典 
                 retData.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);
@@ -468,7 +468,7 @@ namespace YSAI.DB
                         string value = Convert.ToString(item[column]);
 
                         //处理
-                        AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(addressDetails, value);
+                        AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, value);
 
                         //添加进字典   哪个表的哪个字段    值
                         retData.AddOrUpdate(column, addressValue, (k, v) => addressValue);

+ 8 - 4
src/YSAI.DAQ/YSAI.Log/Base.cs

@@ -27,9 +27,6 @@ namespace YSAI.Log
         {
             try
             {
-#if DEBUG
-                Debug.WriteLine(info);
-#endif
                 //日期
                 string DATE = DateTime.Now.ToString("yyyy-MM-dd") + "\\";
                 //小时
@@ -42,7 +39,12 @@ namespace YSAI.Log
                 }
                 using (StreamWriter sw = new StreamWriter(PATH + (string.IsNullOrEmpty(filename) ? StaticData.LogFileName : filename), true, Encoding.UTF8))
                 {
-                    sw.WriteLine(DateTime.Now.ToString(StaticData.LogInfoTimeFormat) + $"|{type.ToString()}|" + info);
+                    string writeData = $"{DateTime.Now.ToString(StaticData.LogInfoTimeFormat)}|{type}|{info}";
+#if DEBUG
+                    Console.WriteLine(writeData);
+                    Debug.WriteLine(writeData);
+#endif
+                    sw.WriteLine(writeData);
                 }
             }
             catch
@@ -76,6 +78,8 @@ namespace YSAI.Log
         public void Dispose()
         {
             //释放内存
+            GC.Collect();
+            GC.SuppressFinalize(this);
         }
     }
 }

+ 5 - 1
src/YSAI.DAQ/YSAI.Log/Data.cs

@@ -44,6 +44,10 @@ namespace YSAI.Log
         /// <summary>
         /// 测试日志输出
         /// </summary>
-        Test
+        Test,
+        /// <summary>
+        /// 失败数据日志输出
+        /// </summary>
+        FailData
     }
 }

+ 21 - 1
src/YSAI.DAQ/YSAI.Log/LogHelper.cs

@@ -9,7 +9,27 @@ namespace YSAI.Log
 {
     public class LogHelper
     {
-        
+        /// <summary>
+        /// 日志Info输出
+        /// </summary>
+        /// <param name="Data"></param>
+        public static void FailData(string Data, string? filename = null)
+        {
+            try
+            {
+                using (Base LogShow = new Base())
+                {
+                    LogShow.Output(Data, DataType.FailData, filename);
+                }
+            }
+            catch (Exception ex)
+            {
+#if DEBUG
+                Console.WriteLine(ex.Message);
+                Debug.WriteLine(ex.Message);
+#endif
+            }
+        }
         /// <summary>
         /// 日志Info输出
         /// </summary>

+ 4 - 4
src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientOperate.cs

@@ -389,7 +389,7 @@ namespace YSAI.Modbus.client
                     }
 
                     //数据处理
-                    AddressValue addressValue = Core.data.AddressHandler.Execute(add, Value);
+                    AddressValue addressValue = Core.data.AddressHandler.ExecuteDispose(add, Value);
 
                     //数据添加
                     param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);
@@ -460,7 +460,7 @@ namespace YSAI.Modbus.client
                     }
 
                     //数据处理
-                    AddressValue addressValue = Core.data.AddressHandler.Execute(add, Value);
+                    AddressValue addressValue = Core.data.AddressHandler.ExecuteDispose(add, Value);
 
                     //数据添加
                     param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);
@@ -531,7 +531,7 @@ namespace YSAI.Modbus.client
                         }
                     }
                     //数据处理
-                    AddressValue addressValue = Core.data.AddressHandler.Execute(add, Value);
+                    AddressValue addressValue = Core.data.AddressHandler.ExecuteDispose(add, Value);
 
                     //数据添加
                     param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);
@@ -601,7 +601,7 @@ namespace YSAI.Modbus.client
                     }
 
                     //数据处理
-                    AddressValue addressValue = Core.data.AddressHandler.Execute(add, Value);
+                    AddressValue addressValue = Core.data.AddressHandler.ExecuteDispose(add, Value);
 
                     //数据添加
                     param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);

+ 3 - 3
src/YSAI.DAQ/YSAI.Opc/da/client/OpcDaClientOperate.cs

@@ -115,7 +115,7 @@ namespace YSAI.Opc.da.client
                         ConcurrentDictionary<string, AddressValue> param = new ConcurrentDictionary<string, AddressValue>();
 
                         //处理数据
-                        AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(addressDetails, item.Value.ToString());  //数据 
+                        AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, item.Value.ToString());  //数据 
 
                         //添加至集合
                         param.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);
@@ -664,7 +664,7 @@ namespace YSAI.Opc.da.client
                             string? Value = VAM.Read(item);
 
                             //数据处理
-                            AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(item, Value);
+                            AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(item, Value);
 
                             //数据添加
                             param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);
@@ -688,7 +688,7 @@ namespace YSAI.Opc.da.client
                                 string? Value = itemValue[i].Value.ToString();
 
                                 //数据处理
-                                AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(address.AddressArray[i], Value);
+                                AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(address.AddressArray[i], Value);
 
                                 //数据添加
                                 param.AddOrUpdate(itemValue[i].ItemName, addressValue, (k, v) => addressValue);

+ 3 - 3
src/YSAI.DAQ/YSAI.Opc/da/http/OpcDaHttpOperate.cs

@@ -276,7 +276,7 @@ namespace YSAI.Opc.da.http
                     {
                         string? Value = VAM.Read(addressDetails.AddressName);
 
-                        nodes.TryAdd(addressDetails.AddressName, YSAI.Core.data.AddressHandler.Execute(addressDetails, Value));
+                        nodes.TryAdd(addressDetails.AddressName, YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, Value));
                     }
                     else
                     {
@@ -305,13 +305,13 @@ namespace YSAI.Opc.da.http
                                 if (read.ReadGroup)  //直接读取组下面的数据
                                 {
                                     //处理
-                                    nodes.TryAdd(itemvalues.itemname, YSAI.Core.data.AddressHandler.Execute(addressDetails, Value));
+                                    nodes.TryAdd(itemvalues.itemname, YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, Value));
                                 }
                                 else  //读取单个节点数据
                                 {
                                     if (addressDetails.AddressName.Equals(itemvalues.itemname))
                                     {
-                                        nodes.TryAdd(itemvalues.itemname, YSAI.Core.data.AddressHandler.Execute(addressDetails, Value));
+                                        nodes.TryAdd(itemvalues.itemname, YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, Value));
                                     }
                                 }
                             }

+ 3 - 3
src/YSAI.DAQ/YSAI.Opc/ua/client/OpcUaClientOperate.cs

@@ -208,7 +208,7 @@ namespace YSAI.Opc.ua.client
                 //设置参数
                 ConcurrentDictionary<string, AddressValue> param = new ConcurrentDictionary<string, AddressValue>();
                 //处理数据
-                AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(addressDetails, notification.Value.ToString());  //数据 
+                AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, notification.Value.ToString());  //数据 
 
                 param.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);
 
@@ -1141,7 +1141,7 @@ namespace YSAI.Opc.ua.client
                         string? Value = VAM.Read(item);
 
                         //数据处理
-                        AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(item, Value);
+                        AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(item, Value);
 
                         //数据添加
                         param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);
@@ -1167,7 +1167,7 @@ namespace YSAI.Opc.ua.client
                             string? Value = read.Results[i].ToString();
 
                             //数据处理
-                            AddressValue addressValue = YSAI.Core.data.AddressHandler.Execute(addressDetails, Value);
+                            AddressValue addressValue = YSAI.Core.data.AddressHandler.ExecuteDispose(addressDetails, Value);
 
                             //数据添加
                             param.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);

+ 1 - 1
src/YSAI.DAQ/YSAI.S7/client/S7ClientOperate.cs

@@ -208,7 +208,7 @@ namespace YSAI.S7.client
                         }
 
                         //数据处理
-                        AddressValue addressValue = Core.data.AddressHandler.Execute(item, Value);
+                        AddressValue addressValue = Core.data.AddressHandler.ExecuteDispose(item, Value);
 
                         //数据添加
                         param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);