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

Qt Modbus 寄存器读写实例

一.线圈状态寄存器读写

  • 项目效果如下
    在这里插入图片描述

1. 写单个寄存器

  • MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status);
int addr=ui->spinBoxwirte_addr->value();int data=ui->spinBoxwirte_data->value();int ret = modbus_write_bit(mb,addr,data);if(ret!=1){QMessageBox::information(this,"失败","写状态寄存器失败,地址:"+QString::number(data));}else{label_status->setText("写线圈状态寄存器成功!");}

2. 读单个寄存器

  • int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
int addr=ui->spinBoxRead_addr->value();int data=ui->spinBoxRead_data->value();//int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);uint8_t dest[4];int ret = modbus_read_bits(mb,addr,1,dest);if(ret!=1){QMessageBox::information(this,"失败","读状态寄存器失败,地址:"+QString::number(data));}else{label_status->setText("读线圈状态寄存器成功!");qDebug()<<"读出的数据为:"<<dest[0];ui->spinBoxRead_data->setValue(dest[0]);}

3. 写多个寄存器

  • int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);
int addr=ui->spinBoxWriteMore_addr->value();//使用正则表达式,来处理字符串的分割QString  str = ui->textEdit_xianWrite->toPlainText();//用正则表达式进行分割QRegExp separator= QRegExp("\t|\n|\r\n|,| |;");//进行分割QStringList list =  str.split(separator,QString::SkipEmptyParts);uint8_t*value=new uint8_t[list.count()];for(int i=0;i<list.count();i++){value[i]=list[i].toInt();}//int modbus_write_bits(modbus_t *ctx, int addr, int nb, const uint8_t *data);int ret = modbus_write_bits(mb,addr,list.count(),value);if(ret!=list.count()){QMessageBox::information(this,"写多个失败","读状态寄存器失败,地址:"+QString::number(addr));label_status->setText("写多个线圈状态寄存器失败!");}else{label_status->setText("写多个线圈状态寄存器成功!");}delete [] value;

4. 读多个寄存器

- int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);

ui->textEditRead_xian->clear();int addr=ui->spinBoxReadMorexian_addr->value();int count=ui->spinBoxReadMorexian_num->value();uint8_t *values = new uint8_t[count];//int modbus_read_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);int ret=modbus_read_bits(mb,addr,count,values);if(ret!=count){QMessageBox::information(this,"读多个失败","读状态寄存器失败,地址:"+QString::number(addr));label_status->setText("读多个线圈状态寄存器失败!");}else{label_status->setText("读多个线圈状态寄存器成功!");QString str;for(int i=0;i<count;i++){str+=QString::number(values[i])+"\t";}ui->textEditRead_xian->setText(str);}delete [] values;

二.离散输入状态寄存器读写

  • 效果展示如下
    在这里插入图片描述

1. 读单个寄存器

  • int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
 int addr=ui->spinBoxInput_one_addr->value();int data;//int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);uint8_t dest[4];int ret = modbus_read_input_bits(mb,addr,1,dest);if(ret!=1){QMessageBox::information(this,"失败","读单个离散输入寄存器失败,地址:"+QString::number(addr));}else{label_status->setText("读单个离散输入寄存器成功!");qDebug()<<"读出的数据为:"<<dest[0];ui->spinBoxInput_one_data->setValue(dest[0]);}

2. 读多个寄存器

  • int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);
ui->textEdit_input->clear();int addr=ui->spinBoxInput_more_addr->value();int count=ui->spinBoxInput_more_num->value();//int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);uint8_t *dest=new uint8_t[count];int ret = modbus_read_input_bits(mb,addr,count,dest);if(ret!=count){QMessageBox::information(this,"失败","读多个离散输入寄存器失败,地址:"+QString::number(addr));}else{label_status->setText("读多个离散输入寄存器成功!");QString str;for(int i=0;i<count;i++){str+= QString::number(dest[i])+"\t";}ui->textEdit_input->setText(str);}

三.保持寄存器读写

  • 效果如下:
    在这里插入图片描述

1. 写单个寄存器

  • int modbus_write_register(modbus_t *ctx, int reg_addr, const uint16_t value);
 //int modbus_write_register(modbus_t *ctx, int reg_addr, const uint16_t value);int addr=ui->spinBoxHoldRegWrite_addr->value();int value=ui->spinBoxHoldRegW_data->value();int ret =modbus_write_register(mb,addr,value);if(ret!=1){QMessageBox::information(this,"失败","保持寄存器写单个失败");}else{QMessageBox::information(this,"成功","保持寄存器写单个成功!!!");}

