设备模型
设备把「寄存器地址」变成业务含义,例如炉温。界面和业务应使用点表或 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且声明了点的设备,会自动进入采集循环。