QT6 libModbus 用于ModbusTcp客户端读写服务端

虽然在以前的文章中多次描述过,那么本文使用开源库libModbus,可得到更好的性能,也可移植到各种平台。

性能:读1次和写1次约各用时2ms

分别创建了读和写各1个连接指针,用于读100个寄存器和写100个寄存器,读写分离

客户端: win10 

                Intel(R) Pentium(R) Gold 8505   1.20 GHz

               Intel(R) Ethernet Controller I226

                QT6.2.4

服务端:信捷XDH PLC

测试读100次共200ms左右,写100次也共200ms左右。

 很容易移植到linux电脑、以及嵌入式系统 。       

1.前置条件:

   (1)需要头文件8个:

(2)还需要扩展名为.c的4个文件:

(3)把以上代码拷贝如你的项目文件中,并添加进去

(4)还有一个注意事项:在pro文件中需要添加这个:LIBS += -lWs2_32

这行是添加Windows socket库文件

2.代码:

   #include "modbus-tcp.h"
   #include <QElapsedTimer>

   //以下可放入你的按钮代码里

    uint16_t tab_reg[100];  // 用于保存读取到的寄存器的数据
     uint16_t write_buffer_16[100];// 用于写寄存器的数据到服务端

     modbus_t *ctx;//用于读
     modbus_t *ctx2;//用于写


    // 创建 Modbus 上下文
     QElapsedTimer time_m;
     time_m.start();
      ctx = modbus_new_tcp("192.168.6.6", 502);  // 服务器的 IP 地址和端口号

     //ctx2 = modbus_new_tcp("127.0.0.1", 502);  // 如果你没有这个PLC,用这行代替上行 
     if (ctx == NULL)

    {
         fprintf(stderr, "Unable to create the libmodbus context\n");
         return  ;
     }
     // 连接到 Modbus 服务器
     if (modbus_connect(ctx) == -1)

    {
         fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
         modbus_free(ctx);
         return  ;
     }

     int rc;
     // 读取保持寄存器的数据(示例:从地址0开始读取100个寄存器)
     for (int i = 0; i < 100; i++)//读100次
     {
         rc = modbus_read_registers(ctx, 0, 100, tab_reg);//读,地址0,100个寄存器
     }

     if (rc == -1) {
         fprintf(stderr, "Read registers failed: %s\n", modbus_strerror(errno));
         modbus_close(ctx);
         modbus_free(ctx);
         return  ;
     }

     qDebug()<<rc;
     modbus_close(ctx);
     modbus_free(ctx);
     qDebug()<<"read use:"<<time_m.elapsed()<<"ms";
  //--------------分割线-----------------------------------------
     time_m.start();
      ctx2 = modbus_new_tcp("192.168.6.6", 502);  // 服务器的 IP 地址和端口号

      //ctx2 = modbus_new_tcp("127.0.0.1", 502);  // 如果你没有这个PLC,用这行代替上行 

    if (ctx2 == NULL) {
        fprintf(stderr, "Unable to create the libmodbus context\n");
        return  ;
    }
    if (modbus_connect(ctx2) == -1) {
        fprintf(stderr, "Connection failed: %s\n", modbus_strerror(errno));
        modbus_free(ctx2);
        return  ;
    }

    for (int i = 0; i < 100; i++)
    {
        write_buffer_16[i]=i;
    }

    int rw=0;

   // 写入保持寄存器的数据(示例:从地址0开始写入100个寄存器)
    for(int i=0;i<100;i++)//写100次
    {
         rw=modbus_write_registers(ctx2,0, 100, write_buffer_16);//地址0,100个寄存器
    }


    if (rw == -1)
     {
        fprintf(stderr, "write registers failed: %s\n", modbus_strerror(errno));
        modbus_close(ctx2);
        modbus_free(ctx2);
        return  ;
    }
    qDebug()<<rw;
    // // 打印读取到的寄存器数据
    // for (int i = 0; i < 100; i++)
    // {
    //     printf("Register %d: %d\n", i, tab_reg[i]);
    // }

    // 关闭连接并释放资源

    modbus_close(ctx2);
    modbus_free(ctx2);
    qDebug()<<"write use:"<<time_m.elapsed()<<"ms";

