当前位置: 首页 > news >正文

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

若该文为原创文章,转载请注明原文出处
本文章博客地址: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

在这里插入图片描述

#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

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • html5路由如何在nginx上部署(vite+vue3)
  • 每日一练习(复习昨天的知识)
  • 【VUE基础】VUE3第五节—核心语法之ref标签、props
  • 《警世贤文》摘抄:勤奋篇、取财篇、疏财篇、是非篇、安心篇、防忧篇(多读书、多看报、少吃零食多睡觉)
  • 解析Spring Boot中的数据迁移工具
  • 视频融合共享平台LntonCVS视频监控汇聚平台工业视频监控系统
  • Linux操作系统探索时间
  • 三级嵌入式 汇编指令
  • java使用poi-tl模版引擎导出word之if判断条件的使用
  • css文字自适应宽度动态出现省略号...
  • IO练习网络爬虫获取
  • 基于Netty的自研流系统缓存实现挑战: 内存碎片与OOM困境
  • 雷池WAF动态防护功能初体验
  • 智能制造热点词汇科普篇——工业微服务
  • .net6 当连接用户的shell断掉后,dotnet会自动关闭,达不到长期运行的效果。.NET 进程守护
  • 77. Combinations
  • Android 架构优化~MVP 架构改造
  • Angular数据绑定机制
  • Bootstrap JS插件Alert源码分析
  • docker python 配置
  • extjs4学习之配置
  • Java,console输出实时的转向GUI textbox
  • Linux中的硬链接与软链接
  • php的插入排序,通过双层for循环
  • vue数据传递--我有特殊的实现技巧
  • 笨办法学C 练习34:动态数组
  • 不上全站https的网站你们就等着被恶心死吧
  • 给初学者:JavaScript 中数组操作注意点
  • 基于 Babel 的 npm 包最小化设置
  • 记一次和乔布斯合作最难忘的经历
  • 巧用 TypeScript (一)
  • 让你的分享飞起来——极光推出社会化分享组件
  • 使用 @font-face
  • 使用 QuickBI 搭建酷炫可视化分析
  • ​flutter 代码混淆
  • # 安徽锐锋科技IDMS系统简介
  • #### go map 底层结构 ####
  • #pragma once与条件编译
  • $L^p$ 调和函数恒为零
  • (C语言)深入理解指针2之野指针与传值与传址与assert断言
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (二)基于wpr_simulation 的Ros机器人运动控制,gazebo仿真
  • (附源码)基于SpringBoot和Vue的厨到家服务平台的设计与实现 毕业设计 063133
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (一)kafka实战——kafka源码编译启动
  • (正则)提取页面里的img标签
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .CSS-hover 的解释
  • .mysql secret在哪_MySQL如何使用索引
  • .net core 控制台应用程序读取配置文件app.config