前言

  西门子PLC、台达PLC、法兰克机床等等多年以前玩得比较多,有tcp/ip通讯也有modbus通讯,modbus又分为网络,485,232等。
  医疗项目,焊接机器人项目,工控机床项目,数控项目,物联网项目用的挺多的,将关键的通信技术抽离出来,单独弄成工具。

 

需求

  与各种其他行业仪器通讯软件开发的通讯核心模块,modbus功能模块,制作成调试工具,可满足一般情况的调试。
  1.支持通过串口232,485端口进行通讯;
  2.支持设置打开端口的参数;
  3.支持写入bool,int,dInt,real,dReal参数类型数据;
  4.支持读取bool,int,dInt,real,dReal参数类型数据;
  5.增加10种主题风格切换(仅用于预选择主题风格);

 

Demo

  
  
  
  

 

工具下载地址

  CSDN(0积分下载):https://download.csdn.net/download/qq21497936/19236703
QQ群:1047134658(点击“文件”搜索“plcModbus ”,群内与博文同步更新)

 

十种主题风格切换

  

 

相关头文件源码

PlcModbusMasterWidget.h

#ifndef PLCMODBUSMASTERWIDGET_H
#define PLCMODBUSMASTERWIDGET_H #include <QWidget>
#include <QThread>
#include <QDateTime>
#include <QElapsedTimer>
#include <QHash>
#include <QFile>
#include <QMessageBox>
#include <QAbstractButton>
#include "ModbusManager.h" namespace Ui {
class PlcModbusMasterWidget;
} class PlcModbusMasterWidget : public QWidget
{
Q_OBJECT public:
explicit PlcModbusMasterWidget(QWidget *parent = 0);
~PlcModbusMasterWidget(); protected slots:
void slot_opened(bool opened);
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); protected slots:
void slot_buttonClicked(int index); private slots:
void on_pushButton_open_clicked();
void on_pushButton_close_clicked();
void on_pushButton_read_clicked();
void on_pushButton_write_clicked();
void on_pushButton_clearM_clicked(); private:
Ui::PlcModbusMasterWidget *ui; QThread *_pModbusManagerThread;
QElapsedTimer _elapsedTimer; QHash<int, QString> _hashInt2Str;
}; #endif // PLCMODBUSMASTERWIDGET_H

ModbusManager.h

#ifndef MODBUSMANAGER_H
#define MODBUSMANAGER_H #include <QObject>
#include <QMutex> class ModbusManager : public QObject
{
Q_OBJECT
private:
explicit ModbusManager(QObject *parent = 0); public:
bool testEnvAndRtu(); public:
static ModbusManager *getInstance(); public:
void setPortName(const QString &portName);
void setBaud(int baud);
void setParity(char parity);
void setDataBit(int dataBit);
void setStopBit(int stopBit);
void setTimeOutMs(int timeOutMs);
void setSlaveAddr(int slaveAddr); public:
QString getPortName() const;
int getBaud() const;
char getParity() const;
int getDataBit() const;
int getStopBit() const;
int getTimeOutMs() const;
int getSlaveAddr() const; signals:
void signal_opened(bool opened); 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_open();
void slot_close(); 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 ModbusManager *_pInstance;
static QMutex _mutex; private:
QString _portName;
int _baud;
char _parity;
int _dataBit;
int _stopBit;
int _timeOutMs;
int _slaveAddr; private:
bool _running;
bool _opened;
}; #endif // MODBUSMANAGER_H
 

若该文为原创文章,转载请注明原文出处
本文章博客地址:https://blog.csdn.net/qq21497936/article/details/117398968

