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,物料包下载地址如下 #注意安装的插件需和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下一款非常强大的调试软件,其实就是GNU Debugger的缩写。接下来我们学习一下他的基本使用。 例子函数,其中只有一个ds18b20的采集温度函数和一个主函数: #include <stdio.h> #include <errno.h> #includ…...
C++ //练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。
C Primer(第5版) 练习 16.14 练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 template <int H, int W> class Screen{…...
【Java】深度解析监视器的组成原理
目录 一、什么是监视器(Monitor)二、监视器的组成部分三、线程的状态转换四、总结 一、什么是监视器(Monitor) 在Java中,监视器(Monitor)是用来实现线程同步的一种机制。每个Java对象都有一个与…...

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

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

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

《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6
2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点,之后出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.方法递归调用 基本介绍 递归能解决什么问题? 八皇后问题 递归举例 递归重要规则 练习 2.递归调用应用实例-迷宫问题 3.递归调用实例-汉诺塔 4.递归调用实例-八皇后问题 1.方法递归调用 基本介绍 简单来说,递归就是自己调用自己。 …...

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

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

【嵌入式之RTOS】什么是消息队列
目录 一、FreeRTOS消息队列的基本概念 二、FreeRTOS消息队列的工作原理 三、FreeRTOS消息队列的特点 四、FreeRTOS消息队列的应用 五、示例 消息队列是一种用于任务间通信的机制,它允许一个任务(生产者)向消息队列发送消息,而…...

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,这两个module分别是两个springboot项目,都从nacos中获取连接mysql的连接参数。我们开工。 …...

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

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)
1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…...

【Python系列】深入理解 Python 中的 `nonlocal` 关键字
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架
假设一个flask目录结构如下: my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…...
破解PyCharm插件更新难题:让IDE焕发新生
破解PyCharm插件更新难题:让IDE焕发新生 PyCharm作为业界领先的集成开发环境(IDE),其丰富的插件生态是其强大功能的重要来源。然而,插件无法更新的问题可能会困扰许多用户,影响开发体验。本文将详细介绍如…...

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

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...

uniapp 小程序 学习(一)
利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 :开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置,将微信开发者工具放入到Hbuilder中, 打开后出现 如下 bug 解…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
算法刷题-回溯
今天给大家分享的还是一道关于dfs回溯的问题,对于这类问题大家还是要多刷和总结,总体难度还是偏大。 对于回溯问题有几个关键点: 1.首先对于这类回溯可以节点可以随机选择的问题,要做mian函数中循环调用dfs(i&#x…...

运行vue项目报错 errors and 0 warnings potentially fixable with the `--fix` option.
报错 找到package.json文件 找到这个修改成 "lint": "eslint --fix --ext .js,.vue src" 为elsint有配置结尾换行符,最后运行:npm run lint --fix...