Browse Source

应用实例更新,数据结构优化

Shun 2 years ago
parent
commit
b8c97a7ae7
34 changed files with 534 additions and 327 deletions
  1. 169 165
      README.md
  2. 1 1
      src/YSAI.AllenBradley/YSAI.AllenBradley.csproj
  3. 1 1
      src/YSAI.Beckhoff/YSAI.Beckhoff.csproj
  4. 1 1
      src/YSAI.Can/YSAI.Can.csproj
  5. 2 2
      src/YSAI.Core/YSAI.Core.csproj
  6. 56 43
      src/YSAI.Core/handler/AddressHandler.cs
  7. 1 1
      src/YSAI.DB/YSAI.DB.csproj
  8. 1 1
      src/YSAI.DaqManage/YSAI.DaqManage.csproj
  9. 1 1
      src/YSAI.Kafka/YSAI.Kafka.csproj
  10. 1 1
      src/YSAI.Mewtocol/YSAI.Mewtocol.csproj
  11. 1 1
      src/YSAI.Mitsubishi/YSAI.Mitsubishi.csproj
  12. 1 1
      src/YSAI.Modbus/YSAI.Modbus.csproj
  13. 1 1
      src/YSAI.Model/YSAI.Model.csproj
  14. 12 32
      src/YSAI.Model/data/AddressParse.cs
  15. 8 0
      src/YSAI.Model/data/AddressRelay.cs
  16. 0 18
      src/YSAI.Model/enum/ParseType.cs
  17. 1 1
      src/YSAI.Mqtt/YSAI.Mqtt.csproj
  18. 1 1
      src/YSAI.NetMQ/YSAI.NetMQ.csproj
  19. 1 1
      src/YSAI.Netty/YSAI.Netty.csproj
  20. 1 1
      src/YSAI.Omron/YSAI.Omron.csproj
  21. 1 4
      src/YSAI.Opc/YSAI.Opc.csproj
  22. 15 0
      src/YSAI.Opc/ua/client/OpcUaClientData.cs
  23. 7 14
      src/YSAI.Opc/ua/client/OpcUaClientOperate.cs
  24. 1 1
      src/YSAI.RabbitMQ/YSAI.RabbitMQ.csproj
  25. 1 1
      src/YSAI.Redis/YSAI.Redis.csproj
  26. 1 1
      src/YSAI.RelayManage/YSAI.RelayManage.csproj
  27. 1 1
      src/YSAI.Rest/YSAI.Rest.csproj
  28. 1 1
      src/YSAI.Rpc/YSAI.Rpc.csproj
  29. 1 1
      src/YSAI.Siemens/YSAI.Siemens.csproj
  30. 18 21
      src/YSAI.Test.All/Program.cs
  31. 0 1
      src/YSAI.Test.All/YSAI.Test.All.csproj
  32. 223 4
      src/YSAI.Test.Console/Program.cs
  33. 1 1
      src/YSAI.Test/YSAI.Test.csproj
  34. 2 2
      src/YSAI.VT/Program.cs

+ 169 - 165
README.md

@@ -28,6 +28,7 @@
 2. 数据结构
 3. 接口
 4. 枚举
+5. 模型工具
 
 ## 扩展工具
 1. [ YSAI.Rpc ]基于DotNetty实现的RPC(远程过程调用) 支持一对多,支持身份验证
@@ -48,7 +49,7 @@
 10. Mewtocol(松下)	[Tcp、Serial]
 
 ```sharp
-namespace YSAI.Core.@interface
+namespace YSAI.Model.@interface
 {
     /// <summary>
     /// 数采接口
@@ -66,7 +67,7 @@ namespace YSAI.Core.@interface
 5. NetMQ	[Publish、Subscribe]
 
 ```sharp
-namespace YSAI.Core.@interface
+namespace YSAI.Model.@interface
 {
     /// <summary>
     /// 转发接口
@@ -76,229 +77,230 @@ namespace YSAI.Core.@interface
 }
 ```
 
-## 应用
-```sharp
-
-1.上 NUGET 搜索 YSAI
-2.安装对应的协议包
-3.应用代码如下
-4.协议包内还有内部公共方法,请自行研究使用
-
-------------------------------------------------------
+## 协议服务端(用于数据模拟)
+1. Mqtt服务端  
+2. MqttWebSocket服务端 
+3. OpcUa服务端
+4. Socket服务端
+5. WebSocket服务端
 
