Skip to content

Modbus 插件

Modbus 插件实现了 Modbus RTU 和 Modbus TCP 协议,支持从 Modbus 从站设备采集数据和写入控制命令。

  • Modbus RTU:串口通讯(支持波特率、数据位、校验位、停止位配置)
  • Modbus TCP:TCP/IP 网络通讯
  • 功能码支持:0x01(读线圈)、0x02(读离散输入)、0x03(读保持寄存器)、0x04(读输入寄存器)、0x05/0x0F(写线圈)、0x06/0x10(写保持寄存器)
  • 批量读取:自动将相同采集频率和连续地址的点位合并读取
  • 批量写入:支持批量写入连续地址的保持寄存器
  • 数据类型:支持 Bool、String、Uint16/Int16、Uint32/Int32、Uint64/Int64、Float32/Float64
  • 字节交换:支持字节交换(ByteSwap)和字交换(WordSwap)
  • 位操作:支持寄存器中的位读写
  • 读写避让:写操作时读任务自动避让,避免冲突
  • 超时处理:连续超时后自动增加采集间隔,最大不超过 1 分钟
  • 虚拟模式:支持虚拟模式(测试用)

连接配置位于 config.jsonconnections 字段下:

{
"plugin": "modbus",
"connections": {
"modbus-tcp-1": {
"address": "192.168.1.100:502",
"mode": "tcp",
"timeout": 1000,
"retry": 3,
"minInterval": 100,
"batchReadLen": 32
}
}
}
参数
address192.168.1.100:502
modetcp
timeout1000
retry3
minInterval100
batchReadLen32
参数
address/dev/ttyUSB0
modertu
baudRate9600
dataBits8
parity0
stopBits1
timeout1000
retry3
minInterval100
batchReadLen32
参数类型默认值说明
addressstring-TCP 模式为 IP:PORT,RTU 模式为串口路径
modestring-连接模式:tcprtu
baudRateuint9600波特率(RTU 模式)
dataBitsuint8数据位(RTU 模式)
parityuint0校验位:0(无)、1(奇)、2(偶)
stopBitsuint1停止位(RTU 模式)
timeoutuint161000超时时间(毫秒)
retryint3重试次数
minIntervaluint16100最小采集间隔(毫秒)
batchReadLenuint1632批量读取寄存器最大数量
batchWriteLenuint16120批量写入寄存器最大长度
virtualboolfalse是否启用虚拟模式(测试用)

点位配置基于通用点位定义,并添加 Modbus 协议扩展参数。

点位的基础参数(如 namedescriptionvalueTypereadWrite 等)请参考设备配置指南

在通用点位基础上,Modbus 插件支持以下扩展参数:

{
"name": "temperature",
"startAddress": "40001",
"primaryTable": "HOLDING_REGISTER",
"rawType": "Float32",
"duration": "5s",
"byteSwap": false,
"wordSwap": false
}
参数类型必填说明
startAddressstring寄存器地址(支持十进制、十六进制 0x、Modbus 标准格式如 40001
primaryTablestring寄存器类型
rawTypestring原始数据类型
durationstring采集周期,默认 1s
byteSwapbool是否字节交换
wordSwapbool是否字交换(32 位及以上数据类型)
bituint8位偏移(仅位操作)
bitLenuint8位长度(仅位操作)
multiWritebool是否强制使用多寄存器写接口

Modbus 设备需要在 properties 中配置从站 ID:

属性类型必填说明
unitIDstring从站 ID
说明代码
COIL线圈(读写)0x01/0x05/0x0F
DISCRETE_INPUT离散输入(只读)0x02
INPUT_REGISTER输入寄存器(只读)0x04
HOLDING_REGISTER保持寄存器(读写)0x03/0x06/0x10
rawType说明寄存器数量
Bool布尔值1(COIL/DISCRETE_INPUT)
Uint8无符号 8 位整数-
Uint16无符号 16 位整数1
Uint32无符号 32 位整数2
Uint64无符号 64 位整数4
Int8有符号 8 位整数-
Int16有符号 16 位整数1
Int32有符号 32 位整数2
Int64有符号 64 位整数4
Float32单精度浮点数2
Float64双精度浮点数4
String字符串自定义(默认 1)

支持多种地址格式:

  • 十进制100100d - 直接作为寄存器地址
  • 十六进制0x64 - 十六进制地址
  • Modbus 标准格式
    • 00001-09999COIL,地址 0-9998
    • 10001-19999DISCRETE_INPUT,地址 0-9998
    • 30001-39999INPUT_REGISTER,地址 0-9998
    • 40001-49999HOLDING_REGISTER,地址 0-9998

插件自动将相同采集频率、相同寄存器类型、连续地址的点位合并为一个采集组:

  • 相同 duration 的点位分为一组
  • 相同 primaryTable 的点位才能同组
  • 地址区间长度不超过 batchReadLen 时合并,超过则拆分为新组
  • 减少通讯次数,提高采集效率
  • 支持单寄存器写和多寄存器写
  • 写操作时,读任务自动避让(通过 writeSemaphore 信号量控制)
  • 写操作后 minInterval 时间内,读任务继续避让
  • 支持位操作:写入时自动合并同地址的位操作
  • 失败自动重试,次数由 retry 参数控制

启用 virtual 或全局虚拟模式时:

  • 不实际连接设备
  • 使用 Lua 脚本模拟读写
  • 用于测试配置和协议
graph TB
    A[插件初始化] --> B[创建连接器]
    B --> C[加载设备点位]
    C --> D[点位分组]

    subgraph 采集组构建
        D --> D1{相同采集周期?}
        D1 -->|是| D2{相同寄存器类型?}
        D2 -->|是| D3{地址连续<br/>且不超过batchReadLen?}
        D3 -->|是| D4[合并为同一组]
        D3 -->|否| D5[创建新组]
        D2 -->|否| D5
        D1 -->|否| D5
    end

    D4 --> E[定时采集任务]
    D5 --> E

    E --> F[读取寄存器数据]
    F --> G[数据解码]
    G --> G1[ByteSwap/WordSwap]
    G --> G2[位操作]
    G --> G3[类型转换]
    G1 --> H[构造DeviceData]
    G2 --> H
    G3 --> H
    H --> I[触发导出]

    subgraph 写操作
        J[写指令] --> K[编码数据]
        K --> K1[类型转换]
        K --> K2[ByteSwap/WordSwap]
        K --> K3[位合并]
        K1 --> K4[构造writeValue]
        K2 --> K4
        K3 --> K4
        K4 --> L[发送写请求]
        L --> M[写避让]
    end

    M --> E

插件根据以下规则将点位分组:

  1. 相同采集周期duration 相同的点位分为一组
  2. 相同寄存器类型primaryTable 相同的点位才能同组
  3. 地址连续:地址区间不超过 batchReadLen 时合并为同一组
  4. 超限拆分:超过 batchReadLen 时拆分为新组

示例:

点位A: address=100, duration=1s, HOLDING_REGISTER
点位B: address=101, duration=1s, HOLDING_REGISTER → 同一组
点位C: address=102, duration=5s, HOLDING_REGISTER → 新组(周期不同)
点位D: address=100, duration=1s, INPUT_REGISTER → 新组(类型不同)
  • 写操作通过 writeSemaphore 信号量控制
  • 写操作执行时,读任务自动等待
  • 写操作后 minInterval 时间内,读任务继续避让
  • 确保读写不冲突

以下参数未配置时使用默认值:

  • minInterval:100 毫秒
  • retry:3 次
  • timeout:1000 毫秒
  • batchReadLen:32 个
  • duration1s
  • 插件入口:plugins/modbus/plugin.go
  • 核心实现:plugins/modbus/internal/plugin.go
  • 连接器:plugins/modbus/internal/connector.go
  • 数据模型:plugins/modbus/internal/model.go