lixun 2 anos atrás
pai
commit
93145fd722

+ 21 - 19
src/YSAI.DAQ/YSAI.Core/data/AddressHandler.cs

@@ -3,12 +3,14 @@ using Microsoft.VisualBasic;
 using Newtonsoft.Json.Linq;
 using System;
 using System.Collections.Generic;
+using System.Dynamic;
 using System.Linq;
 using System.Reflection;
 using System.Text;
 using System.Threading.Tasks;
 using System.Xml.Linq;
 using YSAI.Core.@enum;
+using YSAI.Core.@interface.only;
 using YSAI.Core.reflection;
 using YSAI.Core.script;
 using YSAI.Log;
@@ -26,6 +28,10 @@ namespace YSAI.Core.data
         /// </summary>
         public static ReflectionOperate reflectionOperate = ReflectionOperate.Instance();
 
+        /// <summary>
+        /// 动态对象,用于转发失败存入本地记录
+        /// </summary>
+        public static dynamic DynamicObj = new ExpandoObject();
 
         /// <summary>
         /// 执行数据解析
@@ -144,13 +150,12 @@ namespace YSAI.Core.data
                     if (addressDetails.MqttRelay != null)
                     {
                         OperateResult? operateResult = reflectionOperate.ExecuteMethod(addressDetails.MqttRelay.ReflectionSN, new object[] { addressDetails.MqttRelay.Topic, value, addressDetails.MqttRelay.QoSLevel, addressDetails.MqttRelay.Retain }) as OperateResult;
-                        if (operateResult.State)
+                        if (!operateResult.State)
                         {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.Topic} ]转发状态:{operateResult.State}", logName);
-                        }
-                        else
-                        {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.Topic} ]转发状态:{operateResult.State},{operateResult.Message}", logName);
+                            DynamicObj.Param = addressDetails.MqttRelay;
+                            DynamicObj.State = operateResult.State;
+                            DynamicObj.Exception = operateResult.Message;
+                            LogHelper.Error(DynamicObj.ToJson(), logName);
                         }
                     }
 
@@ -158,28 +163,25 @@ namespace YSAI.Core.data
                     if (addressDetails.RabbitMQRelay != null)
                     {
                         OperateResult? operateResult = reflectionOperate.ExecuteMethod(addressDetails.RabbitMQRelay.ReflectionSN, new object[] { addressDetails.RabbitMQRelay.MessageHead, value, addressDetails.RabbitMQRelay.Type, addressDetails.RabbitMQRelay.Durable, addressDetails.RabbitMQRelay.Exclusive, addressDetails.RabbitMQRelay.AutoDelete }) as OperateResult;
-                        if (operateResult.State)
+                        if (!operateResult.State)
                         {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.RabbitMQRelay.MessageHead} ]转发状态:{operateResult.State}", logName);
-                        }
-                        else
-                        {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.RabbitMQRelay.MessageHead} ]转发状态:{operateResult.State},{operateResult.Message}", logName);
+                            DynamicObj.Param = addressDetails.RabbitMQRelay;
+                            DynamicObj.State = operateResult.State;
+                            DynamicObj.Exception = operateResult.Message;
+                            LogHelper.Error(DynamicObj.ToJson(), logName);
                         }
                     }
 
-
                     //Kafka转发
                     if (addressDetails.KafkaRelay != null)
                     {
                         OperateResult? operateResult = reflectionOperate.ExecuteMethod(addressDetails.KafkaRelay.ReflectionSN, new object[] { addressDetails.KafkaRelay.Topic, addressDetails.KafkaRelay.Key, value }) as OperateResult;
-                        if (operateResult.State)
-                        {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.KafkaRelay.Topic} ]转发状态:{operateResult.State}", logName);
-                        }
-                        else
+                        if (!operateResult.State)
                         {
-                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.KafkaRelay.Topic} ]转发状态:{operateResult.State},{operateResult.Message}", logName);
+                            DynamicObj.Param = addressDetails.KafkaRelay;
+                            DynamicObj.State = operateResult.State;
+                            DynamicObj.Exception = operateResult.Message;
+                            LogHelper.Error(DynamicObj.ToJson(), logName);
                         }
                     }
                 }

