lixun 2 лет назад
Родитель
Сommit
446f64338e

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/data/Address.cs

@@ -16,7 +16,7 @@ namespace YSAI.Core.data
         /// <summary>
         /// 可以理解成唯一标识符(可以存机台号、组名、车间、厂)
         /// </summary>
-        public string SN { get; set; }
+        public string SN { get; set; } = Guid.NewGuid().ToString();   
         /// <summary>
         /// 所有地址 也可以是一个地址  此数组里面的地址应是唯一的
         /// </summary>
@@ -35,11 +35,11 @@ namespace YSAI.Core.data
         {
             if (Address != null && AddressAnotherName != null)  //地址别名都不为空
             {
-                return AddressArray?.Find(c => c.Address.Equals(Address) && c.AddressAnotherName.Equals(AddressAnotherName));
+                return AddressArray?.Find(c => c.AddressName.Equals(Address) && c.AddressAnotherName.Equals(AddressAnotherName));
             }
             else if (Address != null && AddressAnotherName == null) //地址不为空,别名为空
             {
-                return AddressArray?.Find(c => c.Address.Equals(Address));
+                return AddressArray?.Find(c => c.AddressName.Equals(Address));
             }
             else if (Address == null && AddressAnotherName != null)  //别名不为空,地址为空
             {

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

@@ -20,15 +20,11 @@ namespace YSAI.Core.data
         /// </summary>
         public string? SN { get; set; }
         /// <summary>
-        /// 点位地址
+        /// 实际的点位地址名称
         /// 是扩展数据时,可为空
         /// 不是扩展数据时,此项为PLC的地址
         /// </summary>
-        public string? Address { get; set; }
-        /// <summary>
-        /// 数据类型
-        /// </summary>
-        public DataType DataType { get; set; } = DataType.String;
+        public string? AddressName { get; set; }
         /// <summary>
         /// 地址别名
         /// </summary>
@@ -47,24 +43,23 @@ namespace YSAI.Core.data
         /// 地址数据解析   
         /// 此点位的数据是否需要通过指定类型来进行解析
         /// </summary>
-        public AddressParse? ParseParam { get; set; }
-        /// <summary>
-        /// 是否使用扩展
-        /// </summary>
-        public bool IsExtend { get; set; }
+        public AddressParse? AddressParseParam { get; set; }
         /// <summary>
         /// 指定通信的扩展数据
         /// </summary>
-        public object? Extend { get; set; }
+        public object? AddressExtendParam { get; set; }
         /// <summary>
         /// 是否启用
         /// </summary>
         public bool IsEnable { get; set; } = true;
         /// <summary>
+        /// 数据类型
+        /// </summary>
+        public DataType AddressDataType { get; set; } = DataType.String;
+        /// <summary>
         /// 地址类型,默认实际地址
         /// </summary>
         public AddressType AddressType { get; set; } = AddressType.Reality;
-
         /// <summary>
         /// 重写Equals
         /// </summary>
@@ -74,12 +69,11 @@ namespace YSAI.Core.data
         {
             AddressDetails? addressDetails = obj as AddressDetails;
             if (addressDetails == null) return false;
-            if (addressDetails.Address == this.Address &&
+            if (addressDetails.AddressName == this.AddressName &&
                 addressDetails.AddressAnotherName == this.AddressAnotherName &&
                 addressDetails.AddressPropertyName == this.AddressPropertyName &&
                 addressDetails.AddressDescribe == this.AddressDescribe &&
-                addressDetails.IsExtend == this.IsExtend &&
-                addressDetails.DataType == this.DataType&&
+                addressDetails.AddressDataType == this.AddressDataType&&
                 addressDetails.IsEnable == this.IsEnable&&
                 addressDetails.AddressType == this.AddressType)
             {

+ 5 - 7
src/YSAI.DAQ/YSAI.Core/data/AddressValue.cs

@@ -38,11 +38,10 @@ namespace YSAI.Core.data
             this.SN = addressDetails.SN;
             this.AddressPropertyName = addressDetails.AddressPropertyName;
             this.AddressDescribe = addressDetails.AddressDescribe;
-            this.ParseParam = addressDetails.ParseParam;
-            this.IsExtend = addressDetails.IsExtend;
-            this.Extend = addressDetails.Extend;
+            this.AddressParseParam = addressDetails.AddressParseParam;
+            this.AddressExtendParam = addressDetails.AddressExtendParam;
             this.MqttRelay = addressDetails.MqttRelay;
-            this.DataType = addressDetails.DataType;
+            this.AddressDataType = addressDetails.AddressDataType;
             this.AddressType = addressDetails.AddressType;
             return this;
         }
@@ -57,12 +56,11 @@ namespace YSAI.Core.data
         {
             AddressValue? addressDetails = obj as AddressValue;
             if (addressDetails == null) return false;
-            if (addressDetails.Address == this.Address &&
+            if (addressDetails.AddressName == this.AddressName &&
                 addressDetails.AddressAnotherName == this.AddressAnotherName &&
                 addressDetails.AddressPropertyName == this.AddressPropertyName &&
                 addressDetails.AddressDescribe == this.AddressDescribe &&
-                addressDetails.IsExtend == this.IsExtend &&
-                addressDetails.DataType == this.DataType &&
+                addressDetails.AddressDataType == this.AddressDataType &&
                 addressDetails.IsEnable == this.IsEnable &&
                 addressDetails.AddressType == this.AddressType &&
                 addressDetails.Value == this.Value&&

+ 8 - 8
src/YSAI.DAQ/YSAI.Core/data/Dispose.cs

@@ -49,7 +49,7 @@ namespace YSAI.Core.data
 
                 //最终数据组织
                 AddressValue addressValue = new AddressValue().SET(addressDetails);
-                addressValue.Address = addressDetails.Address;
+                addressValue.AddressName = addressDetails.AddressName;
                 addressValue.Value = value;
                 addressValue.OriginalValue = originalValue;
                 addressValue.Time = DateTime.Now;
@@ -86,19 +86,19 @@ namespace YSAI.Core.data
         {
             //最新值
             string NewValue = value;
-            if (addressDetails.ParseParam != null)
+            if (addressDetails.AddressParseParam != null)
             {
                 try
                 {
-                    switch (addressDetails.ParseParam.ParseType)
+                    switch (addressDetails.AddressParseParam.ParseType)
                     {
                         case ParseType.MethodAnalysis:
-                            NewValue = reflectionOperate.ExecuteMethod(addressDetails.ParseParam.ReflectionSN, new object[] { value }).ToString();
+                            NewValue = reflectionOperate.ExecuteMethod(addressDetails.AddressParseParam.ReflectionSN, new object[] { value }).ToString();
                             break;
                         case ParseType.ScriptAnalysis:
-                            using (ScriptOperate scriptOperate = new ScriptOperate(addressDetails.ParseParam.Script))  //通过脚本解析
+                            using (ScriptOperate scriptOperate = new ScriptOperate(addressDetails.AddressParseParam.Script))  //通过脚本解析
                             {
-                                OperateResult operateResult = scriptOperate.Execute(addressDetails.ParseParam.Script.ScriptType, addressDetails.ParseParam.Script.ScriptCode, addressDetails.ParseParam.Script.ScriptFunction, value);
+                                OperateResult operateResult = scriptOperate.Execute(addressDetails.AddressParseParam.Script.ScriptType, addressDetails.AddressParseParam.Script.ScriptCode, addressDetails.AddressParseParam.Script.ScriptFunction, value);
                                 if (operateResult.State)
                                 {
                                     NewValue = operateResult.RData.ToString();
@@ -138,11 +138,11 @@ namespace YSAI.Core.data
                         OperateResult? operateResult = (reflectionOperate.ExecuteMethod(addressDetails.MqttRelay.ReflectionSN, new object[] { addressDetails.MqttRelay.TopicName, value, addressDetails.MqttRelay.QoSLevel, addressDetails.MqttRelay.Retain }) as Task<OperateResult>).Result;
                         if (operateResult.State)
                         {
-                            LogHelper.Info($"[ {addressDetails.Address} ][ {addressDetails.MqttRelay.TopicName} ]地址数据转发状态:{operateResult.State}");
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.TopicName} ]地址数据转发状态:{operateResult.State}");
                         }
                         else
                         {
-                            LogHelper.Info($"[ {addressDetails.Address} ][ {addressDetails.MqttRelay.TopicName} ]地址数据转发状态:{operateResult.State},{operateResult.Message}");
+                            LogHelper.Info($"[ {addressDetails.AddressName} ][ {addressDetails.MqttRelay.TopicName} ]地址数据转发状态:{operateResult.State},{operateResult.Message}");
                         }
                     }
                 }

+ 1 - 1
src/YSAI.DAQ/YSAI.Core/subscribe/SubscribeOperate.cs

@@ -288,7 +288,7 @@ namespace YSAI.Core.subscription
                         //移除不需要的节点订阅
                         if (basics.Address.AddressArray.RemoveAll(e => e.Equals(item)).Equals(0))
                         {
-                            FillMessage.Add($"[ {item.Address} ]取消订阅失败");
+                            FillMessage.Add($"[ {item.AddressName} ]取消订阅失败");
                         }
                     }
                 }

+ 3 - 3
src/YSAI.DAQ/YSAI.Core/virtualAddress/VirtualAddressManage.cs

@@ -91,7 +91,7 @@ namespace YSAI.Core.virtualAddress
             //判断是不是虚拟点
             if (IsVirtualAddress(details))
             {
-                SetVirtualAddress(new VirtualAddressData() { AddressName = details.Address, DataType = details.DataType, Dynamic = details.AddressType.Equals(AddressType.VirtualDynamic) ? true : false });
+                SetVirtualAddress(new VirtualAddressData() { AddressName = details.AddressName, DataType = details.AddressDataType, Dynamic = details.AddressType.Equals(AddressType.VirtualDynamic) ? true : false });
                 IsVA = true;
             }
             else
@@ -124,7 +124,7 @@ namespace YSAI.Core.virtualAddress
         /// </summary>
         public string? Read(AddressDetails details)
         {
-            VirtualAddress? virtualAddress = GetVirtualAddress(details.Address);
+            VirtualAddress? virtualAddress = GetVirtualAddress(details.AddressName);
             if (virtualAddress != null)
             {
                return virtualAddress.Read();
@@ -149,7 +149,7 @@ namespace YSAI.Core.virtualAddress
         /// </summary>
         public bool Write(AddressDetails details, string Value)
         {
-            VirtualAddress? virtualAddress = GetVirtualAddress(details.Address);
+            VirtualAddress? virtualAddress = GetVirtualAddress(details.AddressName);
             if (virtualAddress != null)
             {
                 return virtualAddress.Write(Value);

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

@@ -447,7 +447,7 @@ namespace YSAI.DB
                 AddressValue addressValue = YSAI.Core.data.Dispose.Execute(addressDetails, value);
 
                 //添加进字典 
-                retData.AddOrUpdate(addressDetails.Address, addressValue, (k, v) => addressValue);
+                retData.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);
 
                 //添加到字典集合
                 retDatas.Add(retData);
@@ -642,15 +642,15 @@ namespace YSAI.DB
                     }
                     else
                     {
-                        ExtendParam.Read read = item.Extend as ExtendParam.Read;
+                        ExtendParam.Read read = item.AddressExtendParam as ExtendParam.Read;
                         if (read == null)
                         {
-                            read = JsonTool.StringToJsonEntity<ExtendParam.Read>(item.Extend.ToString());
+                            read = JsonTool.StringToJsonEntity<ExtendParam.Read>(item.AddressExtendParam.ToString());
                         }
                         //列名
                         List<string> ColumnName = read.ColumnName;
                         //组织sql
-                        string sql = (item.Extend as ExtendParam.Read).Sql;
+                        string sql = (item.AddressExtendParam as ExtendParam.Read).Sql;
                         //查询结果对象
                         object obj = null;
                         try

+ 40 - 8
src/YSAI.DAQ/YSAI.Modbus/client/ModbusClientOperate.cs

@@ -340,11 +340,15 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.ReadCoils").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("ReadCoils", false, $"未连接");
+                }
                 //节点数据
                 ConcurrentDictionary<string, AddressValue> param = new ConcurrentDictionary<string, AddressValue>();
                 foreach (var add in address.AddressArray)
                 {
-                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.Address);
+                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.AddressName);
                     bool[] retvalue = modbusMaster.ReadInputs((byte)basics.SlaveAddress, (ushort)Dvalue.startAddress, (ushort)Dvalue.numberOfPoints);
                     string? value = string.Empty;
                     if (retvalue.Length > 1)
@@ -367,7 +371,7 @@ namespace YSAI.Modbus.client
                     AddressValue addressValue = Core.data.Dispose.Execute(add, value);
 
                     //数据添加
-                    param.AddOrUpdate(add.Address, addressValue, (k, v) => addressValue);
+                    param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);
 
                 }
                 if (param.Count > 0)
@@ -394,11 +398,15 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.ReadInputs").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("ReadInputs", false, $"未连接");
+                }
                 //节点数据
                 ConcurrentDictionary<string, AddressValue> param = new ConcurrentDictionary<string, AddressValue>();
                 foreach (var add in address.AddressArray)
                 {
-                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.Address);
+                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.AddressName);
                     bool[] retvalue = modbusMaster.ReadInputs((byte)basics.SlaveAddress, (ushort)Dvalue.startAddress, (ushort)Dvalue.numberOfPoints);
                     string? value = string.Empty;
                     if (retvalue.Length > 1)
@@ -420,7 +428,7 @@ namespace YSAI.Modbus.client
                     AddressValue addressValue = Core.data.Dispose.Execute(add, value);
 
                     //数据添加
-                    param.AddOrUpdate(add.Address, addressValue, (k, v) => addressValue);
+                    param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);
 
                 }
                 if (param.Count > 0)
@@ -447,11 +455,15 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.ReadHoldingRegisters").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("ReadHoldingRegisters", false, $"未连接");
+                }
                 //节点数据
                 ConcurrentDictionary<string, AddressValue> param = new ConcurrentDictionary<string, AddressValue>();
                 foreach (var add in address.AddressArray)
                 {
-                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.Address);
+                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.AddressName);
                     ushort[] retvalue = modbusMaster.ReadHoldingRegisters((byte)basics.SlaveAddress, (ushort)Dvalue.startAddress, (ushort)Dvalue.numberOfPoints);
                     string? value = string.Empty;
                     if (retvalue.Length > 1)
