跳到主要内容

设备模型

设备把「寄存器地址」变成业务含义,例如炉温。界面和业务应使用点表或 ModbusDevice 的读写方法,而不是在窗口里拼十六进制。

登记

先注册通道,再注册设备:

builder.AddAcquisition(TimeSpan.FromMilliseconds(500));
builder.AddVirtualChannel("bus", new ModbusSlaveResponder(1, ModbusTransport.Rtu));
builder.AddModbusRtu("oven", "bus", unitId: 1, points: map =>
{
map.HoldingRegister("temperature", 0, raw => raw * 0.1);
});

自定义设备:

public sealed class TemperatureMeter : DeviceBase, IAcquisitionSource
{
public TemperatureMeter(string name, IChannel channel)
: base(name, channel)
{
Points = [new PointDefinition("temperature", name, PointValueKind.Double)];
}

public IReadOnlyList<PointDefinition> Points { get; }

public async Task PollAsync(IPointTableWriter table, CancellationToken cancellationToken)
{
// 读取通道、换算后 table.Publish(...)
}
}

builder.AddDevice("oven", "bus", (name, channel) => new TemperatureMeter(name, channel));

运行时:

  • app.Devices.Get<ModbusDevice>("oven") 做一次性读写
  • app.Points.Get<double>("temperature") 读取采集循环维护的当前值

约定

  • 一台设备绑定一条通道。多台设备共用通道时不要并发发请求;采集循环按设备依次轮询。
  • 设备名在宿主内唯一,查找时不区分大小写。
  • 点名在设备内唯一;不同设备出现同名点时,使用 设备.点
  • 设备类型不要引用 WinForms 或 WPF。
  • 实现了 IAcquisitionSource 且声明了点的设备,会自动进入采集循环。