跳转至

IndustryKit Modbus

Modbus source 主动读取配置的 Coil、Discrete Input、Input Register 和 Holding Register。 同一区域中相邻地址会合并读取。

配置层级

层级 作用
[[sources]] 定义一个 Modbus 采集任务;可重复配置多个设备或 Unit。
[sources.modbus] 配置当前 source 的 TCP/RTU 连接和请求超时。
[sources.modbus.serial] 仅用于 RTU,配置本地串口。
[[sources.modbus.points]] 定义一个读取点位;每增加一项就多采集一个输出字段。

每个 [[sources]] 只能包含一个协议子表;type = "modbus" 必须与 [sources.modbus] 对应。field 是写入 measurement 的输出字段名,area 和 address 才是设备中的读取位置。

配置

[[sources]]
id = "plc-tcp"
type = "modbus"
measurement = "modbus_metrics"
interval = "10s"
tags = { device = "plc-01" }

[sources.modbus]
transport = "tcp"
address = "192.0.2.10:502"
unit_id = 1
timeout = "2s"

[[sources.modbus.points]]
field = "pump_running"
area = "coil"
address = 0
data_type = "bool"

[[sources.modbus.points]]
field = "tank_level"
area = "holding"
address = 100
data_type = "uint16"
scale = 0.1
[[sources]]
id = "meter-rtu"
type = "modbus"
measurement = "modbus_metrics"
interval = "10s"
tags = { device = "meter-01" }

[sources.modbus]
transport = "rtu"
unit_id = 7
timeout = "2s"

[sources.modbus.serial]
device = "/dev/ttyUSB0"
baud_rate = 19200
data_bits = 8
parity = "even"
stop_bits = 1

[[sources.modbus.points]]
field = "energy_total"
area = "holding"
address = 0
data_type = "uint64"
byte_order = "big"
word_order = "high"

Windows 串口使用 COM 设备名,例如将 device 设置为 COM3;实际端口以设备管理器为准。

参数

[[sources]]

字段 默认值 说明
id 无 必填且在配置中唯一;同时作为 source_id 标签。
type 无 必须设置为 modbus。
measurement industrial 上报的指标集或日志来源名称。
interval 10s 轮询周期,必须大于 0。
tags {} 当前 source 的静态标签。

[sources.modbus]

字段 默认值 说明
transport 无 必填:tcp 或 rtu。
address 空 TCP 必填的 host:port;RTU 不设置。
unit_id TCP:0;RTU:无 Modbus Unit/Slave ID;RTU 必须按设备手册显式设置为 1–247。
timeout 2s 单次协议请求超时,必须大于 0。

[sources.modbus.serial]

该表仅在 transport = "rtu" 时使用。

字段 默认值 说明
device 无 RTU 必填的串口设备,例如 Linux 的 /dev/ttyUSB0 或 Windows 的 COM3。
baud_rate 19200 串口波特率。
data_bits 8 数据位,范围为 5..8。
parity even 校验方式:none、even 或 odd。
stop_bits 1 停止位:1 或 2。

[[sources.modbus.points]]

字段 默认值 说明
field 无 必填的输出字段名。
category metric 输出类型:metric 或 logging。
tags {} 当前点位的静态标签。
area 无 必填:coil、discrete、input 或 holding。
address 0 零基 PDU 地址,不是设备手册中的 40001 等显示地址。
data_type 无 必填:bool、int16、uint16、int32、uint32、int64、uint64、float32、float64 或 string。
length 1 仅 string 使用的寄存器数量,范围为 1..125。
byte_order big 每个寄存器的字节序:big 或 little。
word_order high 多寄存器值的字序:high 或 low。
scale 1 数值变换乘数。
offset 0 数值变换偏移;最终值为 value * scale + offset。
on_change false metric 是否仅在值变化时发送;logging 始终按变化发送。
emit_initial false 对 logging 或启用 on_change 的 metric,是否发送首次观察值。
status info 仅用于 logging 的状态字段。

设备手册中的 40001 等显示地址通常不是 PDU 地址;例如 40001 常对应配置 address = 0,最终应以设备手册为准。

Linux 串口权限

IndustryKit 服务默认以 industrykit 用户运行。Modbus TCP 不需要额外权限;使用 Modbus RTU 前,需要确认该用户可以读写配置中的串口设备。以下命令以 root 用户执行。

先查看设备所属用户组:

ls -l /dev/ttyUSB0

如果设备所属组是 dialout,执行:

usermod -aG dialout industrykit
systemctl restart industrykit

部分发行版使用 uucp 组,此时将命令中的 dialout 替换为 uucp。加入附加组后 必须重启服务,新启动的进程才会获得权限。以下命令切换为 industrykit 用户验证读写权限:

su -s /bin/sh -c 'test -r /dev/ttyUSB0 && test -w /dev/ttyUSB0' industrykit

如果串口没有合适的设备组,不要将 industrykit 加入 root 组;应由管理员通过 udev 规则 按串口适配器的 Vendor ID/Product ID 授予专用组读写权限。

数据与限制

  • coil 和 discrete 只能配置为 bool。
  • 单个 source 至少配置一个 point;相同 field 与最终标签组合不能重复。
  • 当前只提供读操作,不支持写 Coil 或 Holding Register。

文档评价

文档内容是否对您有帮助?