📘 IDaq 接口
命名空间: Snet.Core | 接口: IDaq | 成员: 14 个组件接口 + IDisposable
IDaq 是所有协议驱动和中间件组件实现的顶层接口。它将 14 个不同的能力接口组合成一个统一的契约,用于操作数据采集和消息组件。
接口层次结构
IDaq 继承自以下 14 个组件接口以及 IDisposable:
| 接口 | 用途 | 关键方法 |
|---|---|---|
IOn |
连接 / 启动组件 | OnAsync() |
IOff |
断开 / 停止组件 | OffAsync() |
IRead |
从设备或数据源读取数据 | ReadAsync(address), ReadAsync(addresses), ReadAsync(values) |
IWrite |
向设备或目标写入数据 | WriteAsync(values), WriteAsync(address, value) |
ISubscribe |
订阅数据变更通知 | SubscribeAsync(address), UnSubscribeAsync(address) |
IGetStatus |
获取组件状态 | GetStatusAsync() |
IEvent |
事件注册与分发 | OnDataEvent, OnInfoEvent, OnLanguageEvent 及其异步对应方法 |
IGetParam |
获取组件参数 | GetParamAsync<T>() |
ICreateInstance |
创建具有修改参数的副本 | CreateInstanceAsync(data) |
ILog |
日志控制与级别管理 | SetLogLevelAsync(level), GetLogMessagesAsync() |
IWA |
Web API 控制 | 多种 WebAPI 管理方法 |
IGetObject |
获取内部对象 | GetObjectAsync<T>(key) |
ILanguage |
多语言支持 | SetLanguageAsync(culture) |
IDisposable |
资源清理 | Dispose() |
快速入门
using Snet.Core;
// 假设使用任意 IDaq 实现(如 Modbus、Siemens、MQTT)
IDaq daq = new ModbusOperate(new ModbusData.Basics
{
IpAddress = "192.168.1.100",
Port = 502,
Station = 1
});
// 连接
await daq.OnAsync();
// 从设备读取(入参为 Address 对象)
var address = new Address(new AddressDetails("温度", "40001", DataType.Float));
var result = await daq.ReadAsync(address);
if (result.Status)
{
var data = result.GetSource<ConcurrentDictionary<string, AddressValue>>();
foreach (var kv in data)
Console.WriteLine($"{kv.Key} = {kv.Value.ResultValue}");
}
// 向设备写入
await daq.WriteAsync(new ConcurrentDictionary<string, object> { ["40001"] = 1234f });
// 先绑定事件,再订阅
daq.OnDataEventAsync += async (sender, e) =>
{
if (e.Status)
Console.WriteLine($"接收到数据: {e.ResultData}");
};
// 订阅持续的数据更新
var subAddr = new Address(new AddressDetails("温度", "40001", DataType.Float));
await daq.SubscribeAsync(subAddr);
// 切换语言
await daq.SetLanguageAsync("zh-CN");
// 断开连接
await daq.OffAsync();
// 清理资源
daq.Dispose();
核心操作
连接管理
// 连接 -- 必须在任何读/写/订阅操作之前调用
await daq.OnAsync();
// 断开连接 -- 释放连接和资源
await daq.OffAsync();
读取数据
// ReadAsync 入参为 Address 对象,返回 OperateResult
var address = new Address(new List<AddressDetails>
{
new("温度", "DB1.DBD0", DataType.Float),
new("压力", "DB1.DBD4", DataType.Float)
});
var result = await daq.ReadAsync(address);
if (result.Status)
{
var data = result.GetSource<ConcurrentDictionary<string, AddressValue>>();
foreach (var kv in data)
Console.WriteLine($"{kv.Key} = {kv.Value.ResultValue}");
}
写入数据
// 主要签名:元组形式(子类实现的抽象方法)
await daq.WriteAsync(new ConcurrentDictionary<string, (object value, EncodingType? encodingType)>
{
["40001"] = ((short)100, EncodingType.ANSI),
["40002"] = (25.6f, null)
});
// 便捷形式 1:自动 ASCII 编码
await daq.WriteAsync(new ConcurrentDictionary<string, object>
{
["40001"] = (short)100,
["40002"] = 25.6f
});
// 便捷形式 2:WriteModel 对象(含 DataType 做精确类型转换)
await daq.WriteAsync(new ConcurrentDictionary<string, WriteModel>
{
["40001"] = new WriteModel((short)100, DataType.Int16),
["40002"] = new WriteModel(25.6f, DataType.Float, encodingType: EncodingType.UTF8)
});
订阅数据
// 开始监视一个地址(参数为 Address 对象,非字符串)
await daq.SubscribeAsync(new Address(new AddressDetails("温度", "40001", DataType.Float)));
// 数据通过事件到达
daq.OnDataEventAsync += async (sender, e) =>
{
if (e.Status)
Console.WriteLine($"[{e.Time}] {e.Message}");
};
// 停止监视
await daq.UnSubscribeAsync(new Address(new AddressDetails("温度", "40001", DataType.Float)));
事件
IDaq 提供 3 对事件(同步和异步):
| 事件 | 描述 |
|---|---|
OnDataEvent / OnDataEventAsync |
当从读取或订阅接收到数据时触发 |
OnInfoEvent / OnInfoEventAsync |
当状态变更、警告和信息消息时触发 |
OnLanguageEvent / OnLanguageEventAsync |
当语言/区域设置变更时触发 |
// 注册事件处理器
daq.OnDataEventAsync += HandleDataAsync;
daq.OnInfoEventAsync += HandleInfoAsync;
daq.OnLanguageEventAsync += HandleLanguageAsync;
async Task HandleDataAsync(OperateResult result)
{
// 处理接收到的数据
}
async Task HandleInfoAsync(OperateResult result)
{
// 处理状态消息
}
async Task HandleLanguageAsync(OperateResult result)
{
// 处理语言变更通知
}