@@ -473,7 +485,7 @@ namespace YSAI.Modbus.client
                     AddressValue addressValue = Core.data.Dispose.Execute(add, value);
 
                     //数据添加
-                    param.AddOrUpdate(add.Address, addressValue, (k, v) => addressValue);
+                    param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);
                 }
                 if (param.Count > 0)
                 {
@@ -499,11 +511,15 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.ReadInputRegisters").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("ReadInputRegisters", false, $"未连接");
+                }
                 //节点数据
                 ConcurrentDictionary<string, AddressValue> param = new ConcurrentDictionary<string, AddressValue>();
                 foreach (var add in address.AddressArray)
                 {
-                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.Address);
+                    (int startAddress, int numberOfPoints) Dvalue = DisposeAddress(add.AddressName);
                     ushort[] retvalue = modbusMaster.ReadInputRegisters((byte)basics.SlaveAddress, (ushort)Dvalue.startAddress, (ushort)Dvalue.numberOfPoints);
                     string? value = string.Empty;
                     if (retvalue.Length > 1)
@@ -526,7 +542,7 @@ namespace YSAI.Modbus.client
                     AddressValue addressValue = Core.data.Dispose.Execute(add, value);
 
                     //数据添加
-                    param.AddOrUpdate(add.Address, addressValue, (k, v) => addressValue);
+                    param.AddOrUpdate(add.AddressName, addressValue, (k, v) => addressValue);
                 }
                 if (param.Count > 0)
                 {
@@ -552,6 +568,10 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.WriteSingleCoil").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("WriteSingleCoil", false, $"未连接");
+                }
                 foreach (var item in Values)
                 {
                     modbusMaster.WriteSingleCoil((byte)basics.SlaveAddress, item.Key, item.Value);
@@ -575,6 +595,10 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.WriteSingleRegister").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("WriteSingleRegister", false, $"未连接");
+                }
                 foreach (var item in Values)
                 {
                     modbusMaster.WriteSingleRegister((byte)basics.SlaveAddress, item.Key, item.Value);
@@ -598,6 +622,10 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.WriteMultipleRegisters").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("WriteMultipleRegisters", false, $"未连接");
+                }
                 foreach (var item in Values)
                 {
                     modbusMaster.WriteMultipleRegisters((byte)basics.SlaveAddress, item.Key, item.Value);
@@ -621,6 +649,10 @@ namespace YSAI.Modbus.client
             RunTimeTool.Instance($"{ClassName}.WriteMultipleCoils").StartRecord();
             try
             {
+                if (modbusMaster == null)
+                {
+                    return Break("WriteMultipleCoils", false, $"未连接");
+                }
                 foreach (var item in Values)
                 {
                     modbusMaster.WriteMultipleCoils((byte)basics.SlaveAddress, item.Key, item.Value);

+ 2 - 2
src/YSAI.DAQ/YSAI.Mqtt/service/websocket/MqttWebSocketServiceData.cs

@@ -37,7 +37,7 @@ namespace YSAI.Mqtt.service.websocket
             /// <summary>
             /// 地址
             /// </summary>
-            public string? Address { get; set; }
+            public string? Uri { get; set; }
 
             /// <summary>
             /// 重写基类中的Equals方法
@@ -61,7 +61,7 @@ namespace YSAI.Mqtt.service.websocket
                     LoginPassword == Obj.LoginPassword &&
                     Port == Obj.Port &&
                     HttpPort == Obj.HttpPort &&
-                    Address == Obj.Address)
+                    Uri == Obj.Uri)
                     {
                         return true;
                     }

+ 2 - 2
src/YSAI.DAQ/YSAI.Mqtt/service/websocket/MqttWebSocketServiceOperate.cs

@@ -249,7 +249,7 @@ namespace YSAI.Mqtt.service.websocket
                         endpoints =>
                         {
                             endpoints.MapConnectionHandler<MqttConnectionHandler>(
-                                mqttServiceData_Static.Address,  //指定地址
+                                mqttServiceData_Static.Uri,  //指定地址
                                 httpConnectionDispatcherOptions => httpConnectionDispatcherOptions.WebSockets.SubProtocolSelector = protocolList => protocolList.FirstOrDefault() ?? string.Empty);
                         });
 
