IDaq 接口 - Snet Docs

📘 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)
{
    // 处理语言变更通知
}

参见