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

相关推荐

  1. QT:基于QT实现Boost搜索引擎客户

    2024-01-06 10:58:01       28 阅读
  2. GRPC服务客户DEMO

    2024-01-06 10:58:01       43 阅读
  3. Springboot 分片上传客户Demo

    2024-01-06 10:58:01       47 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-06 10:58:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-06 10:58:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-06 10:58:01       82 阅读
  4. Python语言-面向对象

    2024-01-06 10:58:01       91 阅读

热门阅读

  1. [数据结构]链栈的创建,入栈和出栈

    2024-01-06 10:58:01       45 阅读
  2. vue3防抖函数封装与使用,以指令的形式使用

    2024-01-06 10:58:01       49 阅读
  3. 使用 openpyxl 库读取 Excel 文件

    2024-01-06 10:58:01       54 阅读
  4. MySQL-DDL

    MySQL-DDL

    2024-01-06 10:58:01      44 阅读
  5. 云计算复习笔记--期末

    2024-01-06 10:58:01       56 阅读