@@ -272,7 +272,7 @@ namespace YSAI.Mqtt.service.websocket
 
 
                     OnEventHandler?.Invoke(this, new Event() { Message = $"{LogHead_Static} MQTT 服务端地址 ( 127.0.0.1:{mqttServiceData_Static.Port} )", Step = Steps.系统信息 });
-                    OnEventHandler?.Invoke(this, new Event() { Message = $"{LogHead_Static} MQTT WebSocket 服务端地址 ( ws://127.0.0.1:{mqttServiceData_Static.HttpPort}/{mqttServiceData_Static.Address} )", Step = Steps.系统信息 });
+                    OnEventHandler?.Invoke(this, new Event() { Message = $"{LogHead_Static} MQTT WebSocket 服务端地址 ( ws://127.0.0.1:{mqttServiceData_Static.HttpPort}/{mqttServiceData_Static.Uri} )", Step = Steps.系统信息 });
                 }
                 catch (Exception ex)
                 {

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

@@ -117,7 +117,7 @@ namespace YSAI.Opc.da.client
                         AddressValue addressValue = YSAI.Core.data.Dispose.Execute(addressDetails, item.Value.ToString());  //数据 
 
                         //添加至集合
-                        param.AddOrUpdate(addressDetails.Address, addressValue, (k, v) => addressValue);
+                        param.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);
 
                         //响应
                         OnEventHandler?.Invoke(this, new OpcDaClientData.EventParam() { Message = $"点位数据更新", State = true, Params = param });
@@ -164,7 +164,7 @@ namespace YSAI.Opc.da.client
         {
             if (AddressArray.ContainsKey(GroupName))
             {
-               return AddressArray[GroupName].FirstOrDefault(c => c.Address.Equals(AddressName));
+               return AddressArray[GroupName].FirstOrDefault(c => c.AddressName.Equals(AddressName));
             }
             return null;
         }