+ 13 - 0
src/YSAI.DAQ/YSAI.Core/data/packet/AddressPacket.cs

@@ -0,0 +1,13 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace YSAI.Core.data.packet
+{
+    /// <summary>
+    /// 地址数据包(发送)
+    /// </summary>
+    public class AddressPacket : AddressValue { }
+}

+ 28 - 0
src/YSAI.DAQ/YSAI.Core/data/packet/OperatePacket.cs

@@ -0,0 +1,28 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using YSAI.Core.@enum;
+
+namespace YSAI.Core.data.packet
+{
+    /// <summary>
+    /// 操作数据包(接收)
+    /// </summary>
+    public class OperatePacket
+    {
+        /// <summary>
+        /// 操作类型
+        /// </summary>
+        public OperateType OType { get; set; }
+        /// <summary>
+        /// 操作传入的参数
+        /// </summary>
+        public object[]? Param { get; set; }
+        /// <summary>
+        /// 时间
+        /// </summary>
+        public DateTime Time { get; set; }
+    }
+}

+ 32 - 0
src/YSAI.DAQ/YSAI.Core/data/packet/StatusPacket.cs

@@ -0,0 +1,32 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using YSAI.Core.@enum;
+
+namespace YSAI.Core.data.packet
+{
+    /// <summary>
+    /// 状态数据包(发送)
+    /// </summary>
+    public class StatusPacket
+    {
+        /// <summary>
+        /// 库的实例 唯一标识符
+        /// </summary>
+        public string? SN { get; set; }
+        /// <summary>
+        /// 消息
+        /// </summary>
+        public object Message { get; set; }
+        /// <summary>
+        /// 状态代码
+        /// </summary>
+        public StatusType SType { get; set; }
+        /// <summary>
+        /// 时间
+        /// </summary>
+        public DateTime Time { get; set; } = DateTime.Now.ToLocalTime();
+    }
+}

+ 55 - 1
src/YSAI.DAQ/YSAI.Core/enum/Enums.cs

@@ -228,5 +228,59 @@ namespace YSAI.Core.@enum
         [Description("转发库")]
         Relay
     }
-   
+
+    /// <summary>
+    /// 状态类型
+    /// </summary>
+    public enum StatusType
+    {
+        /// <summary>
+        /// 系统异常
+        /// </summary>
+        [Description("系统异常")]
+        SystemException,
+        /// <summary>
+        /// 采集异常
+        /// </summary>
+        [Description("采集异常")]
+        DaqLibException,
+        /// <summary>
+        /// 正常
+        /// </summary>
+        [Description("正常")]
+        OK,
+        /// <summary>
+        /// 未知
+        /// </summary>
+        [Description("未知")]
+        Unknown
+    }
+
+    /// <summary>
+    /// 操作
+    /// </summary>
+    public enum OperateType
+    {
+        /// <summary>
+        /// 读取
+        /// </summary>
+        [Description("读取")]
+        Read,
+        /// <summary>
+        /// 写入
+        /// </summary>
+        [Description("写入")]
+        Write,
+        /// <summary>
+        /// 打开
+        /// </summary>
+        [Description("打开")]
+        On,
+        /// <summary>
+        /// 关闭
+        /// </summary>
+        [Description("关闭")]
+        Off
+    }
+
 }

+ 61 - 55
src/YSAI.DAQ/YSAI.Core/subscribe/SubscribeOperate.cs

