## 阐述
1. 所有协议公共函数支持同步异步
2. 所有协议读取写入协议参数统一
3. 全部都是统一入参出参
4. 支持多点转发,多点解析
5. 支持快速对接,与配置
6. 支持虚拟点位
7. 所有采集协议支持订阅模式
8. 采集与转发协议接口统一
9. 事件结果统一
## 核心与扩展组件
1. [ YSAI.Log ]Verbose(详细信息)、Debug(调试)、Info(信息)、Warning(警告)、Error(异常或错误)、Fatal(致命错误或异常)
2. [ YSAI.Unility ]公共快捷方便方法集合 (字节、枚举、文件、字符串、验证、比对、转换、反射、扩展、Json、Xml、Ftp、System ...)
3. [ YSAI.Model ]特性、数据结构、接口、枚举、模型工具
4. [ YSAI.Core ]处理、反射、转发、脚本、订阅、虚拟地址、TCP、UDP、HTTP、WS、串口
5. [ YSAI.Rpc ]基于DotNetty实现的RPC(远程过程调用) 支持一对多,支持身份验证
6. [ YSAI.Redis ]非关系型数据库,用于数据快速出站入站存储
## 采集协议
1. Opc(工业标准通信协议) [UA、DA、DAHttp]
2. Can(工业标准通信协议)
3. DB(数据库) [SqlServer、MySql、Oracle、SQLite]
4. Modbus(工业标准通信协议) [Rtu、Ascii、Tcp、Udp]
5. Siemens(西门子) [S7200、S7200Smart、S7300、S7400、S71200、S71500]
6. Beckhoff(倍福) [ADS]
7. Mitsubishi(三菱) [A1E、QNA3E]
8. Omron(欧姆龙) [FINS]
9. AllenBradley(罗克韦尔)
10. Mewtocol(松下) [Tcp、Serial]
11. GE(通用电气) [SRTP]
```sharp
namespace YSAI.Model.@interface
{
///
/// 数采接口
///
public interface IDaq : IOn, IOff, IRead, IWrite, ISubscribe, IGetStatus, IEvent, IGetParam, ICreateInstance, IDisposable
{ }
}
```
## 转发协议
1. Kafka [AdminClient、Producer、Consumer]
2. Mqtt [Client [ Publish、Subscribe ]、Service、WSService]
3. RabbitMQ [Publish、Subscribe]
4. Netty [Client [ Publish、Subscribe ]、Service]
5. NetMQ [Publish、Subscribe]
```sharp
namespace YSAI.Model.@interface
{
///
/// 转发接口
///
public interface IRelay : IOn, IOff, IProducer, IConsumer, IGetStatus, IEvent, IGetParam, ICreateInstance, IDisposable
{ }
}
```
## 协议服务端(用于数据模拟)
1. Mqtt服务端
2. MqttWebSocket服务端
3. OpcUa服务端
4. Socket服务端
5. WebSocket服务端
## 创建实例合集
```sharp
//实例创建的几种方式
//以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();
//有参实例
operate = new OpcUaClientOperate(new OpcUaClientData.Basics());
//有参单例
operate = OpcUaClientOperate.Instance(new OpcUaClientData.Basics());
//接口 - 无参实例
daq = new OpcUaClientOperate();
//接口 - 无参实例调函数创建实例,与无参实例配合使用
daq = new OpcUaClientOperate().CreateInstance(new OpcUaClientData.Basics()).GetRData();
//接口 - 有参实例
daq = new OpcUaClientOperate(new OpcUaClientData.Basics());
//接口 - 有参单例
daq = OpcUaClientOperate.Instance(new OpcUaClientData.Basics());
using (operate)
{
//使用完直接释放
}
using (daq)
{
//使用完直接释放
}
```
## 采集应用
1. 上 “NUGET” 搜索
2. 安装对应的协议包
3. 应用代码如下
4. 协议包内还有内部公共方法,请自行研究使用
```sharp
//采集协议
//以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
{
new AddressDetails() //地址详情参数介绍
{
SN=$"", //可以理解成唯一标识符(可以存机台号、组名、车间、厂)
AddressAnotherName="", //地址别名
AddressDataType=DataType.String, //数据类型
AddressDescribe="", //地址描述
AddressExtendParam=new object(), //扩展数据
AddressName="", //实际地址[ 不能为空 ]
AddressPropertyName="", //属性名称
AddressType=AddressType.Reality, //地址类型
IsEnable=true, //是否启用
AddressRelayParam=new AddressRelay //转发参数
{
ISns = new List { "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 value = new ConcurrentDictionary
{
["地址"] = "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().ToJson().JsonFormatting()); //转成JSON.JSON格式化
#endregion 获取参数
}
```
## 转发应用
1. 上 “NUGET” 搜索
2. 安装对应的协议包
3. 应用代码如下
4. 协议包内还有内部公共方法,请自行研究使用
```sharp
//转发协议
//以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().ToJson().JsonFormatting()); //转成JSON.JSON格式化
#endregion 获取参数
}
```
## 更新表
#### 2023-02-15
1. 项目启动
2. 库框架搭建
3. 采集订阅流程实现多线程队列形式,处理速度大大提升
```sharp
//更新,无休眠时间
while(true)
{
//三大步骤
1.优化
2.更新
3.提交
}
```
#### 2023-09-20
1. 采集订阅模式关闭优化
2. 底层通信库性能提升
#### 2023-09-23
1. 日志记录优化,更详细的日志记录
#### 2023-09-24
1. 新增公用库方法
2. 版本更新
3. MqttService参数类型修改
#### 2023-09-25
1. CanLib 文件位置更换
2. Pack 生成位置更换
#### 2023-09-27
1. Mqtt 客户端 修改内部公共方法函数名
2. 转发协议包修改
#### 2023-10-08
1. 反射新增类库,分为内外使用
2. 修改转发库获取不到状态问题
3. 版本更新,提交NUGET
4. 新增边端 结构参数解析JSON
#### 2023-10-10
1. 解决OPCUA问题
2. OPCUA版本更新
#### 2023-10-11 ~ 2023-10-12
1. 修改 OPCUA 订阅流程逻辑,解决超时问题
2. 修改 OPCUA 工具显示问题
3. OPCUA 工具新增 导出 Core 地址对象
4. 版本更新
5. 细节更新
6. 结果类型新增
7. 单例模式下新增实例数量限制
#### 2023-10-13
1. 解决RMQ内存增加问题
2. 新增微秒延时
3. 版本更新
4. 新增对象比对方法
5. 修改 override bool Equals 方法
#### 2023-10-15
1. 优化细节
2. 移除 override bool Equals 方法,直接使用对象比对
3. 版本更新
#### 2023-10-16
1. 自定义订阅修改
2. 修改对象比对
3. 版本更新
#### 2023-10-17
1. 订阅函数变化更新 新增订阅源数据比对更新,使比对更合理
2. S7读取修改
#### 2023-10-19
1. 移除多余脚本代码(只做简单脚本计算)
2. 优化OPCUA
3. 版本更新
#### 2023-10-20 ~ 2023-10-23
1. 新增json字符串判断
2. 修改opcua当断线重连自动订阅
3. 修改传输协议的数据格式
4. 新增新的传输协议 Netty 客户端服务端
5. 细节优化
6. 版本更新
#### 2023-10-24 ~ 2023-10-25
1. 新增数据类型DataTime、Time、Date
2. 新增倍福客户端
3. 版本更新,细节优化
#### 2023-10-26
1. 修改CORE的系统与Unility时间工具
2. 整体细节优化
3. 版本更新
#### 2023-10-30
1. 移除S7非标服务端
2. 移除Modbus 非标服务端
3. 底层通信新增字节数从末尾从前移除0x00
4. 多余代码清理
5. 版本更新
#### 2023-10-31
1. OpcUa新增根据设置值自动分配订阅组
2. OpcDa新增根据设置值自动分配订阅组
3. 细节优化
#### 2023-11-01
1. 新增三个特性 单位、验证、展示
2. 新增获取库参数接口方法【GetParam】
3. 移除单独生成库配置文件
4. 细节优化
5. 新增结构参数类
6. 版本更新
#### 2023-11-02
1. 新增创建单例接口方法,为了在反射或获取参数的情况下使用所有功能
#### 2023-11-03
1. 底层通信读取等待结果新增分批读取
2. 新增三菱PLC数据采集
3. 细节优化
4. 版本更新
#### 2023-11-06
1. 三菱PLC采集优化
2. 新增欧姆龙PLC FINS协议采集
3. 版本更新
#### 2023-11-08
1. 新增 NETMQ 传输协议(不保证消息质量模式)
2. 优化函数运行时间,使用 struct 直接操作底层,性能提升
3. 细节优化,版本更新
4. 修改所有协议获取参数重复代码,移植至Core
#### 2023-11-09
1. 新增 AllenBradley PLC采集
2. 新增S7类型读取流程
3. 优化CORE内部结构代码
4. 优化所有采集协议的读取代码
5. 修改采集协议的OFF方法,新添加订阅OFF
6. 新增S7、AllenBradley、Mitsubishi、Omron、ModBus 测试服务端(非标准)
7. 版本更新
#### 2023-11-10
1. 自定义订阅细节修改,移除不必要的事件
2. 新增松下PLC
3. 修改获取参数函数细节
4. 移除不必要的事件跳转
5. OpcUa Da 属性BUG修改
#### 2023-11-13
1. 展示特性中新增详细提示字段,方面展示时了解与指导此属性的详情
2. Serilog 更新至最新版本
3. 修改版本规则 ( 年.天.秒 ) ( 23.317.30964 ) -- 23年,第317天,当天的30964秒时生成的版本
4. 生成nuget包位置更新
#### 2023-11-14
1. 修改S7库名称,现使用Siemens
2. 所有库新增详细描述
3. 等待.net8发布,集成.net8
4. OPCUA 移除默认XML文件,使用动态创建
5. 新增版本更新工具,一键更新版本
#### 2023-11-15
1. 所有库 统一更新,支持 net6.0 、net8.0
2. mqttwsservice 细节优化
#### 2023-11-16
1. RPC远程过程调用工具编写
2. 底层SOCKET WEBSOCKET 修改断线重连规则
3. 版本更新
#### 2023-11-21
1. 新增基于DotNetty实现的RPC(远程过程调用) 支持一对多,支持身份验证
2. RabbitMQ 依赖库更新
#### 2023-11-23
1. 移除Core中的Redis
2. 新增 扩展工具 Redis
3. 修改RPC扩展工具细节
4. 新增 XML 序列化 反序列化 扩展方法
5. 新增HEX扩展转换
6. 版本更新
#### 2023-11-24
1. 整体框架调整 Core、Model、Extend、Daq、Relay
2. 实现底层数据转发功能支持热加载热更新
3. 优化数据解析流程,优化转发流程
#### 2023-11-27
1. 优化数据结构
2. 测试底层转发流程(成功)
3. 测试底层解析流程(成功)
4. 修改脚本解析默认参数传两个
5. 修改反射解析默认参数传两个
6. 新增 动态转发 打开失败重试流程
7. 版本更新
#### 2023-11-28
1. 优化数据类型
2. 优化地址处理函数,严格数据质量
3. OPCUA 新增当订阅的地址点没有在服务器创建订阅,则重新订阅
#### 2023-11-30
1. 修改所有协议的函数开始返回的SN
2. 优化解析,当解析失败异常,则返回空数据,为了更好的判断数据质量
3. OPCUA新增是否重连,重连间隔参数
#### 2023-12-4
1. 修改地址处理的细节,让数据质量更准确
2. 对象比较器更换至[CompareNETObjects]
3. 新增示例代码
4. 修改PACK生成代码位置,与主代码不存在引用关系
#### 2023-12-5
1. 传输协议 netty 更新 ,修复服务端无法群发问题
2. 修改三菱采集协议包问题
3. tool 存在遗留问题待解决
#### 2023-12-7
1. kafka 处理任务优化
2. 版本更新
#### 2023-12-11
1. 新增版本自动更新工具
2. 新增目标框架自动更新工具
3. 依赖库更新
#### 2023-12-13
1. 自动更新工具新增自动打包,一键式完整发布流程
2. 工具主界面修改,性能优化,更友好的交互
3. 采集协议、传输协议工具开发,正在进行中
#### 2023-12-14
1. WPF 属性表格研究,为了开发工具时不用手动写入多个属性控件
2. 所有基础数据新增 Category 特性
3. 依赖库更新
#### 2023-12-18
1. 移除关闭时任务等待
2. 工具界面整体架构更新完成,包含自动加载参数
3. UDP、TCPSERVICE工具改造完成
#### 2023-12-19
1. 新增Ws客户端,服务端
2. 优化Ws Core
3. 串口、Tcp客户端改造完成
4. 优化终端展示界面
5. 新增第一次打开显示默认界面
#### 2023-12-20
1. 优化工具界面
2. 改造OPCUA客户端界面
#### 2023-12-22
1. OPCUA客户端工具改造完成
2. OPCUA服务端动态库修改
3. OPCUA服务端工具改造完成
#### 2023-12-25
1. 修改Mqtt服务端 验证机制
2. 删除OPCUA服务端 匿名登录机制
3. OPCDAHTTP 工具改造完成
#### 2023-12-26
1. mqtt 服务端问题修改
2. mqtt 客户端新增断开事件
3. mqtt 客户端服务端工具改造完成
4. 新增采集、转发工具模版,更快的集成新的驱动
5. 新增AllenBradley、Beckhoff、Mewtocol、Mitsubishi、Omron、Siemens 工具
#### 2023-12-27 ~ 2023-12-29
1. MODBUS 底层库读取写入改造完成
2. 新增 modbus 工具
3. 工具细节优化
4. 模版固定值优化
#### 2024-1-2
1. 新增转发模块工具,kafka、NetMQ、RabbitMQ、Netty
#### 2024-1-3
1. 修改工具细节
2. 优化已存在的问题
3. 新增Windows窗体示例
4. 新增Windows动画效果示例
#### 2024-1-4
1. 修改DB采集问题
2. 优化DB采集的返回数据格式
3. 工具新增DB数据采集
4. 采集转发版本更新
#### 2024-1-5
1. GE 通用电气 PLC 集成,百分之50
#### 2024-1-8
1. GE 通用电气 PLC 集成完成
2. OFF接口新增 强制关闭属性
3. 所有库修改OFF实现与Dispose流程
4. 依赖库更新
#### 2024-1-9
1. 修改OPCUA工具节点浏览的节点导出功能
2. 新增GE工具
#### 2024-1-10
1. 细节优化
2. 新增物联网纯配置数采系统(百分之五)