前言
西门子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
相关头文件源码
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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
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
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
- 29.
- 30.
- 31.
- 32.
- 33.
- 34.
- 35.
- 36.
- 37.
- 38.
- 39.
- 40.
- 41.
- 42.
- 43.
- 44.
- 45.
- 46.
- 47.
- 48.
- 49.
- 50.
- 51.
- 52.
- 53.
- 54.
- 55.
- 56.
- 57.
- 58.
- 59.
- 60.
- 61.
- 62.
- 63.
- 64.
- 65.
- 66.
- 67.
- 68.
- 69.
- 70.
- 71.
- 72.
- 73.
- 74.
- 75.
- 76.
- 77.
- 78.
- 79.
- 80.
- 81.
- 82.
- 83.
- 84.
- 85.
- 86.
- 87.
- 88.
- 89.
- 90.
- 91.
- 92.
- 93.
- 94.
- 95.
- 96.