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

}

}

相关推荐
All for pursuit.24 分钟前
【回溯-7】494.目标和
数据结构·c++·算法·leetcode
白杨尚青25 分钟前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
(Charon)2 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
无名猿2 小时前
成员初始化列表与初始化顺序陷阱:按声明顺序,不是书写顺序
c++·现代c++·语法基础
91刘仁德2 小时前
传输层协议深度拆解:端口寻址、UDP 报文与 TCP 可靠性机制全解析
linux·网络·c++·网络协议·tcp/ip·udp·c
Liuchang09112 小时前
洛谷 P2670 [NOIP 2015 普及组] 扫雷游戏
c++·算法·游戏
扶尔魔ocy2 小时前
【qt openGL入门笔记】坐标系统和摄像机
qt·opengl
顶点多余2 小时前
C/C++常见面试题
开发语言·c++
HugoStudio_SWAN2 小时前
洛谷 B4575 [GESP202609 二级] 直角三角形——临场定义理解与边界质疑
c++·学习·程序人生·算法
(Charon)2 小时前
【C++面试】右值引用与移动语义:std::move到底做了什么
开发语言·c++