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

無料無料技术资料

这篇内容可直接阅读,适合用于基础学习和検索引流。

ThingsBoard IoT Gatewayは、Modbus、MQTT、OPC-UA、BLEなどのプロトコルをサポートし、現場の産業機器データをThingsBoard IoTプラットフォームに接続することができます。この記事では、TCP/RTUデバイスアクセス、データタイプマッピング、バッチ読み取り最適化、RPCリモート制御、アトリビュートダウンストリーム制御、TLSセキュア接続、プラント環境の完全な監視など、ThingsBoard IoT Gateway用Modbusコネクタの構成について詳しく説明します。

ThingsBoard IoT Gatewayの概要

1.1 什么是ThingsBoard IoT Gateway

ThingsBoard IoT Gatewayは、ThingsBoardプラットフォームとフィールドデバイス間のブリッジとして機能するオープンソースのIoTゲートウェイソフトウェアです。エッジデバイス(Raspberry Pi、産業用コンピュータ、サーバーなど)上で動作し、さまざまな産業用プロトコル(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つのモデル
  • 豊富なデータ型16 int、32 int、64 int、float、double、bits、stringなど
  • エンディアン構成:サポートBIG/LITTLEバイトオーダー和字序独立設定
  • バッチ読み取り連続レジスタを一度に読み取ることができ、リクエスト数を削減できます。
  • データ変換:内置multiplier(乘)和divider(除)系数变换
  • RPCリモートコントロールプラットフォームはRPC呼び出しでデバイスレジスタを読み書きできます。
  • 属性ダウン:プラットフォーム属性变更可自动写入デバイスレジスタ
  • 切断されたリンク再試行回数と待機時間の設定をサポートする自動再接続メカニズム
  • TLSセキュリティ:サポートModbus TCP over TLS加密传输
  • ローカルストレージ。:ネットワーク障害時のデータローカルキャッシュ、復旧後の自動再送信
  • 完全なオープンソース:Apache 2.0协议,商业使用無料

II.構造と動作原理

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

III.設置と展開

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 nsr/config    プロファイル·ディレクトリ
#-v data/data        データストアディレクトリオフラインキャッシュ
#--デバイス             シリアルデバイスのマウント(RTUが必要)
#-ネットワークホスト       ホストネットワークの使用(ローカルデバイスへのアクセスが容易)

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
      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:セキュリティ
    ess
  QOS 1                              MQTTのQoSレベル
  storage
    type memory                      メモリストレージ/ファイル/sqlite
    max_records_count 100000         #キャッシュレコードの最大数
    read_records_count 100           #各レコードの数

Connectors
  - name "Modbus TCP Connector"
    type mod
    configuration modbus_tcp.json    Modbus TCPコネクタの設定

  - name ""
    type modbus
    uration    Modbus RTUコネクタの構成

grpc:
  enabled false                      # gRPCリモート構成ThingsBoard PE

logs
  level INFO [level INFO]                         #ログレベルDE//WARNING/
  path "/var/log/tb-gateway/"        #日記の内容

5. Modbus TCPアクセス

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

// modbus_tcp.json - Modbus TCP连接器設定
{
  "master": {
    "slaves": [
      {
        // ====== 连接設定 ======
        "host": "192.168.1.100",       // デバイスIPアドレス
        "port": 502,                    // デバイスポート
        "type": "tcp",                  // 连接タイプ tcp/udp/serial
        "method": "socket",             // フレームタイプ socket(標準TCP)/rtu(RTU over TCP)
        "unitId": 1,                    // スレーブID
        "deviceName": "车间A温湿度センサー", // ThingsBoard上的デバイス名
        "deviceType": "temperature_sensor", // デバイスタイプ/設定文件

        // ====== 通信パラメータ ======
        "timeout": 35,                  // タイムアウト時間(秒)
        "byteOrder": "BIG",             // バイトオーダー 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",           // データ型
            "address": 100,             // レジスター·アドレス
            "objectsCount": 8,          // 読み取りレジスタの数(string需要多个)
            "functionCode": 3           // 機能コード 03=リードホールドレジスタ
          }
        ],

        // ====== 遥测(动态データ,实时上报) ======
        "timeseries": [
          {
            "tag": "temperature",       // 遥测键名
            "type": "16int",            // データ型 16int/32int/float/bits
            "address": 0,               // レジスター·アドレス
            "objectsCount": 1,          // 読み取りレジスタの数
            "functionCode": 3,          // 機能コード 03=リードホールドレジスタ
            "divider": 10               // 除数(レジスタの値/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,          // 機能コード 01=リードコイルを読む
            "bitTargetType": "bool"     // 转换为布尔值
          }
        ],

        // ====== 属性更新(プラットフォーム→デバイスダウンタウン制御) ======
        "attributeUpdates": [
          {
            "tag": "set_temperature",   // プラットフォーム属性名
            "type": "16int",
            "address": 10,              // 写入レジスター·アドレス
            "functionCode": 6,          // 機能コード 06=単一レジスタの書き込み
            "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           // 機能コード 05=シングルコイルを書く。
          }
        ]
      }
    ]
  }
}

