案例分享:Qt modbusTcp除錯工具(讀寫Byte、Int、DInt、Real、DReal)(當前v1.0.0)

长沙红胖子Qt發表於2024-07-10

前言

  西門子PLC、臺達PLC、法蘭克機床等等多年以前玩得比較多,有tcp/ip通訊也有modbus通訊,modbus又分為網路,485,232等。
  醫療專案,焊接機器人專案,工控機床專案,數控專案,物聯網專案用的挺多的,將關鍵的通訊技術抽離出來,單獨弄成工具。
  最近調絞車,遇到了modbus tcp,正好有裝置,於是額外花時間單獨抽出來作為除錯工具。

需求

  與各種其他行業儀器通訊軟體開發的通訊核心模組,modbus功能模組,製作成除錯工具,可滿足一般情況的除錯。
  1.支援透過TCP埠進行通訊;(區別於modbus rtu 232/485)
  2.支援設定開啟從機的ip地址、埠和超時引數;
  3.支援寫入bool,int,dInt,real,dReal引數型別資料;
  4.支援讀取bool,int,dInt,real,dReal引數型別資料;
  5.增加容錯處理,連線後modbusTcp可能存在讀寫失敗,增加容錯處理機制,使其每次讀寫都能成功。

Demo

  在這裡插入圖片描述
  在這裡插入圖片描述

  在這裡插入圖片描述

工具下載地址

  CSDN(0積分下載):https://download.csdn.net/download/qq21497936/89529006
  QQ群:1047134658(點選“檔案”搜尋“modbus ”,群內與博文同步更新)

相關標頭檔案原始碼

PlcModbusMasterWidget.h

在這裡插入圖片描述

#ifndef MODBUSTCPWIDGET_H
#define MODBUSTCPWIDGET_H

/************************************************************\
 * 控制元件名稱: modbus Master管理應用
 * 控制元件描述:
 *          1.使用modbusTcp開啟
 *          2.PLC讀取bool、int、dInt、real(float)、dReal(double)
 *          3.PLC寫入bool、int、dInt、real(float)、dReal(double)
 * 其他說明:
 *          在ModbusTCP協議中,從機地址的概念與ModbusRTU有所不同。
 *          在ModbusTCP中,通常不直接透過從機地址來區分不同的裝置,
 *          而是透過IP地址和埠號來識別和連線特定的Modbus伺服器(從機)。
 * 著作權資訊
 *      作者:長沙紅胖子Qt
 *      公司:長沙創微智科資訊科技有限公司
 *      網址:www.chuangweizhike.com
 *      部落格導航:https://hpzwl.blog.csdn.net/article/details/102478062
 *      聯絡方式:QQ(21497936) 微信(yangsir198808)
 * 版本資訊
 *       日期             版本         描述
 *   2024年07月09日     v1.0.0       基礎功能,支援線圈、int、dint、單精度浮點,雙精度浮點型別
 *                                  讀寫失敗容錯處理執行機制
\************************************************************/

#include <QWidget>
#include <QThread>
#include <QDateTime>
#include <QElapsedTimer>
#include <QHash>
#include <QFile>
#include <QMessageBox>
#include <QAbstractButton>
#include "ModbusTcpManager.h"

namespace Ui {
class ModbusTcpWidget;
}

class ModbusTcpWidget : public QWidget
{
    Q_OBJECT

public:
    explicit ModbusTcpWidget(QWidget *parent = 0);
    ~ModbusTcpWidget();

protected:
    void initControl();

protected slots:
    void slot_connected(bool connected);
    void slot_disConnected();
    void slot_readBitsResult(bool result, int startAddr, QList<bool> listBool);
    void slot_readIntsResult(bool result, int startAddr, QList<int> listInt);
    void slot_readDIntsResult(bool result, int startAddr, QList<int> listInt);
    void slot_readRealsResult(bool result, int startAddr, QList<float> listFloat);
    void slot_readDRealsResult(bool result, int startAddr, QList<double> listDouble);