@@ -155,75 +155,81 @@ namespace YSAI.Core.subscription
                     lock (basics.Address)  //锁住不让其他操作
                     {
                         //执行委托
-                        OperateResult values = basics.Function?.Invoke(basics.Address);
-
-                        //完成后的数据复制
-                        OperateResult value = values;
-                        //判断数据类型
-                        switch (value.RType)
+                        OperateResult value = basics.Function?.Invoke(basics.Address);
+                        //状态判断
+                        if (value.State)
                         {
-                            case @enum.ResultType.KeyValue:
-                                ConcurrentDictionary<string, AddressValue>? RData = value.RData as ConcurrentDictionary<string, AddressValue>;
-                                //做流程处理
-                                if (basics.DataChangeOut)
-                                {
+                            //判断数据类型
+                            switch (value.RType)
+                            {
+                                case @enum.ResultType.KeyValue:
+                                    ConcurrentDictionary<string, AddressValue>? RData = value.RData as ConcurrentDictionary<string, AddressValue>;
+                                    //做流程处理
+                                    if (basics.DataChangeOut)
+                                    {
+                                        //实例化对象
+                                        if (UpParam == null)
+                                        {
+                                            UpParam = new ConcurrentDictionary<string, AddressValue>();
+                                        }
+                                        //空数据不做处理
+                                        if (RData != null && RData.Count > 0)
+                                        {
+                                            //获取到第一次数据,准备节点检测数据是否变化
+                                            if (!ConcurrentDictionaryEquals(UpParam, RData))
+                                            {
+                                                //当节点数据变化,有一项数据未变化,也把这未变项与变化项一同抛出,在特殊用途中,确保此批点位数据都存在
+                                                if (basics.SameDataOut)
+                                                {
+                                                    //抛出差异数据
+                                                    OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "存在变化数据", Params = RData, State = true });
+                                                }
+                                                else
+                                                {
+                                                    //如果不一致,就找寻里面不一样的 键、值
+                                                    ConcurrentDictionary<string, AddressValue> data = new ConcurrentDictionary<string, AddressValue>(RData.Except(UpParam).ToDictionary(x => x.Key, x => x.Value));
+                                                    //抛出差异数据
+                                                    OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "变化数据", Params = data, State = true });
+                                                }
+                                                //把这次新数据 赋值到历史数据中
+                                                UpParam = RData;
+                                            }
+                                        }
+                                    }
+                                    else
+                                    {
+                                        OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "实时数据", Params = RData, State = true });
+                                    }
+                                    break;
+                                case @enum.ResultType.KeyValueArray:
+                                    List<ConcurrentDictionary<string, AddressValue>>? RDataArray = value.RData as List<ConcurrentDictionary<string, AddressValue>>;
                                     //实例化对象
-                                    if (UpParam == null)
+                                    if (UpParamArray == null)
                                     {
-                                        UpParam = new ConcurrentDictionary<string, AddressValue>();
+                                        UpParamArray = new List<ConcurrentDictionary<string, AddressValue>>();
                                     }
                                     //空数据不做处理
-                                    if (RData != null && RData.Count > 0)
+                                    if (RDataArray != null && RDataArray.Count > 0)
                                     {
                                         //获取到第一次数据,准备节点检测数据是否变化
-                                        if (!ConcurrentDictionaryEquals(UpParam, RData))
+                                        if (!ConcurrentDictionaryEquals(UpParamArray, RDataArray))
                                         {
-                                            //当节点数据变化,有一项数据未变化,也把这未变项与变化项一同抛出,在特殊用途中,确保此批点位数据都存在
-                                            if (basics.SameDataOut)
+                                            foreach (var item in RDataArray)
                                             {
                                                 //抛出差异数据
-                                                OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "存在变化数据", Params = RData, State = true });
-                                            }
-                                            else
-                                            {
-                                                //如果不一致,就找寻里面不一样的 键、值
-                                                ConcurrentDictionary<string, AddressValue> data = new ConcurrentDictionary<string, AddressValue>(RData.Except(UpParam).ToDictionary(x => x.Key, x => x.Value));
-                                                //抛出差异数据
-                                                OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "变化数据", Params = data, State = true });
+                                                OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "存在变化数据", Params = item, State = true });
                                             }
                                             //把这次新数据 赋值到历史数据中
