Qt MODBUS协议

Qt中使用Modbus协议

Qt提供了Qt Modbus模块,支持Modbus RTU和Modbus TCP协议,可用于与硬件设备通信。以下是具体实现步骤:

环境准备 确保Qt安装时勾选了Qt Serial Port和Qt Modbus模块。在项目配置文件(.pro)中添加:

qmake 复制代码
QT += serialport modbus

创建Modbus客户端

cpp 复制代码
#include <QModbusRtuSerialMaster>
#include <QModbusTcpClient>

// RTU串口模式
QModbusRtuSerialMaster *modbusDevice = new QModbusRtuSerialMaster;
modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, "COM1");
modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud19200);
modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);
modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);
modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);

// TCP模式
QModbusTcpClient *modbusDevice = new QModbusTcpClient;
modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502);
modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.1.100");

连接设备

cpp 复制代码
if (!modbusDevice->connectDevice()) {
    qDebug() << "连接失败:" << modbusDevice->errorString();
}

数据读写操作 读取保持寄存器(功能码0x03):

cpp 复制代码
QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10);
if (auto *reply = modbusDevice->sendReadRequest(readUnit, 1)) {
    if (!reply->isFinished())
        connect(reply, &QModbusReply::finished, this, [this, reply]() {
            if (reply->error() == QModbusDevice::NoError) {
                const QModbusDataUnit unit = reply->result();
                for (uint i = 0; i < unit.valueCount(); i++)
                    qDebug() << "地址" << unit.startAddress() + i << "值:" << unit.value(i);
            }
            reply->deleteLater();
        });
    else
        delete reply;
}

写入单个寄存器(功能码0x06):

cpp 复制代码
QModbusDataUnit writeUnit(QModbusDataUnit::HoldingRegisters, 5, {123});
if (auto *reply = modbusDevice->sendWriteRequest(writeUnit, 1)) {
    connect(reply, &QModbusReply::finished, this, [this, reply]() {
        if (reply->error() == QModbusDevice::NoError)
            qDebug() << "写入成功";
        reply->deleteLater();
    });
}

错误处理

cpp 复制代码
connect(modbusDevice, &QModbusClient::errorOccurred, [](QModbusDevice::Error error) {
    qDebug() << "Modbus错误:" << error;
});

断开连接

cpp 复制代码
modbusDevice->disconnectDevice();

注意事项

  • Modbus RTU需要正确配置串口参数(波特率、数据位等)
  • 从站地址需要与硬件设备设置一致
  • 读写操作是异步的,需要通过信号槽处理结果
  • 工业环境中建议添加超时重试机制
  • 对于大量数据读取,需注意Modbus协议的单帧限制(通常最多125个寄存器)

调试建议

  • 使用Modbus调试工具(如Modbus Poll)验证硬件通信
  • 启用Qt Modbus模块的调试输出:
cpp 复制代码
QLoggingCategory::setFilterLevel("qt.modbus*", QtDebugMsg);
  • 检查硬件设备的Modbus地址映射表,确保访问正确的寄存器地址
相关推荐
大鱼>1 天前
DSPy:LLM程序自动编译与提示词优化
开发语言·人工智能·python·深度学习
撩妹帝九歌1 天前
Java文件写入与编码、字节数组、字符集、字符编解码 一文打通!
java·开发语言
星核0penstarry1 天前
Solon AI v4.0.4 技术分析:Java Agent 框架的兼容性突破与选型考量 基于 OSCHINA 2026-07-30 报道及公开技术资料整理
java·开发语言·人工智能
昨夜星河入梦来1 天前
postman接口测试报错503的解决方法
开发语言·postman
spider_xcxc1 天前
Jenkins 遇见 Argo CD:构建可靠 GitOps 流水线的实战指南
java·开发语言·servlet
IT小盘1 天前
16-Prompt版本管理-从手工修改到可追踪配置系统
开发语言·人工智能·python·prompt
Cx330❀1 天前
【Linux网络】深入 HTTP 协议(五):从 Cookie/Session 原理到 C++ 源码实战
linux·运维·服务器·开发语言·网络·c++·http
keyipatience1 天前
Socket编程3个版本
linux·运维·服务器·开发语言·网络·ubuntu
北冥you鱼1 天前
Go语言四则运算实战:从基础类型到big包的深度解析
开发语言·后端·golang
江畔柳前堤1 天前
roLabelImg 详细安装教程
开发语言·人工智能·后端·云原生