开启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.pswp.cn/news/915281.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

昇思+香橙派 AI 开发实践:DeepSeek 全流程指南(基于 openEuler)

一、 环境准备 1. 镜像烧录 镜像烧录可以在任何操作系统内执⾏&#xff0c;这⾥以在Windows系统为例&#xff0c;使用balenaEtcher⼯具&#xff0c;快速烧录镜像到Micro SD卡中。 本章节所需的软/硬件如下&#xff1a; 软件相关&#xff1a;balenaEtcher制卡⼯具、openEul…

AI生成邮件发送脚本(带附件/HTML排版)与定时爬取网站→邮件通知(价格监控原型)

想象一下&#xff1a;每天早晨咖啡还没喝完&#xff0c;你的邮箱就自动收到了心仪商品的最新价格&#xff1b;重要报告准时带着专业排版的附件发送到客户手中——这一切不需要你手动操作。本文将用不到100行代码带你实现这两个自动化神器&#xff01; 一、为什么我们需要自动化…

【vLLM 学习】Encoder Decoder Multimodal

vLLM 是一款专为大语言模型推理加速而设计的框架&#xff0c;实现了 KV 缓存内存几乎零浪费&#xff0c;解决了内存管理瓶颈问题。 更多 vLLM 中文文档及教程可访问 →https://vllm.hyper.ai/ *在线运行 vLLM 入门教程&#xff1a;零基础分步指南 源码 examples/offline_inf…

【MySQL笔记】视图

目录一、什么是视图&#xff1f;二、使用视图的优势三、视图的创建与使用四、不能更新视图的场景五、删除视图六、总结一、什么是视图&#xff1f; 视图&#xff08;View&#xff09;是一种虚拟表&#xff0c;不存储实际数据&#xff0c;而是通过执行预定义的查询动态生成数据…

【RK3576】【Android14】分区划分

获取更多相关的【RK3576】【Android14】驱动开发&#xff0c;可收藏系列博文&#xff0c;持续更新中&#xff1a; 【RK3576】Android 14 驱动开发实战指南

Datawhale 25年7月组队学习coze-ai-assistant Task1学习笔记:动手实践第一个AI Agent—英伦生活口语陪练精灵

Chap1 了解AI工作流 1.1什么是工作流 工作流 就像是一条流水线&#xff0c;把复杂的任务拆分成多个简单的步骤&#xff0c;每一步都有明确的目标和流程。1.2智能体和工作流的区别 智能体&#xff08;AI Agent&#xff09; **是什么 &#xff1a;**智能体是一个自动化的“助手”…

Webpack插件开发深度指南:从原理到实战

Webpack插件是前端工程化的核心引擎&#xff0c;本文将带你深入插件开发全流程&#xff0c;实现一个功能完整的资源清单插件&#xff0c;并揭示Tapable事件系统的核心原理。 一、Webpack插件机制解析 1.1 插件架构核心&#xff1a;Tapable事件系统 Webpack基于Tapable构建了…

2、Redis持久化详解

Redis持久化详解 文章目录 Redis持久化详解 前言 RDB和AOF的区别 RDB和AOF的优缺点 Redis 持久化配置 1、RDB持久化配置 2、AOF持久化配置(尝试修复会删除aof文件内容) 3、AOF 重写功能 新增知识点: 新增知识点: 前言 Redis是一种高级 key-value 型的NoSQL数据库。它跟mem…

curl 命令详解

curl 命令的 -d/–data 和 --data-urlencode 的区别 curl 命令的 -d/–data 和 --data-urlencode 都用于发送 HTTP POST 请求的数据&#xff0c;但关键区别在于 是否自动对数据进行 URL 编码。以下是详细对比&#xff1a; curl 命令的 -d/--data 和 --data-urlencode 都用于发送…

ubuntu下好用的录屏工具

以下是 vokoscreen 的安装教程&#xff0c;适用于 Linux 系统。vokoscreen 是一款简单易用的屏幕录制工具&#xff0c;支持录制屏幕、摄像头和音频。 安装 vokoscreen vokoscreen 提供了多种安装方式&#xff0c;包括通过包管理器、Deb 包或 AppImage 文件。 方法 1&#xf…

