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 用户执行。
先查看设备所属用户组:
如果设备所属组是 dialout,执行:
部分发行版使用 uucp 组,此时将命令中的 dialout 替换为 uucp。加入附加组后
必须重启服务,新启动的进程才会获得权限。以下命令切换为 industrykit 用户验证读写权限:
如果串口没有合适的设备组,不要将 industrykit 加入 root 组;应由管理员通过 udev 规则
按串口适配器的 Vendor ID/Product ID 授予专用组读写权限。
数据与限制¶
coil和discrete只能配置为bool。- 单个 source 至少配置一个 point;相同
field与最终标签组合不能重复。 - 当前只提供读操作,不支持写 Coil 或 Holding Register。