前言

  西门子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

  案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)_modbusTcp
  案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)_modbusTcp_02

  案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)_modbusTcp_03


相关头文件源码

PlcModbusMasterWidget.h

案例分享:Qt modbusTcp调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.0.0)_modbusTcp_04

#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

  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.

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
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.
  • 44.
  • 45.
  • 46.
  • 47.
  • 48.
  • 49.
  • 50.
  • 51.
  • 52.
  • 53.
  • 54.
  • 55.
  • 56.
  • 57.
  • 58.
  • 59.
  • 60.
  • 61.
  • 62.
  • 63.
  • 64.
  • 65.
  • 66.
  • 67.
  • 68.
  • 69.
  • 70.
  • 71.
  • 72.
  • 73.
  • 74.
  • 75.
  • 76.
  • 77.
  • 78.
  • 79.
  • 80.
  • 81.
  • 82.
  • 83.
  • 84.
  • 85.
  • 86.
  • 87.
  • 88.
  • 89.
  • 90.
  • 91.
  • 92.
  • 93.
  • 94.
  • 95.
  • 96.