开启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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dodo_code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值