开启modbus tcp模拟调试
1、新建modbus tcp服务器
功能差异客户端功能:
生成并发送Modbus请求报文(如功能码03读取寄存器)。
解析服务器响应数据,实现远程监控或控制。
服务器端功能:
监听默认端口(如502),等待客户端连接。
解析请求报文并执行操作,封装结果返回客户端。
modbustcp库文件
https://github.com/stephane/libmodbus/releases
2、下载库文件
# 从源码编译安装 libmodbus
wget https://libmodbus.org/releases/libmodbus-3.1.11.tar.gz
tar -xzf libmodbus-3.1.6.tar.gz
cd libmodbus-3.1.6
./autogen.sh
./configure
make
sudo make install
# 更新动态链接库
sudo ldconfig
1. 安装依赖
首先,确保你的系统上安装了编译 libmodbus 所需的依赖。对于大多数 Linux 发行版,你需要安装 gcc(或类似的 C 编译器)、make 和 automake 等基本工具。
以 Ubuntu/Debian 系统为例,你可以使用以下命令安装这些依赖:
sudo apt-get update
sudo apt-get install build-essential autoconf automake libtool
2. 解压文件
下载 libmodbus-3.1.7.tar.gz 文件,并使用以下命令解压:
tar -zxvf libmodbus-3.1.7.tar.gz
cd libmodbus-3.1.7
3. 生成配置脚本
进入解压后的目录,运行以下命令来生成配置脚本:
./autogen.sh
4. 配置和编译
运行 configure 脚本并编译 libmodbus:
./configure
make
5. 安装
完成编译后,使用以下命令安装 libmodbus:
sudo make install
6. 验证安装
安装完成后,你可以通过检查库文件和头文件的位置来验证安装是否成功。例如:
ls /usr/local/lib/libmodbus* # 检查库文件
ls /usr/local/include/modbus* # 检查头文件
7. 可选:设置环境变量(如果需要)
如果你希望在命令行中直接使用 libmodbus 的头文件和库,可能需要设置环境变量。例如,你可以在你的 shell 配置文件中(如 .bashrc 或 .bash_profile)添加以下行:
export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
export C_INCLUDE_PATH=/usr/local/include:$C_INCLUDE_PATH
export CPLUS_INCLUDE_PATH=/usr/local/include:$CPLUS_INCLUDE_PATH
然后,运行 source ~/.bashrc 来应用更改。
按照这些步骤,你应该能够成功安装 libmodbus-3.1.7。如果在安装过程中遇到任何问题,请检查错误信息并根据需要进行调整。
g++ hello.cpp -o hello -I /usr/local/include -L /usr/local/lib -lmodbus
测试成功
3. 编写 Modbus TCP 程序
(1) 示例代码(客户端)
cpp
复制
下载
#include <modbus/modbus.h>
#include <stdio.h>
#include <errno.h>
int main() {
modbus_t *ctx;
uint16_t tab_reg[10] = {0};
ctx = modbus_new_tcp("127.0.0.1", 502); // 目标服务器 IP 和端口
if (ctx == NULL) {
fprintf(stderr, "Failed to create Modbus context: %s\n", modbus_strerror(errno));
return -1;
}
if (modbus_connect(ctx) == -1) {
fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
modbus_free(ctx);
return -1;
}
// 读取寄存器(地址 0,数量 5)
int rc = modbus_read_registers(ctx, 0, 5, tab_reg);
if (rc == -1) {
fprintf(stderr, "Read failed: %s\n", modbus_strerror(errno));
} else {
printf("Read data:\n");
for (int i = 0; i < 5; i++) {
printf("Register %d: %d\n", i, tab_reg[i]);
}
}
modbus_close(ctx);
modbus_free(ctx);
return 0;
}
(2) 编译
由于 libmodbus 安装在 /usr/local/lib,需手动链接库路径:
bash
复制
下载
g++ modbus_client.cpp -o modbus_client -I /usr/local/include -L /usr/local/lib -lmodbus
(3) 运行
bash
复制
下载
export LD_LIBRARY_PATH=/usr/local/lib # 临时添加动态库路径
./modbus_client
永久生效:
bash
复制
下载
echo "/usr/local/lib" | sudo tee /etc/ld.so.conf.d/libmodbus.conf
sudo ldconfig
4. 调试配置
在 VS Code 中创建 launch.json:
json
复制
下载
{
"version": "0.2.0",
"configurations": [
{
"name": "Debug Modbus Client",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/modbus_client",
"args": [],
"environment": [{"name": "LD_LIBRARY_PATH", "value": "/usr/local/lib"}],
"cwd": "${workspaceFolder}",
"MIMode": "gdb"
}
]
}
读寄存器的值
#include <modbus/modbus.h>
#include <stdio.h>
#include <errno.h>int main() {modbus_t *ctx;uint16_t tab_reg[10] = {0};ctx = modbus_new_tcp("192.168.1.193", 502); // 目标服务器 IP 和端口if (ctx == NULL) {fprintf(stderr, "Failed to create Modbus context: %s\n", modbus_strerror(errno));return -1;}if (modbus_connect(ctx) == -1) {fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;}// 读取寄存器(地址 0,数量 5)int rc = modbus_read_registers(ctx, 0, 5, tab_reg);if (rc == -1) {fprintf(stderr, "Read failed: %s\n", modbus_strerror(errno));} else {printf("Read data:\n");for (int i = 0; i < 5; i++) {printf("Register %d: %d\n", i, tab_reg[i]);}}modbus_close(ctx);modbus_free(ctx);return 0;
}
写寄存器的值
#include <modbus/modbus.h>
#include <stdio.h>
#include <errno.h>int main() {modbus_t *ctx;int rc;uint16_t write_value = 88; // 要写入的值int write_addr = 100; // 寄存器地址// 1. 创建 Modbus TCP 上下文ctx = modbus_new_tcp("192.168.1.193", 502); // 目标服务器IP和端口if (ctx == NULL) {fprintf(stderr, "Failed to create Modbus context: %s\n", modbus_strerror(errno));return -1;}// 2. 设置超时(可选)modbus_set_response_timeout(ctx, 1, 0); // 1秒超时// 3. 连接服务器if (modbus_connect(ctx) == -1) {fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));modbus_free(ctx);return -1;}// 4. 写入单个寄存器(功能码 0x06)rc = modbus_write_register(ctx, write_addr, write_value);if (rc == -1) {fprintf(stderr, "Write failed: %s\n", modbus_strerror(errno));} else {printf("Successfully wrote value %d to register %d\n", write_value, write_addr);}// 5. 关闭连接modbus_close(ctx);modbus_free(ctx);return 0;
}