概述
本文档将帮助您为ThingsBoard物联网网关设置Modbus连接器。我们将用简单的术语解释配置参数,使您能够轻松理解和操作。Modbus是一种广泛应用于工业自动化和控制系统的协议,允许设备通过网络相互通信,该连接器可以与ThingsBoard平台无缝集成。使用通用配置来启用此扩展。
此外,如果您是ThingsBoard物联网网关的新用户,我们建议您阅读快速入门指南,以了解ThingsBoard物联网网关的基本概念及其与Modbus协议的工作方式。
该连接器可以通过用户界面表单进行配置,帮助您建立与Modbus服务器的连接、采集数据并向从设备写入数据。让我们来看看所有可用的设置并逐一清晰地解释,这将帮助您了解一切是如何工作的。
配置模式
Modbus连接器可以通过两种模式进行配置:基础模式和高级模式。
- 基础模式专为ThingsBoard物联网网关新用户设计,旨在以最少的配置快速设置连接器。它提供了带有基本设置的简化界面。
- 高级模式面向需要更多配置控制权的有经验用户。它为高级用例提供了额外的选项和灵活性。
您可以使用配置页面顶部的切换按钮在这些模式之间切换:

通用设置
本配置部分包含 connector 的通用设置,例如:
- Name - 用于日志和保存到持久化设备的 connector 名称;
- Logs configuration(日志配置) - 本地和远程日志设置:
- Enable remote logging - 为 connector 启用远程日志;
- Logging level - 本地和远程日志级别:NONE、ERROR、CRITICAL、WARNING、INFO、DEBUG、TRACE;
- Report strategy - 向 ThingsBoard 发送数据的策略:
- Report period - 向 ThingsBoard 发送数据的周期(毫秒);
- Type - report strategy 类型:
- On report period - 在上报周期后向 ThingsBoard 发送数据;
- On value change - 值变化时向 ThingsBoard 发送数据;
- On value change or report period - 值变化或到达上报周期时向 ThingsBoard 发送数据;
- On received - 从设备接收数据后向 ThingsBoard 发送数据(默认策略)。

主连接(网关作为主站)设置
Modbus主站用于从Modbus服务器(从站)查询数据。要配置用于数据检索的服务器,您需要指定从站列表。

服务器(从站)设置
Modbus从站是响应Modbus主站请求的设备。在此部分中,您可以配置主站将从中查询数据的Modbus从站。您可以向列表中添加多个从站,每个从站可以有自己的配置。
以下参数用于配置从设备、其名称和配置文件,以及上报策略:
- Unit ID - Modbus从站的ID。
- Device name -平台上的设备名称。
- Device profile -平台上的设备配置文件名称。
- Report strategy -向ThingsBoard发送数据的策略:
- Report period -向ThingsBoard发送数据的周期(毫秒);
- Type -上报策略类型:
- On report period -在上报周期后向ThingsBoard发送数据;
- On value change -当值发生变化时向ThingsBoard发送数据;
- On value change or report period -当值发生变化或上报周期到达时向ThingsBoard发送数据;
- On received -从设备接收到数据后向ThingsBoard发送数据(默认策略)。
要添加新的服务器连接配置,请导航到”Master Connections“选项卡并点击”加号“图标:

连接设置
根据 Modbus 主站偏好的通信方式,有三种配置选项:使用 TCP、UDP 或串口。
以下参数用于配置从站的 TCP 连接:
|
以下参数用于配置从站的 UDP 连接:
|
以下参数用于配置从站的串口连接:
|
高级连接设置
您可以配置其他设置,例如:TLS 连接、轮询时间、字节序和字序等。 下表描述了相关参数:
| 参数 | 默认值 | 描述 |
|---|---|---|
| 连接超时 (s) | 35 | 连接 Modbus 服务器的超时时间(秒) |
| 字节序 | LITTLE | 读取字节的顺序 |
| 字序 | LITTLE | 读取多个寄存器时字的顺序 |
| 重试 | true | 是否向主站重试发送数据。可选值:true 或 false |
| 空值时重试 | true | 主站返回空值时是否重试 |
| 无效时重试 | true | 主站返回失败时是否重试 |
| 轮询周期 (ms) | 5000 | 检查从站属性和遥测的周期(毫秒) |
| 连接尝试时间 (ms) | 5000 | 连接主站前的等待时间(毫秒) |
| 连接尝试次数 | 5 | 通过 ThingsBoard 网关进行的连接尝试次数 |
| 失败尝试后等待 (ms) | 300000 | 向主站发送数据前等待的时间(毫秒) |
-
点击「高级连接设置」子部分将其打开;
-
进行必要设置。
此外,您还可以配置 TLS 连接(仅用于 TCP/UDP 连接类型)。下表描述了配置 TLS 连接所需的参数:
| 参数 | 描述 |
|---|---|
| 客户端证书文件路径 | 网关文件系统中证书文件的路径 |
| 私钥文件路径 | 私钥文件路径 |
| 密码 | 服务器密码 |
| 服务器主机名 | 服务器主机名(应与证书中的主机名匹配) |

