用C++QT实现一个modbus rtu通讯程序框架

QT中的Modbus 类在Qt的Modbus模块中是用来表示Modbus协议中不同类型数据单元的。找不到就向父类找,这里是qmodbusdevice有一个定义链接参数的函数,自行查阅手册看下详细。有串口的名字、校验位、波特率、数据位、停止位;还有网口的端口号与IP地址。如果是用来与PLC通信的话,一般用的最多的是。这里我们做测试选个持续的寄存器。 阅读详情

下面是一个简单的Modbus RTU通讯程序框架的示例,使用C++和QT来实现:

#include <QCoreApplication>
#include <QSerialPort>
#include <QModbusDataUnit>
#include <QModbusRtuSerialMaster>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 创建串口对象
    QSerialPort serial;
    serial.setPortName("COM1"); // 设置串口名称
    serial.setBaudRate(QSerialPort::Baud9600); // 设置波特率
    serial.setDataBits(QSerialPort::Data8); // 设置数据位
    serial.setParity(QSerialPort::NoParity); // 设置校验位
    serial.setStopBits(QSerialPort::OneStop); // 设置停止位

    // 打开串口
    if (!serial.open(QIODevice::ReadWrite))
    {
        qDebug() << "Failed to open serial port!";
        return 1;
    }

    // 创建Modbus RTU主站对象
    QModbusRtuSerialMaster modbusMaster;
    modbusMaster.setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM1"); // 设置串口名称
    modbusMaster.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600); // 设置波特率
    modbusMaster.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8); // 设置数据位
    modbusMaster.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity); // 设置校验位
    modbusMaster.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop); // 设置停止位

    // 设置Modbus设备地址
    modbusMaster.setServerAddress(1);

    // 连接Modbus RTU设备
    if (!modbusMaster.connectDevice())
    {
        qDebug() << "Failed to connect to Modbus device!";
        return 1;
    }

    // 创建Modbus数据单元
    QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10); // 读取保持寄存器0~9的数据

    // 读取Modbus数据
    if (auto *reply = modbusMaster.sendReadRequest(readUnit, 1))
    {
        // 等待读取完成
        if (!reply->isFinished())
        {
            QEventLoop loop;
            QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
            loop.exec();
        }

        // 检查读取结果
        if (reply->error() == QModbusDevice::NoError)
        {
            // 处理读取到的数据
            const auto values = reply->result().values();
            for (int i = 0; i < values.size(); ++i)
            {
                qDebug() << "Register" << i << "=" << values.at(i);
            }
        }
        else
        {
            qDebug() << "Read error:" << reply->errorString();
        }

        // 释放Modbus回复对象
        reply->deleteLater();
    }
    else
    {
        qDebug() << "Failed to send Modbus read request!";
    }

    // 关闭Modbus连接
    modbusMaster.disconnectDevice();

    // 关闭串口
    serial.close();

    return a.exec();
}

具体的数据处理将根据需求进行扩展和实现,如写入数据和处理异常等。另外,需要根据实际情况设置正确的串口参数和设备地址,并确保与Modbus设备的正确连接。在编译和运行程序之前,还需要在项目的.pro文件中添加QT+=serialport以启用QtSerialPort模块。

下面是一个写入Modbus寄存器的示例:

// 创建Modbus数据单元
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 0, 1); // 写入保持寄存器0

// 设置写入数据
QVector<quint16> data;
data.append(123); // 写入的数据
writeUnit.setValues(data);

// 写入Modbus数据
if (auto *reply = modbusMaster.sendWriteRequest(writeUnit, 1))
{
    // 等待写入完成
    if (!reply->isFinished())
    {
        QEventLoop loop;
        QObject::connect(reply, &QModbusReply::finished, &loop, &QEventLoop::quit);
        loop.exec();
    }

    // 检查写入结果
    if (reply->error() == QModbusDevice::NoError)
    {
        qDebug() << "Write request completed successfully!";
    }
    else
    {
        qDebug() << "Write error:" << reply->errorString();
    }

    // 释放Modbus回复对象
    reply->deleteLater();
}
else
{
    qDebug() << "Failed to send Modbus write request!";
}

 本文转自:Modbus笔记_modbus 66 03开头-优快云博客

ModBus协议部分功能码设计与实现方法(QT环境) QT环境下实现ModbusRTU以及ModBusTCP。支持功能码:0x01、0x03、0x0f、0x10 阅读详情

相关推荐

Qt C++实战:Modbus RTU协议详解及主站实现

Modbus总线协议属于应用层协议,是一种常见的工业系统通讯协议,被广泛应用于工业领域。本篇将对Modbus RTU协议进行详细介绍,并实现一个基于Qt的Modbus RTU主站上位机。

WHEgqing的专栏 1250