6. Modbus RTUシリアルデバイスアクセス

// modbus_rtu.json - Modbus RTUシリアルポート连接器設定
{
  "master": {
    "slaves": [
      {
        // ====== シリアルポート连接設定 ======
        "type": "serial",               // シリアルポートタイプ
        "port": "/dev/ttyUSB0",         // シリアルデバイス
        "method": "rtu",                // フレームタイプ rtu/ascii
        "baudrate": 9600,               // ボーレート
        "bytesize": 8,                  // データ·ビット
        "parity": "N",                  // チェックビット N/E/O
        "stopbits": 1,                  // ストップ·ビット
        "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": []
      }
    ]
  }
}

7.データ型の詳細

タイプ説明レジスタの占有機能コードの適用
16インチ16ビット符号付き整数103/04
16ウイント16ビット符号なし整数103/04
32インチ32ビット符号付き整数203/04
32 uint32ビット符号なし整数203/04
64int64ビット符号付き整数403/04
Floatの32ビット浮動小数点数(IEEE754)203/04
double(ダブル)64ビット浮動小数点数403/04
bitsのことビット/Coil1つのビット01/02/05/15
ストリング·ストリングストリング·ストリングNさん03/04

7.1バイト順序とワード順序

  • byteOrder BIG:ビッグエンディアン(上位バイトが前)、ほとんどのModbusデバイスのデフォルト
  • byteOrder: LITTLE:リトルエンディアン(下位バイトが前)
  • wordOrder BIG:大文字順序(上位文字の前)、32ビットデータの2つのレジスタ順序
  • wordOrder: LITTLE小文字の順序(下文字の前)
  • BIG+BIG ABCD、BIG+LITTLE CDAB、LITTLE+BIG BADC、LITTLE+LITTLE DCBAの4種類の組み合わせ
  • QModMasterで同じ32ビット浮動小数点数を読み取り、4つの組み合わせのどれが妥当かを比較する

8.バッチ読み取り最適化

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

// 不おすすめ:すべてのレジスタ。单独リクエスト(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}

// 自定义tag变量:
// ${unitId}     - スレーブID
// ${type}       - データ型
// ${address}    - レジスター·アドレス
// ${deviceName} - デバイス名

RPCリモートコントロール

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           // シングルコイルを書く。
  },
  // 書き込み操作。:設定设定值
  {
    "tag": "setSetpoint",
    "type": "16int",
    "address": 10,
    "objectsCount": 1,
    "functionCode": 6           // 単一レジスタの書き込み
  }
]

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

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

// setSetpoint
// 参数:{"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             //個々のレジスタに書き込む
    “plier”10               //プラットフォーム値25.0→書き込み250
  },
  {
    “tag”“alarm_enable”
    “type”“bits”、
    “address”5
    “functionCode”5              タグ:write coil
  }
]

//ワークフロー
// 1。ThingsBoardデバイスページでの共有プロパティの変更target_temperature = 26.0
// 2.。プラットフォームはMQTTでプロパティ更新通知を送信
// 3.。ゲートウェイが通知を受信し、26.0 * 10 = 260を計算
// 4。ゲートウェイはModbusデバイスレジスタ10へ260を書き込む(ファンクションコード06)
// 5。デバイス設定温度が26.0°Cに変更

11. 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": []
      }
    ]
  }
}

ゲートウェイ·スレーブ·モード

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

