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