@@ -181,7 +181,7 @@ namespace YSAI.Opc.da.client
                 {
                     for (int ic = 0; ic < AddressArray.ElementAt(i).Value.Count; ic++)
                     {
-                        if (AddressArray.ElementAt(i).Value[i].Address.Equals(AddressName))
+                        if (AddressArray.ElementAt(i).Value[i].AddressName.Equals(AddressName))
                         {
                             AddressArray.ElementAt(i).Value.RemoveAt(i);
                             break;
@@ -197,7 +197,7 @@ namespace YSAI.Opc.da.client
                     {
                         for (int ic = 0; ic < AddressArray.ElementAt(i).Value.Count; ic++)
                         {
-                            if (AddressArray.ElementAt(i).Value[i].Address.Equals(AddressName))
+                            if (AddressArray.ElementAt(i).Value[i].AddressName.Equals(AddressName))
                             {
                                 AddressArray.ElementAt(i).Value.RemoveAt(i);
                                 break;
@@ -313,16 +313,16 @@ namespace YSAI.Opc.da.client
                         {
                             if (keyValuePair.Value.Item2.Count > 0)
                             {
-                                if (!keyValuePair.Value.Item2.Exists(c => c.ItemName.Equals(address.AddressArray[i].Address)))
+                                if (!keyValuePair.Value.Item2.Exists(c => c.ItemName.Equals(address.AddressArray[i].AddressName)))
                                 {
-                                    items[i] = new Item() { ItemName = address.AddressArray[i].Address };
+                                    items[i] = new Item() { ItemName = address.AddressArray[i].AddressName };
                                     ItemState = true;
                                     AddAddressData(GroupName, address.AddressArray[i]);
                                 }
                             }
                             else
                             {
-                                items[i] = new Item() { ItemName = address.AddressArray[i].Address };
+                                items[i] = new Item() { ItemName = address.AddressArray[i].AddressName };
                                 ItemState = true;
                                 AddAddressData(GroupName, address.AddressArray[i]);
                             }
@@ -640,11 +640,11 @@ namespace YSAI.Opc.da.client
                             AddressValue addressValue = YSAI.Core.data.Dispose.Execute(item, Value);
 
                             //数据添加
-                            param.AddOrUpdate(item.Address, addressValue, (k, v) => addressValue);
+                            param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);
                         }
                         else
                         {
-                            items.Add(new Item() { ItemName = item.Address });
+                            items.Add(new Item() { ItemName = item.AddressName });
                         }
                     }
 

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

@@ -273,17 +273,17 @@ namespace YSAI.Opc.da.http
 
                     if (IsVA)
                     {
-                        string? Value = VAM.Read(addressDetails.Address);
+                        string? Value = VAM.Read(addressDetails.AddressName);
 
-                        nodes.TryAdd(addressDetails.Address, YSAI.Core.data.Dispose.Execute(addressDetails, Value));
+                        nodes.TryAdd(addressDetails.AddressName, YSAI.Core.data.Dispose.Execute(addressDetails, Value));
                     }
                     else
                     {
                         //去扩展里面取数据
-                        OpcDaHttpData.ExtendParam.Read read = addressDetails.Extend as OpcDaHttpData.ExtendParam.Read;
+                        OpcDaHttpData.ExtendParam.Read read = addressDetails.AddressExtendParam as OpcDaHttpData.ExtendParam.Read;
                         if (read == null)
                         {
-                            read = JsonTool.StringToJsonEntity<OpcDaHttpData.ExtendParam.Read>(addressDetails.Extend.ToString());
+                            read = JsonTool.StringToJsonEntity<OpcDaHttpData.ExtendParam.Read>(addressDetails.AddressExtendParam.ToString());
                         }
                         //先去判断当前连接的状态
                         OperateResult param = Request((int)OpcDaHttpData.RequestMethod.ReqGetConnectStatusOfOPC, new ReqGetConnectStatusOfOPC.Request() { opcname = read.ServerName });
@@ -308,7 +308,7 @@ namespace YSAI.Opc.da.http
                                 }
                                 else  //读取单个节点数据
                                 {
-                                    if (addressDetails.Address.Equals(itemvalues.itemname))
+                                    if (addressDetails.AddressName.Equals(itemvalues.itemname))
                                     {
                                         nodes.TryAdd(itemvalues.itemname, YSAI.Core.data.Dispose.Execute(addressDetails, Value));
                                     }

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

@@ -204,7 +204,7 @@ namespace YSAI.Opc.ua.client
                 //处理数据
                 AddressValue addressValue = YSAI.Core.data.Dispose.Execute(addressDetails, notification.Value.ToString());  //数据 
 
-                param.AddOrUpdate(addressDetails.Address, addressValue, (k, v) => addressValue);
+                param.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);
 
                 //响应
                 OnEventParamHandler?.Invoke(this, new EventParam() { Message = $"点位数据更新", Step = Steps.订阅通知事件, State = true, Params = param });
@@ -219,7 +219,7 @@ namespace YSAI.Opc.ua.client
         /// <summary>
         /// 从服务器读取值节点
         /// </summary>
-        private async Task<DataValue> ReadNode(NodeId nodeId)
+        private DataValue ReadNode(NodeId nodeId)
         {
             ReadValueIdCollection nodesToRead = new ReadValueIdCollection
             {
@@ -231,11 +231,11 @@ namespace YSAI.Opc.ua.client
             };
 
             // 读取当前值
-            ReadResponse readResponse = await clientSession.ReadAsync(
+            ReadResponse readResponse =  clientSession.ReadAsync(
                 null,
                 0,
                 TimestampsToReturn.Neither,
-                nodesToRead, new CancellationToken());
+                nodesToRead, new CancellationToken()).Result;
 
             return readResponse.Results[0];
         }
@@ -299,11 +299,11 @@ namespace YSAI.Opc.ua.client
         /// <summary>
         /// 获取树节点图片类型
         /// </summary>
-        public async Task<string> GetNodeIconType(ReferenceDescription target, NodeId sourceId)
+        public string GetNodeIconType(ReferenceDescription target, NodeId sourceId)
         {
             if (target.NodeClass == NodeClass.Variable)
             {
-                DataValue dataValue = await ReadNode((NodeId)target.NodeId);
+                DataValue dataValue = ReadNode((NodeId)target.NodeId);
 
                 if (dataValue.WrappedValue.TypeInfo != null)
                 {
@@ -355,7 +355,7 @@ namespace YSAI.Opc.ua.client
         /// </summary>
         /// <param name="nodeIds"></param>
         /// <returns></returns>
-        public async Task<DataValue[]> DetailedReadAllNodeData(List<NodeId> nodeIds)
+        public DataValue[] DetailedReadAllNodeData(List<NodeId> nodeIds)
         {
             ReadValueIdCollection nodesToRead = new ReadValueIdCollection();
             foreach (var nodeId in nodeIds)
@@ -387,11 +387,7 @@ namespace YSAI.Opc.ua.client
                     AttributeId = Attributes.Description
                 });
             }
-
-            // read all values.
-            ReadResponse readResponse = await Task.Run(() => { return clientSession?.ReadAsync(null, 0, TimestampsToReturn.Neither, nodesToRead, new CancellationToken()); });
-
-            return readResponse.Results.ToArray();
+            return clientSession?.ReadAsync(null, 0, TimestampsToReturn.Neither, nodesToRead, new CancellationToken()).Result.Results.ToArray();
         }
 
         /// <summary>
@@ -674,10 +670,10 @@ namespace YSAI.Opc.ua.client
         /// <summary>
         /// 获取指定节点的数据类型
         /// </summary>
-        public async Task<BuiltInType> GetNodeValueType(NodeId nodeId)
+        public BuiltInType GetNodeValueType(NodeId nodeId)
         {
             ///得到数据类型
-            DataValue[] dataValues = await DetailedReadAllNodeData(new List<NodeId> { nodeId });
+            DataValue[] dataValues = DetailedReadAllNodeData(new List<NodeId> { nodeId });
             if (dataValues[1].WrappedValue.TypeInfo != null)
             {
                 return dataValues[1].WrappedValue.TypeInfo.BuiltInType;
@@ -698,10 +694,15 @@ namespace YSAI.Opc.ua.client
         public override string LogHead => "[ OpcUaClientOperate 操作 ]";
         public override string ClassName => "OpcUaClientOperate";
 
-        public async Task<OperateResult> AddSubscribeAsync(ConcurrentDictionary<string, List<AddressDetails>> param, byte Priority = 100)
+        public Task<OperateResult> AddSubscribeAsync(ConcurrentDictionary<string, List<AddressDetails>> param, byte Priority = 100)
+        {
+            return Task.Run(()=> AddSubscribe(param,Priority));
+        }
+
+        public OperateResult AddSubscribe(ConcurrentDictionary<string, List<AddressDetails>> param, byte Priority = 100)
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.AddSubscribe").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.AddSubscribe").StartRecord();
             try
             {
                 if (!IsConnected)
@@ -740,7 +741,7 @@ namespace YSAI.Opc.ua.client
                                     //节点与键对应
                                     foreach (var item in alls.Value.MonitoredItems)
                                     {
-                                        if (item.StartNodeId.ToString().Equals(Nodes[i].Address))
+                                        if (item.StartNodeId.ToString().Equals(Nodes[i].AddressName))
                                         {
                                             //存在此节点,则移除此节点
                                             Nodes.Remove(Nodes[i]);
@@ -751,7 +752,7 @@ namespace YSAI.Opc.ua.client
                             if (Nodes.Count > 0)
                             {
                                 //先在会话中,移除这个订阅
-                                if (!await clientSession?.RemoveSubscriptionAsync(allSubscriptions[Tag]))
+                                if (!clientSession.RemoveSubscriptionAsync(allSubscriptions[Tag]).Result)
                                 {
                                     //如果从会话中异常订阅失败则直接跳出
                                     return Break("AddSubscribe", false, "从会话中移除订阅失败");
@@ -767,9 +768,9 @@ namespace YSAI.Opc.ua.client
                                 if (!item.IsEnable) continue;
 
                                 MonitoredItem intMonitoredItem = new MonitoredItem(allSubscriptions[Tag].DefaultItem);
-                                intMonitoredItem.StartNodeId = new NodeId(item.Address);  //标识要监视的节点的浏览路径的开始节点
+                                intMonitoredItem.StartNodeId = new NodeId(item.AddressName);  //标识要监视的节点的浏览路径的开始节点
                                 intMonitoredItem.AttributeId = Attributes.Value;  //要监视的属性
-                                intMonitoredItem.DisplayName = item.Address;  //被监控项的显示名称
+                                intMonitoredItem.DisplayName = item.AddressName;  //被监控项的显示名称
                                 intMonitoredItem.SamplingInterval = opcUaData.SamplingInterval;  //采样间隔
                                 intMonitoredItem.Notification += async delegate (MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e) { OnMonitoredItemNotification(monitoredItem, e, item); };  //重写事件添加一个参数
 
@@ -779,7 +780,7 @@ namespace YSAI.Opc.ua.client
                             if (Nodes.Count > 0)
                             {
                                 //不在主线程中实现
-                                await Task.Run(async () =>
+                                Task.Run(async () =>
                                 {
                                     //添加订阅
                                     clientSession?.AddSubscription(allSubscriptions[Tag]);
@@ -787,7 +788,7 @@ namespace YSAI.Opc.ua.client
                                     await allSubscriptions[Tag].CreateAsync();
                                     // 在服务器端创建监控项
                                     await allSubscriptions[Tag].ApplyChangesAsync();
-                                });
+                                }).Wait();
                             }
                         }
                         else
@@ -809,15 +810,15 @@ namespace YSAI.Opc.ua.client
                                 if (!item.IsEnable) continue;
 
                                 MonitoredItem intMonitoredItem = new MonitoredItem(subscription.DefaultItem);
-                                intMonitoredItem.StartNodeId = new NodeId(item.Address);  //标识要监视的节点的浏览路径的开始节点
+                                intMonitoredItem.StartNodeId = new NodeId(item.AddressName);  //标识要监视的节点的浏览路径的开始节点
                                 intMonitoredItem.AttributeId = Attributes.Value;  //要监视的属性
-                                intMonitoredItem.DisplayName = item.Address;  //被监控项的显示名称
+                                intMonitoredItem.DisplayName = item.AddressName;  //被监控项的显示名称
                                 intMonitoredItem.SamplingInterval = opcUaData.SamplingInterval;  //采样间隔
                                 intMonitoredItem.Notification += async delegate (MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e) { OnMonitoredItemNotification(monitoredItem, e, item); };  //重写事件添加一个参数
                                 subscription.AddItem(intMonitoredItem);   //添加订阅通知项
                             }
                             //不在主线程中实现
-                            await Task.Run(async () =>
+                            Task.Run(async () =>
                             {
                                 //添加订阅
                                 clientSession?.AddSubscription(subscription);
@@ -825,7 +826,7 @@ namespace YSAI.Opc.ua.client
                                 await subscription.CreateAsync();
                                 // 在服务器端创建监控项
                                 await subscription.ApplyChangesAsync();
-                            });
+                            }).Wait();
                             //把此订阅添加到集合,方便后续移除订阅(当存在此键则更新值,不存在则添加)
                             allSubscriptions?.AddOrUpdate(Tag, subscription, (k, v) => subscription);
                         }
@@ -845,15 +846,15 @@ namespace YSAI.Opc.ua.client
             }
         }
 
-        public OperateResult AddSubscribe(ConcurrentDictionary<string, List<AddressDetails>> param, byte Priority = 100)
+        public Task<OperateResult> RemoveSubscribeAsync(List<AddressDetails> Nodes)
         {
-            return AddSubscribeAsync(param, Priority).Result;
+            return Task.Run(() => RemoveSubscribe(Nodes));
         }
 
-        public async Task<OperateResult> RemoveSubscribeAsync(List<AddressDetails> Nodes)
+        public OperateResult RemoveSubscribe(List<AddressDetails> Nodes)
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.RemoveSubscribe").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.RemoveSubscribe").StartRecord();
             try
             {
                 if (!IsConnected)
@@ -869,7 +870,7 @@ namespace YSAI.Opc.ua.client
                         //节点与键对应
                         foreach (var item in alls.Value.MonitoredItems)
                         {
-                            if (item.StartNodeId.ToString().Equals(node.Address))
+                            if (item.StartNodeId.ToString().Equals(node.AddressName))
                             {
                                 if (monitored == null)
                                 {
@@ -889,7 +890,7 @@ namespace YSAI.Opc.ua.client
                                 {
                                     if (alls2.Key.Equals(alls.Key))
                                     {
-                                        await Task.Run(() => { clientSession?.RemoveSubscriptionAsync(alls.Value); });
+                                        clientSession?.RemoveSubscriptionAsync(alls.Value).Wait();
                                         //移除后立马跳到上一级,防止性能消耗
                                         break;
                                     }
@@ -902,7 +903,6 @@ namespace YSAI.Opc.ua.client
                         }
                     }
                 }
-
                 return Break("RemoveSubscribe", true);
             }
             catch (Exception ex)
@@ -911,15 +911,15 @@ namespace YSAI.Opc.ua.client
             }
         }
 
-        public OperateResult RemoveSubscribe(List<AddressDetails> Nodes)
+        public Task<OperateResult> DeleteNodeAsync(string Key)
         {
-            return RemoveSubscribeAsync(Nodes).Result;
+            return Task.Run(()=> DeleteNode(Key));
         }
 
-        public async Task<OperateResult> DeleteNodeAsync(string Key)
+        public OperateResult DeleteNode(string Key)
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.DeleteNode").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.DeleteNode").StartRecord();
             try
             {
                 if (!IsConnected)
@@ -932,7 +932,7 @@ namespace YSAI.Opc.ua.client
                     NodeId = new NodeId(Key),
                 };
 
-                DeleteNodesResponse deleteNodesResponse = await Task.Run(() => { return clientSession?.DeleteNodesAsync(null, waitDelete, new CancellationToken()); });
+                DeleteNodesResponse? deleteNodesResponse = clientSession?.DeleteNodesAsync(null, waitDelete, new CancellationToken()).Result;
 
                 foreach (var item in deleteNodesResponse.Results)
                 {
@@ -949,16 +949,15 @@ namespace YSAI.Opc.ua.client
             }
         }
 
-        public OperateResult DeleteNode(string Key)
+        public Task<OperateResult> InitAsync()
         {
-            return DeleteNodeAsync(Key).Result; 
+            return Task.Run(()=> Init());
         }
 
-        public async Task<OperateResult> InitAsync()
+        public OperateResult Init()
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.Init").StartRecord();
-
+            RunTimeTool.Instance($"{ClassName}.Init").StartRecord();
             try
             {
                 //实例化对象
@@ -984,7 +983,7 @@ namespace YSAI.Opc.ua.client
 
 
                 //用配置的当前状态更新验证器。
-                await certificateValidator.Update(new SecurityConfiguration
+                certificateValidator.Update(new SecurityConfiguration
                 {
                     //获取或设置一个值,该值指示是否应自动接受不受信任的证书
                     AutoAcceptUntrustedCertificates = true,
@@ -992,7 +991,7 @@ namespace YSAI.Opc.ua.client
                     RejectSHA1SignedCertificates = false,
                     //获取或设置一个值,该值指示接受的最小证书密钥强度
                     MinimumCertificateKeySize = 1024
-                });
+                }).Wait();
                 //实例化
                 if (AI == null)
                 {
@@ -1002,7 +1001,7 @@ namespace YSAI.Opc.ua.client
                 AI.ApplicationType = ApplicationType.Client;
                 AI.ConfigSectionName = "Opc.Ua.Client";   //配置文件的名称
                 //加载应用程序配置
-                AC = await AI.LoadApplicationConfiguration(false);
+                AC = AI.LoadApplicationConfiguration(false).Result;
                 AC.ApplicationName = opcUaData.Name;
                 AC.ApplicationType = ApplicationType.Client;
                 AC.CertificateValidator = certificateValidator;
@@ -1015,15 +1014,15 @@ namespace YSAI.Opc.ua.client
             }
         }
 