//modbus_slave.json-Modbusスレーブとしてのゲートウェイ
{
  “slave”{
    “type”“t”
    “host”“0.0.0.0”
    “port”502
    “method”“socket”、
    “unitId”1、
    “deviceName”“Gateway_Slave”
    “deviceType”“gateway”、

    “beOrder”“BIG”、
    “wordOrder”“BIG”、
    “pollPeriod”5000
    “sendDataToThingsBoard”true、

    //スレーブデータマッピング(他のマスターがこれらのアドレスを読み取ることができます)
    “timeseries”[
      {"tag""gateway_temperature""type""16int""address" 0 "functionCode" 3}
      {"""gateway_idity"    “type”“16int”“address”1“functionCode”3}
    ],
    “attributes”[]
    “attributeUpdates”[]
    “rpc”[]
  }
}

13、完全な戦闘:工場環境監視システム

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

// factory_monitor.json - 工厂环境モニタリング完全な構成
{
  "master": {
    "slaves": [
      // ====== 车间A温湿度(TCP) ======
      {
        "host": "192.168.1.101",
        "port": 502,
        "type": "tcp",
        "method": "socket",
        "unitId": 1,
        "deviceName": "车间A-温湿度",
        "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}
        ]
      },
      // ====== 车间B温湿度(TCP) ======
      {
        "host": "192.168.1.102",
        "port": 502,
        "type": "tcp",
        "method": "socket",
        "unitId": 1,
        "deviceName": "车间B-温湿度",
        "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,スレーブ1) ======
      {
        "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,スレーブ2,同一条バス) ======
      {
        "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}
        ]
      }
    ]
  }
}

14.日記と障害

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

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

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

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

# RTUデバイス(用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  # 将用户加入シリアルポート组

15.よくある質問

問題理由は解決策は
デバイスの接続に失敗しましたIP/ポートエラー或网络通信不可ncでポートをテストし、ファイアウォールとルートをチェック
RTU応答なしシリアルパラメータの不一致ボーレート/データビット/検査ビット/停止ビットの検査
データ値の例外バイト·エンディアン/ワード·エンディアン·エラーbyteOrder/wordOrderの4つの組み合わせを試す
浮動小数点が正しいワード順序設定エラー32ビットfloatはbyteOrderとwordOrderの両方を設定します。
32ビットデータ異常objectsCountが2に設定されていませんint/floatはobjectsCount=2でなければならない
RPC呼び出しに応答がないメソッド名の不一致rpc設定のtagが呼び出し元メソッド名と一致していることを確認する
属性が無効属性名が一致しないプラットフォーム共有属性名はattributeUpdates.tagと一致している必要があります
シリアルポート権限の拒否ユーザーにシリアル·アクセス権がないdialoutグループに参加するか、rootで実行する
頻繁に切断する。pollPeriodが短すぎるか、デバイスが遅いpollPeriodを大きくし、timeout設定を確認します。
データの非報告ゲートウェイがプラットフォームに接続されていませんaccessTokenおよびプラットフォームアドレスポートの確認

十六、学习リソース

  • 公式ドキュメント:https://thingsboard.io/docs/iot-gateway/
  • Modbusコネクタ構成thingsboard.io/docs/iot-gateway/config/modbus/
  • GitHubのソースコードgithub.com/thingsboard/thingsboard-gateway
  • Demoサーバーdocker run -it -p 5021
  • ThingsBoardプラットフォームthingsboard.io/

ThingsBoard IoT GatewayのModbusコネクタは、TCP/RTUデュアルプロトコル、マスター/スレーブデュアルモード、豊富なデータタイプとエンディアン構成、バッチ読み取り最適化、RPCリモートコントロール、プロパティダウンコントロールをサポートし、産業機器への完全なアクセスを提供します。この記事で提供する基本的なTCPデバイスアクセスから完全なプラント環境モニタリングまでの実戦構成は、本番環境への展開に直接使用できます。ThingsBoard公式デモサーバーで構成をテストし、徐々に実際のデバイスに接続することをお勧めします。

📦

VIP専用:ThingsBoard IoT Gateway Modbusパッケージ

JSONの完全な構成:バッチ読み取り、RPCダウン制御、タイムスタンプマッピング、マルチスレーブ管理、直接インポートすることができます。

完全なコードをダウンロードしてロックを解除 30+ 工程実戦パッケージ:デバッグスクリプト、速検表、プロジェクトテンプレート、検査ケース

VIPデータベースからダウンロード 月額9.9ドル/年間199ドル
この資料を実際のプロジェクトに活用しませんか?

ツールセンターで電文解析、CRCチェック、デバイスデバッグを行うか、要件を送信して選定と接続のアドバイスを受けましょう。

エンジニア会員

この記事を実行可能なデバッグ資料に

登録すると、高度な電文解析、資料パックのダウンロード、コード例、エンジニアリングケース、優先技術サポートが利用可能に。実際のプロジェクト納品に最適です。

高度なツール無制限
資料パックとコードパック
完全なエンジニアリングケースライブラリ
優先技術サポート窓口