Qt多线程中定时读取Modbus服务器 寄存器以及读写,另一个线程点击刷新系统时间

本文介绍了如何在Qt环境中利用多线程分别进行定时读取Modbus服务器寄存器和刷新系统时间的操作。通过提供详细的代码链接和程序结构图,展示了ui界面设计以及各个关键文件的功能,包括global.h、mainwindow.h、plcthread.h和plctimerthread.h等。实现在不影响主线程的情况下,实现Modbus通信和系统时间更新。
摘要由CSDN通过智能技术生成

代码链接:

https://download.csdn.net/download/dfy1407/16692818

ui界面

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

程序结构图

在这里插入图片描述

global.h

#ifndef GLOBAL_H
#define GLOBAL_H
#include <QString>

class global
{
   
public:
    global();
    static QString ComPortName;
    static QString Tor;
};

#endif // GLOBAL_H

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "plctimerthread.h"
#include "plcthread.h"
#include <QTimer>
#include <QTime>
#include <QDebug>
#include <QString>
#include <QThread>
#include <QDebug>
#include "global.h"

#include <QModbusDataUnit>
#include <QModbusRtuSerialMaster>
#include <QModbusClient>
#include <QModbusReply>

#include <QSerialPort>
#include <QSerialPortInfo>


namespace Ui {
   
class MainWindow;
}

class MainWindow : public QMainWindow
{
   
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();


private:
    Ui::MainWindow *ui;
    QThread *thread;
    PlcTimerThread *plcThread;

    QThread *qthreadPlc;
    PlcThread *plc;

signals:
    void sendSpinbox(int);
    void writeTor(QString);

private slots:
    void on_pushButton_clicked();
    void on_pushButton_2_clicked();
    void on_pushButton_3_clicked();
    void on_pushButton_4_clicked();
    void showTime(QString);
    void on_spinBox_valueChanged();
    void on_connectModbus_clicked();
    void on_searchPort_clicked();
    void on_writeT_clicked();

    void on_statusBar(const QString&);
    void on_change2Discon();
    void on_change2Con();
    void on_updateT(QString);
    void on_updateS(QString);




};

#endif // MAINWINDOW_H

plcthread.h

#ifndef PLCTHREAD_H
#define PLCTHREAD_H

#include <QObject>
#include <QModbusDataUnit>
#include <QModbusRtuSerialMaster>
#include <QModbusClient>
#include <QModbusReply>
#include <QSerialPort>
#include <QSerialPortInfo>
#include "global.h"
#include <QString>
#include <QDebug>
#include <QThread>
#include <QTimer>


class PlcThread : public QObject
{
   
    Q_OBJECT
public:
    explicit PlcThread(QObject *parent = nullptr);
    ~PlcThread();

    void doWork();
    void connectPlc();

    void readPlc();
    void torqReadReady();
    void spdReadReady();
    void on_writeTor(QString);

signals:
    void startWork();
    void finishWork();

    void statusBar(const QString&);
    void change2Discon();
    void change2Con();


    void updateT(QString);
    void updateS(QString);

public slots:

private:
    QModbusClient *modbusDevice;
    QTimer *dataTimer;
    uchar T[4];
    uchar S[4];

};

#endif // PLCTHREAD_H

plctimerthread.h

#ifndef PLCTIMERTHREAD_H
#define PLCTIMERTHREAD_H

#include <QObject>
#include <QTimer>
#include <QDebug>
#include <QTime>
#include <QString>
#include "ui_mainwindow.h"
#include <QMainWindow>

#include <QModbusDataUnit>
#include <QModbusRtuSerialMaster>
#include <QModbusClient>
#include <QModbusReply>

#include <QSerialPort>
#include <QSerialPortInfo>

class PlcTimerThread : public QObject
{
   
    Q_OBJECT
public:
    explicit PlcTimerThread(QObject *parent = nullptr);
    ~PlcTimerThread();
public:
    void run();
    void dowork();
    void printSpinBox(int);
signals:
    void workStart();
    void workFinished();
    void upDateTime(QString);
private:
    QTimer *timer;
    QString str_time;
    int spinbox;


public slots:





};

#endif // PLCTIMERTHREAD_H

global.cpp

#include "global.h"

QString global::ComPortName;
QString global::Tor;

global::global()
{
   

Qt使用C++读取Modbus寄存器,可以使用第三方库QModbus。QModbus一个基于QtModbus通信库,可以实现Modbus TCP和RTU通信协议。以下是一个简单的例子,演示如何使用QModbus读取Modbus寄存器。 首先,需要在Qt项目添加QModbus库。在.pro文件添加以下行: ``` QT += network QT += serialbus ``` 然后在C++代码添加以下头文件: ``` #include <QModbusTcpClient> #include <QModbusDataUnit> ``` 接下来,可以使用以下代码来读取Modbus寄存器: ``` QModbusTcpClient *modbusDevice = new QModbusTcpClient(this); modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, 502); modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, "192.168.1.1"); if (!modbusDevice->connectDevice()) { qDebug() << "Failed to connect to Modbus device:" << modbusDevice->errorString(); return; } QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 1); if (auto *reply = modbusDevice->sendReadRequest(readUnit, 1)) { if (!reply->isFinished()) connect(reply, &QModbusReply::finished, this, [reply, modbusDevice]() { if (reply->error() == QModbusDevice::NoError) { const QModbusDataUnit unit = reply->result(); //读取寄存器成功,可以在这里处理数据 } else { qDebug() << "Modbus read error:" << reply->errorString(); } modbusDevice->disconnectDevice(); reply->deleteLater(); }); else delete reply; // 错误处理 } else { qDebug() << "Read error:" << modbusDevice->errorString(); } ``` 在这个例子,我们首先创建一个QModbusTcpClient对象,并连接到Modbus设备。然后,我们创建一个QModbusDataUnit对象,用于读取寄存器值。我们使用sendReadRequest()方法发送读取请求,并使用finished信号进行处理。如果读取成功,我们可以在结果处理数据。如果出现错误,我们会发出错误消息并断开连接。 需要注意的是,这个例子我们只读取一个寄存器的值。如果要读取多个寄存器,可以将寄存器数量设置为读取单元的数量,例如: ``` QModbusDataUnit readUnit(QModbusDataUnit::HoldingRegisters, 0, 10); ``` 这将读取从地址0开始的10个寄存器的值。
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值