数据映射
在数据映射中,您可以指定Modbus主站如何与从站交互。这包括从从站读取数据。您还可以使用此部分配置哪些数据将作为设备属性或遥测数据发送。数据映射包含灵活数据管理所需的所有设置。
属性和时间序列
本单元配置提供 Modbus 服务器上数据处理相关设置。这些设置在ThingsBoard 平台实例中将被解释为设备的 attribute/time series。以下参数用于配置设备 attribute 和 time series:
- Key - 平台上 attribute 或 time series 的 key。
- Type - Modbus 寄存器的数据类型。
- Function code - 读取寄存器的 Modbus 功能码。
- Objects count - 要读取的寄存器数量。
- Address - Modbus 服务器上寄存器的地址。

要添加新的 attribute 或 time series,请按以下步骤操作:
-
在 “Attributes” 或 “Time series” 部分点击 “pencil” 图标(取决于所选部分);
-
在打开的窗口中点击 “Add attribute” 或 “Add time series“(取决于所选部分);
-
填写 key、type、function code、objects count 和 address 字段。点击 “Apply”。
在 “Attributes” 或 “Time series” 部分点击 “pencil” 图标(取决于所选部分);
在打开的窗口中点击 “Add attribute” 或 “Add time series“(取决于所选部分);
填写 key、type、function code、objects count 和 address 字段。点击 “Apply”。
Report strategy(上报策略)
您可为每个 time series 或 attribute 启用特定的 report strategy。该策略定义数据发送到 ThingsBoard 服务器的频率。可用策略如下:
- On report period - 在上报周期后向 ThingsBoard 发送数据;
- On value change - 当值变化时向 ThingsBoard 发送数据;
- On value change or report period - 当值变化或在上报周期后向 ThingsBoard 发送数据;
- On received - 从设备接收数据后向 ThingsBoard 发送数据(默认策略)。
Enum mapping(枚举映射)
可使用 enum mapping 功能将寄存器值映射为人类可读的字符串。对于值表示设备状态而非“传感器值”的寄存器特别有用。Enum mapping 适用于所有寄存器类型。上行 RPC to Device 调用可使用 enum mapping 获取解释后的值。
此外,enum mapping 可按预期与批量读取配合使用。
要为特定 attribute 或 time series 设置 enum mapping,需在配置中定义 variants 参数。该参数为对象,每个 key 表示可能的寄存器值,对应的 value 为描述该寄存器值的人类可读字符串。
Enum mapping 配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
{
"tag": "status",
"type": "16int",
"address": 1,
"objectsCount": 1,
"functionCode": 3,
"variants": {
"0": "Stopped",
"1": "Booting",
"2": "Running"
}
}
线圈寄存器 enum mapping 配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
{
"tag": "relay",
"type": "bits",
"address": 1,
"objectsCount": 1,
"functionCode": 1,
"bitTargetType": "int",
"variants": {
"0": "Disable",
"1": "Enable"
}
}
RPC to Device 调用的 enum mapping 配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
{
"method": "getStatus",
"type": "16int",
"address": 1,
"objectsCount": 1,
"functionCode": 3,
"variants": {
"0": "Stopped",
"1": "Booting",
"2": "Running"
}
}
Modifier(修饰符)
可通过以下设置对 attribute/time series 值应用 modifier:
| 参数 | 说明 |
|---|---|
| Type | multiplier - 读取结果将乘以此参数的值。 divider - 读取结果将除此参数的值 |
| Value | 用于修改读取值的数值 |

