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

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

相关文章:

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

虽然在以前的文章中多次描述过,那么本文使用开源库libModbus,可得到更好的性能&#xff0c;也可移植到各种平台。 性能&#xff1a;读1次和写1次约各用时2ms。 分别创建了读和写各1个连接指针&#xff0c;用于读100个寄存器和写100个寄存器&#xff0c;读写分离。 客户端&am…...

飞桨(PaddlePaddle)Tensor使用教程

文章目录 飞桨&#xff08;PaddlePaddle&#xff09;Tensor使用教程1. 安装飞桨2. 创建Tensor3. Tensor的基本属性4. Tensor的操作5. Tensor的广播机制6. Tensor与Numpy数组的转换7. 结论 飞桨&#xff08;PaddlePaddle&#xff09;Tensor使用教程 1. 安装飞桨 首先&#xff…...

数据结构c版(3)——排序算法

本章我们来学习一下数据结构的排序算法&#xff01; 目录 1.排序的概念及其运用 1.1排序的概念 1.2 常见的排序算法 2.常见排序算法的实现 2.1 插入排序 2.1.1基本思想&#xff1a; 2.1.2直接插入排序&#xff1a; 2.1.3 希尔排序( 缩小增量排序 ) 2.2 选择排序 2.2…...

《Spring Security 简易速速上手小册》第5章 高级认证技术(2024 最新版)

文章目录 5.1 OAuth2 和 OpenID Connect5.1.1 基础知识详解OAuth2OpenID Connect结合 OAuth2 和 OIDC 5.1.2 重点案例&#xff1a;使用 OAuth2 和 OpenID Connect 实现社交登录案例 Demo 5.1.3 拓展案例 1&#xff1a;访问受保护资源案例 Demo测试访问受保护资源 5.1.4 拓展案例…...

【七】【SQL】自连接

自连接初见 数据库中的自连接是一种特殊类型的SQL查询&#xff0c;它允许表与自身进行连接&#xff0c;以便查询表中与其他行相关联的行。自连接通常用于处理那些存储在同一个表中的但彼此之间具有层级或关系的数据。为了实现自连接&#xff0c;通常需要给表使用别名&#xff…...

C语言while 与 do...while 的区别?

一、问题 while 语句和 do...while 语句类似&#xff0c;都是要判断循环条件是否为真。如果为真&#xff0c;则执⾏循环体&#xff0c;否则退出循环。它们之间有什么区别呢&#xff1f; 二、解答 while 语句和 do..while 语句的区别在于&#xff1a;do..while 语句是先执⾏⼀次…...

RK3568平台开发系列讲解(基础篇)内核错误码

🚀返回专栏总目录 文章目录 一、指针的分类二、错误码三、错误码使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、指针的分类 二、错误码 在 Linux 内核中,所谓的错误指针已经指向了内核空间的最后一页,例如,对于一个 64 位系统来说,内核空间最后地址为 0…...

点云从入门到精通技术详解100篇-基于点云网络和 PSO 优化算法的手势估计(续)

目录 3 深度图像处理及转化 3.1 双目深度摄像原理及深度图的获取 3.1.1 理想化双目深度相机成像...

设计模式(十一)策略模式

请直接看原文:设计模式&#xff08;十一&#xff09;策略模式_某移动支付系统在实现账户资金转入和转出时需要进行身份验证,该系统为用户提供了-CSDN博客 ----------------------------------------------------------------------------------------------------------------…...

Java 计算某年份二月的天数

一、实验任务 要求编写一个程序&#xff0c;从键盘输入年份&#xff0c;根据输入的年份计算这一年的2月有多少天。 二、实验内容 三、实验结果 四、实现逻辑和步骤 &#xff08;1&#xff09;使用scanner类实现程序使用键盘录入一个年份。 &#xff08;2&#xff09;使用if语…...

unity 数学 如何计算线和平面的交点

