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);}

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

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

相关文章

学习c#-4语句 ,条件,循环

代码&#xff1a; string name "小赵"; //条件判断 if (name "小赵") { Console.WriteLine("我是小赵"); } else { Console.WriteLine("我不是小赵"); } // switch条件判断 switch (name) { case "小…

5.3 匿名函数:Python编程中的隐士大师

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 工&#x1f497;重&#x1f497;hao&#x1f497;&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题.…

嵌入式初学-C语言-十七

#接嵌入式初学-C语言-十六# 函数的递归调用 含义&#xff1a; 在一个函数中直接或者间接调用了函数本身&#xff0c;称之为函数的递归调用 // 直接调用a()->a(); // 间接调用a()->b()->a();a()->b()->..->a();递归调用的本质&#xff1a; 本是是一种循环…

【QT】Qt 音视频

Qt 音视频 Qt 音视频1. Qt 音频2. Qt 视频 Qt 音视频 在 Qt 中&#xff0c;音频主要是通过 QSound 类来实现。但是需要注意的是 QSound 类只支持播放 wav 格式的音频文件。也就是说如果想要添加音频效果&#xff0c;那么首先需要将非 wav 格式的音频文件转换为 wav 格式。 通…

JavaWeb之servlet关于Ajax实现前后端分离

一、什么是Ajax: AJAX Asynchronous JavaScript and XML&#xff08;异步的 JavaScript 和 XML&#xff09;。 AJAX 不是新的编程语言&#xff0c;而是一种使用现有标准的新方法。 AJAX 最大的优点是在不重新加载整个页面的情况下&#xff0c;可以与服务器交换数据并更新部…

Nuxt2:强制删除window.__NUXT__中的数据

一、问题描述 在以前的一篇文章《Nuxt3: 强制删除__NUXT_DATA__的一种方式》中曾介绍了在Nuxt3中如何删除存在于页面id为__NUXT_DATA__的script节点中的数据。 此次&#xff0c;Nuxt2与Nuxt3不同在于它的数据是存在于window.__NUXT__&#xff0c;那么该如何处理呢&#xff1f;…

2025深圳国际户外庭院营地用品博览会

2025深圳国际户外庭院营地用品博览会 2025 Shenzhen International Outdoor Courtyard Camping Supplies Expo 时间&#xff1a;2025年02月27-3月01日 地点&#xff1a;深圳会展中心&#xff08;福田馆&#xff09; 详询主办方陆先生 I38&#xff08;前三位&#xff09; …

如何用OceanBase与DataWorks,打造一站式的数据集成、开发和数据服务

导语&#xff1a;在OceanBase 2024年开发者大会的技术生态论坛上&#xff0c;阿里云DataWorks团队的高级技术专家罗海伟&#xff0c;详细阐述了一站式大数据开发治理平台DataWorks的能力&#xff0c;并对于如何基于OceanBase和Dataworks构建一站式数据集成、开发以及数据服务进…

Linux驱动开发—Linux内核定时器概念和使用详解,实现基于定时器的字符驱动

文章目录 内核定时器概念在Linux驱动模块中使用定时器软定时器&#xff08;Soft Timers&#xff09;jiffies 含义高精度定时器&#xff08;High Resolution Timers&#xff09; 实现倒计时字符设备驱动 内核定时器概念 在 Linux 内核中&#xff0c;定时器是用来管理和调度延迟…

8.7-主从数据库的配置+mysql的增删改查

一、mysql环境的配置 1.环境准备 &#xff08;1&#xff09;主数据库 #关闭防火墙 [rootmaster ~]# systemctl stop firewalld#关闭selinux [rootmaster ~]# setenforce 0#下载lrzsz工具 [rootmaster ~]# yum -y install lrzsz#安装rsync [rootmaster ~]# yum -y install rs…

低代码平台:效率利器还是质量妥协?

目录 低代码平台&#xff1a;效率利器还是质量妥协&#xff1f; 一、引言 二、低代码平台的定义和背景 1、什么是低代码平台&#xff1f; 2、低代码平台的兴起 三、低代码开发的机遇 1、提高开发效率 2、降低开发成本 3、赋能业务人员 四、低代码开发的挑战 1、质量…

pgbackrest备份方案(差异和增量备份的区别)

pgbackrest备份方案(差异和增量备份的区别) 一 备份 全量备份&#xff1a; 将数据库集群的全部内容复制到备份中。数据库集群的第一个备份始终是全量备份。始终能够直接还原全量备份。全量备份不依赖于完整备份之外的任何文件来保持一致性。 差异备份&#xff1a; 仅复制自…

3D展示的前景如何?

随着人类科技的不断进步&#xff0c;对未来的趋势也肯定是向高纬度发展。3D取代2D只是一个所需时间长短而已&#xff0c;题主既然这么问&#xff0c;说明肯定是意识到了3D是未来的趋势&#xff0c;那么就应该多接触和了解未来的3D平台及应用工具、应用领域等。 之前2G\3G时代&…

1.MongoDB入门指南之开篇

1. 写在前面 MongoDB大家可能听说过&#xff0c;但是要怎么学习&#xff1f;先学习哪个&#xff0c;很多人是不知道的&#xff0c;毕竟面对一个未知的事物&#xff0c;迷茫是很多人都会遇到的&#xff0c;从今天起我们就开始系统的介绍MongoDB的学习。 2. 课程介绍 课程主要分…

【Android Studio】原生应用部署第三方插件(探针)

一、本地引入包流程 &#xff08;一&#xff09;本地引入包内容 &#xff08;二&#xff09;本地引入包操作步骤 将 【probe-android-sdk】目录里面所有的aar包复制到嵌码项目工程&#xff08;App级别&#xff09;的 libs 目录下 二、添加插件 &#xff08;一&#xff09;…

Qt文件读写

Qt中文件读写类简述 包含头文件#include <QFile> 读写模式如下 枚举 文件读写步骤 1 先使用string 类型来接受打开文件的返回值 QFileDialog::getOpenFileName(this,"文件","./"); //打开一个文件 2 构建文件对象 Qfile ff (qstring)接受打…

“前缀和”专题篇一

目录 【模版】前缀和 【模版】二维前缀和 寻找数组的中心下标 除自身以外数组的乘积 【模版】前缀和 题目 思路 这道题如果使用暴力解法&#xff0c;即针对每次查询&#xff0c;先算出前r个数的总和&#xff0c;然后再算出前l-1个数的总和&#xff0c;然后相减就得出本次查…

【MYSQL】MYSQL逻辑架构

mysql逻辑架构分为3层 mysql逻辑架构分为3层 1). 连接层&#xff1a;主要完成一些类似连接处理&#xff0c;授权认证及相关的安全方案。 2). 服务层&#xff1a;在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的&#xff0c;包括权限判断&#xff0c;SQL接口&…

三数之和-Leetcode

leetcode链接&#xff1a;三数之和 题目描述 解题思路 主要要思考以下几个问题&#xff1a; 如何选取三个元素&#xff1f;— 当前节点 左指针 右指针指针开始位置&#xff1f;— 左指针 当前节点位置 i 1&#xff0c; 右指针 n - 1如何保证不重复&#xff1f; — 先把…

利用自然语言处理(NLP)技术挖掘旅游评论数据

目录 简单了解 延伸 如何使用自然语言处理技术提高旅游评论情感倾向的准确性&#xff1f; 旅游评论数据中多模态信息融合的最佳实践是什么&#xff1f; 在旅游评论数据预处理和清洗过程中&#xff0c;哪些方法最有效&#xff1f; 使用Python网络爬虫技术进行旅游评论数据的…