2. 读单个寄存器

- int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

int addr=ui->spinBox_HoldR_addr->value();uint16_t dest[4];//int modbus_read_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);int ret = modbus_read_registers(mb,addr,1,dest);if(ret!=1){QMessageBox::information(this,"失败","保持寄存器读单个失败");}else{QMessageBox::information(this,"成功","保持寄存器读单个成功!!!");ui->spinBox_HoldR_data->setValue(dest[0]);}

四.输入寄存器读写

  • 项目效果
    在这里插入图片描述

1. 读单个寄存器

- int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);

 int addr=ui->spinBoxInput_one_addr->value();int data;//int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);uint8_t dest[4];int ret = modbus_read_input_registers(mb,addr,1,dest);if(ret!=1){QMessageBox::information(this,"失败","读单个离散输入寄存器失败,地址:"+QString::number(addr));}else{label_status->setText("读单个离散输入寄存器成功!");qDebug()<<"读出的数据为:"<<dest[0];ui->spinBoxInput_one_data->setValue(dest[0]);}

2. 读多个寄存器

  • int modbus_read_input_registers(modbus_t *ctx, int addr, int nb, uint16_t *dest);
ui->textEdit_input->clear();int addr=ui->spinBoxInput_more_addr->value();int count=ui->spinBoxInput_more_num->value();//int modbus_read_input_bits(modbus_t *ctx, int addr, int nb, uint8_t *dest);uint8_t *dest=new uint8_t[count];int ret = modbus_read_input_registers(mb,addr,count,dest);if(ret!=count){QMessageBox::information(this,"失败","读多个离散输入寄存器失败,地址:"+QString::number(addr));}else{label_status->setText("读多个离散输入寄存器成功!");QString str;for(int i=0;i<count;i++){str+= QString::number(dest[i])+"\t";}ui->textEdit_input->setText(str);}

相关文章:

Qt Modbus 寄存器读写实例

一.线圈状态寄存器读写 项目效果如下 1. 写单个寄存器 MODBUS_API int modbus_write_bit(modbus_t *ctx, int coil_addr, int status); int addrui->spinBoxwirte_addr->value();int dataui->spinBoxwirte_data->value();int ret modbus_write_bit(mb,addr,d…...

centos安装es、kibana、ik

这里es使用的是7.10.2版本的es&#xff0c;物料包下载地址如下 #注意安装的插件需和es版本保持一致 #es https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.10.2-linux-x86_64.tar.gz #kibana https://artifacts.elastic.co/downloads/kibana/kibana-7.10…...

调试工具之GDB的基本使用

GDB基本使用 GDB是Linux下一款非常强大的调试软件&#xff0c;其实就是GNU Debugger的缩写。接下来我们学习一下他的基本使用。 例子函数&#xff0c;其中只有一个ds18b20的采集温度函数和一个主函数&#xff1a; #include <stdio.h> #include <errno.h> #includ…...

C++ //练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。

C Primer&#xff08;第5版&#xff09; 练习 16.14 练习 16.14 编写Screen类模板&#xff0c;用非类型参数定义Screen的高和宽。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 template <int H, int W> class Screen{…...

【Java】深度解析监视器的组成原理

目录 一、什么是监视器&#xff08;Monitor&#xff09;二、监视器的组成部分三、线程的状态转换四、总结 一、什么是监视器&#xff08;Monitor&#xff09; 在Java中&#xff0c;监视器&#xff08;Monitor&#xff09;是用来实现线程同步的一种机制。每个Java对象都有一个与…...

Day14-Servlet后端验证码的实现

图片验证码的生成采用的是Kaptcha&#xff1b; Kaptcha是一个高度可配置的验证码生成工具&#xff0c;由Google开源。它通过一系列配置文件和插件&#xff0c;实现了将验证码字符串自动转换成图片流&#xff0c;并可以与session进行关联&#xff0c;从而在验证过程中使用&#…...

MySQL:数据库权限与角色

权限 MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。 自主存取控制 DAC&#xff08;DiscretionaryAccess Control)&#xff1a;用户对于不同的数据库对象有不同的存取权限&#xff0c;不同的…...

等保测评练习卷25

等级保护初级测评师试题25 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.安全区域边界对象主要根据系统中网络访问控制设备的部署情况来确定&#xff08;&#xff09;不是网络访问控制设备而…...

《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6

2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点&#xff0c;之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…...

Java方法递归

目录 1.方法递归调用 基本介绍 递归能解决什么问题&#xff1f; 八皇后问题 递归举例 递归重要规则 练习 2.递归调用应用实例-迷宫问题 3.递归调用实例-汉诺塔 4.递归调用实例-八皇后问题 1.方法递归调用 基本介绍 简单来说&#xff0c;递归就是自己调用自己。 …...

目标跟踪那些事

目标跟踪那些事 跟踪与检测的区别 目标跟踪和目标检测是计算机视觉中的两个重要概念&#xff0c;但它们的目的和方法是不同的。 目标检测(object Detection)&#xff1a;是指在图像或视频帧中识别并定位一个或多个感兴趣的目标对象的过程 。 目标跟踪(object Tracking)&…...

【Git】 如何将一个分支的某个提交合并到另一个分支

【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时&#xff0c;常常会遇到这样的需求&#xff1a;将某个分支的特定提交合并到另一个分支中。这种情况下&#xff0c;我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…...

【嵌入式之RTOS】什么是消息队列

目录 一、FreeRTOS消息队列的基本概念 二、FreeRTOS消息队列的工作原理 三、FreeRTOS消息队列的特点 四、FreeRTOS消息队列的应用 五、示例 消息队列是一种用于任务间通信的机制&#xff0c;它允许一个任务&#xff08;生产者&#xff09;向消息队列发送消息&#xff0c;而…...

9-springCloud集成nacos config

本文介绍spring cloud集成nacos config的过程。 0、环境 jdk 1.8maven 3.8.1Idea 2021.1nacos 2.0.3 1、项目结构 根项目nacos-config-sample下有两个module&#xff0c;这两个module分别是两个springboot项目&#xff0c;都从nacos中获取连接mysql的连接参数。我们开工。 …...

市场主流 AI 视频生成技术的迭代路径

AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构&#xff08;TransformerDiffusion&#xff09;等多个阶段&#xff0c;每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…...

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)