已知一个平面上的一点P0和法向量n&#xff0c;一条直线上的点L0和方向L,求该直线与该平面的交点P 如下图 首先我们要知道向量归一化点乘之后得到就是两个向量的夹角的余弦值&#xff0c;如果两个向量相互垂直则值是0&#xff0c;小于0则两个向量的夹角大于90度&#xff0c;大于…...

Mysql DATETIME与TIMESTAMP的区别

TIMESTAMP的取值范围小&#xff0c;并且TIMESTAMP类型的日期时间在存储时会将当前时区的日期时间值转换为时间标准时间值&#xff0c;检索时再转换回当前时区的日期时间值。 而DATETIME则只能反映出插入时当地的时区&#xff0c;其他时区的人查看数据必然会有误差的。 DATETI…...

hadoop基础

启动Hadoop cd /usr/local/hadoop ./sbin/start-dfs.sh #启动hadoop打开 ./bin/hdfs dfs ./bin/hdfs dfs -ls 针对 DataNode 没法启动的解决方法 cd /usr/local/hadoop ./sbin/stop-dfs.sh # 关闭 rm -r ./tmp # 删除 tmp 文件&#xff0c;注意这会删除 HDFS 中原有的…...

2024目前三种有效加速国内Github

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01;截至2024年&#xff0c;国内访问 GitHub 的速度受到多种因素的影响&#xff0c;包括网络封锁、地理距离、网络带宽等。为了提高国内用户访问 GitHub 的速度&#xff0c;以下是目前较为有效的三种加速方式&…...

2024高频前端面试题 HTML 和 CSS 篇

JS和ES6 篇&#xff1a; ​​​​​​​2024高频前端面试题 JavaScript 和 ES6 篇-CSDN博客 一 . HTML 篇 1. H5有什么新特性 1) 语义化标签 用正确的标签做正确的事情。 html 语义化让页面的内容结构化&#xff0c;结构更清晰&#xff0c;便于对浏览器、搜索引擎解析&…...

LeetCode 100231.超过阈值的最少操作数 I

给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。 一次操作中&#xff0c;你可以删除 nums 中的最小元素。 你需要使数组中的所有元素都大于或等于 k &#xff0c;请你返回需要的 最少 操作次数。 示例 1&#xff1a; 输入&#xff1a;nums [2,11,10,1,3], k 10 输…...

Pygame教程01:初识pygame游戏模块

Pygame是一个用于创建基本的2D游戏和图形应用程序。它提供了一套丰富的工具&#xff0c;让开发者能够轻松地创建游戏和其他图形应用程序。Pygame 支持许多功能&#xff0c;包括图像和声音处理、事件处理、碰撞检测、字体渲染等。 Pygame 是在 SDL&#xff08;Simple DirectMed…...

HTML和CSS (前端共三篇)【详解】

目录 一、前端开发介绍 二、HTML入门 三、HTML基础标签 四、CSS样式修饰 五、HTML表格标签 六、HTML表单标签 一、前端开发介绍 web应用有BS和CS架构两种&#xff0c;其中我们主要涉及的是BS架构。而BS架构里&#xff0c;B&#xff08;Browser浏览器&#xff09;是客户端的…...

Linux——进程控制(二)进程等待

目录 前言 一、进程等待 二、如何进行进程等待 1.wait 2.waitpid 2.1第二个参数 2.2第三个参数 3. 等待多个进程 三、为什么不用全局变量获取子进程的退出信息 前言 前面我们花了大量的时间去学习进程的退出&#xff0c;退出并不难&#xff0c;但更深入的学习能为本…...

多线程导入excel

设置线程池参数&#xff0c;创建线程池 corePoolSize要保留在池中的线程数&#xff0c;即使它们是空闲的&#xff0c;除非{code - allowCoreThreadTimeOut}被设置maximumPoolSize允许在池中的最大线程数keepAliveTime当线程数大于核心时&#xff0c;这是多余的空闲线程将在终止…...

SetFit模型性能基准测试:与主流小样本方法的全面对比

