当前位置: 首页 > java >正文

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

http://www.xdnf.cn/news/15666.html

相关文章:

  • 【LeetCode 热题 100】199. 二叉树的右视图——(解法一)BFS
  • 自己动手实现 strlen:从循环到递归的四种写法
  • Postman/Apipost中使用Post URL编码发送含换行符参数的问题分析
  • 现代R语言机器学习:Tidymodel/Tidyverse语法+回归/树模型/集成学习/SVM/深度学习/降维/聚类分类与科研绘图可视化
  • 串口(Serial Port)是什么?
  • 在 React 中根据数值动态设置 SVG 线条粗细
  • 【52】MFC入门到精通——MFC串口助手(二)---通信版(发送数据 、发送文件、数据转换、清空发送区、打开/关闭文件),附源码
  • 9. isaacsim4.2教程-ROS加相机/CLOCK
  • vs openssl编译提示无法打开文件“libssl.lib”或“libcrypto.lib”
  • 回归预测 | MATLAB实现SA-BP模拟退火算法优化BP神经网络多输入单输出回归预测
  • 搜广推校招面经九十五
  • stm32驱动双步进电机
  • Linux入门篇学习——借助 U 盘或 TF 卡拷贝程序到开发板上
  • UniApp -- 小程序自定义导航栏组件
  • 论文征集 | 国产工业软件硕博学位论文激励计划启动
  • 主流编程语言全景图:从Python到Rust的深度解析
  • 网络基础12--可靠性概述及要求
  • sky-take-out项目Mybatis的使用
  • 高性能数据库-Redis详解
  • 网关-微服务网关入门
  • STM32-第七节-TIM定时器-3(输入捕获)
  • 深度解析Linux文件I/O三级缓冲体系:用户缓冲区→标准I/O→内核页缓存
  • 如何在服务器上获取Linux目录大小
  • Mysql数据库——增删改查CRUD
  • *SFT深度实践指南:从数据构建到模型部署的全流程解析
  • 1-大语言模型—理论基础:详解Transformer架构的实现(1)
  • LeetCode|Day18|20. 有效的括号|Python刷题笔记
  • 【数据可视化-67】基于pyecharts的航空安全深度剖析:坠毁航班数据集可视化分析
  • 小记_想写啥写啥_实现行间的Latex公式_VScode始终折叠大纲
  • 【Linux】基本指令(入门篇)(上)