-                                            UpParam = RData;
-                                        }
-                                    }
-                                }
-                                else
-                                {
-                                    OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "实时数据", Params = RData, State = true });
-                                }
-                                break;
-                            case @enum.ResultType.KeyValueArray:
-                                List<ConcurrentDictionary<string, AddressValue>>? RDataArray = value.RData as List<ConcurrentDictionary<string, AddressValue>>;
-                                //实例化对象
-                                if (UpParamArray == null)
-                                {
-                                    UpParamArray = new List<ConcurrentDictionary<string, AddressValue>>();
-                                }
-                                //空数据不做处理
-                                if (RDataArray != null && RDataArray.Count > 0)
-                                {
-                                    //获取到第一次数据,准备节点检测数据是否变化
-                                    if (!ConcurrentDictionaryEquals(UpParamArray, RDataArray))
-                                    {
-                                        foreach (var item in RDataArray)
-                                        {
-                                            //抛出差异数据
-                                            OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = "存在变化数据", Params = item, State = true });
+                                            UpParamArray = RDataArray;
                                         }
-                                        //把这次新数据 赋值到历史数据中
-                                        UpParamArray = RDataArray;
                                     }
-                                }
-                                break;
+                                    break;
+                            }
+                        }
+                        else
+                        {
+                            //当状态为false 说明读取失败,写入日志
+                            OnEventHandler?.Invoke(this, new SubscribeData.EventParam() { Message = $"自定义订阅轮询异常:{value.Message}", State = false });
                         }
                     }
                 }

+ 13 - 0
src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientData.cs

@@ -53,9 +53,13 @@ namespace YSAI.Modbus.client
         /// </summary>
         public enum ProtocolType
         {
+            [Description("SerialPortParam")]
             Rtu,
+            [Description("SerialPortParam")]
             Ascii,
+            [Description("TcpParam")]
             Tcp,
+            [Description("UdpParam")]
             Udp
         }
         /// <summary>
@@ -268,12 +272,21 @@ namespace YSAI.Modbus.client
             [Description("写入超时时间")]
             public int WriteTimeOut { get; set; } = 2000;
 
+            /// <summary>
+            /// TCP参数
+            /// </summary>
             [Description("TCP参数")]
             public TcpParam? TcpParam { get; set; }
 
+            /// <summary>
+            /// UDP参数
+            /// </summary>
             [Description("UDP参数")]
             public UdpParam? UdpParam { get; set; }
 
+            /// <summary>
+            /// 串口参数
+            /// </summary>
             [Description("串口参数")]
             public SerialPortParam? SerialPortParam { get; set; }
 

+ 3 - 3
src/YSAI.DAQ/YSAI.Unility/EnumTool.cs

@@ -30,7 +30,7 @@ namespace YSAI.Unility
                 if (objArr != null && objArr.Length > 0)
                 {
                     DescriptionAttribute da = objArr[0] as DescriptionAttribute;
-                    m.Description = da.Description;
+                    m.Describe = da.Description;
                 }
                 m.Value = Convert.ToInt32(e);
                 m.Name = e.ToString();
@@ -92,7 +92,7 @@ namespace YSAI.Unility
                 if (objArr != null && objArr.Length > 0)
                 {
                     DescriptionAttribute da = objArr[0] as DescriptionAttribute;
-                    m.Description = da.Description;
+                    m.Describe = da.Description;
                 }
                 m.Value = Convert.ToInt32(e);
                 m.Name = e.ToString();
@@ -179,7 +179,7 @@ namespace YSAI.Unility
             /// <summary>  
             /// 枚举的描述  
             /// </summary>  
-            public string Description { set; get; }
+            public string Describe { set; get; }
         }
 
         /// <summary>