SetFit模型性能基准测试&#xff1a;与主流小样本方法的全面对比 【免费下载链接】setfit Efficient few-shot learning with Sentence Transformers 项目地址: https://gitcode.com/gh_mirrors/se/setfit SetFit作为一种高效的小样本学习方法&#xff0c;基于Sentence …...

GTE-Pro语义引擎效果展示:跨年度文档语义关联(2023制度→2024执行细则)

GTE-Pro语义引擎效果展示&#xff1a;跨年度文档语义关联&#xff08;2023制度→2024执行细则&#xff09; 今天想和大家分享一个特别有意思的案例&#xff0c;也是我们团队最近用GTE-Pro语义引擎解决的一个实际问题。 想象一下这个场景&#xff1a;你是一家公司的员工&#…...

5大惊喜功能!BiliBili-UWP第三方客户端带你解锁Windows端B站极致体验

5大惊喜功能&#xff01;BiliBili-UWP第三方客户端带你解锁Windows端B站极致体验 【免费下载链接】BiliBili-UWP BiliBili的UWP客户端&#xff0c;当然&#xff0c;是第三方的了 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP 还在为网页版B站的卡顿、广告…...

平台整治学历营销,创作者该如何破局?

平台整治学历营销&#xff0c;创作者需转向内容核心。主流社交平台已启动专项规范&#xff0c;对过度绑定名校标签、靠学历博眼球的内容进行规范引导&#xff0c;不再允许单纯以“名校”为噱头引流&#xff0c;引导创作者回归内容本身&#xff0c;摒弃“靠学历吸睛”的流量捷径…...

Linux 的 mkfifo 命令

mkfifo 是 Linux 系统中用于创建命名管道(FIFO)的命令行工具。命名管道是一种特殊的文件类型&#xff0c;允许不相关的进程通过文件系统进行通信。 基本语法 mkfifo [选项] 文件名常用选项 -m, --modeMODE&#xff1a;设置管道文件的权限模式&#xff08;类似 chmod&#xf…...

行标识符机制的技术演进与实践(上)——从OID说起

文章目录从对象标识说起——OID的前世今生OID到底是全局的还是局部的?OID的历史演进——从默认到逐步弃用regclass——OID的语法糖OID在系统表中的应用细节sys_class——数据库对象的"户口本"sys_type和sys_proc——类型和函数的OID管理OID与ctid的关系和区别OID与其…...

从零到一:8086汇编驱动DAC0832实现六波形发生器(微机课设实战)

1. 项目背景与硬件准备 第一次接触微机原理课设时&#xff0c;我和大多数同学一样对着DAC0832芯片发懵——这个巴掌大的黑色元件怎么能把数字信号变成模拟波形&#xff1f;后来在实验室熬了三个通宵才明白&#xff0c;原来8086汇编配合这片DAC芯片&#xff0c;竟能做出媲美专业…...

高效抖音批量下载解决方案:从单视频到主页批量的完整指南

高效抖音批量下载解决方案&#xff1a;从单视频到主页批量的完整指南 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback su…...

别死记硬背DP了!用‘斐波那契数列’和‘兔子繁殖’故事,真正理解重叠子问题与最优子结构

从兔子繁殖到算法竞赛&#xff1a;用生活故事拆解动态规划的核心思想 第一次接触动态规划&#xff08;DP&#xff09;时&#xff0c;很多人的反应都是"这太抽象了"。教科书上充斥着"最优子结构"、"重叠子问题"等专业术语&#xff0c;让人望而生畏…...

OpenClaw技能扩展实战:用Qwen3.5-9B构建图片分析工作流

OpenClaw技能扩展实战&#xff1a;用Qwen3.5-9B构建图片分析工作流 1. 为什么需要图片分析工作流 作为一个经常需要处理大量图片的内容创作者&#xff0c;我长期被三个问题困扰&#xff1a;相册混乱难以查找、社交媒体配文耗时、截图信息整理低效。直到发现OpenClaw支持通过S…...