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

news/2024/11/17 21:36:49/文章来源:https://www.cnblogs.com/qq21497936/p/18293821

前言

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/741643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HP惠普服务器维修数据恢复

一、初步评估与诊断 收集信息:了解服务器的型号、配置、操作系统、RAID配置(如果适用)以及数据丢失的具体情况。 故障诊断:通过查看服务器的日志、系统状态指示灯、硬件自检报告等信息,初步确定数据丢失的原因。这可能是由于硬件故障(如硬盘损坏、RAID控制器故障等)、软…

戴尔服务器维修数据恢复

一、明确数据丢失原因 首先,需要明确数据丢失或服务器故障的具体原因,如硬盘掉线、阵列卡损坏、意外断电、黑客攻击等。这些原因将直接影响数据恢复的策略和方法。 二、记录关键信息 记录服务器型号、配置、硬盘序列号等关键信息,以便在后续的数据恢复过程中使用。这些信息对…

数据库修复数据恢复

数据库修复和数据恢复是数据库管理中非常重要的环节,它们涉及通过技术手段将损坏或丢失的数据库文件恢复到可正常使用的状态。 一、数据库修复 数据库修复是指通过技术手段将损坏的数据库文件修复至可正常使用的数据库文件的过程。数据库损坏可能由多种原因引起,如服务器宕机…

硬盘数据恢复

硬盘数据恢复是指通过技术手段,将保存在台式机硬盘、笔记本硬盘、服务器硬盘、移动硬盘等存储设备上的丢失或损坏的数据进行抢救和恢复的过程。 一、硬盘数据恢复的方法 使用回收站恢复 当从Windows系统中删除文件时,操作系统通常会将文件移至回收站。如果回收站没有清空,可…

华为服务器维修数据恢复

一、故障诊断 收集信息:了解服务器的型号、配置、操作系统、RAID配置(如果适用)以及数据丢失的具体情况。 分析故障:通过查看服务器的日志、系统状态指示灯、硬件自检报告等信息,初步确定数据丢失的原因。可能的原因包括硬件故障(如硬盘损坏、RAID控制器故障等)、软件问…

Nginx——一个域名下部署多个Vue项目

前言 当前生成环境已经有一个正常的Vue项目,现在需要将大屏项目也部署到同一个域名下,搜索了下类型的问题,感觉问的还挺多的,所以这里记录下操作步骤; 如何在不动第一个项目的情况下来部署第二个Vue项目; 内容 前端配置 publicPath 修改vue.config.js下的publicPath参数p…

给你的博客加上评论区!

一个网站如果有评论功能,可以更好的和读者互动。17.评论区 一个网站如果有评论功能,可以更好的和读者互动。VuePress 也有很多评论插件,这里简单介绍下,最后介绍本站所使用的 Twikoo。 大部分评论插件都是使用的 Github 或 Gitee 的 issue 功能,也就是用 issue 去存储评论…

Java中的SpringAOP、代理模式、常用AspectJ注解详解

这篇文章主要介绍了Java中的SpringAOP、代理模式、常用AspectJ注解详解,Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务,例如审计和事务管理进行内聚性的开发,需要的朋友可以参考下+ 目录一、AOP简述 回到主题,何为AOP?AOP即面向切面编程——Sp…

浅谈qiankun微前端

qiankun是single-spa二开;使用场景:不同技术栈,不同团队,独立开发部署、增量升级;总结:解耦; 主应用: 具有整合-输入子应用的html入口;子应用 与single-spa基本一致,导出了三个生命周期函数 (bootstrap mount unmout)js沙箱: 三个沙箱(快照沙箱、支持单应用的代理沙…

Linux捣鼓记录:快速搭建alist+aria2+qbittorrent

简介:使用docker-compose创建alist aria2 qbittorrent服务,前置条件安装docker及docker-compose插件,docker镜像仓库访问不了,建议配置代理用来拉取镜像。 一、确认路径,确认UID GID,确认端口 路径 alist挂载路径: - /home/dalong/app/alist:/opt/alist/data - /home/d…

php webman使用fileboy热加载

1.下载fileboy文件下载地址:https://gitee.com/dengsgo/fileboy/releases 2.在工作目录创建一个文件夹,把下载的exr文件复制一份到文件夹,重命名为‘fileboy.exe’,添加系统变量PATH: 3.打开cmd命令窗口执行 fileboy 命令,出现以下图说明配置成功 4.切换到项目根目录,执…

统计学入门:时间序列分析基础知识详解

时间序列分析中包含了许多复杂的数学公式,它们往往难以留存于记忆之中。为了更好地掌握这些内容,本文将整理并总结时间序列分析中的一些核心概念,如自协方差、自相关和平稳性等,并通过Python实现和图形化展示这些概念,使其更加直观易懂。希望通过这篇文章帮助大家更清楚地…