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

CSDN 2024-08-10 16:35:02 阅读 63

若该文为原创文章,转载请注明原文出处

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/140313789

红胖子(红模仿)的博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结合等等)持续更新中…(点击传送门)

合作案例专栏:案例分享(体验Demo可下载,只定制)

前言

西门子PLC、台达PLC、法兰克机床等等多年以前玩得比较多,有tcp/ip通讯也有modbus通讯,modbus又分为网络,485,232等。

医疗项目,焊接机器人项目,工控机床项目,数控项目,物联网项目用的挺多的,将关键的通信技术抽离出来,单独弄成工具。

最近调绞车,遇到了modbus tcp,正好有设备,于是额外花时间单独抽出来作为调试工具。

相关博客

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

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

《台达PLC开发笔记(一):台达PLC连接介绍,分别使用485、网口与台达PLC建立连接》

《台达PLC开发笔记(二):台达PLC设置主机通讯参数为RTU并成功通讯》

《西门子PLC开发笔记(一):PLC介绍,西门子S1200系列接线、编程、下载和仿真》

《LibModbus库开发笔记(一):libmodbus库介绍、编译和基础工程模板》

《案例分享:Qt西门子PLC调试模拟工具(包含PLC上位机通讯,PLC服务器,读写Byte、Int、DInt、Real)(持续更新,当前v1.6.0)》

需求

与各种其他行业仪器通讯软件开发的通讯核心模块,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

在这里插入图片描述

<code>#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

本文章博客地址:https://blog.csdn.net/qq21497936/article/details/140313789



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。