Qt 上位机串口编程 Modbus编程

      Qt是由Qt Company开发的主流跨平台C++图形用户界面应用程序开发框架。  Qt是面向对象的框架,容易扩展,并且允许真正地组件编程,既可以开发GUI程序,也可用于控制台工具和服务器。     串口(Serial Port),也称串行通讯接口(通常指COM口), 串口通信是指将数据一个比特一个比特地逐位进行传输的通信模式。其特点是通信线路简单,传送速度较慢。Qt串口通信是借助一个QSerialPort的对象来方便的对串口进行读写。   Modbus是一种串行通信协议,是施耐德电气发表工业标准协议。Qt Modbus通讯 采用QModbusRtuSerialMaster 、QModbusRtuSerialSlave等类来实现Modbus通讯相关的功能    本课程主要帮助学员熟练掌握 Qt 5框架串口编程,Modbus协议编程,并且通过两个实战工具项目,为学习Qt 上位机编程 串口、Modbus编程打下坚固的基础! 

保姆级教程:用Qt和libmodbus搞定Modbus RTU通讯,从串口配置到数据读写全流程

本文提供了一份详细的Qt和libmodbus实现Modbus RTU通信的保姆级教程,涵盖从串口配置到数据读写的全流程。通过环境准备、界面设计、通信初始化、数据操作等步骤,帮助开发者快速掌握工业自动化领域的Modbus RTU通信技术,适用于PLC、传感器等设备的数据采集。

weixin_29193259的博客 526

Qt6教程之三(15) Modbus通信

本篇博客主要介绍Modbus通信!

让每一个想学习编程的人,都能学会,都能看懂,看了都有收获! 1万+

从零搭建一个Modbus调试助手:基于Libmodbus库和Qt5的C++实战教程

本文详细介绍了如何从零开始使用C++和Qt5框架结合Libmodbus库开发一个功能完整的Modbus调试助手。教程涵盖开发环境配置、Modbus通讯核心类设计、Qt用户界面实现以及高级功能优化,帮助开发者快速掌握工业自动化领域的Modbus协议应用,特别适合需要与PLC等设备通讯的工控开发者。

weixin_30335353的博客 374

Modbus RTU与Qt上位机实战:变频电机远程控制系统开发详解

在工业自动化与智能制造升级中,上位机作为人机交互的核心枢纽,承担着设备监控、数据采集与远程控制的关键任务。而Modbus协议凭借其开放、简单、可靠的特点,成为连接PLC、变频器与工控机最常用的工业通讯语言。基于RS485总线的Modbus RTU以半双工问答方式传输数据,通过寄存器地址映射与CRC校验保证报文准确,是实现低成本、高稳定通讯的经典方案。结合Qt框架开发跨平台上位机,利用其信号槽机制与高性能界面渲染能力,可构建实时响应、交互流畅的控制系统。此类技术广泛应用于产线电机启停、变频调速、运行状态监控与

weixin_29188043的博客 321

探索工业自动化:基于Qt5的Modbus RTU协议实现

探索工业自动化:基于Qt5的Modbus RTU协议实现 【下载地址】qt5实现modbusrtu 本仓库致力于提供一个基于Qt5框架实现Modbus RTU协议的解决方案。Modbus是一种广泛应用于工业自动化领域的通信协议,特别是PLC(可编程逻辑控制器)与其他设备之间的通讯。通过Qt5这一强大的跨平台应用程序开发库...

gitblog_09806的博客 379

qt c++ modeBus通信实例

qt c++,modebus通信小程序。

baymax9527的博客 1796

基于 QT5 的 modbus rtu 主机通讯库

创建文件mcmodbusrtu.h #ifndef MCMODBUSRTU_H #define MCMODBUSRTU_H #include &amp;lt;QObject&amp;gt; #include &amp;lt;QSerialPort&amp;gt; #include &amp;lt;QTimer&amp;gt; // CRC16码表 #define UCHAR unsigned char static const UCHA...

小马哔哔 1万+

Qt应用软件【协议篇】modbus-rtu示例

Qt上位机串口编程modbus-rtu

小鱼酱的博客 2539

基于Qt5的Modbus RTU通信实现与项目实战

本文还有配套的精品资源,点击获取 简介:Qt5是广泛使用的跨平台应用开发框架,具备强大的图形界面和高效的串口通信支持,而Modbus RTU是工业自动化中常用的串行通信协议。本文介绍如何在Qt5环境中实现Modbus RTU协议通信,涵盖QSerialPort串口配置、二进制报文解析、信号与槽机制、定时器控制及多线程处理等关键技术。通过“emsIO_test”示例项目,演示了对Modbus设备的寄存器读写、线圈状态查询等操作,帮助开发者构建稳定可靠的工业通信应用。

weixin_35751194的博客 1106

【亲测免费】 qt5实现modbusrtu

qt5实现modbusrtu 【下载地址】qt5实现modbusrtu 本仓库致力于提供一个基于Qt5框架实现Modbus RTU协议的解决方案。Modbus是一种广泛应用于工业自动化领域的通信协议,特别是PLC(可编程逻辑控制器)与其他设备之间的通讯。通过Qt5这一强大的跨平台应用程序开发库,本项目实现了对Modbus...

gitblog_09782的博客 598

QT环境下实现ModbusRTU以及ModBusTCP 支持功能码:0x01、0x03、0x0f、0x10

