ThingsBoard IoT Gateway Modbus接入完全チュートリアル:TCP/RTUデバイスデータの収集 RPCリモートコントロール。与バッチ読み取り最適化実践

freeFree Technical Resource

This content is free to read, suitable for basic learning and search traffic.

ThingsBoard IoT Gateway是ThingsBoard官方开源的IoTゲートウェイ,サポートModbus、MQTT、OPC-UA、BLE等多种协议,可将现场工业設備のデータ接入ThingsBoardIoTプラットフォーム。本記事详细介绍ThingsBoard IoT Gateway的Modbus连接器設定,包括TCP/RTUデバイス接入、データ型マッピング、バッチ読み取り最適化、RPCRemote control、属性ダウンタウン制御、TLSセキュリティ连接以及完全的工厂环境モニタリング実践。

一、ThingsBoard IoT Gateway概述

1.1 什么是ThingsBoard IoT Gateway

ThingsBoard IoT Gateway是一个开源的IoTゲートウェイ软件,作为ThingsBoardプラットフォーム与现场デバイス之间的桥梁。它运行在边缘デバイス(如Raspberry Piについて、工控机、Server)上,経由各种工业协议(Modbus、MQTT、OPC-UA、BLE、CAN等)采集现场設備のデータ,然后経由MQTT协议上传到ThingsBoardプラットフォーム。同时サポートプラットフォーム下发的RPCリモートコントロール。和属性更新,実装双向通信。

1.2 核心特性

  • 多协议サポート:Modbus TCP/RTU、MQTT、OPC-UA、BLE、CAN、Sigfox、HTTP等
  • 主从双モード:ModbusサポートMaster(主动読み取り)和Slave(被动レスポンス)2つのモデル
  • データ型丰富:16int、32int、64int、float、double、bits、string等
  • バイトオーダー設定:サポートBIG/LITTLEバイトオーダー和字序独立設定
  • バッチ読み取り:连续レジスタ可一次読み取り,减少リクエスト次数
  • データ变换:内置multiplier(乘)和divider(除)系数变换
  • RPCRemote control:プラットフォーム可経由RPC调用読み取り或写入デバイスレジスタ
  • 属性下行:プラットフォーム属性变更可自动写入デバイスレジスタ
  • 断线再接続:自動再接続。机制,サポートリトライ回数和待機中时间設定
  • TLSセキュリティ:サポートModbus TCP over TLS加密传输
  • 本地存储:网络中断时データ本地缓存,恢复后自动补传
  • 完全开源:Apache 2.0协议,商业使用無料

二、架构与工作原理

┌──────────────────────────────────────────────────────────────┐
│                    ThingsBoard プラットフォーム                           │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────────┐  │
│  │  デバイス管理    │  │  データ可视化  │  │  ルール引擎/告警      │  │
│  └──────┬──────┘  └──────┬──────┘  └──────────┬──────────┘  │
└─────────┼────────────────┼─────────────────────┼─────────────┘
          │ MQTT (上行データ/RPC下行/属性)
┌─────────▼─────────────────────────────────────────────────────┐
│              ThingsBoard IoT Gateway(エッジゲートウェイ)                │
│  ┌────────────────────────────────────────────────────────┐  │
│  │                    连接器框架                             │  │
│  │  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐  │  │
│  │  │ Modbus   │ │  MQTT    │ │ OPC-UA   │ │   BLE    │  │  │
│  │  │ Connector│ │Connector │ │Connector │ │Connector │  │  │
│  │  └────┬─────┘ └──────────┘ └──────────┘ └──────────┘  │  │
│  └───────┼────────────────────────────────────────────────┘  │
└──────────┼───────────────────────────────────────────────────┘
           │ Modbus TCP/RTU
┌──────────▼───────────────────────────────────────────────────┐
│                    现场デバイス层                                  │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────────┐   │
│  │ Temperature & Humidity    │ │ パワーメーター  │ │  PLC     │ │ 周波数変換器       │   │
│  │ Sensors    │ │          │ │          │ │              │   │
│  └──────────┘ └──────────┘ └──────────┘ └──────────────┘   │
└──────────────────────────────────────────────────────────────┘

三、インストール与部署

3.1 Dockerインストール(おすすめ)

# 作成設定目录
mkdir -p ~/.tb-gateway/config
cd ~/.tb-gateway

# 拉取最新镜像
docker pull thingsboard/tb-gateway:latest

