代码实现QT开发上位机,实现MODBUS数据的读取和写入
时间: 2025-06-25 11:15:07 浏览: 21
### QT 上位机 MODBUS 数据读取写入实现代码
在使用 Qt 开发基于 Modbus 协议的数据读取和写入功能时,可以利用 `Qt Serial Bus` 模块中的类来简化操作。以下是具体实现方式:
#### 使用 QModBusRtuClient 进行串口通信
如果通过串口实现 Modbus RTU 通信,则需创建一个 `QModBusRtuSerialMaster` 对象并配置其参数。
```cpp
#include <QCoreApplication>
#include <QModbusDataUnit>
#include <QModbusRtuSerialMaster>
#include <QDebug>
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
// 创建 Modbus 客户端实例
QModbusRtuSerialMaster master;
// 配置串口参数 (波特率、数据位、停止位等)
master.setConnectionParameter(QModbusDevice::SerialPortNameParameter, "/dev/ttyUSB0");
master.setConnectionParameter(QModbusDevice::BaudRateParameter, QVariant::fromValue(quint32(9600)));
master.setConnectionParameter(QModbusDevice::DataBitsParameter, QSerialPort::Data8);
master.setConnectionParameter(QModbusDevice::ParityParameter, QSerialPort::NoParity);
master.setConnectionParameter(QModbusDevice::StopBitsParameter, QSerialPort::OneStop);
if (!master.connectDevice()) {
qDebug() << "Failed to connect:" << master.errorString();
return -1;
}
// 设置目标设备地址
const int slaveId = 1;
// 构建请求单元(例如读保持寄存器)
QModbusDataUnit readRequest(static_cast<QModbusDataUnit::RegisterType>(3), /*起始地址*/ 0, /*数量*/ 10);
// 发送读取请求
if (auto *reply = master.sendReadRequest(readRequest, slaveId)) {
if (!reply->isFinished()) {
QObject::connect(reply, &QModbusReply::finished, [&]() {
if (reply->error() == QModbusError::NoError) {
const auto result = reply->result();
for (const auto value : result.values())
qDebug() << "Received response:" << value.toInt();
} else {
qDebug() << "Read error occurred:" << reply->errorString();
}
reply->deleteLater();
});
} else {
qDebug() << "Synchronous read failed:" << reply->errorString();
reply->deleteLater();
}
} else {
qDebug() << "Read error:" << master.errorString();
}
return app.exec();
}
```
以上代码展示了如何设置 Modbus RTU 的串口连接以及发送读取命令的过程[^1]。
#### 使用 QModBusTcpClient 进行 TCP/IP 通信
对于 Modbus TCP 场景,可采用如下方法构建客户端并与服务器交互。
```cpp
// 初始化 ModbusTCP 设备对象
QModbusTcpClient tcpClient;
tcpClient.setHostAddress(QHostAddress("192.168.1.10"));
tcpClient.setPort(502);
if (!tcpClient.connectDevice()) {
qDebug() << "Connect Error!" << tcpClient.errorString();
}
// 准备写入单个线圈状态的例子
QModbusDataUnit writeCoil(QModbusDataUnit::Coils, 0x0F, 1);
writeCoil.setValue(0, true);
if (auto *response = tcpClient.sendWriteRequest(writeCoil, 1)) {
if (response->error() != QModbusDevice::NoError){
qDebug() << "Write Coil Failed." << response->errorString();
}else{
qDebug()<<"Write Success!";
}
}
tcpClient.disconnectDevice();
```
此部分说明了针对远程主机建立 Modbus-TCP 链接,并执行简单的线圈写入动作的方法[^2]。
#### 注意事项
- **错误处理**:实际应用中应加入更完善的异常捕获机制。
- **性能优化**:批量传输而非逐条指令能有效提升效率。
- **安全性考量**:在网络环境下运行的服务要考虑防火墙规则及认证措施。
阅读全文
相关推荐


















