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

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

时间:2024-07-10 12:30:05浏览次数:14  
标签:Real slot Qt int void startAddr DInt bool QList

前言

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

标签:Real,slot,Qt,int,void,startAddr,DInt,bool,QList
From: https://www.cnblogs.com/qq21497936/p/18293821

相关文章

  • Qt实现字符验证码相关功能
            本文主要介绍了Qt实现自定义验证码控件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值。        验证码的原理基于人类视觉和计算机视觉的差异性。通过给用户显示一些难以被机器识别的图形或文字,让用户进行人机交......
  • QT--SQLite
    配置类相关的表,所以我使用sqlite,且QT自带该组件;1.安装sqlite-tools-win-x64-3460000、SQLiteExpert5.4.31.575使用SQLiteExpert建好数据库.db文件,和对应的表后把db文件放在指定目录./db/program.db;2.选择sql组件3.新增数据库处理类,在使用数据库的地方调用类成员函数......
  • qt 用数据画一个图,并表示出来
    1.概要想用数据绘制一个画面,看有相机到播放的本质是啥。要点  //创建一个QImage对象,指定图像的宽度、高度和格式  QImageimage(width,height,QImage::Format_Grayscale8);  //将像素数据复制到QImage对象中  memcpy(image.bits(),pixelData,width......
  • 关于Qt模型插入最后一行数据中存在未填满的项,点击导致崩溃的解决办法
    在使用Qt模型视图框架的时候,你可能会遇见这种情况:给QTableView设置设置模型的时候,网模型里面插入数据,因为数据是一行一行插入的,即要使用model的appandRow函数,但有时候最后一行数据没有填满一行,但是没有填满的那一部分仍然可以点击,如下代码:while(query.next()){ProductInf......
  • Qt:10.显示类控件(QLabel-显示文本或图像的控件、QLCDNumber -显示数字的特殊控件、QPr
    目录一、QLabel-显示文本或图像的控件:1.1QLabel介绍:1.2设置文本格式——textFormat属性:1.3设置图片——pixmap属性:1.4自动缩放——scaledContents属性:拓展:resizeEvent方法:1.5内容对齐方式——alignment属性:1.6自动换行——wordWrap属性:1.7 文本缩进——indent属性......
  • QT入门看这一篇就够(详解含qt源码)
     目录一、Qt概述1.1什么是Qt1.2Qt的发展史1.3Qt的优势1.4Qt版本1.5成功案例二、创建Qt项目2.1使用向导创建2.2一个最简单的Qt应用程序2.2.1main函数中2.2.2类头文件2.3.pro文件2.4命名规范 2.5QtCreator常用快捷键三、Qt按钮小程序3.1按钮的创建......
  • QT实现wifi信号强弱图标
            Qt界面中绘制WiFi信号强弱图标。模拟类似手机的WIFI强度图标的绘制,比较简单,欢迎参考。一、简述        使用Qt实现WIFI信号图标。二、效果  三、核心代码  1、头文件#ifndefWIFIICON_H#defineWIFIICON_H#include<QWidget>classW......
  • QT设置回调函数给python调用——参数法
    这种方法将回调函数作为python函数参数对象的方法来使用。Qt已经添加了Python库,并且能够正常调用Python的API,可以成功调用Python的代码块,这部分可以参考我另外一篇博客:QT中调用python中的函数-Henkk-博客园(cnblogs.com)1.QT相关函数定义1.1创建回调函数例如下面两个函......
  • Qt 控件的简单实例化
    记录一个初学小白的学习过程,记录一些浅显的学习笔记GroupBoxGroupBox控件的作用是组织界面元素,将一组相关的控件组合在一起,并在顶部显示一个标题。基类:QWidget (第一部分是widget.h)(第二部分是widget.cpp)#ifndefWIDGET_H#defineWIDGET_H#include<QWidget>#inc......
  • [QT入门]标签控件(QLabel)
    一、概述QLabel是Qt中用于显示文本或图像的控件。它通常被用作标签或显示静态信息的区域。QLabel控件是图形用户界面(GUI)开发中的基础元素之一,广泛应用于各种Qt应用程序中。QLabel控件的灵活性和易用性使其成为开发过程中不可或缺的一部分。二、QLabel控件的基本属性和方法1.......