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ビット符号付き整数 | 1 | 03/04 |
| 16ウイント | 16ビット符号なし整数 | 1 | 03/04 |
| 32インチ | 32ビット符号付き整数 | 2 | 03/04 |
| 32 uint | 32ビット符号なし整数 | 2 | 03/04 |
| 64int | 64ビット符号付き整数 | 4 | 03/04 |
| Floatの | 32ビット浮動小数点数(IEEE754) | 2 | 03/04 |
| double(ダブル) | 64ビット浮動小数点数 | 4 | 03/04 |
| bitsのこと | ビット/Coil | 1つのビット | 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ドル