    void slot_writeBitsResult(bool result, int startAddr, QList<bool> listBool);
    void slot_writeIntsResult(bool result, int startAddr, QList<int> listInt);
    void slot_writeDIntsResult(bool result, int startAddr, QList<int> listInt);
    void slot_writeRealsResult(bool result, int startAddr, QList<float> listFloat);
    void slot_writeDRealsResult(bool result, int startAddr, QList<double> listDouble);

private slots:
    void on_comboBox_writeType_currentIndexChanged(int index);
    void on_lineEdit_readStartAddr_textChanged(const QString &arg1);
    void on_lineEdit_writeStartAddr_textChanged(const QString &arg1);
    void on_lineEdit_readStartAddrHex_textChanged(const QString &arg1);
    void on_lineEdit_writeStartAddrHex_textChanged(const QString &arg1);

private slots:
    void on_pushButton_connect_clicked();
    void on_pushButton_disconnect_clicked();
    void on_pushButton_read_clicked();
    void on_pushButton_write_clicked();
    void on_pushButton_clear_clicked();

private:
    Ui::ModbusTcpWidget *ui;

    QThread *_pModbusManagerThread;
    QElapsedTimer _elapsedTimer;
};

#endif // MODBUSTCPWIDGET_H

ModbusManager.h

#ifndef MODBUSTCPMANAGER_H
#define MODBUSTCPMANAGER_H

#include <QObject>
#include <QMutex>

union RealByte {
    float f;
    quint8 buf[4];
};

union DRealByte {
    double f;
    quint8 buf[8];
};

#include "modbus/modbus.h"
#include "modbus/modbus-version.h"
#include "modbus/modbus-rtu.h"
#include "modbus/modbus-tcp.h"

class ModbusTcpManager : public QObject
{
    Q_OBJECT
private:
    explicit ModbusTcpManager(QObject *parent = 0);

public:
    bool testEnvAndRtu();

public:
    static ModbusTcpManager *getInstance();

public:
    void setIp(const QString &ip);
    void setPort(const quint16 &port);
    void setTimeOutMs(int timeOutMs);

public:
    QString getIp() const;
    quint16 getPort() const;
    int getTimeOutMs() const;

signals:
    void signal_connected(bool connected);
    void signal_disConnected();

    void signal_readBitsResult(bool result, int startAddr, QList<bool> listBool);
    void signal_readIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_readDIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_readRealsResult(bool result, int startAddr, QList<float> listFloat);
    void signal_readDRealsResult(bool result, int startAddr, QList<double> listDouble);

    void signal_writeBitsResult(bool result, int startAddr, QList<bool> listBool);
    void signal_writeIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_writeDIntsResult(bool result, int startAddr, QList<int> listInt);
    void signal_writeRealsResult(bool result, int startAddr, QList<float> listFloat);
    void signal_writeDRealsResult(bool result, int startAddr, QList<double> listDouble);

public slots:
    void slot_start();
    void slot_stop();
    void slot_connect();
    void slot_disConnect();

    void slot_readBits(int startAddr, int size);
    void slot_readInts(int startAddr, int size);
    void slot_readDInts(int startAddr, int size);
    void slot_readReals(int startAddr, int size);
    void slot_readDReals(int startAddr, int size);

    void slot_writeBits(int startAddr, QList<bool> listBool);
    void slot_writeInts(int startAddr, QList<int> listInt);
    void slot_writeDInts(int startAddr, QList<int> listInt);
    void slot_writeReals(int startAddr, QList<float> listFloat);
    void slot_writeDReals(int startAddr, QList<double> listDouble);

private:
    static ModbusTcpManager *_pInstance;
    static QMutex _mutex;

private:
    QString _ip;
    quint16 _port;
    int _timeOutMs;

private:
    bool _running;
    bool _connected;

private:
    modbus_t *_pModbus;

};

#endif // MODBUSTCPMANAGER_H

相關文章