# 运行容器
docker run -it --name tb-gateway \
  -v ~/.tb-gateway/config:/config \
  -v ~/.tb-gateway/data:/data \
  --device /dev/ttyUSB0:/dev/ttyUSB0 \
  --network host \
  thingsboard/tb-gateway:latest

# 参数説明:
# -v config:/config    設定文件目录
# -v data:/data        データストア目录(オフライン缓存)
# --device             挂载シリアルデバイス(RTU需要)
# --network host       使用マスター网络(方便アクセス本地デバイス)

3.2 Docker Compose部署

# docker-compose.yml
version: "3.8"
services:
  tb-gateway:
    image: thingsboard/tb-gateway:latest
    container_name: tb-gateway
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./config:/config
      - ./data:/data
    devices:
      - /dev/ttyUSB0:/dev/ttyUSB0
      - /dev/ttyUSB1:/dev/ttyUSB1
    environment:
      - TB_GW_LOG_LEVEL=INFO
    logging:
      driver: "json-file"
      options:
        max-size: "10m"
        max-file: "3"

3.3 原生インストール(Ubuntu/Debian)

# インストールPython3和依赖
sudo apt update
sudo apt install -y python3 python3-pip python3-dev

# インストールThingsBoard IoT Gateway
sudo pip3 install thingsboard-gateway

# 作成設定目录
sudo mkdir -p /etc/thingsboard-gateway/config
sudo mkdir -p /var/lib/thingsboard-gateway

