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