1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数&#xff0c;但是要求这些同名函数的形参不同&#xff0c;可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为&#xff0c;使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…...

【Python系列】深入理解 Python 中的 `nonlocal` 关键字

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架

假设一个flask目录结构如下&#xff1a; my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…...

破解PyCharm插件更新难题:让IDE焕发新生

破解PyCharm插件更新难题&#xff1a;让IDE焕发新生 PyCharm作为业界领先的集成开发环境&#xff08;IDE&#xff09;&#xff0c;其丰富的插件生态是其强大功能的重要来源。然而&#xff0c;插件无法更新的问题可能会困扰许多用户&#xff0c;影响开发体验。本文将详细介绍如…...

cmake常用命令学习

1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件&#xff0c;而.cmake文件是一个模块文件&#xff0c;可以被include到CMakeLists.txt中。 include指令一般用于语句的复用&#xff0c;也就是说&#xff0c;如果有…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

JavaSec-RCE

简介 RCE(Remote Code Execution)&#xff0c;可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景&#xff1a;Groovy代码注入 Groovy是一种基于JVM的动态语言&#xff0c;语法简洁&#xff0c;支持闭包、动态类型和Java互操作性&#xff0c…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力

引言&#xff1a; 在人工智能快速发展的浪潮中&#xff0c;快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型&#xff08;LLM&#xff09;。该模型代表着该领域的重大突破&#xff0c;通过独特方式融合思考与非思考…...

Frozen-Flask :将 Flask 应用“冻结”为静态文件

Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是&#xff1a;将一个 Flask Web 应用生成成纯静态 HTML 文件&#xff0c;从而可以部署到静态网站托管服务上&#xff0c;如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)

Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败&#xff0c;具体原因是客户端发送了密码认证请求&#xff0c;但Redis服务器未设置密码 1.为Redis设置密码&#xff08;匹配客户端配置&#xff09; 步骤&#xff1a; 1&#xff09;.修…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

短视频矩阵系统文案创作功能开发实践,定制化开发

在短视频行业迅猛发展的当下&#xff0c;企业和个人创作者为了扩大影响力、提升传播效果&#xff0c;纷纷采用短视频矩阵运营策略&#xff0c;同时管理多个平台、多个账号的内容发布。然而&#xff0c;频繁的文案创作需求让运营者疲于应对&#xff0c;如何高效产出高质量文案成…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...