外观
Modbus TCP 示例
2025-09-22
概述
本文介绍了如何创建一个 Modbus TCP 主机示例,并将其作为客户端与 Modbus slave 上位机软件建立 TCP 通信,旨在帮助读者深入熟悉 Modbus TCP 协议的通信流程,掌握主机通过 TCP 报文修改从机寄存器数据(如保持寄存器 0、1、2)的操作逻辑,以及验证主机设置数据与从机接收数据的一致性。
注意:确保开发板和 PC 在同一网段,并保证开发板能 ping 通 PC。
Modbus TCP 通信
Modbus TCP 是基于 TCP/IP 协议的工业通信协议,采用主从通信架构,主机通过发送标准 TCP 报文向从机设备发起读写请求,从机返回响应报文完成数据交互。 其数据帧包含 MBAP 报头(标识事务、协议类型等)和功能码字段,可实现对从机保持寄存器、输入寄存器等数据的操作,广泛应用于工业自动化领域的设备联网通信,是 Modbus 协议在网络环境下的主流应用形式。
Modbus TCP 主机客户端寄存器数据修改与一致性验证实验
本示例将使用 Modbus TCP 传输模式与 Modbus slave 上位机软件建立通信,由主机向从机寄存器 0、1、2 写入指定数据,并验证从机接收数据与主机发送数据的一致性。
创建工程点击展开
依次点击 “文件” -> “新建” -> "RT-Thread RuiChing App 项目"。

在弹出新建向导中选择 开发版 、BSP: 、示例 、 调试器/下载器。选择好之后点击 “完成”。

点击 “完成” 后,等待工程创建完成。

创建完成。

构建工程点击展开
单击工程使工程进入 Active-Debug 模式。

点击工具栏上的构建按钮进行工程编译。

构建成功后,会显示构建成功的信息。

固件下载点击展开
固化设备树

固化 APP

核心示例代码
applications/modbus_tcp_master.c
static int modbus_tcp_master(void)
{
modbus_t *ctx;
uint16_t tab_reg[10];
int rc;
int i;
// 初始化 Modbus TCP 主站上下文(目标从站 IP 地址: 192.168.1.200,使用 IPv4 协议)
ctx = modbus_new_tcp("192.168.1.200", 502, AF_INET);
if (ctx == NULL)
{
rt_kprintf("Unable to create the libmodbus context\n");
return -1;
}
// 配置从站地址和超时时间
modbus_set_slave(ctx, 1);
modbus_set_response_timeout(ctx, 10, 0);
// 建立 TCP 连接
if (modbus_connect(ctx) == -1)
{
rt_kprintf("Connection failed\n");
modbus_free(ctx);
return -1;
}
// 读取从站地址 0 开始的 10 个寄存器的值,存入 tab_reg
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1)
{
rt_kprintf("Failed to read registers\n");
modbus_close(ctx);
modbus_free(ctx);
return -1;
}
// 打印读取寄存器的值
rt_kprintf("Read %d registers:\n", rc);
for (i = 0; i < rc; i++)
{
rt_kprintf("Register %d: %d\n", i, tab_reg[i]);
}
// 向从站地址 0 开始的 3 个寄存器写入 100, 200, 300
int write_start_address = 0;
uint16_t write_values[3] = {100, 200, 300};
rc = modbus_write_registers(ctx, write_start_address, 3, write_values);
if (rc == -1)
{
rt_kprintf("Failed to write multiple registers\n");
}
else
{
rt_kprintf("Successfully wrote multiple registers starting at address %d\n", write_start_address);
}
// 再次读取数据,验证写入结果
rc = modbus_read_registers(ctx, 0, 10, tab_reg);
if (rc == -1)
{
rt_kprintf("Failed to read registers after write\n");
}
else
{
rt_kprintf("Registers after write:\n");
for (i = 0; i < rc; i++)
{
rt_kprintf("Register %d: %d\n", i, tab_reg[i]);
}
}
// 断开连接并释放内存
modbus_close(ctx);
modbus_free(ctx);
return 0;
}运行程序
配置 Modbus Slave 上位机软件
modbus slave 连接设置:依次点击 Connection —> Connect
modbus slave 从机属性设置:点击 Setup —> Slave Definition


下载并运行程序后,在控制台输入
modbus_tcp_master
Modbus slave 上位机软件中寄存器 0、1、2 的数据分别更新为 100、200、300。