+## 创建实例合集
+```sharp
 //实例创建的几种方式
-
-//第一种方式
-BeckhoffOperate beckhoffOperate1 = new BeckhoffOperate();
-
-//第二种方式(单例模式)
-BeckhoffOperate? beckhoffOperate2 = new BeckhoffOperate().CreateInstance(new BeckhoffData.Basics()).GetRData<BeckhoffOperate>();
-
-//第三种方式(单例模式)
-BeckhoffOperate beckhoffOperate3 = BeckhoffOperate.Instance(new BeckhoffData.Basics());
-
-//第四种方式
-IDaq daq1 = new BeckhoffOperate(new BeckhoffData.Basics());
-
-//第五种方式
-IDaq daq2 = BeckhoffOperate.Instance(new BeckhoffData.Basics());
-
-//第六种方式
-using (BeckhoffOperate beckhoffOperate4 = new BeckhoffOperate())
+//以OPCUA 采集协议为例
+using YSAI.Model.@interface;
+using YSAI.Opc.ua.client;
+
+OpcUaClientOperate? operate = null;
+IDaq? daq = null;
+
+//无参实例
+operate = new OpcUaClientOperate();
+//无参实例调函数创建实例,与无参实例配合使用
+operate = new OpcUaClientOperate().CreateInstance(new OpcUaClientData.Basics()).GetRData<OpcUaClientOperate>();
+//有参实例
+operate = new OpcUaClientOperate(new OpcUaClientData.Basics());
+//有参单例
+operate = OpcUaClientOperate.Instance(new OpcUaClientData.Basics());
+//接口 - 无参实例
+daq = new OpcUaClientOperate();
+//接口 - 无参实例调函数创建实例,与无参实例配合使用
+daq = new OpcUaClientOperate().CreateInstance(new OpcUaClientData.Basics()).GetRData<OpcUaClientOperate>();
+//接口 - 有参实例
+daq = new OpcUaClientOperate(new OpcUaClientData.Basics());
+//接口 - 有参单例
+daq = OpcUaClientOperate.Instance(new OpcUaClientData.Basics());
+
+using (operate)
 {
     //使用完直接释放
 }
 
-//第七种方式
-using (BeckhoffOperate beckhoffOperate5 = BeckhoffOperate.Instance(new BeckhoffData.Basics()))
-{
-    //使用完直接释放这个单例
-}
-
-//第八种方式
-using (BeckhoffOperate? beckhoffOperate6 = new BeckhoffOperate().CreateInstance(new BeckhoffData.Basics()).GetRData<BeckhoffOperate>())
-{
-    //使用完直接释放这个单例
-}
-
-//第九种方式
-using (IDaq daq3 = new BeckhoffOperate(new BeckhoffData.Basics()))
+using (daq)
 {
     //使用完直接释放
 }
 
-//第十种方式
-using (IDaq daq4 = BeckhoffOperate.Instance(new BeckhoffData.Basics()))
-{
-    //使用完直接释放这个单例
-}
-
-//■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
-//第一种的应用场景是获取库参数信息时当这个对象已经实例化了,但是实际功能无法使用,就可以直接使用 CreateInstance 创建一个单例模式
-//先获取参数
-beckhoffOperate1.GetParam();
-//在生成单例后赋值,这样当前实例就已经可以使用所有功能,并且是单例的存在
-beckhoffOperate1 = beckhoffOperate1.CreateInstance(new BeckhoffData.Basics()).GetRData<BeckhoffOperate>();
-//第二种与第三种就是直接创建单例模式,但第二种是为了在反射的情况下使用单例模式,第二种也是为第一种情况而产生
+```
 
-------------------------------------------------------
+## 采集应用
+1. 上 “NUGET” 搜索
+2. 安装对应的协议包
+3. 应用代码如下
+4. 协议包内还有内部公共方法,请自行研究使用
 
+```sharp
 //采集协议
-using (类 operate = new 类(new 类数据.Basics
+//以OPCUA 采集协议为例
+using System.Collections.Concurrent;
+using YSAI.Core.script;
+using YSAI.Log;
+using YSAI.Model.data;
+using YSAI.Model.@enum;
+using YSAI.Opc.ua.client;
+using YSAI.Unility;
+
+using (OpcUaClientOperate operate = new OpcUaClientOperate(new OpcUaClientData.Basics
 {
-
-    //采集对象参数
-
+    ServerUrl = "opc.tcp://127.0.0.1:6688",
+    UserName = "user",
+    Password = "password",
 }))
 {
-    //打开
-    OperateResult result = operate.On();
-    LogHelper.Info(result.ToJson().JsonFormatting());
-
     //点位地址
     Address address = new Address();
     address.SN = Guid.NewGuid().ToString();
     address.CreationTime = DateTime.Now.ToLocalTime();
     address.AddressArray = new List<AddressDetails>
     {
-        new AddressDetails()//S7点位地址
-        {
-            SN=$"{Guid.NewGuid().ToNString()} - Factory",
-            AddressName = "DB71.DBD4",
-            AddressDataType = YSAI.Core.@enum.DataType.Float
-        },
-         new AddressDetails()//OpcUa点位地址
-        {
-            SN=$"{Guid.NewGuid().ToNString()} - Factory",
-            AddressName = "ns=2;s=Scalar_Simulation_Float",
-            AddressDataType = YSAI.Core.@enum.DataType.Float
-        },
-         new AddressDetails()//OpcDa点位地址
+         new AddressDetails()                                        //地址详情参数介绍
         {
-            SN=$"{Guid.NewGuid().ToNString()} - Factory",
-            AddressName = "a.a.a",
-            AddressDataType = YSAI.Core.@enum.DataType.Float
-        },
-         new AddressDetails()//Modbus点位地址
-        {
-            SN=$"{Guid.NewGuid().ToNString()} - Factory",
-            AddressName = "0,2",
-            AddressDataType = YSAI.Core.@enum.DataType.Float
-        },
-         new AddressDetails()  //DB点位地址
-        {
-            SN=$"{Guid.NewGuid().ToNString()} - Factory",
-            AddressName = "数据库采集",
-            AddressDataType = YSAI.Core.@enum.DataType.String,
-            AddressExtendParam=new DBData.ExtendParam.Read()
+            SN=$"",                                                  //可以理解成唯一标识符(可以存机台号、组名、车间、厂)
+            AddressAnotherName="",                                   //地址别名
+            AddressDataType=DataType.String,                         //数据类型
+            AddressDescribe="",                                      //地址描述
+            AddressExtendParam=new object(),                         //扩展数据
+            AddressName="",                                          //脚本地址
+            AddressPropertyName="",                                  //地址别名
+            AddressType=AddressType.Reality,                         //地址类型
+            IsEnable=true,                                           //是否启用
+            AddressRelayParam=new AddressRelay                       //转发参数
             {
-               Sql = @"SELECT A,B,C,D FORM TABLE ORDER BY YPBH DESC  LIMIT 0,1",
-               ColumnName = new List<string>() { "A", "B", "C", "D"}
-            }
-         },
-         new AddressDetails()  //OpcDaHttp点位地址
-        {
-            SN=$"{Guid.NewGuid().ToNString()} - Factory",
-            AddressName = "a.a.a",
-            AddressDataType = YSAI.Core.@enum.DataType.String,
-            AddressExtendParam=new OpcDaHttpData.ExtendParam.Read()
+                ISns = new List<string> { "ISN1", "ISN2" },          //实例SN
+                Topic = $"topic",                                    //主题
+                ContentFormat="Value:{0}"                            //内容格式
+            },
+            AddressParseParam=new AddressParse                       //脚本解析实例
             {
-               GroupName="YF75ZDHPJ",
-               ReadInterval=1000,
-               ServerName="OPC.SimaticNET.1"
-            }
-         },
-         new AddressDetails()  //地址详情参数介绍
-        {
-            SN=$"A88",                                              //可以理解成唯一标识符(可以存机台号、组名、车间、厂)
-            AddressAnotherName="A_Name",                            //地址别名
-            AddressDataType=YSAI.Core.@enum.DataType.Float,         //数据类型
-            AddressDescribe="NameDescribe",                         //地址描述
-            AddressExtendParam=new object(),                        //扩展数据
-            AddressName="Name",                                     //地址名称
-            //AddressParseParam=new AddressParse                    //地址解析参数
-            //{
-            //    ParseType=ParseType.ScriptAnalysis,               //解析类型
-            //    Script=new YSAI.Core.script.ScriptData.Basics     //脚本解析数据
+                ScriptParam=new ScriptData.Basics                    //脚本解析基础数据
+                {
+                    ScriptCode = @"function Convert(addressname,value) { return '【这是调用脚本解析】传入的地址是:'+ addressname + '----传入的参数是:' + value; }",  //脚本代码
+                    ScriptFunction = "Convert",                                                                                                                        //脚本入口
+                    ScriptType = ScriptData.ScriptType.JavaScript                                                                                                      //脚本类型
+                }
+            },
+            //AddressParseParam = new AddressParse                  //反射解析
+            //{                      
+            //    ReflectionParam = new object[]                    //反射解析的参数
             //    {
+            //        new ReflectionData.Basics                     //反射解析基础数据
+            //        {
+            //                                                      //反射解析的基础数据
+            //        },
+            //        "SN"                                          //反射解析的SN
             //    }
-            //},
-             AddressParseParam=new AddressParse                     //地址解析参数
-            {
-                ParseType=ParseType.MethodAnalysis,                 //解析类型
-                ReflectionSN="反射SN"
-            },
-             AddressPropertyName="Name1",                           //地址别名
-             AddressType=AddressType.Reality,                       //地址类型
-             IsEnable=true                                          //是否启用
+            // },
          }
     };
 
+    #region 打开
+    OperateResult result = operate.On();
+    LogHelper.Info(result.ToJson().JsonFormatting());  //转成JSON.JSON格式化 
+    #endregion 打开
+
+    #region 读取
     //读取
     result = operate.Read(address);
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 读取
 
-    //订阅
+    #region 订阅
     operate.OnEvent += delegate (object? sender, EventResult e)
-    {
-        LogHelper.Info(e.ToJson().JsonFormatting());
-    };
+{
+    LogHelper.Info(e.ToJson().JsonFormatting());    //转成JSON.JSON格式化
+};
     result = operate.Subscribe(address);
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 订阅
 
-    //写入
-    ConcurrentDictionary<string, string> value = new ConcurrentDictionary<string, string>
+    #region 写入
+    ConcurrentDictionary<string, object> value = new ConcurrentDictionary<string, object>
     {
-        ["地址"] = "值"
+        ["地址"] = "string 值",
+        ["地址"] = (float)1.1f,
+        ["地址"] = (double)2.2d,
+        ["地址"] = (int)3,
+        ["地址"] = true
     };
     result = operate.Write(value);
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 写入
 
-    //关闭
+    #region 关闭
     result = operate.Off();
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 关闭
+
+    #region 获取状态
+    result = operate.GetStatus();
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 获取状态
+
+    #region 获取参数
+    result = operate.GetParam();
+    LogHelper.Info(result.GetRData<ParamStructure>().ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 获取参数
 }
+````
 
-------------------------------------------------------
+## 转发应用
+1. 上 “NUGET” 搜索
+2. 安装对应的协议包
+3. 应用代码如下
+4. 协议包内还有内部公共方法,请自行研究使用
 
+```sharp
 //转发协议
