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 | 説明 | 占用レジスタ | 适用機能コード |
|---|---|---|---|
| 16int | 16ビット符号付き整数 | 1 | 03/04 |
| 16uint | 16ビット符号なし整数 | 1 | 03/04 |
| 32int | 32ビット符号付き整数 | 2 | 03/04 |
| 32uint | 32ビット符号なし整数 | 2 | 03/04 |
| 64int | 64ビット符号付き整数 | 4 | 03/04 |
| float | 32ビット浮動小数点数(IEEE754) | 2 | 03/04 |
| double | 64ビット浮動小数点数 | 4 | 03/04 |
| bits | 位/コイル | 1(位) | 01/02/05/15 |
| string | ストリング·ストリング | N | 03/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未设为2 | 32int/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元