3.库文件下载链接

https://download.csdn.net/download/weixin_39926429/88900380

4.如果你没有PLC,可用以下软件模拟服务端

https://download.csdn.net/download/weixin_39926429/88900693

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423959.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5、DVWA代码审计(2)

一、csrf 1、csrf(low) 限制 复现 GET /vulnerabilities/csrf/?password_new123456&password_conf123456&ChangeChange HTTP/1.1 Host: ddd.com Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML,…

手撸AI-3: Accelerate库分布式训练详解

一. 引言 Accelerate 是 Hugging Face 公司开发的一个 Python 库&#xff0c;旨在简化并优化在各种环境中进行深度学习训练的过程&#xff0c;包括单机、多 GPU、TPU 和各种分布式训练环境。这个库提供了一种通用的 API&#xff0c;可以方便地将原来只能在单个设备上运行的代码…

chromedriver,Chrome驱动的实时更新

发现自己的selenium项目跑不起来了 效验驱动版本 下载链接(可能需要魔法) https://registry.npmmirror.com/binary.html?pathchromedriver/ https://googlechromelabs.github.io/chrome-for-testing/ 找到驱动位置 1. 默认安装路径&#xff1a;Chrome驱动通常会默认安装在系…

智能驾驶规划控制理论学习02-基于搜索的路径规划方法

目录 一、路径搜索问题 二、图论基础 三、图搜索方法 1、广度优先搜索&#xff08;BFS&#xff09; bfs与dfs的区别 bfs的搜索过程 bfs的算法实现 2、迪杰斯特拉算法&#xff08;Dijkstra&#xff09; 核心思想 优先级队列 Dijkstra搜索过程 Dijkstra优缺点…

微服务day03-Nacos配置管理与Nacos集群搭建

一.Nacos配置管理 Nacos不仅可以作为注册中心&#xff0c;可以进行配置管理 1.1 统一配置管理 统一配置管理可以实现配置的热更新&#xff08;即不用重启当服务发生变更时也可以直接更新&#xff09; dataId格式&#xff1a;服务名-环境名.yaml&#xff0c;分组一般使用默认…

【比较mybatis、lazy、sqltoy、mybatis-flex操作数据】操作批量新增、分页查询(二)

orm框架使用性能比较 环境&#xff1a; idea jdk17 spring boot 3.0.7 mysql 8.0比较mybatis、lazy、sqltoy、mybatis-flex操作数据 测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4-JDK17-SNAPS…

2024最新算法:鹦鹉优化算法(Parrot optimizer,PO)求解23个基准函数(提供MATLAB代码)

一、鹦鹉优化算法 鹦鹉优化算法&#xff08;Parrot optimizer&#xff0c;PO&#xff09;由Junbo Lian等人于2024年提出的一种高效的元启发式算法&#xff0c;该算法从驯养的鹦鹉中观察到的觅食、停留、交流和对陌生人行为的恐惧中汲取灵感。这些行为被封装在四个不同的公式中…

leetcode:37.解数独

题目理解&#xff1a;本题中棋盘的每一个位置都要放一个数字&#xff08;而N皇后是一行只放一个皇后&#xff09;&#xff0c;并检查数字是否合法&#xff0c;解数独的树形结构要比N皇后更宽更深。 代码实现&#xff1a;

2024免费mac苹果电脑的清理和维护软件CleanMyMac X

对于 Mac 用户来说&#xff0c;电脑的清理和维护是一件让人头疼的事情。但是&#xff0c;有了 CleanMyMac X&#xff0c;这一切都将变得轻松愉快。CleanMyMac X 是一款专为 Mac 设计的电脑清理软件&#xff0c;它以其强大的功能和简单的操作&#xff0c;让无数用户为之倾倒。 C…