# コピーデフォルト設定
sudo cp -r /usr/local/lib/python3*/dist-packages/thingsboard_gateway/config/* \
  /etc/thingsboard-gateway/config/

# 启动服务
thingsboard-gateway -c /etc/thingsboard-gateway/config/tb_gateway.yaml

# 設定为systemd服务(可选)
sudo nano /etc/systemd/system/tb-gateway.service
# [Unit]
# Description=ThingsBoard IoT Gateway
# After=network.target
# [Service]
# ExecStart=/usr/local/bin/thingsboard-gateway -c /etc/thingsboard-gateway/config/tb_gateway.yaml
# Restart=always
# User=root
# [Install]
# WantedBy=multi-user.target

sudo systemctl enable tb-gateway
sudo systemctl start tb-gateway

四、主設定文件tb_gateway.yaml

# tb_gateway.yaml - ThingsBoard IoT Gateway主設定
thingsboard:
  host: "thingsboard.example.com"   # ThingsBoardプラットフォームアドレス
  port: 1883                         # MQTTポート
  remoteConfiguration: true          # 有効远程設定(プラットフォーム可修改ゲートウェイの構成)
  security:
    accessToken: "YOUR_GATEWAY_TOKEN"  # ゲートウェイアクセス令牌
  qos: 1                              # MQTT QoS等级
  storage:
    type: memory                      # オフライン存储タイプ memory/file/sqlite
    max_records_count: 100000         # 最大缓存记录数
    read_records_count: 100           # 每次补传记录数

connectors:
  - name: "Modbus TCP Connector"
    type: modbus
    configuration: modbus_tcp.json    # Modbus TCP连接器設定

  - name: "Modbus RTU Connector"
    type: modbus
    configuration: modbus_rtu.json    # Modbus RTU连接器設定

grpc:
  enabled: false                      # gRPC远程設定(ThingsBoard PE)

logs:
  level: INFO                         # 日志级别 DEBUG/INFO/WARNING/ERROR
  path: "/var/log/tb-gateway/"        # ログディレクトリ

五、Modbus TCPデバイス接入

最も一般的な的场景:経由イーサネット(イーサネット)読み取りModbus TCP設備のデータ。

// modbus_tcp.json - Modbus TCP连接器設定
{
  "master": {
    "slaves": [
      {
        // ====== 连接設定 ======
        "host": "192.168.1.100",       // deviceIPaddress
        "port": 502,                    // デバイスポート
        "type": "tcp",                  // 连接タイプ tcp/udp/serial
        "method": "socket",             // フレームタイプ socket(標準TCP)/rtu(RTU over TCP)
        "unitId": 1,                    // slaveID
        "deviceName": "车间ATemperature & Humidity Sensor", // ThingsBoard上的デバイス名
        "deviceType": "temperature_sensor", // デバイスタイプ/設定文件

        // ====== Communication parameters ======
        "timeout": 35,                  // タイムアウト時間(秒)
        "byteOrder": "BIG",             // endianness BIG/LITTLE
        "wordOrder": "BIG",             // 字序 BIG/LITTLE(32位以上データ有效)
        "retries": true,                // 失敗重试
        "retryOnEmpty": true,           // 空レスポンス重试
        "retryOnInvalid": true,         // 无效レスポンス重试
        "pollPeriod": 5000,             // ポーリング周期(毫秒)
        "connectAttemptTimeMs": 5000,   // 接続タイムアウト(毫秒)
        "connectAttemptCount": 5,       // 连接リトライ回数
        "waitAfterFailedAttemptsMs": 30000, // 接続の失敗后待機中时间

        // ====== 属性(静态データ,デバイス信息) ======
        "attributes": [
          {
            "tag": "firmware_version",  // 属性名
            "type": "string",           // data type
            "address": 100,             // register address
            "objectsCount": 8,          // 読み取りレジスタの数(string需要多个)
            "functionCode": 3           // function code 03=read holding registers
          }
        ],

        // ====== 遥测(动态データ,实时上报) ======
        "timeseries": [
          {
            "tag": "temperature",       // 遥测键名
            "type": "16int",            // data type 16int/32int/float/bits
            "address": 0,               // register address
            "objectsCount": 1,          // 読み取りレジスタの数
            "functionCode": 3,          // function code 03=read holding registers
            "divider": 10               // 除数(register value/10,250→25.0)
          },
          {
            "tag": "humidity",
            "type": "16int",
            "address": 1,
            "objectsCount": 1,
            "functionCode": 3,
            "divider": 10               // 652→65.2
          },
          {
            "tag": "pressure",
            "type": "32int",            // 32ビット整数(占21つのレジスタ)
            "address": 2,
            "objectsCount": 2,
            "functionCode": 3,
            "multiplier": 0.1           // 乘数
          },
          {
            "tag": "relay_status",
            "type": "bits",             // 位タイプ(リードコイルを読む)
            "address": 0,
            "objectsCount": 1,
            "functionCode": 1,          // function code 01=リードコイルを読む
            "bitTargetType": "bool"     // 转换为布尔值
          }
        ],

        // ====== 属性更新(プラットフォーム→デバイスダウンタウン制御) ======
        "attributeUpdates": [
          {
            "tag": "set_temperature",   // プラットフォーム属性名
            "type": "16int",
            "address": 10,              // 写入レジスター·アドレス
            "functionCode": 6,          // function code 06=write single register
            "multiplier": 10            // プラットフォーム值25.0→写入250
          }
        ],

        // ====== RPC方法(プラットフォーム远程调用) ======
        "rpc": [
          {
            "tag": "getTemperature",    // RPC方法名
            "type": "16int",
            "address": 0,
            "objectsCount": 1,
            "functionCode": 3
          },
          {
            "tag": "setRelay",          // RPC書き込み操作。
            "type": "bits",
            "address": 0,
            "objectsCount": 1,
            "functionCode": 5           // function code 05=write single coil
          }
        ]
      }
    ]
  }
}

六、Modbus RTUシリアルデバイス接入

// modbus_rtu.json - Modbus RTUシリアルポート连接器設定
{
  "master": {
    "slaves": [
      {
        // ====== シリアルポート连接設定 ======
        "type": "serial",               // シリアルポートタイプ
        "port": "/dev/ttyUSB0",         // Serial Port Device
        "method": "rtu",                // フレームタイプ rtu/ascii
        "baudrate": 9600,               // Baud rate
        "bytesize": 8,                  // data bit
        "parity": "N",                  // check digit N/E/O
        "stopbits": 1,                  // stop bit
        "strict": true,                 // 严格モード(低ボーレート使用文字间タイムアウト)

        "unitId": 1,
        "deviceName": "パワーメーター1号",
        "deviceType": "power_meter",

        "timeout": 35,
        "byteOrder": "BIG",
        "wordOrder": "BIG",
        "pollPeriod": 1000,             // 1秒ポーリング一次
        "retries": true,

        // ====== 遥测データ ======
        "timeseries": [
          {
            "tag": "voltage",
            "type": "16int",
            "address": 0,
            "objectsCount": 1,
            "functionCode": 3,
            "divider": 10               // 2200→220.0V
          },
          {
            "tag": "current",
            "type": "16int",
            "address": 1,
            "objectsCount": 1,
            "functionCode": 3,
            "divider": 100              // 135→1.35A
          },
          {
            "tag": "power",
            "type": "32int",
            "address": 2,
            "objectsCount": 2,
            "functionCode": 3,
            "divider": 1000             // 297000→297.0kW
          },
          {
            "tag": "energy",
            "type": "32int",
            "address": 4,
            "objectsCount": 2,
            "functionCode": 3
          },
          {
            "tag": "power_factor",
            "type": "16int",
            "address": 6,
            "objectsCount": 1,
            "functionCode": 3,
            "divider": 1000             // 950→0.95
          }
        ],

        "attributeUpdates": [],
        "rpc": []
      },
      // ====== 同一条バス上的第二个デバイス ======
      {
        "type": "serial",
        "port": "/dev/ttyUSB0",         // 同一个シリアルポート
        "method": "rtu",
        "baudrate": 9600,
        "bytesize": 8,
        "parity": "N",
        "stopbits": 1,

        "unitId": 2,                    // 不同スレーブID
        "deviceName": "パワーメーター2号",
        "deviceType": "power_meter",

        "timeout": 35,
        "byteOrder": "BIG",
        "pollPeriod": 1000,

        "timeseries": [
          {
            "tag": "voltage",
            "type": "16int",
            "address": 0,
            "objectsCount": 1,
            "functionCode": 3,
            "divider": 10
          }
        ],

        "attributeUpdates": [],
        "rpc": []
      }
    ]
  }
}

七、データ型详解

Type説明占用レジスタ适用機能コード
16int16ビット符号付き整数103/04
16uint16ビット符号なし整数103/04
32int32ビット符号付き整数203/04
32uint32ビット符号なし整数203/04
64int64ビット符号付き整数403/04
float32ビット浮動小数点数(IEEE754)203/04
double64ビット浮動小数点数403/04
bits位/コイル1(位)01/02/05/15
stringストリング·ストリングN03/04

7.1 byte序与字序

  • byteOrder: BIG:ビッグエンディアンバイトオーダー(前の高さ。),大多数Modbusデバイスデフォルト
  • byteOrder: LITTLE:リトルエンディアンバイトオーダー(低バイト数前に)
  • wordOrder: BIG:大字序(前の単語。),32ビット·データ的两1つのレジスタ顺序
  • wordOrder: LITTLE:小字序(前に低い言葉。)
  • 四种组合:BIG+BIG(ABCD)、BIG+LITTLE(CDAB)、LITTLE+BIG(BADC)、LITTLE+LITTLE(DCBA)
  • 不確かなこと时用QModMaster読み取り同一32ビット浮動小数点数,对比四种组合哪个值合理

八、バッチ読み取り最適化

当デバイス有多个连续レジスタ需要読み取り时,使用バッチ読み取り可以大幅减少リクエスト次数,提高效率。

// 不おすすめ:すべてのレジスタ。单独リクエスト(4次リクエスト)
"timeseries": [
  {"tag": "temperature", "type": "16int", "address": 0, "functionCode": 3},
  {"tag": "humidity",    "type": "16int", "address": 1, "functionCode": 3},
  {"tag": "power",       "type": "16int", "address": 2, "functionCode": 3},
  {"tag": "pressure",    "type": "16int", "address": 3, "functionCode": 3}
]

// おすすめ:バッチ読み取り(1次リクエスト読み取り41つのレジスタ)
"timeseries": [
  {
    "tag": "${unitId}.${type}.${address}",  // 自動生成される键名
    "type": "16int",
    "functionCode": 3,
    "objectsCount": 1,
    "address": "0-3",               // アドレス範囲,一次読み取り
    "divider": 10
  }
]
// 上报结果:
// {"1.16int.0": 250, "1.16int.1": 652, "1.16int.2": 100, "1.16int.3": 1013}

// Customizationtag变量:
// ${unitId}     - slaveID
// ${type}       - data type
// ${address}    - register address
// ${deviceName} - Device Name

九、RPCRemote control

ThingsBoardプラットフォーム可以経由RPC调用远程読み取り或写入Modbusデバイスレジスタ。

// RPC設定サンプル
"rpc": [
  // 読み取り操作。:読み取り温度
  {
    "tag": "getTemperature",
    "type": "16int",
    "address": 0,
    "objectsCount": 1,
    "functionCode": 3
  },
  // 書き込み操作。:設定继电器
  {
    "tag": "setRelay",
    "type": "bits",
    "address": 0,
    "objectsCount": 1,
    "functionCode": 5           // write single coil
  },
  // 書き込み操作。:設定设定值
  {
    "tag": "setSetpoint",
    "type": "16int",
    "address": 10,
    "objectsCount": 1,
    "functionCode": 6           // write single register
  }
]

// 在ThingsBoard RPCデバッグ终端调用:
// getTemperature
// 戻る:{"temperature": 250}

// setRelay
// parameter:{"value": 1}  (1=ON, 0=OFF)

// setSetpoint
// parameter:{"value": 250}  (25.0°C)

// 通用RPC(无需预設定):
// get type=16int;functionCode=3;objectsCount=1;address=0;
// set type=16int;functionCode=6;objectsCount=1;address=10;value=250;

十、属性ダウンタウン制御

当プラットフォーム上的共享属性值发生变化时,ゲートウェイ自动将新值写入Modbusデバイスレジスタ。

"attributeUpdates": [
  {
    "tag": "target_temperature",   // プラットフォーム共享属性名
    "type": "16int",
    "address": 10,                 // 写入レジスタ
    "functionCode": 6,             // write single register
    "multiplier": 10               // プラットフォーム值25.0→写入250
  },
  {
    "tag": "alarm_enable",
    "type": "bits",
    "address": 5,
    "functionCode": 5              // 写コイル
  }
]

// ワークフローワークフロー程:
// 1. 在ThingsBoardデバイスページ修改共享属性 target_temperature = 26.0
// 2. プラットフォーム経由MQTT下发属性更新通知
// 3. ゲートウェイ收到通知,result 26.0 * 10 = 260
// 4. ゲートウェイ向Modbusデバイスレジスタ10写入260(function code06)
// 5. デバイス温度を設定する。变为26.0°C

十一、TLSセキュリティ连接

// Modbus TCP over TLS設定
{
  "master": {
    "slaves": [
      {
        "host": "secure-device.example.com",
        "port": 802,                  // TLS常用ポート
        "type": "tcp",
        "method": "socket",
        "unitId": 1,
        "deviceName": "セキュリティデバイス",
        "deviceType": "secure_device",

        // TLS設定
        "tls": {
          "enabled": true,
          "cert": "/config/certs/client.crt",    // クライアント側は证书
          "key": "/config/certs/client.key",     // クライアント側は私钥
          "ca_certs": "/config/certs/ca.crt",    // CA证书
          "password": "key_password"             // 私钥パスワード(可选)
        },

        "timeout": 35,
        "byteOrder": "BIG",
        "pollPeriod": 5000,

        "timeseries": [
          {"tag": "temperature", "type": "16int", "address": 0, "functionCode": 3}
        ],
        "attributeUpdates": [],
        "rpc": []
      }
    ]
  }
}

十二、Gateway Slaveモード

ゲートウェイ也可以作为Modbusスレーブ运行,允许其他Modbusマスター·ステーション·リーディングゲートウェイ缓存的データ。

// modbus_slave.json - ゲートウェイ作为Modbusslave
{
  "slave": {
    "type": "tcp",
    "host": "0.0.0.0",
    "port": 502,
    "method": "socket",
    "unitId": 1,
    "deviceName": "Gateway_Slave",
    "deviceType": "gateway",

    "byteOrder": "BIG",
    "wordOrder": "BIG",
    "pollPeriod": 5000,
    "sendDataToThingsBoard": true,

    // スレーブデータ·マッピング(其他マスター可読み取り这些アドレス)
    "timeseries": [
      {"tag": "gateway_temperature", "type": "16int", "address": 0, "functionCode": 3},
      {"tag": "gateway_humidity",    "type": "16int", "address": 1, "functionCode": 3}
    ],
    "attributes": [],
    "attributeUpdates": [],
    "rpc": []
  }
}

十三、完全実践:工厂环境モニタリング系统

以下是一个完全的生产环境設定:モニタリング3个车间的温湿度、2台パワーメーター、1台PLC,データすべて上传ThingsBoardプラットフォーム。

// factory_monitor.json - 工厂环境モニタリング完全な構成
{
  "master": {
    "slaves": [
      // ====== 车间ATemperature & Humidity(TCP) ======
      {
        "host": "192.168.1.101",
        "port": 502,
        "type": "tcp",
        "method": "socket",
        "unitId": 1,
        "deviceName": "车间A-Temperature & Humidity",
        "deviceType": "env_sensor",
        "timeout": 35,
        "byteOrder": "BIG",
        "wordOrder": "BIG",
        "pollPeriod": 10000,
        "timeseries": [
          {"tag": "temperature", "type": "16int", "address": 0, "functionCode": 3, "divider": 10},
          {"tag": "humidity",    "type": "16int", "address": 1, "functionCode": 3, "divider": 10},
          {"tag": "dew_point",   "type": "16int", "address": 2, "functionCode": 3, "divider": 10}
        ],
        "attributeUpdates": [
          {"tag": "alarm_temp_high", "type": "16int", "address": 100, "functionCode": 6, "multiplier": 10}
        ],
        "rpc": [
          {"tag": "getTemp", "type": "16int", "address": 0, "functionCode": 3}
        ]
      },
      // ====== 车间BTemperature & Humidity(TCP) ======
      {
        "host": "192.168.1.102",
        "port": 502,
        "type": "tcp",
        "method": "socket",
        "unitId": 1,
        "deviceName": "车间B-Temperature & Humidity",
        "deviceType": "env_sensor",
        "timeout": 35,
        "byteOrder": "BIG",
        "pollPeriod": 10000,
        "timeseries": [
          {"tag": "temperature", "type": "16int", "address": 0, "functionCode": 3, "divider": 10},
          {"tag": "humidity",    "type": "16int", "address": 1, "functionCode": 3, "divider": 10}
        ],
        "attributeUpdates": [],
        "rpc": []
      },
      // ====== パワーメーター1(RTU,slave1) ======
      {
        "type": "serial",
        "port": "/dev/ttyUSB0",
        "method": "rtu",
        "baudrate": 9600,
        "bytesize": 8,
        "parity": "E",
        "stopbits": 1,
        "unitId": 1,
        "deviceName": "配电柜1-パワーメーター",
        "deviceType": "power_meter",
        "timeout": 35,
        "byteOrder": "BIG",
        "wordOrder": "LITTLE",
        "pollPeriod": 5000,
        "timeseries": [
          {"tag": "voltage_a", "type": "16int", "address": 0, "functionCode": 3, "divider": 10},
          {"tag": "voltage_b", "type": "16int", "address": 1, "functionCode": 3, "divider": 10},
          {"tag": "voltage_c", "type": "16int", "address": 2, "functionCode": 3, "divider": 10},
          {"tag": "current_a", "type": "16int", "address": 3, "functionCode": 3, "divider": 100},
          {"tag": "power",     "type": "32int", "address": 4, "functionCode": 3, "divider": 1000},
          {"tag": "energy",    "type": "32int", "address": 6, "functionCode": 3}
        ],
        "attributeUpdates": [],
        "rpc": []
      },
      // ====== パワーメーター2(RTU,slave2,同一条バス) ======
      {
        "type": "serial",
        "port": "/dev/ttyUSB0",
        "method": "rtu",
        "baudrate": 9600,
        "bytesize": 8,
        "parity": "E",
        "stopbits": 1,
        "unitId": 2,
        "deviceName": "配电柜2-パワーメーター",
        "deviceType": "power_meter",
        "timeout": 35,
        "byteOrder": "BIG",
        "wordOrder": "LITTLE",
        "pollPeriod": 5000,
        "timeseries": [
          {"tag": "voltage_a", "type": "16int", "address": 0, "functionCode": 3, "divider": 10},
          {"tag": "power",     "type": "32int", "address": 4, "functionCode": 3, "divider": 1000}
        ],
        "attributeUpdates": [],
        "rpc": []
      },
      // ====== PLC(TCP,バッチ読み取り) ======
      {
        "host": "192.168.1.200",
        "port": 502,
        "type": "tcp",
        "method": "socket",
        "unitId": 1,
        "deviceName": "生产线PLC",
        "deviceType": "plc",
        "timeout": 35,
        "byteOrder": "BIG",
        "pollPeriod": 2000,
        "sendDataOnlyOnChange": true,
        "timeseries": [
          {
            "tag": "${unitId}.${type}.${address}",
            "type": "16int",
            "functionCode": 3,
            "objectsCount": 1,
            "address": "0-15"
          }
        ],
        "attributeUpdates": [
          {"tag": "production_speed", "type": "16int", "address": 100, "functionCode": 6}
        ],
        "rpc": [
          {"tag": "startProduction", "type": "bits", "address": 0, "functionCode": 5},
          {"tag": "stopProduction",  "type": "bits", "address": 1, "functionCode": 5}
        ]
      }
    ]
  }
}

十四、日志与排障

# 表示ゲートウェイ日志
docker logs -f tb-gateway

# EnableDEBUG级别日志(トラブルシューティングコミュニケーションの問題)
# 修改tb_gateway.yaml: logs.level: DEBUG

# 常见日志説明:
# INFO - Modbus connector started           连接器启动成功
# INFO - Connected to modbus slave          连機器の接続成功
# WARNING - Modbus connection failed        接続の失敗(チェックIP/ポート/serial port)
# ERROR - Modbus request timeout            リクエストタイムアウト(チェックデバイス是否オンライン)
# ERROR - Invalid response from slave       レスポンス无效(チェックバイトオーダー/slaveID)

# 测试Modbusデバイス是否可达
# TCPdevice:
nc -zv 192.168.1.100 502

# RTUdevice(用pymodbus测试):
python3 -c "
from pymodbus.client import ModbusSerialClient
c = ModbusSerialClient(port='/dev/ttyUSB0', baudrate=9600, parity='E')
c.connect()
r = c.read_holding_registers(0, 5, device_id=1)
print(r.registers if not r.isError() else r)
c.close()
"

# チェックシリアルポート权限
ls -la /dev/ttyUSB0
sudo usermod -aG dialout $USER  # 将用户加入シリアルポート组

十五、common problems

問題原因解決方法
デバイス接続の失敗IP/ポートエラー或网络通信不可用nc测试ポート,ファイアウォールの確認和路由
RTU応答なし。シリアルパラメータの不一致核对ボーレート/data bit/check digit/stop bit
データ值異常endianness/字序エラー尝试四种byteOrder/wordOrder组合
浮動小数点数正しくない字序設定エラー32位float需同时設定byteOrder和wordOrder
32ビット·データ異常objectsCount未设为232int/float必须objectsCount=2
RPC调用応答なし。方法名不マッチングチェックrpc設定中的tag与调用方法名一致
属性下行不生效属性名不マッチングプラットフォーム共享属性名必须与attributeUpdates.tag一致
シリアルポート权限拒绝用户无シリアルポートアクセス権加入dialout组或用rootrun
频繁断线再接続pollPeriod过短或デバイス慢增大pollPeriod,チェックtimeout設定
データ不上报ゲートウェイ未连接プラットフォームチェックaccessToken和プラットフォームアドレスポート

十六、学习リソース

  • 官方ドキュメント:https://thingsboard.io/docs/iot-gateway/
  • Modbus连接器設定:https://thingsboard.io/docs/iot-gateway/config/modbus/
  • GitHubsource code:https://github.com/thingsboard/thingsboard-gateway
  • DemoServer:docker run -it -p 5021:5021 thingsboard/tb-gw-modbus-server:latest
  • ThingsBoardプラットフォーム:https://thingsboard.io/

ThingsBoard IoT Gateway的Modbus连接器提供了完全的工业デバイス接入能力,サポートTCP/RTU双协议、主从双モード、丰富的データ型和バイトオーダー設定、バッチ読み取り最適化、RPCリモートコントロール。和属性ダウンタウン制御。本記事提供的从基础TCPデバイス接入到完全工厂环境モニタリングの実践設定,可直接使用する。于生产环境部署。建议先用ThingsBoard官方Demoサーバー·サーバー测试設定,再逐步接入真实デバイス。

📦

VIP专属:ThingsBoard IoT Gateway Modbusパッケージの設定

JSON完全な構成:バッチ読み取り、RPCダウンタウン制御、timeseriesマッピング、駅からの管理。,直接インポートできます。。

Activate VIP即可下载完全代码,同时解锁 30+ 工程実践パッケージの内容:スクリプトのデバッグ、クイックチェック·テーブル、项目模板、トラブルシューティング案例……

前往VIP资料库下载 → 月费仅9.9元 / 年费199元
Put this resource to use in a real project?

Go to the Tool Center for message parsing, CRC verification and device debugging, or submit your requirements for selection and integration advice.

Engineer Membership

Turn this article into actionable debugging resources

After activation, you can use advanced message parsing, resource pack downloads, code examples, engineering cases and priority technical support, suitable for real project delivery.

Unlimited Advanced Tools
Resource & Code Packs
Complete Engineering Case Library
Priority Technical Support