Batch reading(批量读取)
为优化读取过程,可将多个寄存器分组到单个批量读取请求中。这种方式可减少发送到 Modbus 服务器的请求数量,从而提高性能并降低网络流量。请注意,批量读取请求中的寄存器必须为相同类型和功能码。
组读取配置中有两个重要参数:address 和 tag。详细说明如下:
- address - 起始寄存器地址与结束寄存器地址,用
-分隔。例如0-10表示组读取从地址0的寄存器开始,到地址10的寄存器结束(含)。 - tag - 组读取内每个寄存器的唯一标识符,用于在给定地址范围内识别特定寄存器。tag 名称可使用以下变量构成表达式:
${address}- 组读取内的寄存器地址。${unitId}- slave ID。${functionCode}- 功能码。${type}- 寄存器的数据类型。${objectsCount}- 对象数量。
divider 和 multiplier 参数按预期工作。
组读取配置示例:
1
2
3
4
5
6
7
{
"tag": "${unitId} - ${type} - ${address}",
"type": "16int",
"functionCode": 3,
"objectsCount": 1,
"address": "0-10"
}
使用示例
以下示例使用 ThingsBoard Modbus 演示服务器,可通过 Docker 及以下命令运行: 服务器地址为
此处关注寄存器
在左侧边栏进入“实体”→“网关”并选择您的网关。 点击右侧菜单中的“连接器配置”按钮。 选择已创建的 Modbus 连接器并点击“主站连接”标签。请确保已配置并连接设备(若不清楚如何操作,可参阅入门指南或本指南中的连接设置和数据映射)。点击要配置属性更新的设备旁的“铅笔”图标。 向下滚动至“属性或时序数据”部分,点击“铅笔”图标编辑属性和遥测。 点击“添加属性”或“添加遥测”按钮。此处添加 记得点击“应用”按钮保存更改。 可以检查属性/遥测是否生效。依次进入“实体”→“设备”→选择已创建设备→“最新遥测”标签,查看
上述示例的 Modbus 连接器完整配置如下: |
以下示例使用 ThingsBoard Modbus 演示服务器,可通过 Docker 及以下命令运行: 服务器地址为
使用 Modbus 设备时,常需将寄存器读到的数值乘以某个系数才能得到正确值。例如,若寄存器中功率为
在左侧边栏进入“实体”→“网关”并选择您的网关。 点击右侧菜单中的“连接器配置”按钮。 选择已创建的 Modbus 连接器并点击“主站连接”标签。请确保已配置并连接设备(若不清楚如何操作,可参阅入门指南或本指南中的连接设置和数据映射)。点击要配置属性更新的设备旁的“铅笔”图标。 向下滚动至“属性或时序数据”部分,点击“铅笔”图标编辑属性和遥测。 点击“添加属性”或“添加遥测”按钮。此处添加 记得点击“应用”按钮保存更改。 可以检查带乘数的遥测是否生效。依次进入“实体”→“设备”→选择已创建设备→“最新遥测”标签,查看
上述示例的 Modbus 连接器完整配置如下: |
以下示例使用 ThingsBoard Modbus 演示服务器,可通过 Docker 及以下命令运行: 服务器地址为
使用 Modbus 设备时,常需要将寄存器读到的数值除以某个系数才能得到正确值。例如,若寄存器中温度为
在左侧边栏进入“实体”→“网关”并选择您的网关。 点击右侧菜单中的“连接器配置”按钮。 选择已创建的 Modbus 连接器并点击“主站连接”标签。请确保已配置并连接设备(若不清楚如何操作,可参阅入门指南或本指南中的连接设置和数据映射)。点击要配置属性更新的设备旁的“铅笔”图标。 向下滚动至“属性或时序数据”部分,点击“铅笔”图标编辑属性和遥测。 点击“添加属性”或“添加遥测”按钮。此处添加 记得点击“应用”按钮保存更改。 可以检查带除数的遥测是否生效。依次进入“实体”→“设备”→选择已创建设备→“最新遥测”标签,查看
上述示例的 Modbus 连接器完整配置如下: |
我们以 ThingsBoard Modbus 演示服务器为例,可使用 Docker 运行以下命令: 服务器在
为优化发送到 Modbus 服务器的请求数量,可使用高级配置模式下的批量读取功能。该功能允许在单次请求中读取多个寄存器,从而显著降低 Modbus 服务器负载并提升性能。 下面举例说明如何正确配置批量读取,以从 Modbus 服务器读取 从上表可知,所需寄存器类型相同( 将以下配置复制粘贴到 Modbus 连接器高级配置模式: 保存更改并启动连接器后,可以看到对应遥测数据正确更新:
|
Modbus 设备的寄存器可能表示枚举值,例如运行模式、状态码或错误状态。为便于理解,可使用 ThingsBoard IoT 网关 Modbus 连接器的枚举映射功能将其映射为可读字符串。该功能适用于所有寄存器类型,可用于上行数据(属性和时序数据)及上行 RPC 到设备调用。下面说明如何在 Modbus 连接器配置中设置枚举映射。 以下示例使用 ThingsBoard Modbus 演示服务器,可通过 Docker 及以下命令运行: 服务器地址为
我们要将
要为这些寄存器配置枚举映射,需在每个寄存器配置中定义 将以下配置复制粘贴到 Modbus 连接器高级配置模式中: 应用该配置后,
|
请求映射
请求映射部分允许您配置ThingsBoard平台实例如何与设备交互。即平台如何从设备请求数据、如何更新设备属性以及如何向设备发送RPC命令。
Modbus连接器支持以下请求映射:
- 属性更新 -允许从ThingsBoard平台实例更新设备节点值。
- RPC方法 -允许向设备发送RPC命令。使用RPC方法,您可以获取或设置Modbus寄存器的值。Modbus连接器支持不同类型的RPC方法,例如:
- 保留的GET/SET方法 -这些方法会自动为每个属性和时间序列参数创建。 您可以使用它们来获取或设置Modbus寄存器的值。
- 可配置的设备RPC方法 -这些方法允许您在连接器配置中配置可以发送到设备的自定RPC命令。
“属性更新”子部分
此子部分包含来自ThingsBoard平台实例的属性更新请求配置。
ThingsBoard允许配置设备属性并从设备应用程序中获取其中一些属性。您可以将其视为设备的远程配置。您的设备能够从ThingsBoard请求共享属性。更多详情请参阅用户指南。
以下参数用于配置属性更新:
- Key -共享属性名称。
- Type -值的类型,用于标识正在接收的值的数据类型。
- Function code -用于数据处理的功能码, 具体参见Modbus功能码。
- Objects count -要写入或读取的对象数量,指定请求中将处理多少个寄存器。
- Address -对象地址,用于标识Modbus协议中的特定对象。

添加新属性更新的步骤:
-
进入「属性更新」部分并点击「铅笔」图标;
-
在打开的窗口中点击「添加属性更新」;
-
设置属性键名、类型、功能码、对象数量和地址。然后点击「应用」。
“RPC请求”子部分
ThingsBoard允许向直接连接到ThingsBoard或通过网关连接的设备发送RPC命令。 此部分提供的配置用于从ThingsBoard向设备发送RPC请求。以下参数用于配置RPC方法:
- Method name - RPC方法名称,用于标识请求。
- Type -值的数据类型,用于标识正在接收的值的数据类型。
- Function code -用于数据处理的功能码, 具体参见Modbus功能码。
- Objects count -要写入或读取的对象数量,指定请求中将处理多少个寄存器。
- Address -对象地址,用于标识Modbus协议中的特定对象。

添加新 RPC 方法的步骤:
-
进入「RPC 请求」部分并点击「铅笔」图标;
-
在打开的窗口中点击「添加请求」;
-
填写键、类型、功能码、对象数量和地址。点击「应用」。
使用示例
属性更新允许您更新 Modbus 服务器中的寄存器值。您可以在设备配置页面的「属性更新」部分添加新的属性更新。 我们以 ThingsBoard Modbus 演示服务器为例,可使用 Docker 运行以下命令: 服务器在
我们关注寄存器「1」,我们已将此寄存器添加为键名为 让我们向配置添加属性更新。请按以下步骤操作:
在左侧边栏进入「实体」→「网关」并选择您的网关。 点击右侧菜单的「连接器配置」按钮。 选择已创建的 Modbus 连接器并点击「主站连接」选项卡。确保已配置并连接设备(如不清楚操作,请参阅 入门指南 或本指南的 连接设置 和 数据映射 章节)。点击要配置属性更新的设备上的「铅笔」图标。 向下滚动到「属性更新」部分,点击「铅笔」图标编辑属性更新。 点击「添加属性更新」按钮。本示例中将添加 记得点击「应用」按钮保存更改。 现在可以检查属性更新是否生效。进入「实体」→「设备」→ 选择已创建的设备 →「属性」选项卡 → 选择「共享属性」→ 点击「+」图标并添加 现在检查继电器寄存器的值。在所选设备中进入「最新遥测」选项卡,查看
尝试将 上述示例的 Modbus 连接器完整配置如下: |
RPC 到设备允许向直接连接或通过网关连接到 ThingsBoard 的设备发送 RPC 命令。 我们以 ThingsBoard Modbus 演示服务器为例,可使用 Docker 运行以下命令: 服务器在
我们希望通过 RPC 到设备从演示设备获取温度值。 要调用此方法,首先需要配置 Modbus 连接器以支持 RPC 调用。请按以下步骤操作:
在左侧边栏进入「实体」→「网关」并选择您的网关。 点击右侧菜单的「连接器配置」按钮。 选择已创建的 Modbus 连接器并点击「主站连接」选项卡。确保已配置并连接设备(如不清楚操作,请参阅 入门指南 或本指南的 连接设置 和 数据映射 章节)。点击要配置属性更新的设备上的「铅笔」图标。 向下滚动到「RPC 请求」部分,点击「铅笔」图标编辑 RPC 方法。 点击「添加请求」按钮。在「方法」字段填写 记得点击「应用」按钮保存更改。 配置已完成,让我们检查如何调用该方法。在 RPC 调试终端部件中运行以下命令: 响应:
上述示例的 Modbus 连接器完整配置如下: |
每个遥测和属性参数都自带 我们以 ThingsBoard Modbus 演示服务器为例,可使用 Docker 运行以下命令: 服务器在
我们关注寄存器 让我们使用保留的 响应:
因此, 要设置继电器寄存器的值并打开继电器,请运行以下查询: 响应: 如下方截图所示,继电器遥测值已变为
再次检查继电器遥测的值:现在为 响应:
上述示例的 Modbus 连接器完整配置如下: |
高级配置
高级配置部分提供了主站(Master)部分配置的所有可用参数的详细概述。
主站
网关可以作为Modbus主站运行。此配置部分用于Modbus主站,主站用于从Modbus服务器(从站)查询数据。
从站
从站列表用于指定主站将从中查询数据的Modbus从站列表。
| 参数 | 默认值 | 描述 |
|---|---|---|
| server.slaves[].unitId | Modbus从站的单元ID。 | |
| server.slaves[].deviceName | 平台上的设备名称。 | |
| server.slaves[].deviceType | default | (可选)平台上的设备配置文件名称。 |
| server.slaves[].pollPeriod (in ms) | 检查从站属性和遥测数据的周期(毫秒)。 | |
| server.slaves[].delayBetweenRequestsMs | 0 | (可选)读写请求之间的延迟。适用于内部由TCP转串口转换器组成且通过TCP实现Modbus RTU的设备。 |
| server.slaves[].timeout (in sec) | 35 | (可选)连接Modbus服务器的超时时间(秒)。 |
| server.slaves[].retries | true | (可选)重试向主站发送数据。值可以是:true或false。 |
| server.slaves[].retryOnEmpty | true | (可选)如果数据为空则重试向主站发送数据。 |
| server.slaves[].retryOnInvalid | true | (可选)如果发送失败则重试向主站发送数据。 |
| server.slaves[].connectAttemptTimeMs (in ms) | 5000 | (可选)连接主站前的等待时间(毫秒)。 |
| server.slaves[].connectAttemptCount | 5 | (可选)通过ThingsBoard网关的连接尝试次数。 |
| server.slaves[].waitAfterFailedAttemptsMs (in ms) | 300000 | (可选)尝试向主站发送数据前的等待时间(毫秒)。 |
| server.slaves[].byteOrder | LITTLE | 读取字节的顺序。 |
| server.slaves[].wordOrder | LITTLE | 读取多个寄存器时的字顺序。 |
| server.slaves[].reportStrategy | (可选)用于配置设备上报策略的上报策略对象。 |
从站配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
"master": {
"slaves": [
{
"timeout": 35,
"byteOrder": "LITTLE",
"wordOrder": "LITTLE",
"retries": true,
"retryOnEmpty": true,
"retryOnInvalid": true,
"pollPeriod": 5000,
"sendDataOnlyOnChange": true,
"connectAttemptTimeMs": 5000,
"connectAttemptCount": 5,
"waitAfterFailedAttemptsMs": 300000,
"deviceName": "Demo Device",
"deviceType": "default",
"unitId": 1,
...
}
]
}
从站连接类型
Modbus连接器支持三种与Modbus从站的连接类型:
- TCP -通过TCP/IP协议连接Modbus从站。
- UDP -通过UDP协议连接Modbus从站。
- Serial -通过串口(RS-232、RS-485等)连接Modbus从站。
TCP/UDP
| 参数 | 默认值 | 描述 |
|---|---|---|
| master.slaves[].type | 与Modbus设备的连接类型。 | |
| master.slaves[].host | localhost | Modbus服务器的主机名或IP地址。 |
| master.slaves[].port | 5021 | 用于连接的Modbus服务器端口。 |
| master.slaves[].method | socket | 帧类型,Socket或RTU(如需要)。 |
TCP/UDP从站配置示例:
1
2
3
4
5
6
7
8
9
10
"master": {
"slaves": [
{
"host": "127.0.0.1",
"port": 5021,
"method": "socket",
...
}
]
}
串口
| 参数 | 默认值 | 描述 |
|---|---|---|
| master.slaves[].type | serial | 与Modbus设备的连接类型。 |
| master.slaves[].port | 用于连接的Modbus从站端口。 | |
| master.slaves[].method | socket | 帧类型,Socket或RTU(如需要)。 |
| master.slaves[].baudrate | 19200 | 串口连接的波特率。 |
| master.slaves[].stopbits | 1 | (可选)消息中每个字符后发送的位数,用于指示字节结束。 |
| master.slaves[].parity | None | (可选)用于验证数据完整性的校验类型。可以是以下之一:(E)偶校验、(O)奇校验、(N)无校验。 |
| master.slaves[].bytesize | 8 | (可选)串口数据每字节的位数。可以是5、6、7或8之一。 |
| master.slaves[].strict | true | (可选)对于波特率<=19200使用字符间超时。 |
| master.slaves[].repack | false | (可选)重新打包数据以移除填充字节。 |
| master.slaves[].handleLocalEcho | false | (可选)处理串口连接的本地回声。适用于将发送的数据回传的设备。 |
串口从站配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
"master": {
"slaves": [
{
"method": "ascii",
"baudrate": 4800,
"stopbits": 1,
"bytesize": 5,
"parity": "N",
"strict": true,
...
}
]
}
设备属性和时间序列
| 参数 | 描述 |
|---|---|
| server.slaves[].attributes[] | 将发送到ThingsBoard平台实例的属性列表。 |
| server.slaves[].attributes[].tag | ThingsBoard中属性的键名称。可以指定为静态值。 |
| server.slaves[].attributes[].type | 值的数据类型。 |
| server.slaves[].attributes[].functionCode | 用于从Modbus从站读取属性值的功能码。 |
| server.slaves[].attributes[].objectsCount | 从Modbus从站读取的对象数量。 |
| server.slaves[].attributes[].address | Modbus从站中对象的地址。可配置为批量读取。 |
| server.slaves[].attributes[].divider | (可选)值的除数。如未指定,值将按原样发送。 |
| server.slaves[].attributes[].multiplier | (可选)值的乘数。如未指定,值将按原样发送。 |
| server.slaves[].attributes[].bitTargetType | 响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
| mapping[].attributes[].reportStrategy | (可选)属性数据的上报策略。如未指定,将使用设备上报策略。 |
| server.slaves[].timeseries[] | 将发送到ThingsBoard平台实例的时间序列列表。 |
| server.slaves[].timeseries[].tag | ThingsBoard中时间序列的键名称。可以指定为静态值。 |
| server.slaves[].timeseries[].type | 值的数据类型。 |
| server.slaves[].timeseries[].functionCode | 用于从Modbus从站读取时间序列值的功能码。 |
| server.slaves[].timeseries[].objectsCount | 从Modbus从站读取的对象数量。 |
| server.slaves[].timeseries[].address | Modbus从站中对象的地址。可配置为批量读取。 |
| server.slaves[].timeseries[].divider | (可选)值的除数。如未指定,值将按原样发送。 |
| server.slaves[].timeseries[].multiplier | (可选)值的乘数。如未指定,值将按原样发送。 |
| server.slaves[].timeseries[].bitTargetType | 响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
| mapping[].attributes[].reportStrategy | (可选)时间序列数据的上报策略。如未指定,将使用设备上报策略。 |
属性和遥测配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
"attributes": [
{
"tag": "string_read",
"type": "string",
"functionCode": 4,
"objectsCount": 4,
"address": 1
}
],
"timeseries": [
{
"tag": "16uint_read",
"type": "16uint",
"functionCode": 4,
"objectsCount": 2,
"address": 18
},
]
设备属性更新
| Parameter | Description |
|---|---|
| server.slaves[].attributeUpdates[] | 将在设备上更新的属性列表。 |
| server.slaves[].attributeUpdates[].tag | ThingsBoard中共享属性的键名称。可以指定为静态值。 |
| server.slaves[].attributeUpdates[].type | 值的数据类型。 |
| server.slaves[].attributeUpdates[].functionCode | 用于从Modbus从站读取属性值的功能码。 |
| server.slaves[].attributeUpdates[].objectsCount | 从Modbus从站读取的对象数量。 |
| server.slaves[].attributeUpdates[].address | Modbus从站中对象的地址。 |
| server.slaves[].attributeUpdates[].timeout (in ms) | (可选)请求超时时间(毫秒)。如未指定,则使用默认超时时间(5秒)。 |
| server.slaves[].attributeUpdates[].bitTargetType | 响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
属性更新配置示例:
1
2
3
4
5
6
7
8
{
"tag": "relay",
"type": "bits",
"functionCode": 5,
"objectsCount": 1,
"bitTargetType": "int",
"address": 29
}
设备RPC方法
| Parameter | Description |
|---|---|
| server.slaves[].rpc[] | 设备上可用的RPC方法列表。 |
| server.slaves[].rpc[].tag | RPC方法的名称。可以指定为静态值。 |
| server.slaves[].rpc[].type | 值的数据类型。 |
| server.slaves[].rpc[].functionCode | 用于从Modbus从站读取RPC方法值的功能码。 |
| server.slaves[].rpc[].objectsCount | 从Modbus从站读取的对象数量。 |
| server.slaves[].rpc[].address | Modbus从站中对象的地址。 |
| server.slaves[].rpc[].timeout (in ms) | (可选)请求超时时间(毫秒)。如未指定,则使用默认超时时间(5秒)。 |
| server.slaves[].rpc[].bitTargetType | 响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
RPC方法配置示例:
1
2
3
4
5
6
7
8
9
"rpc": [
{
"tag": "setValue",
"type": "16int",
"functionCode": 6,
"objectsCount": 1,
"address": 31
}
]
服务器(网关作为从站)设置
网关可以作为Modbus从站运行。作为从站的网关可以存储数据,在发生变化时或按固定间隔向平台发送更新,用户还可以通过RPC或共享属性更新来更改存储数据。
启用网关作为从站并向平台发送数据
要启用网关作为Modbus从站,您需要在”Server configuration“部分切换”Enable“按钮。请注意,此选项仅会创建Modbus从站,但不会自动向平台发送任何数据:

要向平台发送数据,您需要在”Server configuration“中启用”Send data to the platform“开关,这将在发生变化时或按固定间隔向平台发送数据:

连接设置
根据 Modbus master 之间的首选通信方式,此部分有三种配置选项:TCP、UDP 或 Serial 端口。

以下参数用于配置 Gateway as Slave 的 TCP 连接:
|
以下参数用于配置作为从站的网关的 UDP 连接:
|
以下参数用于配置作为从站的网关的串口连接:
|
高级连接设置
您可以配置其他设置,例如:TLS 连接、字节序、字序等。以下参数用于配置高级连接设置:
- 字节序 - Modbus 连接的字节序,可选 LITTLE 或 BIG。
- 字序 - Modbus 连接的字序,可选 LITTLE 或 BIG。
- 厂商名称 - Modbus 连接的厂商名称。
- 产品代码 - Modbus 连接的产品代码。
- 厂商 URL - Modbus 连接的厂商 URL。
- 产品名称 - Modbus 连接的产品名称。
- 型号名称 - Modbus 连接的型号名称。
- TLS - 启用或禁用 Modbus 连接的 TLS(仅用于 TCP 和 UDP 连接):
- 客户端证书路径 - 客户端证书文件路径。
- 客户端私钥路径 - 客户端私钥文件路径。
- 密码 - 客户端私钥文件密码。
配置高级连接设置的步骤:
-
点击「高级连接设置」子部分将其打开;
-
进行必要设置。
数据映射
在此部分中,您可以指定寄存器和线圈的初始值。每个值对应特定类型的寄存器。包括:
1.保持寄存器 2.线圈初始化器 3.输入寄存器 4.离散输入
对于每种寄存器类型,您可以配置用于读写数据的值类型。根据您选择的数据类型,网关将使用相应的Modbus功能码来读取或写入数据。
要配置读取的值类型,请使用属性和遥测部分。要写入数据,请使用RPC方法和共享属性部分。请注意,每种值类型的配置与属性、遥测、RPC方法和共享属性部分中相应的数据类型类似。唯一的例外是您需要在”Value“字段中设置初始值。
根据寄存器所属的值类型,您应将其添加到相应的数组中。
选择基础或高级Modbus配置:

要向网关 slave 添加新值,请按以下步骤操作:
-
在所选部分的行中点击 “pencil“(铅笔)图标;
-
在打开的窗口中点击 “Add attribute” 或其他(取决于所选部分);
-
填写 key、type、function code、objects count、address 和 value 字段。点击 “Apply”。
在所选部分的行中点击 “pencil“(铅笔)图标;
在打开的窗口中点击 “Add attribute” 或其他(取决于所选部分);
填写 key、type、function code、objects count、address 和 value 字段。点击 “Apply”。
高级配置
高级配置部分提供了网关作为从站配置部分所有可用参数的详细概述。
从站
网关可以作为Modbus从站运行。此配置部分用于Modbus从站,用于存储数据并在发生变化时或按固定间隔向平台发送更新。
| 参数 | 默认值 | 描述 |
|---|---|---|
| slave.byteOrder | LITTLE | 读取字节的顺序。 |
| slave.wordOrder | LITTLE | 读取多个寄存器时的字顺序。 |
| slave.pollPeriod (in ms) | 5000 | 读取并向平台发送属性和遥测数据的周期(毫秒)。 |
| slave.sendDataToThingsBoard | true | 如果设置为TRUE,网关将执行自动配置并在每个轮询周期向ThingsBoard发送值。 |
| slave.unitId | 当前网关在Modbus上的从站ID。 | |
| slave.deviceName | 平台上的设备名称。 | |
| slave.deviceType | default | (可选)平台上的设备配置文件名称。 |
从站配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"slave": {
"type": "tcp",
"host": "127.0.0.1",
"port": 5026,
"method": "socket",
"deviceName": "Modbus Slave Example",
"deviceType": "default",
"pollPeriod": 5000,
"sendDataToThingsBoard": false,
"byteOrder": "LITTLE",
"wordOrder": "LITTLE",
"unitId": 0,
...
}
从站连接类型
Modbus连接器支持三种与Modbus从站的连接类型:
- TCP -通过TCP/IP协议连接Modbus从站。
- UDP -通过UDP协议连接Modbus从站。
- Serial -通过串口(RS-232、RS-485等)连接Modbus从站。
TCP/UDP
| 参数 | 描述 |
|---|---|
| slave.type | 与Modbus设备的连接类型,可以是:tcp或udp。 |
| slave.host | Modbus服务器的主机名或IP地址。 |
| slave.port | 用于连接的Modbus服务器端口。 |
| slave.method | 帧类型,Socket或RTU(如需要)。 |
TCP/UDP配置示例:
1
2
3
4
5
6
7
"slave": {
"type": "tcp",
"host": "127.0.0.1",
"port": 5026,
"method": "socket",
...
}
串口
| 参数 | 默认值 | 描述 |
|---|---|---|
| slave.type | serial | 与Modbus设备的连接类型,可以是:tcp或udp。 |
| slave.port | 用于连接的Modbus从站端口。 | |
| slave.method | rtu | 帧类型,Socket或RTU(如需要)。 |
| slave.baudrate | 19200 | (可选)串口连接的波特率。 |
| slave.stopbits | 1 | (可选)消息中每个字符后发送的位数,用于指示字节结束。 |
| slave.parity | N | (可选)用于验证数据完整性的校验类型。可以是以下之一:(E)偶校验、(O)奇校验、(N)无校验。 |
| slave.bytesize | 8 | (可选)串口数据每字节的位数。可以是5、6、7或8之一。 |
| slave.strict | true | (可选)对于波特率<=19200使用字符间超时。 |
| slave.handleLocalEcho | false | (可选)处理串口连接的本地回声。适用于将发送的数据回传的设备。 |
串口配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
"slave": {
"type": "serial",
"port": 5026,
"method": "rtu",
"baudrate": 4800,
"stopbits": 1,
"bytesize": 5,
"parity": "N",
"strict": true,
"handleLocalEcho": false,
...
}
安全配置
网关作为从站支持安全配置。此配置用于保护与Modbus从站的连接并对连接进行认证。仅适用于TCP和UDP连接。
| 参数 | 描述 |
|---|---|
| slave.security | 安全对象。 |
| slave.security.keyfile | 密钥文件路径。 |
| slave.security.certfile | 证书文件路径。 |
| slave.security.password | 密码。 |
安全配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
"slave": {
"type": "tcp",
"host": "127.0.0.1",
"port": 5026,
"method": "socket",
"security": {
"keyfile": "/path/to/keyfile.pem",
"certfile": "/path/to/certfile.pem",
"password": "your_password"
}
...
}
值
值列表用于指定寄存器和线圈的初始值。每个值对应特定类型的寄存器。包括:
1.保持寄存器 2.线圈初始化器 3.输入寄存器 4.离散输入
对于每种寄存器类型,您可以配置用于读写数据的值类型。根据您选择的数据类型,网关将使用相应的Modbus功能码来读取或写入数据。
属性和时间序列
| 参数 | 描述 |
|---|---|
slave.values[].<register_type>.attributes[] |
属性列表。 |
slave.values[].<register_type>.attributes[].tag |
平台上属性的键名称。 |
slave.values[].<register_type>.attributes[].address |
对象地址。 |
slave.values[].<register_type>.attributes[].type |
值类型。 |
slave.values[].<register_type>.attributes[].objectsCount |
要写入的对象数量。 |
slave.values[].<register_type>.attributes[].value |
寄存器初始值。 |
slave.values[].<register_type>.attributes[].bitTargetType |
响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
slave.values[].<register_type>.timeseries[] |
时间序列列表。 |
slave.values[].<register_type>.timeseries[].tag |
平台上时间序列的键名称。 |
slave.values[].<register_type>.timeseries[].address |
对象地址。 |
slave.values[].<register_type>.timeseries[].type |
值类型。 |
slave.values[].<register_type>.timeseries[].objectsCount |
要写入的对象数量。 |
slave.values[].<register_type>.timeseries[].value |
寄存器初始值。 |
slave.values[].<register_type>.timeseries[].bitTargetType |
响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
属性和时间序列配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
"slave": {
...
"values": {
"holding_registers": {
"attributes": [
{
"address": 1,
"type": "string",
"tag": "sm",
"objectsCount": 1,
"value": "ON"
}
],
"timeseries": [
{
"address": 2,
"type": "16int",
"tag": "smm",
"objectsCount": 1,
"value": 12334
}
],
}
}
}
属性更新
| 参数 | 描述 |
|---|---|
slave.values[].<register_type>.attributeUpdates[] |
属性更新列表。 |
slave.values[].<register_type>.attributeUpdates[].tag |
平台上属性的键名称。 |
slave.values[].<register_type>.attributeUpdates[].address |
对象地址。 |
slave.values[].<register_type>.attributeUpdates[].type |
值类型。 |
slave.values[].<register_type>.attributeUpdates[].functionCode |
写入值的功能码。 |
slave.values[].<register_type>.attributeUpdates[].objectsCount |
要写入的对象数量。 |
slave.values[].<register_type>.attributeUpdates[].value |
寄存器初始值。 |
slave.values[].<register_type>.attributeUpdates[].bitTargetType |
响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
属性更新配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
"slave": {
...
"values": {
"holding_registers": {
"attributeUpdates": [
{
"tag": "shared_attribute_write",
"type": "32int",
"functionCode": 6,
"objectsCount": 2,
"address": 29,
"value": 1243
}
],
}
}
}
RPC方法
| 参数 | 描述 |
|---|---|
slave.values[].<register_type>.rpc[] |
RPC方法列表。 |
slave.values[].<register_type>.rpc[].tag |
平台上RPC方法的键名称。 |
slave.values[].<register_type>.rpc[].address |
对象地址。 |
slave.values[].<register_type>.rpc[].type |
值类型。 |
slave.values[].<register_type>.rpc[].functionCode |
写入值的功能码。 |
slave.values[].<register_type>.rpc[].objectsCount |
要写入的对象数量。 |
slave.values[].<register_type>.rpc[].value |
寄存器初始值。 |
slave.values[].<register_type>.rpc[].bitTargetType |
响应类型可以是整数(0/1)或布尔值(True/False)。仅与bits类型一起使用。 |
RPC方法配置示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
"slave": {
...
"values": {
"holding_registers": {
"rpc": [
{
"tag": "setValue",
"type": "16int",
"functionCode": 5,
"objectsCount": 1,
"address": 31,
"value": 22
}
]
}
}
}
附加信息
以下是有关Modbus功能码和支持的数据类型的更多详细信息。
Modbus功能码
Modbus连接器支持以下Modbus功能码:
| Modbus功能码 | 描述 |
|---|---|
| 读取数据 | |
| 1 | 读取线圈 |
| 2 | 读取离散输入 |
| 3 | 读取多个保持寄存器 |
| 4 | 读取输入寄存器 |
| 写入数据: | |
| 5 | 写入线圈 |
| 6 | 写入寄存器 |
| 15 | 写入多个线圈 |
| 16 | 写入多个寄存器 |
数据类型
用于读写数据的支持数据类型列表及描述。
| 类型 | 功能码 | 对象数量 | 说明 |
|---|---|---|---|
| string | 3-4 | 1-… | 从寄存器读取字节并解码(UTF-8编码)。 |
| bytes | 3-4 | 1-… | 从寄存器读取字节。 |
| bits | 1-4 | 1-… | 读取线圈。如果对象数量为1,结果将被解释为布尔值。否则结果将是一个位数组。 |
| 16int | 3-4 | 1 | 16位整数。 |
| 16uint | 3-4 | 1 | 16位无符号整数。 |
| 16float | 3-4 | 1 | 16位浮点数。 |
| 32int | 3-4 | 2 | 32位整数。 |
| 32uint | 3-4 | 2 | 32位无符号整数。 |
| 32float | 3-4 | 2 | 32位浮点数。 |
| 64int | 3-4 | 4 | 64位整数。 |
| 64uint | 3-4 | 4 | 64位无符号整数。 |
| 64float | 3-4 | 4 | 64位浮点数。 |
下一步
探索与ThingsBoard主要功能相关的指南:















