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

}

}

相关推荐
愚戏师7 小时前
软件工程(应试版)图形工具总结(二)
数据结构·c++·python·软件工程
owde7 小时前
顺序容器 -forward list单链表
数据结构·c++·list
矛取矛求7 小时前
C++ 标准库参考手册深度解析
java·开发语言·c++
lmy201211087 小时前
GESP:2025-3月等级8-T1-上学
c++·算法·图论·dijkstra
٩( 'ω' )و2607 小时前
stl_list的模拟实现
开发语言·c++·list
&Sinnt&7 小时前
C++/Qt 模拟sensornetwork的工作
c++·qt
奕天者7 小时前
C++学习笔记(三十三)——forward_list
c++·笔记·学习
珊瑚里的鱼8 小时前
第五讲(下)| string类的模拟实现
开发语言·c++·笔记·程序人生·算法·visualstudio·visual studio
longlong int9 小时前
【每日算法】Day 17-1:位图(Bitmap)——十亿级数据去重与快速检索的终极方案(C++实现)
开发语言·c++·算法