数据结构开篇

目录 一. 如何学好数据结构二. 基本概念和术语2.1 区分数据、数据元素、数据项、数据对象2.2 数据结构2.2.1 逻辑结构2.2.2 存储结构 2.3 数据类型和抽象数据类型2.4 抽象数据类型的实现 \quad 一. 如何学好数据结构 勤于思考;多做练习;多上机;善于寻求帮助;不怕困难&#xff…

vue+element模仿实现云码自动验证码识别平台官网

一、项目介绍 项目使用传统vue项目结构实现&#xff0c;前端采用element实现。 element官网&#xff1a;Element - The worlds most popular Vue UI framework 云码官网地址&#xff1a;云码-自动验证码识别平台_验证码识别API接口_免费验证码软件 项目截图&#xff0c;支持…

浅析 explicit 关键字

浅析 explicit 关键字 文章目录 浅析 explicit 关键字前言案例剖析补充案例总结 前言 ​ C 提供了多种方式来实现类型转换和构造对象&#xff0c;然而&#xff0c;有时候这些方式会导致一些意想不到的结果&#xff0c;比如隐式转换和复制初始化。为了避免这些潜在的问题&#…

Redis安全加固策略:配置文件权限设置 配置本地日志存储目录 连接超时时间限制

Redis安全加固策略&#xff1a;配置文件权限设置 & 配置本地日志存储目录 & 连接超时时间限制 1.1 配置文件权限设置1.2 配置本地日志存储目录1.3 连接超时时间限制 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1.1 配置文件权限…

【双指针】合并两个有序数组O(N)

合并两个有序数组 链接 . - 力扣&#xff08;LeetCode&#xff09;. - 备战技术面试&#xff1f;力扣提供海量技术面试资源&#xff0c;帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。https://leetcode.cn/problems/merge-sorted-array/ 题目 题解 采用双指针…

Java项目:31 基于SSM的勤工俭学管理系统

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 勤工助学系统有管理员&#xff0c;部门管理员&#xff0c;用户三个角色。 管理员功能有个人中心。管理员管理&#xff0c;部门管理员管理&…

vs code更新后json文件无法识别通配符 ,编译多文件失败的解决办法

问题描述 在Mac或者LInux上&#xff0c;进行C/C相同路径下进行多文件编译时&#xff0c;之前设置好的json文件突然不能解释通配符&#xff0c;并且将带有单引号的地址传给clang&#xff0c;由于*.c被扩在单引号中&#xff0c;clang找不到文件导致失败。 如果将命令端中的指令复…

新一代电话机器人开源PHP源代码

使用easyswoole 框架开发的 新一代电话机器人开源PHP源码 项目地址&#xff1a;https://gitee.com/ddrjcode/robotphp 代理商页面演示地址 http://119.23.229.15:8080 用户名&#xff1a;c0508 密码&#xff1a;123456 包含 AI外呼管理&#xff0c;话术管理&#xff0c;CR…

Android java基础_异常

一.异常的概念 在Java中&#xff0c;异常&#xff08;Exception&#xff09;是指程序执行过程中可能出现的不正常情况或错误。它是一个事件&#xff0c;它会干扰程序的正常执行流程&#xff0c;并可能导致程序出现错误或崩溃。 异常在Java中是以对象的形式表示的&#xff0c;…

力扣hot100题解(python版48-50题)

48、路径总和III 给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从…

香港服务器选择指南(挑选香港服务器的几个标准)

​  随着全球化的加速和互联网的普及&#xff0c;跨境访问和外贸活动越来越频繁。在这个背景下&#xff0c;香港服务器作为一种国际化的基础设施&#xff0c;受到了广泛欢迎。本文将探讨企业在选择香港服务器时应关注的几个标准事项。 1.可靠性和正常运行时间 停机可能会给企…