ソースを参照

1.Mqtt 版本更新 内部函数名修改
2.README.md 新增应用代码

Shun 2 年 前
コミット
a231c81704

+ 147 - 0
README.md

@@ -72,6 +72,153 @@ namespace YSAI.Core.@interface
 }
 ```
 
+## 应用
+```sharp
+
+1.上 NUGET 搜索 YSAI
+2.安装对应的协议包
+3.应用代码如下
+4.协议包内还有内部公共方法,请自行研究使用
+
+------------------------------------------------------
+
+//采集协议
+using (类 operate = new 类(new 类数据.Basics
+{
+
+    //采集对象参数
+
+}))
+{
+    //打开
+    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点位地址
+        {
+            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()
+            {
+               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()  //地址详情参数介绍
+        {
+            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     //脚本解析数据
+            //    {
+            //    }
+            //},
+             AddressParseParam=new AddressParse                     //地址解析参数
+            {
+                ParseType=ParseType.MethodAnalysis,                 //解析类型
+                ReflectionSN="反射SN"
+            },
+             AddressPropertyName="Name1",                           //地址别名
+             AddressType=AddressType.Reality,                       //地址类型
+             IsEnable=true                                          //是否启用
+         }
+    };
+
+    //读取
+    result = operate.Read(address);
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //订阅
+    operate.OnEvent += delegate (object? sender, EventResult e)
+    {
+        LogHelper.Info(e.ToJson().JsonFormatting());
+    };
+    result = operate.Subscribe(address);
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //写入
+    ConcurrentDictionary<string, string> value = new ConcurrentDictionary<string, string>
+    {
+        ["地址"] = "值"
+    };
+    result = operate.Write(value);
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //关闭
+    result = operate.Off();
+    LogHelper.Info(result.ToJson().JsonFormatting());
+}
+
+------------------------------------------------------
+
+//转发协议
+using (类 operate = new 类(new 类数据.Basics
+{
+
+    //转发对象参数
+
+}))
+{
+    //打开
+    OperateResult result = operate.On();
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //生产
+    result = operate.Produce("主题", "内容");
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //消费
+    operate.OnEvent += delegate (object? sender, EventResult e)
+    {
+        LogHelper.Info(e.ToJson().JsonFormatting());
+    };
+    result = operate.Subscribe("主题");
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //关闭
+    result = operate.Off();
+    LogHelper.Info(result.ToJson().JsonFormatting());
+}
+
+```
+
 ## 协议服务端(用于数据模拟)
 1. Mqtt服务端  
 2. MqttWebSocket服务端 

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

@@ -5,7 +5,7 @@
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
 	  <GeneratePackageOnBuild>True</GeneratePackageOnBuild>
-	  <Version>1.0.0.19</Version>
+	  <Version>1.0.0.20</Version>
 	  <Authors>Shun</Authors>
 	  <Company>YSAI</Company>
 	  <Product>SCADA</Product>

+ 9 - 9
src/YSAI.DAQ/YSAI.Mqtt/client/MqttClientOperate.cs

@@ -115,9 +115,9 @@ namespace YSAI.Mqtt.client
         /// </param>
         /// <param name="Retain">消息是否保留</param>
         /// <returns>统一结果</returns>
-        public Task<OperateResult> PublishSubscribeAsync(string Topic, string Content, int QoSLevel = 0, bool Retain = false)
+        public Task<OperateResult> PublishAsync(string Topic, string Content, int QoSLevel = 0, bool Retain = false)
         {
-            return Task.Run(() => PublishSubscribe(Topic, Content, QoSLevel, Retain));
+            return Task.Run(() => Publish(Topic, Content, QoSLevel, Retain));
         }
 
         /// <summary>
@@ -135,15 +135,15 @@ namespace YSAI.Mqtt.client
         /// </param>
         /// <param name="Retain">消息是否保留</param>
         /// <returns>统一结果</returns>
-        public OperateResult PublishSubscribe(string Topic, string Content, int QoSLevel = 0, bool Retain = false)
+        public OperateResult Publish(string Topic, string Content, int QoSLevel = 0, bool Retain = false)
         {
             //开始记录运行时间
-            Depart("PublishSubscribe");
+            Depart("Publish");
             try
             {
                 if (!mqttClient.IsConnected)
                 {
-                    return Break("PublishSubscribe", false, "未连接");
+                    return Break("Publish", false, "未连接");
                 }
                 MqttApplicationMessage mqttApplicationMessage = new MqttApplicationMessage();
                 //主题
@@ -158,16 +158,16 @@ namespace YSAI.Mqtt.client
                 MqttClientPublishResult mqttClientPublishResult = mqttClient.PublishAsync(mqttApplicationMessage).Result;
                 if (mqttClientPublishResult.IsSuccess)
                 {
-                    return Break("PublishSubscribe", true);
+                    return Break("Publish", true);
                 }
                 else
                 {
-                    return Break("PublishSubscribe", false, mqttClientPublishResult.ReasonString);
+                    return Break("Publish", false, mqttClientPublishResult.ReasonString);
                 }
             }
             catch (Exception ex)
             {
-                return Break("PublishSubscribe", false, ex.Message, Exc: ex);
+                return Break("Publish", false, ex.Message, Exc: ex);
             }
         }
         /// <summary>
@@ -320,7 +320,7 @@ namespace YSAI.Mqtt.client
         public OperateResult Produce(string Topic, string Content)
         {
             Depart("Produce");
-            OperateResult operateResult = PublishSubscribe(Topic, Content, Retain: true);
+            OperateResult operateResult = Publish(Topic, Content, Retain: true);
             return Break("Produce", operateResult.State, operateResult.Message);
         }
 

+ 187 - 49
src/YSAI.DAQ/YSAI.Test.Console/Program.cs

@@ -1,73 +1,211 @@
 
 
-//对象实例
+
 using S7.Net;
 using System.Collections.Concurrent;
 using YSAI.Core.data;
 using YSAI.Core.@enum;
+using YSAI.DB;
+using YSAI.Log;
+using YSAI.Mqtt.client;
 using YSAI.S7.client;
 using YSAI.Unility;
 
-S7ClientOperate s7ClientOperate = S7ClientOperate.Instance(new S7ClientData.Basics()
+//采集
+using (类 operate = new 类(new 类数据.Basics
 {
-    Ip = "192.168.2.20",
-    Port = 102,
-    Rack = 0,
-    Slot = 1,
-    S7CpuType = CpuType.S71200,
-    ChangeOut = false,
-    HandleInterval=1,
-    SN = Guid.NewGuid().ToString()
-}); ;
 
-//打开
-OperateResult operateResult = s7ClientOperate.On();
-Console.WriteLine(operateResult.Message);
-
-//点位地址
-Address address = new Address();
-address.SN = Guid.NewGuid().ToString();
-address.CreationTime = DateTime.Now.ToLocalTime();
-address.AddressArray = new List<AddressDetails>();
-address.AddressArray.Add(new AddressDetails()
-{
-    AddressName = "DB71.DBD4",
-    AddressDataType = YSAI.Core.@enum.DataType.String,
-    AddressType = AddressType.Reality
-});
-
-//读取
-operateResult = s7ClientOperate.Read(address);
-Console.WriteLine(operateResult.Message);
-if (operateResult.State)
+    //采集对象参数
+
+}))
 {
-    foreach (var item in operateResult.RData as ConcurrentDictionary<string, AddressValue>)
+    //打开
+    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>
     {
-        Console.WriteLine(item.Key);
-        Console.WriteLine(item.Value.Value);
-    }
-}
-
-//订阅
-s7ClientOperate.OnEvent += S7ClientOperate_OnEvent;
-s7ClientOperate.Subscribe(address);
+        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点位地址
+        {
+            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()
+            {
+               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()  //地址详情参数介绍
+        {
+            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     //脚本解析数据
+            //    {
+            //    }
+            //},
+             AddressParseParam=new AddressParse                     //地址解析参数
+            {
+                ParseType=ParseType.MethodAnalysis,                 //解析类型
+                ReflectionSN="反射SN"
+            },
+             AddressPropertyName="Name1",                           //地址别名
+             AddressType=AddressType.Reality,                       //地址类型
+             IsEnable=true                                          //是否启用
+         }
+    };
+
+    //读取
+    result = operate.Read(address);
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //订阅
+    operate.OnEvent += delegate (object? sender, EventResult e)
+    {
+        LogHelper.Info(e.ToJson().JsonFormatting());
+    };
+    result = operate.Subscribe(address);
+    LogHelper.Info(result.ToJson().JsonFormatting());
 
-while (true)
-{
-   string value= Console.ReadLine();
     //写入
-    ConcurrentDictionary<string, string> keyValuePairs = new ConcurrentDictionary<string, string>();
-    keyValuePairs.TryAdd("DB71.DBD4", value);
-    operateResult = s7ClientOperate.Write(keyValuePairs);
-    Console.WriteLine(operateResult.Message);
+    ConcurrentDictionary<string, string> value = new ConcurrentDictionary<string, string>
+    {
+        ["地址"] = "值"
+    };
+    result = operate.Write(value);
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //关闭
+    result = operate.Off();
+    LogHelper.Info(result.ToJson().JsonFormatting());
 }
 
-void S7ClientOperate_OnEvent(object? sender, EventResult e)
+//转发
+using (类 operate = new 类(new 类数据.Basics
 {
-    Console.WriteLine(e.ToJson());
+
+    //转发对象参数
+
+}))
+{
+    //打开
+    OperateResult result = operate.On();
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //生产
+    result = operate.Produce("主题", "内容");
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //消费
+    operate.OnEvent += delegate (object? sender, EventResult e)
+    {
+        LogHelper.Info(e.ToJson().JsonFormatting());
+    };
+    result = operate.Subscribe("主题");
+    LogHelper.Info(result.ToJson().JsonFormatting());
+
+    //关闭
+    result = operate.Off();
+    LogHelper.Info(result.ToJson().JsonFormatting());
 }
 
 
+
+//    S7ClientOperate s7ClientOperate = S7ClientOperate.Instance(new S7ClientData.Basics()
+//    {
+//        Ip = "192.168.2.20",
+//        Port = 102,
+//        Rack = 0,
+//        Slot = 1,
+//        S7CpuType = CpuType.S71200,
+//        ChangeOut = false,
+//        HandleInterval = 1,
+//        SN = Guid.NewGuid().ToString()
+//    }); ;
+
+////打开
+//OperateResult operateResult = s7ClientOperate.On();
+//Console.WriteLine(operateResult.Message);
+
+////点位地址
+//Address address = new Address();
+//address.SN = Guid.NewGuid().ToString();
+//address.CreationTime = DateTime.Now.ToLocalTime();
+//address.AddressArray = new List<AddressDetails>();
+//address.AddressArray.Add(new AddressDetails()
+//{
+//    AddressName = "DB71.DBD4",
+//    AddressDataType = YSAI.Core.@enum.DataType.String,
+//    AddressType = AddressType.Reality
+//});
+
+////读取
+//operateResult = s7ClientOperate.Read(address);
+//Console.WriteLine(operateResult.Message);
+//if (operateResult.State)
+//{
+//    foreach (var item in operateResult.RData as ConcurrentDictionary<string, AddressValue>)
+//    {
+//        Console.WriteLine(item.Key);
+//        Console.WriteLine(item.Value.Value);
+//    }
+//}
+
+////订阅
+//s7ClientOperate.OnEvent += S7ClientOperate_OnEvent;
+//s7ClientOperate.Subscribe(address);
+
+//while (true)
+//{
+//   string value= Console.ReadLine();
+//    //写入
+//    ConcurrentDictionary<string, string> keyValuePairs = new ConcurrentDictionary<string, string>();
+//    keyValuePairs.TryAdd("DB71.DBD4", value);
+//    operateResult = s7ClientOperate.Write(keyValuePairs);
+//    Console.WriteLine(operateResult.Message);
+//}
+
+//void S7ClientOperate_OnEvent(object? sender, EventResult e)
+//{
+//    Console.WriteLine(e.ToJson());
+//}
+
+
 //WsServiceOperate wsServiceOperate = WsServiceOperate.Instance(new WsServiceData.Basics 
 //{
 //    Ip = "127.0.0.1",

+ 1 - 1
src/YSAI.DAQ/YSAI.Tool.Core/mqtt/client/MqttClientToolController.cs

@@ -284,7 +284,7 @@ namespace YSAI.Tool.Core.mqtt.client
             else
             {
                 //发布
-                reverseBack = mqttClientOperate.PublishSubscribe(Topic, Value, QosType, true);
+                reverseBack = mqttClientOperate.Publish(Topic, Value, QosType, true);
                 //信息输出
                 MessageOut($"{reverseBack.Message},用时:{reverseBack.RunTime} ms");
             }