QT5.14 实现ModbusTCP客户端 Demo

本文在QT5.14平台,基于QModbusClientTcp类,实现了客户端对单个寄存器的读写,用ModbusSlave做服务器做测试。

1.界面

(1)更改读按钮的名称为bt_Read

(2)更改写按钮的名称为bt_Write

2.修改pro文件的第三行

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets serialbus

3.修改mainWindow.h

#ifndef MAINWINDOW_H

#define MAINWINDOW_H

#include <QMainWindow>
#include <QModbusTcpClient>

QT_BEGIN_NAMESPACE

namespace Ui { class MainWindow; }

QT_END_NAMESPACE

class MainWindow : public QMainWindow

{

Q_OBJECT

public:

MainWindow(QWidget *parent = nullptr);

~MainWindow();

private slots:

void on_bt_Read_clicked();
void on_bt_Write_clicked();
void ReplyData();

private:

Ui::MainWindow *ui;

QModbusTcpClient *client;

};

#endif // MAINWINDOW_H

4.修改mainWindow.c

#include "mainwindow.h"

#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)

: QMainWindow(parent)

, ui(new Ui::MainWindow)

{

ui->setupUi(this);

this->setWindowTitle("ModbusTCPClient");

client=new QModbusTcpClient(this);

client->setConnectionParameter(QModbusDevice::NetworkAddressParameter,"127.0.0.1");

client->setConnectionParameter(QModbusDevice::NetworkPortParameter,502);

client->connectDevice();

}

MainWindow::~MainWindow()

{

if(client->state()==QModbusTcpClient::ConnectedState)

{

client->disconnectDevice();

}

delete ui;

}

void MainWindow::on_bt_Read_clicked()

{

QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters,500,1);

unit.setValue(0,ui->textEdit->toPlainText().toInt());

QModbusReply *reply=client->sendReadRequest(unit,1);

if(reply)

{

if(!reply->isFinished())

{

connect(reply,&QModbusReply::finished,this,&MainWindow::ReplyData);

return;

}

}

reply->deleteLater();

}

void MainWindow::on_bt_Write_clicked()

{

QModbusDataUnit unit(QModbusDataUnit::HoldingRegisters,500,1);

unit.setValue(0,ui->textEdit->toPlainText().toInt());

QModbusReply *reply=client->sendWriteRequest(unit,1);

if(reply)

{

reply->deleteLater();

}

}

void MainWindow::ReplyData()

{

QModbusReply *reply=(QModbusReply *)(sender());

QModbusDataUnit unit=reply->result();

reply->deleteLater();

if(unit.valueCount()>0)

{

ui->textEdit->setText(QString::number(unit.value(0)));

}

}

相关推荐
No0d1es7 小时前
电子学会青少年软件编程(C/C++)5级等级考试真题试卷(2024年6月)
c语言·c++·算法·青少年编程·电子学会·五级
DjangoJason8 小时前
C++ 仿RabbitMQ实现消息队列项目
开发语言·c++·rabbitmq
奇树谦10 小时前
QT|windwos桌面端应用程序开发,当连接多个显示器的时候,如何获取屏幕编号?
开发语言·qt
weixin_3077791310 小时前
VS Code配置MinGW64编译GNU 科学库 (GSL)
开发语言·c++·vscode·算法
蒋星熠12 小时前
C++零拷贝网络编程实战:从理论到生产环境的性能优化之路
网络·c++·人工智能·深度学习·性能优化·系统架构
CHANG_THE_WORLD12 小时前
# C++ 中的 `string_view` 和 `span`:现代安全视图指南
开发语言·c++
雨落倾城夏未凉12 小时前
9.c++new申请二维数组
c++·后端
Franklin13 小时前
Python界面设计【QT-creator基础编程 - 01】如何让不同分辨率图像自动匹配graphicsView的窗口大小
开发语言·python·qt
雨落倾城夏未凉13 小时前
8.被free回收的内存是立即返还给操作系统吗?为什么?
c++·后端
雨落倾城夏未凉13 小时前
6.new和malloc的区别
c++·后端