QT环境下实现ModbusRTU以及ModBusTCP。支持功能码:0x01、0x03、0x0f、0x10 适用人群,想了解Modbus协议的人,以及从事相关行业的人。了解了这个协议,对于学习其他协议如CAN,1533B等都非常容易,其实这些协议是原理都差不多,只是不同的协议他们约定的方式不同,底层都是基于电平信号,和各种编码代表0还是1 内容 1.实现源代码。 2.Modbus中文手册 3.实现说明

工业通讯调试困境的终结者:OpenModScan开源Modbus主站工具深度解析

在工业自动化领域,Modbus协议作为连接PLC、传感器和上位机系统的"工业普通话",其调试工作却常常让工程师们陷入效率困境。传统调试工具要么功能单一,要么价格昂贵,要么平台受限。面对复杂的工业现场网络、多协议设备集成和实时数据监控需求,工程师们迫切需要一款功能全面、跨平台兼容且完全免费的专业级Modbus调试工具。OpenModScan正是为解决这一技术痛点而生的开源解决方案,它通过模块化架构设

gitblog_00674的博客 1074

别再手动对照了!用Python+ArcGIS Pro一键搞定三调数据转土地三大类

本文介绍如何利用Python和ArcGIS Pro实现三调数据向土地三大类的自动化转换,大幅提升国土空间规划和土地变更调查的工作效率。通过封装分类规则为Python函数并集成到ArcGIS Pro脚本工具中,解决了传统手动操作耗时且易错的问题,适用于大规模数据处理场景。

weixin_29081101的博客 304

STM32驱动MG996R舵机的PWM控制与闭环原理

舵机是一种典型的模拟闭环伺服系统,其核心是通过电位器反馈实现角度位置的自动校正。工作原理基于负反馈控制:目标PWM脉宽决定期望角度,电位器输出实时反馈实际角度,控制电路计算偏差并驱动电机消除误差。该机制赋予舵机强带载能力与抗干扰性,是机器人、云台、智能执行器等场景的关键执行单元。在嵌入式开发中,STM32通过定时器生成标准20ms周期、0.5–2.5ms脉宽的PWM信号,需严格遵循电气规范,并解决PA15引脚SWJ复用冲突、定时器重映射及CCR精度计算等关键问题。本文深入解析MG996R舵机控制全流程,涵盖

weixin_42600407的博客 559

OpenModScan:解决工业通讯调试难题的专业Modbus协议测试方案

在工业自动化、物联网设备集成和工业通讯调试工具的实际应用中,工程师经常面临Modbus协议测试、设备通讯验证和工业自动化调试的复杂挑战。传统调试方法存在配置繁琐、协议解析困难、设备发现效率低下等问题,严重影响了项目进度和系统稳定性。OpenModScan作为一款开源免费的Modbus主站工具,通过模块化架构设计和全面的协议支持,为工业通讯调试提供了专业高效的解决方案。 ## 工业通讯调试的技术挑

gitblog_00491的博客 848

WSL 相关命令时遇到了 “无法从raw.githubusercontent.com提取分发列表、操作超时

核心问题:国内网络屏蔽raw.githubusercontent.com,导致WSL无法获取发行版列表;最优方案:优先用方案1(手动指定发行版安装),无需改配置,1分钟搞定;永久修复:用方案2(修改hosts),适合需要管理多个WSL发行版的场景;兜底方案:用方案3(手动下载安装包),适配所有网络环境。按以上步骤操作后,你不仅能正常安装WSL,等命令也能正常执行,后续可正常使用WSL搭配Docker Desktop(如切换WSL 2后端),无需再担心网络超时问题。

weixin_39766667的博客 2126

Modbus调试工具

Dick Morley在1979年发表的Modbus协议,最初只是为了让自动化系统使用可编程逻辑控制器PLC设备而制定了这样的一个总线协议。由于其无版权而免费,简洁易用和易于维护等优点得到了广泛应用。随着智能设备的普及应用,Modbus协议在工业自动化、智能建筑和能源管理等诸多领域得到了广泛的应用。ModbusMaster是一款通用的Modbus主站仿真软件,它可以和Modbus终端设备高度协同工作,可以用于调试使用Modbus协议的终端。

DeamoTech的博客 2740

【漏洞修复】Diffie-Hellman Key Agreement Protocol 资源管理错误漏洞(CVE-2002-20001)

Diffie-Hellman Key Agreement Protocol 存在安全漏洞,远程攻击者可以发送实际上不是公钥的任意数字,并触发服务器端DHE模幂计算。

我的博客 1万+

森林冰火人html源码,森林冰火人单人版(源码)

【实例简介】java小游戏——森林冰火人,单人游戏, 实现人物行走,跳跃,吃水晶,具有计时功能,积分功能,倒计时结束游戏失败。【实例截图】【核心代码】森林冰火人单人版├── bin│ ├── game│ │ ├── Help.class│ │ ├── Logon.class│ │ ├── Main.class│ │ ├── Mykey.class│ │ ...

weixin_42507981的博客 6196
上一篇: qtcreator一次性加载多个项目
下一篇: 从QObject类及非QObject类实现多继承,需把QObject放在继承链最前面
荆楚闲人
博客等级 码龄20年 3万+粉丝 473原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值