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