-        public  OperateResult Init()
+        public Task<OperateResult> OnAsync()
         {
-            return InitAsync().Result;
+            return Task.Run(() => On());
         }
 
-        public async Task<OperateResult> OnAsync()
+        public OperateResult On()
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.On").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.On").StartRecord();
             try
             {
                 if (AC != null)
@@ -1050,7 +1049,7 @@ namespace YSAI.Opc.ua.client
                         UserIdentity = new UserIdentity(opcUaData.User, opcUaData.Password);
                     }
                     //通过调用CreateSession服务创建与服务器的新通信会话
-                    clientSession = await Task.Run(async () => { return await Session.Create(AC, endpoint, false, false, AC.ApplicationName, 60000, UserIdentity, null); });
+                    clientSession = Session.Create(AC, endpoint, false, false, AC.ApplicationName, 60000, UserIdentity, null).Result;
 
                     //当会话关闭,则关闭订阅
                     clientSession.DeleteSubscriptionsOnClose = true;
@@ -1074,15 +1073,15 @@ namespace YSAI.Opc.ua.client
             }
         }
 
-        public OperateResult On()
+        public Task<OperateResult> OffAsync()
         {
-            return OnAsync().Result;
+            return Task.Run(()=> Off());
         }
 
-        public async Task<OperateResult> OffAsync()
+        public OperateResult Off()
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.Off").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.Off").StartRecord();
             try
             {
                 if (!IsConnected)
@@ -1098,11 +1097,7 @@ namespace YSAI.Opc.ua.client
 
                 if (clientSession != null)
                 {
-                    //不在主线程里面操作
-                    await Task.Run(async () =>
-                    {
-                        await clientSession.CloseAsync(10000);
-                    });
+                    clientSession.Close(10000);
                     clientSession = null;
                 }
                 IsConnected = false;
@@ -1115,15 +1110,15 @@ namespace YSAI.Opc.ua.client
             }
         }
 
-        public OperateResult Off()
+        public Task<OperateResult> ReadAsync(Address address)
         {
-            return OffAsync().Result;
+            return Task.Run(() => Read(address));
         }
 
-        public async Task<OperateResult> ReadAsync(Address address)
+        public OperateResult Read(Address address)
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.Read").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.Read").StartRecord();
             List<AddressDetails> Nodes = address.AddressArray;
             try
             {
@@ -1152,16 +1147,16 @@ namespace YSAI.Opc.ua.client
                         AddressValue addressValue = YSAI.Core.data.Dispose.Execute(item, Value);
 
                         //数据添加
-                        param.AddOrUpdate(item.Address, addressValue, (k, v) => addressValue);
+                        param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);
                     }
                     else
                     {
-                        readValueIds.Add(new ReadValueId() { NodeId = new NodeId(item.Address), AttributeId = Attributes.Value });
+                        readValueIds.Add(new ReadValueId() { NodeId = new NodeId(item.AddressName), AttributeId = Attributes.Value });
                     }
                 }
 
                 // 读取当前节点的值 
-                ReadResponse read = await clientSession.ReadAsync(null, 0, TimestampsToReturn.Neither, readValueIds, token);
+                ReadResponse? read = clientSession?.ReadAsync(null, 0, TimestampsToReturn.Neither, readValueIds, token).Result;
 
 
                 for (int i = 0; i < read.Results.Count; i++)
@@ -1169,7 +1164,7 @@ namespace YSAI.Opc.ua.client
                     if (!StatusCode.IsBad(read.Results[i].StatusCode))
                     {
                         //获取对应的节点配置
-                        AddressDetails? addressDetails = Nodes.FirstOrDefault(c => c.Address.Equals(readValueIds[i].NodeId.ToString()));
+                        AddressDetails? addressDetails = Nodes.FirstOrDefault(c => c.AddressName.Equals(readValueIds[i].NodeId.ToString()));
 
                         string? Value = read.Results[i].ToString();
 
@@ -1177,7 +1172,7 @@ namespace YSAI.Opc.ua.client
                         AddressValue addressValue = YSAI.Core.data.Dispose.Execute(addressDetails, Value);
 
                         //数据添加
-                        param.AddOrUpdate(addressDetails.Address, addressValue, (k, v) => addressValue);
+                        param.AddOrUpdate(addressDetails.AddressName, addressValue, (k, v) => addressValue);
                     }
                 }
                 return Break("Read", true, RData: param, RType: Core.@enum.ResultType.KeyValue);
