阐述
- 所有协议公共函数支持同步异步
- 所有协议读取写入协议参数统一
- 全部都是统一入参出参
- 支持多点转发,多点解析
- 支持快速对接,与配置
- 支持虚拟点位
- 所有采集协议支持订阅模式
- 采集与转发协议接口统一
- 事件结果统一
YSAI.Core
- Http
- Tcp客户端
- Tcp服务端
- Udp
- WS客户端
- WS服务端
- 串口
- 脚本
- Redis
- 反射
- 自定义订阅
- 虚拟点
YSAI.Log
- Verbose [详细信息]
- Debug [调试]
- Info [信息]
- Warning [警告]
- Error [异常或错误]
- Fatal [致命错误或异常]
YSAI.Unility
- 公共快捷方便方法集合 [字节、枚举、文件、Json、Xml、Ftp、System ...]
采集协议
- OpcUa客户端
- OpcDa客户端
- OpcDaHttp
- Modbus客户端 [Rtu、Ascii、Tcp、Udp]
- S7客户端
- DB [SqlServer、MySql、Oracle、SQLite]
- Can
namespace YSAI.Core.@interface
{
/// <summary>
/// 数采接口
/// </summary>
public interface IDaq : IOn, IOff, IRead, IWrite, ISubscribe, IGetStatus, IEvent, IDisposable
{
}
}
转发协议
- Kafka
- MqttClient
- RabbitMQ
namespace YSAI.Core.@interface
{
/// <summary>
/// 转发接口
/// </summary>
public interface IRelay : IOn, IOff, IProducer, IConsumer, IGetStatus, IEvent, IDisposable
{
}
}
应用
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() //OpcDaHttp点位地址
{
SN=$"{Guid.NewGuid().ToNString()} - Factory",
AddressName = "a.a.a",
AddressDataType = YSAI.Core.@enum.DataType.String,
AddressExtendParam=new OpcDaHttpData.ExtendParam.Read()
{
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 //脚本解析数据
// {
// }
//},
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());
}
协议服务端(用于数据模拟)
- Mqtt服务端
- MqttWebSocket服务端
- OpcUa服务端
- Modbus服务端
- S7服务端
更新表
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读取修改