笔试大题20分值(用两个栈实现队列)

目录前言一、原题二、解题思路三、代码实现&#xff08;c/c&#xff09;C语言代码C代码实现结语前言 目前博主在处于秋招求职的关键时期&#xff0c;在暑假这段时间会频繁更新博客&#xff0c;想在暑假期间把一些常考的面试和笔试题过一下&#xff0c;利用这两个月沉淀一下技术…

【知识扫盲】tokenizer.json中的vocab和merges是什么?

在自然语言处理里&#xff0c;tokenizer.json 文件一般是由 Hugging Face 的 Tokenizers 库生成的&#xff0c;它是分词器配置的核心文件。这里面的 vocab 和 merges 是子词分词算法&#xff08;像 BPE 这种&#xff09;的重要构成要素。下面为你详细解释它们的作用和工作原理&…

【安卓笔记】RxJava的Hook机制,整体拦截器

0. 环境&#xff1a; 电脑&#xff1a;Windows10 Android Studio: 2024.3.2 编程语言: Java Gradle version&#xff1a;8.11.1 Compile Sdk Version&#xff1a;35 Java 版本&#xff1a;Java11 1. 使用场景 整个项目都是用了RxJava&#xff0c;需要对 整个/部分 项目…

NX二次开发常用函数——从一个坐标系到另一个坐标系的转换(UF_MTX4_csys_to_csys )相同体坐标转化

再做项目时相信大家都会用到坐标转化,例如,我之前写的案例分享中的博客都用到过,之前总是找借口进行if else判断,虽然可以实现,但是比起坐标变换无论代码复杂程度还是运行速度都比较差,之前参加过曹大师的教学训练营,但是明显感觉到大佬写代码的逻辑性以及模块化能力都比…

数据库防止数组字符串序列化

请求接到数组["aa","bb"]后,后端需要转换成字符串Java 8 使用 String.join()String[] arr {"aa", "bb"}; String str String.join(",", arr); // "aa,bb"如果采用其他转换,在字段存入数据库后会["\"a…

若依框架文件上传返回路径端口错误 - Nginx代理环境下serverConfig.getUrl()获取端口异常

目录一 、问题描述二、问题现象三、问题根本原因3.1 代码分析3.2 问题核心四、解决方案五、总结一 、问题描述 在使用若依框架进行项目开发时&#xff0c;遇到了一个令人困扰的问题&#xff1a;文件上传功能在本地开发环境运行正常&#xff0c;但部署到服务器后&#xff0c;上…

使用PyInstaller打包 Python 工程

引言:大模型是个好工具,尽管好多内容都是拼凑的,但是整理学到的就是自己的。因工作需要隐藏python源代码,方法有PyInstaller 、Cpython等多种方法,PyInstaller更为常用,PyInstaller打包 Python 工程步骤整理如下: 一、确保系统环境准备就绪 安装 Python 和 pip 确认版本…

Python 程序设计讲义(1):PyCharm 安装教程

Python 程序设计讲义&#xff08;1&#xff09;&#xff1a;PyCharm 安装教程 一、安装 Python 解释器 1、下载 Python 安装文件 点击如下链接进入 Python 官网&#xff1a; https://www.python.org/ 在弹出的页面中单击【Downloads】&#xff0c;然后单击下面的【Download Pyt…

uniapp云打包安卓

1、基础云打包 2、修改logo3、怎么实现下拉菜单4、修改启动页启动页默认这样 5、URL Scheme页面跳转

Python----NLP自然语言处理(英文分词器--NLTK)

一、NLTK_介绍NLTK&#xff08;Natural Language Toolkit&#xff0c;自然语言处理工具包&#xff09;&#xff0c;一个主要用于清洗和处理英文文本的Python工具包。它有很多的功能&#xff0c;我们主要使用的是它的分词功能&#xff0c;之前讲过中文分词是比较复杂的&#xff…