@@ -1188,15 +1183,15 @@ namespace YSAI.Opc.ua.client
             }
         }
 
-        public OperateResult Read(Address address)
+        public Task<OperateResult> WriteAsync<V>(ConcurrentDictionary<string, V> Values)
         {
-            return ReadAsync(address).Result;
+            return Task.Run(() => Write(Values));
         }
 
-        public async Task<OperateResult> WriteAsync<V>(ConcurrentDictionary<string, V> Values)
+        public OperateResult Write<V>(ConcurrentDictionary<string, V> Values)
         {
             //开始记录运行时间
-            RunTimeTool.Instance("OpcUaClientOperate.Writes").StartRecord();
+            RunTimeTool.Instance($"{ClassName}.Writes").StartRecord();
             try
             {
                 OperateResult? reverseBack = null;
@@ -1231,7 +1226,7 @@ namespace YSAI.Opc.ua.client
                         WriteValueCollection writeValues = new WriteValueCollection { writeValue };
 
                         // 写入当前的值
-                        WriteResponse writeResponse = await Task.Run(() => { return clientSession?.WriteAsync(null, writeValues, new CancellationToken()); });
+                        WriteResponse? writeResponse = clientSession?.WriteAsync(null, writeValues, new CancellationToken()).Result;
 
                         foreach (var scc in writeResponse.Results)
                         {
@@ -1249,10 +1244,5 @@ namespace YSAI.Opc.ua.client
                 return Break("Writes", false, ex.Message);
             }
         }
-
-        public OperateResult Write<V>(ConcurrentDictionary<string, V> Values)
-        {
-            return WriteAsync(Values).Result;
-        }
     }
 }

+ 1 - 1
src/YSAI.DAQ/YSAI.Opc/ua/service/OpcUaServiceOperate.cs

@@ -243,7 +243,7 @@ namespace YSAI.Opc.ua.service
 
 
                 //启动服务
-                AI.StartAsService(service);
+                AI.Start(service).Wait();
 
                 //打印信息
                 var endpoints = AI.Server.GetEndpoints().Select(e => e.EndpointUrl).Distinct();

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

@@ -174,14 +174,14 @@ namespace YSAI.S7.client
                         }
                         else
                         {
-                            Value = (PlcS7?.Read(item.Address)).ToString();
+                            Value = (PlcS7?.Read(item.AddressName)).ToString();
                         }
 
                         //数据处理
                         AddressValue addressValue = Core.data.Dispose.Execute(item, Value);
 
                         //数据添加
-                        param.AddOrUpdate(item.Address, addressValue, (k, v) => addressValue);
+                        param.AddOrUpdate(item.AddressName, addressValue, (k, v) => addressValue);
                     }
                     if (param.Count > 0)
                     {

+ 156 - 14
src/YSAI.DAQ/YSAI.Test/TestAll.cs

@@ -11,6 +11,9 @@ using static YSAI.Core.reflection.ReflectionData.Basics.DllData.NamespaceData;
 using YSAI.Core.@interface.only;
 using YSAI.Opc.ua.client;
 using YSAI.Modbus.client;
+using YSAI.Opc.ua.service;
+using YSAI.Mqtt.service.websocket;
+using YSAI.Modbus.service;
 
 namespace YSAI.Test
 {
@@ -32,6 +35,28 @@ namespace YSAI.Test
                         IsAbsolutePath=false,
                         NamespaceDatas=new List<Basics.DllData.NamespaceData>()
                         {
+                            new Basics.DllData.NamespaceData()
+                            {
+                                Namespace="YSAI.Mqtt.service.websocket",
+                                ClassDatas=new List<Basics.DllData.NamespaceData.ClassData>()
+                                {
+                                    new Basics.DllData.NamespaceData.ClassData()
+                                    {
+                                        ClassName="MqttWebSocketServiceOperate",
+                                        ConstructorParam=new object[]{ new MqttWebSocketServiceData.Basics { LoginID="ysai",LoginPassword="ysai",Port= 11819, HttpPort= 11820, Uri="NB_CLASS" } },
+                                        SN="YSAI.Mqtt.MqttWebSocketServiceOperate[Instance]",
+                                        MethodDatas=new List<Basics.DllData.NamespaceData.ClassData.MethodData>()
+                                        {
+                                            new Basics.DllData.NamespaceData.ClassData.MethodData()
+                                            {
+                                                MethodName="On",
+                                                SN="[On]",
+                                                WhetherExecute=true
+                                            }
+                                        }
+                                    }
+                                }
+                            },
                             new Basics.DllData.NamespaceData()
                             {
                                 Namespace="YSAI.Mqtt.client",
@@ -102,17 +127,21 @@ namespace YSAI.Test
                 reflectOperate.RegisterEvent("YSAI.Mqtt.MqttClientOperate[Instance][OnEvent]", true, P2: MqttClientOperate_OnEvent);
 
 
-                reflectOperate.ExecuteMethod("YSAI.Mqtt.MqttClientOperate[Instance][AddSubscribe]", new object[] { "牛逼", 1 });
+                object? v = reflectOperate.ExecuteMethod("YSAI.Mqtt.MqttClientOperate[Instance][AddSubscribe]", new object[] { "牛逼", 1 });
 
-                for (int i = 0; i < 1000; i++)
+                for (int i = 0; i < 100; i++)
                 {
                     reflectOperate.ExecuteMethod("YSAI.Mqtt.MqttClientOperate[Instance][PublishSubscribe]", new object[] { "牛逼", $"{i}", 1, true });
 
-                    if (i == 500)
+                    if (i == 50)
                     {
                         reflectOperate.RegisterEvent("YSAI.Mqtt.MqttClientOperate[Instance][OnEvent]", false, P2: MqttClientOperate_OnEvent);
                     }
                 }
+
+                v = reflectOperate.ExecuteMethod("YSAI.Mqtt.MqttClientOperate[Instance][RemoveSubscribe]", new object[] { "牛逼" });
+
+                v = reflectOperate.ExecuteMethod("YSAI.Mqtt.MqttClientOperate[Instance][Off]");
             }
         }
         private static void MqttClientOperate_OnEvent(object? sender, object e)
@@ -158,13 +187,13 @@ namespace YSAI.Test
                 {
                     address.AddressArray.Add(new AddressDetails()
                     {
-                        Address = item
+                        AddressName = item
                     });
                 }
                 address.AddressArray.Add(new AddressDetails()
                 {
-                    Address = "这.是.一.个.虚.拟.点",
-                    DataType = DataType.String,
+                    AddressName = "这.是.一.个.虚.拟.点",
+                    AddressDataType = DataType.String,
                     AddressType = AddressType.Virtual
                 });
 
@@ -211,20 +240,20 @@ namespace YSAI.Test
 
                 opcDaClientOperate.OnEvent += OpcDaClientOperate_OnEventParam;
 
-                //Console.ReadLine();
+                Thread.Sleep(5000);
 
                 operateResult = opcDaClientOperate.UpdateGroupSubscribedState(组名, true);
                 await Console.Out.WriteLineAsync(operateResult.Message);
 
-                //Console.ReadLine();
+                Thread.Sleep(5000);
 
-                //operateResult = opcDaClientOperate.UpdateGroupSubscribedState(组名, false);
-                //await Console.Out.WriteLineAsync(operateResult.Message);
+                operateResult = opcDaClientOperate.UpdateGroupSubscribedState(组名, false);
+                await Console.Out.WriteLineAsync(operateResult.Message);
 
-                ////Console.ReadLine();
+                Thread.Sleep(5000);
 
-                //operateResult = opcDaClientOperate.UpdateGroupSubscribedState(组名, true);
-                //await Console.Out.WriteLineAsync(operateResult.Message);
+                operateResult = opcDaClientOperate.UpdateGroupSubscribedState(组名, true);
+                await Console.Out.WriteLineAsync(operateResult.Message);
 
             }
         }