案例分享:Qt modbus485调试工具(读写Byte、Int、DInt、Real、DReal)(当前v1.3.0)的更多相关文章

  1. 案例分享:Qt西门子机床人机界面以及数据看板定制(西门子通讯,mysql数据库,生产信息,参数信息,信息化看板,权限控制,播放器,二维图表,参数调试界面)

    若该文为原创文章,转载请注明原文出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/118685521 长期持续带来更多项目与技术分享 ...

  2. 案例分享:Qt+Arm基于RV1126平台的内窥镜软硬整套解决方案(实时影像、冻结、拍照、录像、背光调整、硬件光源调整,其他产品也可使用该平台,如视频监控,物联网产品等等)

    自研产品系列方案   1. 基于瑞芯微的 RV1126 芯片平台:  2. 外接 USB 摄像头(OV9734. OV6946.OV2740 等 UVC 模块)作为图像输入源:  3. 可通过 LED ...

  3. 案例分享:Qt政务标签设计器,标签排版软件定制与打印

    需求   1.标签设计器:  2.具备文字排版功能:  3.支持六种排版格式:  4.排版后可以输出打印(demo中不包含):  5.排版后可以输出标签的指定协议文本FBD格式:  6.可以调整对应标 ...

  4. ArcGIS Add-in插件开发从0到1及实际案例分享

    同学做毕设,要求我帮着写个ArcGIS插件,实现功能为:遍历所有图斑,提取相邻图斑的公共边长及其他属性(包括相邻图斑的ID),链接到属性表中.搞定后在这里做个记录.本文分两大部分: ArcGIS插件开 ...

  5. 老李案例分享:定位JAVA内存溢出

    老李案例分享:定位JAVA内存溢出   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.在poptest的loadrunner的培 ...

  6. mysql的"双1设置"-数据安全的关键参数(案例分享)

    mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...

  7. MySQL数据库详解之"双1设置"的数据安全的关键参数案例分享

    mysql的"双1验证"指的是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,这两个是是控制MySQL 磁盘写入策略以及数据安全性 ...

  8. Elasticsearch Sliced Scroll分页检索案例分享

    面试:你懂什么是分布式系统吗?Redis分布式锁都不会?>>>   The best elasticsearch highlevel java rest api-----bboss ...

  9. Office 2010 KMS激活原理和案例分享

    Office 2010 KMS激活原理和案例分享     为了减低部署盗版(可能包含恶意软件.病毒和其他安全风险)的可能性,Office 2010面向企业客户推出了新的批量激活方式:KMS和MAK.这 ...

随机推荐

  1. Git分支及其协同开发

    目录 Git分支 Git是如何保存数据的 Git分支的本质 Git分支的操作 远程仓库与本地仓库分支开发 一个项目多个远程仓库 远程仓库操作命令 协同开发 Git flow工作流 GitLub安装搭建 ...

  2. 死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理

    该系列文章是本人在学习 Spring 的过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring 源码分析 GitHub 地址 进行阅读. Spring 版本:5.1 ...

  3. day18.进程2

    1 进程调度算法(了解) -先来先服务调度算法 -短作业优先调度算法 -时间片轮转法 -多级反馈队列 2 同步异步,阻塞非阻塞(了解) 1 同步调用:提交了以后,一直等待结果返回 2 异步调用:提交了 ...

  4. Day15_87_通过反射机制获取某个特定的方法

    通过反射机制获取某个特定的方法 反射是通过 方法名+形参列表来区分各个方法的(形参列表要用class类型.加.class) 示例代码 import java.lang.reflect.Method; ...

  5. kuberadm集群升级

    升级kubernetes集群 注意不能跨版本升级 比如1.13.x 要先升级到1.14.x,不能直接升级到1.15.x 举例说明升级到1.15,和1.14有些参数不一样,具体看官网: https:// ...

  6. 拓扑排序详解(梅开二度之dfs版按字典序输出拓扑路径+dfs版输出全部拓扑路径

    什么是拓扑排序? 先穿袜子再穿鞋,先当孙子再当爷.这就是拓扑排序! 拓扑排序说白了其实不太算是一种排序算法,但又像是一种排序(我是不是说了个废话qwq) 他其实是一个有向无环图(DAG, Direct ...

  7. 【死磕JVM】看完这篇我也会排查JVM内存过高了 就是玩儿!

    前言 CPU 是时分的,操作系统里面有很多线程,每个线程的运行时间由CPU决定,CPU会分给每一个线程一个时间片,时间片是一个很短的时间长度,如果在时间片内,线程一直占有,就是100%,我们应该意识到 ...

  8. Android埋点技术概览

    注:本文同步发布于微信公众号:stringwu的互联网杂谈Android无埋点技术概览 本文是Android无埋点系列的开篇---埋点技术概览 1 背景 埋点是数据产品经理(分析师)基于业务需求,对用 ...

  9. 【JDK8】Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  10. hdu4287 水题

    题意:          水题,就是给你一些单词,和一些按键记录,问打出下面的那些单词,每一个按键记录一共按了多少次. 思路:       直接把每个单词的每一位转换成数字,然后再把每个单词转换的数字 ...