-using (类 operate = new 类(new 类数据.Basics
-{
-
-    //转发对象参数
+//以MQTT为例
+using YSAI.Log;
+using YSAI.Model.data;
+using YSAI.Mqtt.client;
+using YSAI.Unility;
 
+using (MqttClientOperate operate = new MqttClientOperate(new MqttClientData.Basics
+{
+    Ip = "127.0.0.1",
+    Port = 11819,
+    UserName = "user",
+    Password = "password"
 }))
 {
-    //打开
+    #region 打开
     OperateResult result = operate.On();
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+    #endregion 打开
 
-    //生产
+    #region 生产
     result = operate.Produce("主题", "内容");
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+    #endregion 生产
 
-    //消费
+    #region 消费
     operate.OnEvent += delegate (object? sender, EventResult e)
     {
-        LogHelper.Info(e.ToJson().JsonFormatting());
+        LogHelper.Info(e.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
     };
     result = operate.Subscribe("主题");
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+    #endregion 消费
 
-    //关闭
+    #region 关闭
     result = operate.Off();
-    LogHelper.Info(result.ToJson().JsonFormatting());
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+    #endregion 关闭
+
+    #region 获取状态
+    result = operate.GetStatus();
+    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 获取状态
+
+    #region 获取参数
+    result = operate.GetParam();
+    LogHelper.Info(result.GetRData<ParamStructure>().ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+    #endregion 获取参数
 }
-
 ```
 
-## 协议服务端(用于数据模拟)
-1. Mqtt服务端  
-2. MqttWebSocket服务端 
-3. OpcUa服务端
-4. Socket服务端
-5. WebSocket服务端
-
 ## 更新表
 
 #### 2023-02-15
@@ -510,4 +512,6 @@ while(true)
 3. OPCUA 新增当订阅的地址点没有在服务器创建订阅,则重新订阅
 
 #### 2023-11-30
-1. 修改所有协议的函数开始返回的SN
+1. 修改所有协议的函数开始返回的SN
+2. 优化解析,当解析失败异常,则返回空数据,为了更好的判断数据质量
+3. OPCUA新增是否重连,重连间隔参数

+ 1 - 1
src/YSAI.AllenBradley/YSAI.AllenBradley.csproj

@@ -16,6 +16,6 @@
     <Description>$(DescriptionType):$(DescriptionName) ( $(DescriptionDetails) )</Description>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Beckhoff/YSAI.Beckhoff.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="Beckhoff.TwinCAT.Ads" Version="6.1.125" />
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Can/YSAI.Can.csproj

@@ -16,7 +16,7 @@
     <Description>$(DescriptionType):$(DescriptionName) ( $(DescriptionDetails) )</Description>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="Kvaser.CanLib">

+ 2 - 2
src/YSAI.Core/YSAI.Core.csproj

@@ -3,7 +3,7 @@
     <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-    <Version>23.334.5881</Version>
+    <Version>23.334.14260</Version>
     <PackageOutputPath Condition="'$(Configuration)' == 'Release'">../YSAI.Publish/Release</PackageOutputPath>
     <PackageOutputPath Condition="'$(Configuration)' == 'Debug'">../YSAI.Publish/Debug</PackageOutputPath>
     <Authors>Shun</Authors>
@@ -17,7 +17,7 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="System.IO.Ports" Version="8.0.0" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
     <PackageReference Include="Microsoft.ClearScript" Version="7.4.4" />
   </ItemGroup>
 </Project>

+ 56 - 43
src/YSAI.Core/handler/AddressHandler.cs

@@ -247,7 +247,12 @@ namespace YSAI.Core.handler
             {
                 if (addressDetails.AddressRelayParam != null)
                 {
-                    OperateResult operateResult = relayOperate.Produce(addressDetails.AddressRelayParam?.Topic, value?.ToString(), addressDetails.AddressRelayParam?.ISns);
+                    //如果内容格式不为空
+                    if (!string.IsNullOrEmpty(addressDetails.AddressRelayParam.ContentFormat) && addressDetails.AddressRelayParam.ContentFormat.Contains("{0}"))
+                    {
+                        value = string.Format(addressDetails.AddressRelayParam.ContentFormat, value);
+                    }
+                    OperateResult operateResult = relayOperate.Produce(addressDetails.AddressRelayParam.Topic, value.ToString(), addressDetails.AddressRelayParam.ISns);
                     if (!operateResult.State)
                     {
                         LogHelper.Error("{" + $"\"Topic\":\"{addressDetails.AddressRelayParam?.Topic}\",\"Content\":\"{value}\",\"ISns\":{addressDetails.AddressRelayParam?.ISns?.ToJson()}" + "}", RelayBackupsLog, consoleShow: false);
@@ -270,62 +275,70 @@ namespace YSAI.Core.handler
             {
                 try
                 {
-                    switch (addressDetails.AddressParseParam.ParseType)
+                    //反射解析参数不为空
+                    if (addressDetails.AddressParseParam?.ReflectionParam != null)
                     {
-                        case ParseType.R:  //反射解析
-                            //基础数据转换
-                            ReflectionData.Basics? rb = addressDetails.AddressParseParam?.ReflectionParseParam?.ReflectionBasics as ReflectionData.Basics;
-                            if (rb != null)
+                        //基础数据
+                        ReflectionData.Basics? basics = addressDetails.AddressParseParam?.ReflectionParam[0] as ReflectionData.Basics;
+                        //需要执行的哪个SN
+                        string? RSN = addressDetails.AddressParseParam?.ReflectionParam[1].ToString();
+                        //判断基础数据
+                        if (basics != null && RSN != null)
+                        {
+                            //如果不存在则新增一个
+                            if (!ReflectionIoc.ContainsKey(basics))
                             {
-                                if (!ReflectionIoc.ContainsKey(rb))
+                                ReflectionOperate operate = ReflectionOperate.Instance(basics);
+                                ReflectionIoc.AddOrUpdate(basics, operate, (k, v) => operate);
+                                OperateResult operateResult = ReflectionIoc[basics].Init();
+                                if (!operateResult.State)
                                 {
-                                    ReflectionOperate operate = ReflectionOperate.Instance(rb);
-                                    ReflectionIoc.AddOrUpdate(rb, operate, (k, v) => operate);
-                                    OperateResult operateResult = ReflectionIoc[rb].Init();
-                                    if (!operateResult.State)
-                                    {
-                                        LogHelper.Error($"反射初始化失败:{operateResult.Message}", ParseLog);
-                                        ReflectionIoc.Remove(rb, out _);
-                                    }
-                                }
-                                if (ReflectionIoc.ContainsKey(rb))
-                                {
-                                    NewValue = ReflectionIoc[rb].ExecuteMethod(addressDetails.AddressParseParam?.ReflectionParseParam?.RSn, new object[] { addressDetails.AddressName, value })?.ToString();
+                                    LogHelper.Error($"反射初始化失败:{operateResult.Message}", ParseLog);
+                                    ReflectionIoc.Remove(basics, out _);
                                 }
                             }
-                            else
+                            if (ReflectionIoc.ContainsKey(basics))
                             {
-                                LogHelper.Error("使用了反射解析,但未设置配置", ParseLog);
+                                NewValue = ReflectionIoc[basics].ExecuteMethod(RSN, new object[] { addressDetails.AddressName, value })?.ToString();
                             }
-                            break;
-                        case ParseType.S:  //脚本解析
-                            //基础数据转换
-                            ScriptData.Basics? sb = addressDetails.AddressParseParam?.ScriptBasics as ScriptData.Basics;
-                            if (sb != null)
+                        }
+                        else
+                        {
+                            LogHelper.Error("使用了“反射”解析,但参数错误或为空", ParseLog);
+                        }
+                    }
+
+                    //脚本解析参数不为空
+                    if (addressDetails.AddressParseParam?.ScriptParam != null)
+                    {
+                        //基础数据
+                        ScriptData.Basics? basics = addressDetails.AddressParseParam?.ScriptParam as ScriptData.Basics;
+                        //判断基础数据
+                        if (basics != null)
+                        {
+                            if (!ScriptIoc.ContainsKey(basics))
                             {
-                                if (!ScriptIoc.ContainsKey(sb))
-                                {
-                                    ScriptOperate operate = ScriptOperate.Instance(sb);
-                                    ScriptIoc.AddOrUpdate(sb, operate, (k, v) => operate);
-                                }
-                                if (ScriptIoc.ContainsKey(sb))
-                                {
-                                    OperateResult operateResult = ScriptIoc[sb].Execute(sb.ScriptType, sb.ScriptCode, sb.ScriptFunction, new object[] { addressDetails.AddressName, value });
-                                    if (operateResult.State)
-                                    {
-                                        NewValue = operateResult.RData?.ToString();
-                                    }
-                                }
+                                ScriptOperate operate = ScriptOperate.Instance(basics);
+                                ScriptIoc.AddOrUpdate(basics, operate, (k, v) => operate);
                             }
-                            else
+                            if (ScriptIoc.ContainsKey(basics))
                             {
-                                LogHelper.Error("使用了脚本解析,但未设置配置", ParseLog);
+                                OperateResult operateResult = ScriptIoc[basics].Execute(basics.ScriptType, basics.ScriptCode, basics.ScriptFunction, new object[] { addressDetails.AddressName, value });
+                                if (operateResult.State)
+                                {
+                                    NewValue = operateResult.RData?.ToString();
+                                }
                             }
-                            break;
+                        }
+                        else
+                        {
+                            LogHelper.Error("使用了“脚本”解析,但参数错误或为空", ParseLog);
+                        }
                     }
+                    //如果没解析到结果则赋值为空
                     if (NewValue is null)
                     {
-                        NewValue = value;
+                        NewValue = string.Empty;
                     }
                     return NewValue?.ToString();
                 }

+ 1 - 1
src/YSAI.DB/YSAI.DB.csproj

@@ -21,6 +21,6 @@
     <PackageReference Include="System.Data.OracleClient" Version="1.0.8" />
     <PackageReference Include="System.Data.SqlClient" Version="4.8.5" />
     <PackageReference Include="System.Data.SQLite" Version="1.0.118" />
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.DaqManage/YSAI.DaqManage.csproj

@@ -7,7 +7,7 @@
   </PropertyGroup>
 	<ItemGroup>
 		<FrameworkReference Include="Microsoft.AspNetCore.App" />
-		<PackageReference Include="YSAI.Core" Version="23.333.10899" />
+		<PackageReference Include="YSAI.Core" Version="23.334.14260" />
 	</ItemGroup>
 
 	<!--<ItemGroup>

+ 1 - 1
src/YSAI.Kafka/YSAI.Kafka.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="Confluent.Kafka" Version="2.3.0" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Mewtocol/YSAI.Mewtocol.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="Mewtocol.NET" Version="0.8.1" />
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Mitsubishi/YSAI.Mitsubishi.csproj

@@ -16,7 +16,7 @@
     <Description>$(DescriptionType):$(DescriptionName) ( $(DescriptionDetails) )</Description>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
   <ItemGroup>
     <ProjectReference Include="..\YSAI.Modbus\YSAI.Modbus.csproj" />

+ 1 - 1
src/YSAI.Modbus/YSAI.Modbus.csproj

@@ -18,6 +18,6 @@
   <ItemGroup>
     <PackageReference Include="NModbus" Version="3.0.81" />
     <PackageReference Include="NModbus.Serial" Version="3.0.81" />
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Model/YSAI.Model.csproj

@@ -3,7 +3,7 @@
     <TargetFrameworks>net6.0;net8.0</TargetFrameworks>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
-    <Version>23.333.10598</Version>
+    <Version>23.334.18639</Version>
     <PackageOutputPath Condition="'$(Configuration)' == 'Release'">../YSAI.Publish/Release</PackageOutputPath>
     <PackageOutputPath Condition="'$(Configuration)' == 'Debug'">../YSAI.Publish/Debug</PackageOutputPath>
     <Authors>Shun</Authors>

+ 12 - 32
src/YSAI.Model/data/AddressParse.cs

@@ -1,44 +1,24 @@
-using Newtonsoft.Json;
-using Newtonsoft.Json.Converters;
-using YSAI.Model.@enum;
-
-namespace YSAI.Model.data
+namespace YSAI.Model.data
 {
     /// <summary>
-    /// 地址的解析
+    /// 地址的解析;
+    /// 只能存在一个解析
     /// </summary>
     public class AddressParse
     {
         /// <summary>
-        /// 解析类型
-        /// </summary>
-        [JsonConverter(typeof(StringEnumConverter))]
-        public ParseType ParseType { get; set; }
-
-        /// <summary>
-        /// 反射解析的参数
-        /// </summary>
-        public ReflectionParse? ReflectionParseParam { get; set; }
-
-        /// <summary>
-        /// 通过脚本来执行解析
-        /// 脚本基础数据对象
-        /// </summary>
-        public object? ScriptBasics { get; set; }
-    }
-    /// <summary>
-    /// 反射解析数据
-    /// </summary>
-    public class ReflectionParse
-    {
-        /// <summary>
-        /// 反射的基础数据
+        /// 反射解析;
+        /// object[0]:反射的基础数据;
+        /// object[1]:需要执行哪个方法的SN;
+        /// 通过反射得到解析后结果,[入参(string 地址名,string 地址值)] - [出参(string)]
         /// </summary>
-        public object ReflectionBasics { get; set; }
+        public object[]? ReflectionParam { get; set; } = null;
 
         /// <summary>
-        /// 需要执行哪个方法的SN
+        /// 脚本解析;
+        /// object:脚本的基础数据;
+        /// 通过动态脚本得到解析后结果,[入参(string 地址名,string 地址值)] - [出参(string)]
         /// </summary>
-        public string RSn { get; set; }
+        public object? ScriptParam { get; set; } = null;
     }
 }

+ 8 - 0
src/YSAI.Model/data/AddressRelay.cs

@@ -9,6 +9,14 @@
         /// 主题
         /// </summary>
         public string? Topic { get; set; }
+
+        /// <summary>
+        /// 内容格式;
+        /// 使用:{0} 必须存在,放数据;
+        /// 为空:无任何格式,直接放数据
+        /// </summary>
+        public string? ContentFormat { get; set; } = null;
+
         /// <summary>
         /// 实例SN,为空则所有打开的转发实例都转发
         /// </summary>

+ 0 - 18
src/YSAI.Model/enum/ParseType.cs

@@ -1,18 +0,0 @@
-namespace YSAI.Model.@enum
-{
-    /// <summary>
-    /// 解析类型
-    /// </summary>
-    public enum ParseType
-    {
-        /// <summary>
-        /// 反射解析,通过反射得到,[入参(string 地址名,string 地址值)] - [出参(string)]
-        /// </summary>
-        R,
-
-        /// <summary>
-        /// 脚本解析,动态脚本解析,[入参(string 地址名,string 地址值)] - [出参(string)]
-        /// </summary>
-        S
-    }
-}

+ 1 - 1
src/YSAI.Mqtt/YSAI.Mqtt.csproj

@@ -18,6 +18,6 @@
   <ItemGroup>
     <PackageReference Include="MQTTnet" Version="4.3.1.873" />
     <PackageReference Include="MQTTnet.AspNetCore" Version="4.3.1.873" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.NetMQ/YSAI.NetMQ.csproj

@@ -18,6 +18,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="NetMQ" Version="4.0.1.13" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Netty/YSAI.Netty.csproj

@@ -18,6 +18,6 @@
   <ItemGroup>
     <PackageReference Include="DotNetty.Handlers" Version="0.7.5" />
     <PackageReference Include="DotNetty.Transport" Version="0.7.5" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Omron/YSAI.Omron.csproj

@@ -16,6 +16,6 @@
     <Description>$(DescriptionType):$(DescriptionName) ( $(DescriptionDetails) )</Description>
   </PropertyGroup>
   <ItemGroup>
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 </Project>

+ 1 - 4
src/YSAI.Opc/YSAI.Opc.csproj

@@ -17,9 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="OPCFoundation.NetStandard.Opc.Ua" Version="1.4.372.76" />
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
-  <!--<ItemGroup>
-    <ProjectReference Include="..\YSAI.Core\YSAI.Core.csproj" />
-  </ItemGroup>-->
 </Project>

+ 15 - 0
src/YSAI.Opc/ua/client/OpcUaClientData.cs

@@ -72,6 +72,21 @@ namespace YSAI.Opc.ua.client
             [Display(true, true, true, ParamStructure.dataCate.unmber)]
             public int Timeout { get; set; } = 5000;
 
+            /// <summary>
+            /// 是否需要断开重新连接
+            /// </summary>
+            [Description("是否需要断开重新连接")]
+            [Display(true, true, true, ParamStructure.dataCate.radio)]
+            public bool InterruptReconnection { get; set; } = true;
+
+            /// <summary>
+            /// 重连间隔(毫秒)
+            /// </summary>
+            [Description("重连间隔")]
+            [Unit("ms")]
+            [Display(true, true, true, ParamStructure.dataCate.unmber)]
+            public int ReconnectionInterval { get; set; } = 2000;
+
             /// <summary>
             /// 取样时间间隔
             /// </summary>

+ 7 - 14
src/YSAI.Opc/ua/client/OpcUaClientOperate.cs

@@ -116,11 +116,6 @@ namespace YSAI.Opc.ua.client
         /// </summary>
         public IUserIdentity UserIdentity { get; set; }
 
-        /// <summary>
-        /// 重连时间,多少秒与服务器进行重连一次
-        /// </summary>
-        private int reconnectPeriod = 10;
-
         /// <summary>
         /// 尝试重新连接到服务器
         /// </summary>
@@ -315,12 +310,6 @@ namespace YSAI.Opc.ua.client
                 }
                 if (ServiceResult.IsBad(e.Status))
                 {
-                    if (reconnectPeriod <= 0)
-                    {
-                        OnEventHandler(this, new EventResult(false, $"[ {Steps.异常断开} ]连接错误  ({e.Status})"));
-                        return;
-                    }
-
                     OnEventHandler(this, new EventResult(false, $"[ {Steps.异常断开} ]重连 {ConnectedCounet++} 次 ..."));
 
                     IsConnected = false;
@@ -328,7 +317,7 @@ namespace YSAI.Opc.ua.client
                     if (sessionReconnectHandler == null)
                     {
                         sessionReconnectHandler = new SessionReconnectHandler();
-                        var state = sessionReconnectHandler.BeginReconnect(session, reconnectPeriod * 1000, Server_ReconnectComplete);
+                        sessionReconnectHandler.BeginReconnect(session, basics.ReconnectionInterval, Server_ReconnectComplete);
                     }
                     return;
                 }
@@ -1709,8 +1698,12 @@ namespace YSAI.Opc.ua.client
                 //当会话关闭,则关闭订阅
                 clientSession.DeleteSubscriptionsOnClose = true;
 
-                //当从服务器到达一个存活状态或检测到一个错误时将被引发
-                clientSession.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);
+                //是否需要重连
+                if (basics.InterruptReconnection)
+                {
+                    //当从服务器到达一个存活状态或检测到一个错误时将被引发
+                    clientSession.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);
+                }
 
                 //添加或删除订阅
                 clientSession.SubscriptionsChanged += ClientSession_SubscriptionsChanged;

+ 1 - 1
src/YSAI.RabbitMQ/YSAI.RabbitMQ.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="RabbitMQ.Client" Version="6.7.0" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Redis/YSAI.Redis.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="StackExchange.Redis" Version="2.7.4" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.RelayManage/YSAI.RelayManage.csproj

@@ -9,7 +9,7 @@
 	<ItemGroup>
 		<PackageReference Include="RabbitMQ.Client" Version="6.7.0" />
 		<PackageReference Include="Confluent.Kafka" Version="2.3.0" />
-		<PackageReference Include="YSAI.Core" Version="23.333.10899" />
+		<PackageReference Include="YSAI.Core" Version="23.334.14260" />
 		<FrameworkReference Include="Microsoft.AspNetCore.App" />
 	</ItemGroup>
 

+ 1 - 1
src/YSAI.Rest/YSAI.Rest.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="RabbitMQ.Client" Version="6.7.0" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Rpc/YSAI.Rpc.csproj

@@ -18,6 +18,6 @@
   <ItemGroup>
     <PackageReference Include="DotNetty.Codecs" Version="0.7.5" />
     <PackageReference Include="ImpromptuInterface" Version="8.0.4" />
-    <PackageReference Include="YSAI.Model" Version="23.333.10598" />
+    <PackageReference Include="YSAI.Model" Version="23.334.13504" />
   </ItemGroup>
 </Project>

+ 1 - 1
src/YSAI.Siemens/YSAI.Siemens.csproj

@@ -17,6 +17,6 @@
   </PropertyGroup>
   <ItemGroup>
     <PackageReference Include="S7netplus" Version="0.20.0" />
-    <PackageReference Include="YSAI.Core" Version="23.333.10899" />
+    <PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 </Project>

+ 18 - 21
src/YSAI.Test.All/Program.cs

@@ -4,7 +4,6 @@ using YSAI.Core.script;
 using YSAI.Log;
 using YSAI.Model.data;
 using YSAI.Model.@enum;
-using YSAI.Mqtt.service;
 using YSAI.Opc.ua.client;
 using YSAI.Unility;
 
@@ -29,21 +28,21 @@ List<string> ReadCsv(string path, bool hasTitle)
 
 //启动两个服务端
 
-Console.WriteLine(MqttServiceOperate.Instance(new MqttServiceData.Basics
-{
-    MaxNumber = 1000,
-    Password = "ysai",
-    UserName = "ysai",
-    Port = 8881
-}).On().ToJson().JsonFormatting());
+//Console.WriteLine(MqttServiceOperate.Instance(new MqttServiceData.Basics
+//{
+//    MaxNumber = 1000,
+//    Password = "ysai",
+//    UserName = "ysai",
+//    Port = 8881
+//}).On().ToJson().JsonFormatting());
 
-Console.WriteLine(MqttServiceOperate.Instance(new MqttServiceData.Basics
-{
-    MaxNumber = 1000,
-    Password = "ysai",
-    UserName = "ysai",
-    Port = 8882
-}).On().ToJson().JsonFormatting());
+//Console.WriteLine(MqttServiceOperate.Instance(new MqttServiceData.Basics
+//{
+//    MaxNumber = 1000,
+//    Password = "ysai",
+//    UserName = "ysai",
+//    Port = 8882
+//}).On().ToJson().JsonFormatting());
 
 
 
@@ -85,8 +84,7 @@ for (int i = 0; i < strings.Count; i++)
             },
             AddressParseParam = new AddressParse
             {
-                ParseType = ParseType.S,
-                ScriptBasics = new ScriptData.Basics()
+                ScriptParam = new ScriptData.Basics()
                 {
                     ScriptCode = @"function Convert(addressname,value) { return '【这是调用脚本解析】传入的地址是:'+ addressname + '----传入的参数是:' + value; }",
                     ScriptFunction = "Convert",
@@ -110,10 +108,9 @@ for (int i = 0; i < strings.Count; i++)
             },
             AddressParseParam = new AddressParse
             {
-                ParseType = ParseType.R,
-                ReflectionParseParam = new ReflectionParse()
+                ReflectionParam = new object[]
                 {
-                    ReflectionBasics = new ReflectionData.Basics
+                    new ReflectionData.Basics
                     {
                         DllDatas = new List<ReflectionData.DllData>
                         {
@@ -158,7 +155,7 @@ for (int i = 0; i < strings.Count; i++)
                             }
                         }
                     },
-                    RSn = "YSAI.Test.Dll.TestAll[Instance][R2]"
+                    "YSAI.Test.Dll.TestAll[Instance][R2]"
                 }
             }
         });

+ 0 - 1
src/YSAI.Test.All/YSAI.Test.All.csproj

@@ -9,7 +9,6 @@
   </PropertyGroup>
 
   <ItemGroup>
-    <ProjectReference Include="..\YSAI.Mqtt\YSAI.Mqtt.csproj" />
     <ProjectReference Include="..\YSAI.Opc\YSAI.Opc.csproj" />
   </ItemGroup>
 

+ 223 - 4
src/YSAI.Test.Console/Program.cs

@@ -1,8 +1,227 @@
-
-using YSAI.Mqtt.client;
-using YSAI.Unility;
+Console.WriteLine();
 
-Console.WriteLine(new MqttClientData.Basics().ToJson().JsonFormatting());
+////实例创建的几种方式
+////以OPCUA 采集协议为例
+//using YSAI.Model.@interface;
+//using YSAI.Opc.ua.client;
+
+//OpcUaClientOperate? operate = null;
+//IDaq? daq = null;
+
+////无参实例
+//operate = new OpcUaClientOperate();
+////无参实例调函数创建实例,与无参实例配合使用
+//operate = new OpcUaClientOperate().CreateInstance(new OpcUaClientData.Basics()).GetRData<OpcUaClientOperate>();
+////有参实例
+//operate = new OpcUaClientOperate(new OpcUaClientData.Basics());
+////有参单例
+//operate = OpcUaClientOperate.Instance(new OpcUaClientData.Basics());
+////接口 - 无参实例
+//daq = new OpcUaClientOperate();
+////接口 - 无参实例调函数创建实例,与无参实例配合使用
+//daq = new OpcUaClientOperate().CreateInstance(new OpcUaClientData.Basics()).GetRData<OpcUaClientOperate>();
+////接口 - 有参实例
+//daq = new OpcUaClientOperate(new OpcUaClientData.Basics());
+////接口 - 有参单例
+//daq = OpcUaClientOperate.Instance(new OpcUaClientData.Basics());
+
+//using (operate)
+//{
+//    //使用完直接释放
+//}
+
+//using (daq)
+//{
+//    //使用完直接释放
+//}
+
+
+////转发协议
+////以MQTT为例
+//using YSAI.Log;
+//using YSAI.Model.data;
+//using YSAI.Mqtt.client;
+//using YSAI.Unility;
+
+//using (MqttClientOperate operate = new MqttClientOperate(new MqttClientData.Basics
+//{
+//    Ip = "127.0.0.1",
+//    Port = 11819,
+//    UserName = "user",
+//    Password = "password"
+//}))
+//{
+//    #region 打开
+//    OperateResult result = operate.On();
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+//    #endregion 打开
+
+//    #region 生产
+//    result = operate.Produce("主题", "内容");
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+//    #endregion 生产
+
+//    #region 消费
+//    operate.OnEvent += delegate (object? sender, EventResult e)
+//    {
+//        LogHelper.Info(e.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    };
+//    result = operate.Subscribe("主题");
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+//    #endregion 消费
+
+//    #region 关闭
+//    result = operate.Off();
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化  
+//    #endregion 关闭
+
+//    #region 获取状态
+//    result = operate.GetStatus();
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 获取状态
+
+//    #region 获取参数
+//    result = operate.GetParam();
+//    LogHelper.Info(result.GetRData<ParamStructure>().ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 获取参数
+//}
+
+
+
+
+////采集协议
+////以OPCUA 采集协议为例
+//using System.Collections.Concurrent;
+//using YSAI.Core.script;
+//using YSAI.Log;
+//using YSAI.Model.data;
+//using YSAI.Model.@enum;
+//using YSAI.Opc.ua.client;
+//using YSAI.Unility;
+
+//using (OpcUaClientOperate operate = new OpcUaClientOperate(new OpcUaClientData.Basics
+//{
+//    ServerUrl = "opc.tcp://127.0.0.1:6688",
+//    UserName = "user",
+//    Password = "password",
+//}))
+//{
+//    //点位地址
+//    Address address = new Address();
+//    address.SN = Guid.NewGuid().ToString();
+//    address.CreationTime = DateTime.Now.ToLocalTime();
+//    address.AddressArray = new List<AddressDetails>
+//    {
+//         new AddressDetails()                                        //地址详情参数介绍
+//        {
+//            SN=$"",                                                  //可以理解成唯一标识符(可以存机台号、组名、车间、厂)
+//            AddressAnotherName="",                                   //地址别名
+//            AddressDataType=DataType.String,                         //数据类型
+//            AddressDescribe="",                                      //地址描述
+//            AddressExtendParam=new object(),                         //扩展数据
+//            AddressName="",                                          //脚本地址
+//            AddressPropertyName="",                                  //地址别名
+//            AddressType=AddressType.Reality,                         //地址类型
+//            IsEnable=true,                                           //是否启用
+//            AddressRelayParam=new AddressRelay                       //转发参数
+//            {
+//                ISns = new List<string> { "ISN1", "ISN2" },          //实例SN
+//                Topic = $"topic",                                    //主题
+//                ContentFormat="Value:{0}"                            //内容格式
+//            },
+//            AddressParseParam=new AddressParse                       //脚本解析实例
+//            {
+//                ScriptParam=new ScriptData.Basics                    //脚本解析基础数据
+//                {
+//                    ScriptCode = @"function Convert(addressname,value) { return '【这是调用脚本解析】传入的地址是:'+ addressname + '----传入的参数是:' + value; }",  //脚本代码
+//                    ScriptFunction = "Convert",                                                                                                                        //脚本入口
+//                    ScriptType = ScriptData.ScriptType.JavaScript                                                                                                      //脚本类型
+//                }
+//            },
+//            //AddressParseParam = new AddressParse                  //反射解析
+//            //{                      
+//            //    ReflectionParam = new object[]                    //反射解析的参数
+//            //    {
+//            //        new ReflectionData.Basics                     //反射解析基础数据
+//            //        {
+//            //                                                      //反射解析的基础数据
+//            //        },
+//            //        "SN"                                          //反射解析的SN
+//            //    }
+//            // },
+//         }
+//    };
+
+//    #region 打开
+//    OperateResult result = operate.On();
+//    LogHelper.Info(result.ToJson().JsonFormatting());  //转成JSON.JSON格式化 
+//    #endregion 打开
+
+//    #region 读取
+//    //读取
+//    result = operate.Read(address);
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 读取
+
+//    #region 订阅
+//    operate.OnEvent += delegate (object? sender, EventResult e)
+//{
+//    LogHelper.Info(e.ToJson().JsonFormatting());    //转成JSON.JSON格式化
+//};
+//    result = operate.Subscribe(address);
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 订阅
+
+//    #region 写入
+//    ConcurrentDictionary<string, object> value = new ConcurrentDictionary<string, object>
+//    {
+//        ["地址"] = "string 值",
+//        ["地址"] = (float)1.1f,
+//        ["地址"] = (double)2.2d,
+//        ["地址"] = (int)3,
+//        ["地址"] = true
+//    };
+//    result = operate.Write(value);
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 写入
+
+//    #region 关闭
+//    result = operate.Off();
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 关闭
+
+//    #region 获取状态
+//    result = operate.GetStatus();
+//    LogHelper.Info(result.ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 获取状态
+
+//    #region 获取参数
+//    result = operate.GetParam();
+//    LogHelper.Info(result.GetRData<ParamStructure>().ToJson().JsonFormatting());   //转成JSON.JSON格式化 
+//    #endregion 获取参数
+//}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+//using YSAI.Mqtt.client;
+//using YSAI.Unility;
+
+//Console.WriteLine(new MqttClientData.Basics().ToJson().JsonFormatting());
 
 
 

+ 1 - 1
src/YSAI.Test/YSAI.Test.csproj

@@ -17,7 +17,7 @@
       <PrivateAssets>all</PrivateAssets>
       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
     </PackageReference>
-	<PackageReference Include="YSAI.Core" Version="23.333.10899" />
+	<PackageReference Include="YSAI.Core" Version="23.334.14260" />
   </ItemGroup>
 
   <ItemGroup>

+ 2 - 2
src/YSAI.VT/Program.cs

@@ -18,9 +18,9 @@ namespace YSAI.VT
                 //"YSAI.Unility",
                 //"YSAI.Log",
 
-                //"YSAI.Model",
+                "YSAI.Model",
 
-                "YSAI.Core",
+                //"YSAI.Core",
 
                 //"YSAI.Rpc",
                 //"YSAI.Redis",