@@ -241,13 +270,19 @@ namespace YSAI.Test
         [TestMethod]
         public void modbus测试()
         {
+
+            ModbusTcpServer modbusTcpServer = new ModbusTcpServer(502,"127.0.0.1");
+            modbusTcpServer.Start();
+
+            Thread.Sleep(1000);
+
             Address address = new Address();
             address.SN = Guid.NewGuid().ToString();
             address.CreationTime = DateTime.Now;
             address.AddressArray = new List<AddressDetails>();
             address.AddressArray.Add(new AddressDetails
             {
-                Address = "0,10"  //从0开始往后读10位
+                AddressName = "0,10"  //从0开始往后读10位
             });
 
             ConcurrentDictionary<ushort, ushort[]> wp=new ConcurrentDictionary<ushort, ushort[]>();
@@ -288,6 +323,113 @@ namespace YSAI.Test
             }
         }
 
+        [TestMethod]
+        public void OPCUA客户端服务端测试()
+        {
+            using (OpcUaServiceOperate opcUaServiceOperate = OpcUaServiceOperate.Instance(new OpcUaServiceData.Basics()
+            {
+                User = "test",
+                Password = "test"
+            }))
+            {
+                OperateResult operateResult = opcUaServiceOperate.On();
+                Console.WriteLine(operateResult.Message);
+
+                string opc = "opc.tcp://127.0.0.1:8866/Opc.Ua.Service";
+
+                using (OpcUaClientOperate opcUaClientOperate = OpcUaClientOperate.Instance(new OpcUaClientData.Basics()
+                {
+                    Name = "test",
+                    User = "test",
+                    Password = "test",
+                    ServerUrl = opc,
+                    SN = Guid.NewGuid().ToString()
+                }))
+                {
+                    opcUaClientOperate.OnEvent += OpcUaClientOperate_OnEvent;
+                    opcUaClientOperate.OnEventParam += OpcUaClientOperate_OnEventParam;
+
 
+                    operateResult = opcUaClientOperate.Init();
+                    Console.WriteLine(operateResult.Message);
+
+                    operateResult = opcUaClientOperate.On();
+                    Console.WriteLine(operateResult.Message);
+
+                    Address address = new Address()
+                    {
+                        AddressArray = new List<AddressDetails>()
+                        {
+                        new AddressDetails()
+                        {
+                            AddressName="ns=2;s=Boolean_Dynamic",
+                        },
+                        new AddressDetails()
+                        {
+                            AddressName="ns=2;s=ByteString_Dynamic",
+                        },
+                        new AddressDetails()
+                        {
+                            AddressName="ns=2;s=Float_Dynamic",
+                        },
+                        new AddressDetails()
+                        {
+                            AddressName="ns=2;s=QualifiedName_Dynamic",
+                        },
+                        new AddressDetails()
+                        {
+                            AddressName="ns=2;s=DateTime_Dynamic",
+                        },
+                        new AddressDetails()
+                        {
+                            AddressName="ns=2;s=LocalizedText_Dynamic",
+                        }
+                        }
+                    };
+
+                    operateResult = opcUaClientOperate.Read(address);
+                    Console.WriteLine(operateResult.Message);
+                    if (operateResult.State)
+                    {
+                        foreach (var item in (operateResult.RData as ConcurrentDictionary<string, AddressValue>))
+                        {
+                            Console.WriteLine(item.Value.Value);
+                        }
+                    }
+                    //Console.WriteLine("回车启动订阅模式");
+                    //Console.Read();
+
+                    ConcurrentDictionary<string, List<AddressDetails>> pairs = new ConcurrentDictionary<string, List<AddressDetails>>();
+                    pairs.TryAdd("test", address.AddressArray);
+
+                    operateResult = opcUaClientOperate.AddSubscribe(pairs);
+                    Console.WriteLine(operateResult.Message);
+
+                    Console.WriteLine("5秒后将移除订阅");
+                    Thread.Sleep(5000);
+
+                    operateResult = opcUaClientOperate.RemoveSubscribe(address.AddressArray);
+                    Console.WriteLine(operateResult.Message);
+
+                    operateResult = opcUaClientOperate.Off();
+                    Console.WriteLine(operateResult.Message);
+                }
+            }
+        }
+        private static void OpcUaClientOperate_OnEventParam(object? sender, OpcUaClientData.EventParam e)
+        {
+            Console.ForegroundColor = ConsoleColor.Yellow;
+            Console.WriteLine(e.Message);
+            foreach (var item in e.Params)
+            {
+                Console.WriteLine(item.Value.Value);
+            }
+        }
+
+        private static void OpcUaClientOperate_OnEvent(object? sender, OpcUaClientData.Event e)
+        {
+            Console.ForegroundColor = ConsoleColor.Green;
+            Console.WriteLine(e.Message);
+        }
     }
 }

+ 10 - 18
src/YSAI.DAQ/YSAI.TestConsole/Program.cs

@@ -1,4 +1,8 @@
-using YSAI.Log;
+using System.Collections.Concurrent;
+using YSAI.Core.data;
+using YSAI.Log;
+using YSAI.Opc.ua.client;
+using YSAI.Opc.ua.service;
 
 namespace YSAI.TestConsole
 {
@@ -6,28 +10,16 @@ namespace YSAI.TestConsole
     {
         static void Main(string[] args)
         {
-            LogHelper.Info("牛逼克拉斯");
-            aaaa<string>();
-        }
-        public static void aaaa<V>()
-        {
+            
 
-            if (typeof(V).Name is string)
-            {
-                
-            }
-            if (typeof(V).Name is short)
-            {
 
-            }
-            if (typeof(V).Name is byte)
-            {
 
-            }
-            if (typeof(V).Name is ushort)
+            while (true)
             {
-
+                Console.ReadKey();
             }
         }
+
+       
     }
 }

+ 9 - 1
src/YSAI.DAQ/YSAI.TestConsole/YSAI.TestConsole.csproj

@@ -8,7 +8,15 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\YSAI.Log\YSAI.Log.csproj" />
+    <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
+    <ProjectReference Include="..\YSAI.DB\YSAI.DB.csproj" />
+    <ProjectReference Include="..\YSAI.Kafka\YSAI.Kafka.csproj" />
+    <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />
+    <ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
+    <ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />
+    <ProjectReference Include="..\YSAI.RabbitMQ\YSAI.RabbitMQ.csproj" />
+    <ProjectReference Include="..\YSAI.Redis\YSAI.Redis.csproj" />
+    <ProjectReference Include="..\YSAI.S7\YSAI.S7.csproj" />
   </ItemGroup>
 
 </Project>