|
- /******************************************************************************
- * Copyright (C) 2025-.
- *
- * File Name: mymodbus.h
- * Description: Modbus RTU协议封装类,支持线圈和寄存器的读写操作
- * Others:
- * Version: 1.0
- * Author: lipengpeng
- * Date: 2025-7-23
- *
- ******************************************************************************/
-
- #ifndef MYMODBUS_H
- #define MYMODBUS_H
-
- #include <QObject>
- #include <QByteArray>
- #include <QVector>
- #include <QString>
- #include <QtGlobal>
-
-
- /**
- * @class MyModbus
- * @brief Modbus RTU协议封装类
- *
- * 提供Modbus RTU协议的核心功能实现,包括:
- * 1. 读线圈/寄存器(功能码0x01/0x03)
- * 2. 写多个线圈(功能码0x0F)
- * 3. 写多个寄存器(功能码0x10)
- * 4. CRC校验计算与验证
- * 5. 响应报文解析
- *
- * @note 使用时需先通过Set()方法设置从站参数
- */
-
- class MyModbus : public QObject
- {
- Q_OBJECT
- public:
- /**
- * @brief 默认构造函数
- */
- MyModbus(QObject *parent = nullptr);
-
- /**
- * @brief 设置Modbus通信参数
- * @param stationAddress 从站地址
- * @param functionCode 功能码
- * @param startAdress 起始地址
- * @param length 数据长度
- */
- bool setStation(quint16 stationAddress, quint16 functionCode,
- quint16 startAdress, quint16 length);
-
- /**
- * @brief 生成读线圈/寄存器命令
- *
- * 根据当前参数生成读取命令(功能码01或03)
- */
- void readCoilAndReg();
-
- /**
- * @brief 生成写多个线圈命令
- * @param coils 要写入的线圈状态数组
- */
- void writeCoil(QVector<bool> &coils);
-
- /**
- * @brief 生成写多个寄存器命令
- * @param values 要写入的寄存器值数组
- */
- void writeRegister(QVector<quint16> &values);
-
- /**
- * @brief 获取待发送的命令报文
- * @return 完整的Modbus命令报文
- */
- QByteArray sendCommand();
-
- /**
- * @brief 处理接收到的响应报文
- * @param revMessage 接收到的原始报文
- * @return 通过CRC校验的有效报文
- */
- QByteArray receive(const QByteArray &revMessage);
-
- /**
- * @brief 检查响应报文中的错误码
- * @return 0表示正常,非0表示异常码
- */
- quint8 errorCheck();
-
- /**
- * @brief 解析读线圈响应报文
- * @return 线圈状态数组
- */
- QVector<bool> analReadCoil();
-
- /**
- * @brief 解析读寄存器响应报文
- * @return 寄存器值数组
- */
- QVector<quint16> analReadReg();
-
- /**
- * @brief 计算CRC校验值
- * @param data 待计算的数据
- * @return CRC校验值
- */
- quint16 calculateCrc(const QByteArray &data);
-
- /**
- * @brief 校验报文的CRC值
- * @param data 待校验的报文
- * @return true表示校验通过,false表示校验失败
- */
- bool crcCheck(const QByteArray &data);
-
- private:
- quint16 stationAddress_; // 从站地址
- quint16 functionCode_; // 功能码
- quint16 startAddress_; // 起始地址
- quint16 length_; // 数据长度
- QByteArray sendCommand_; // 待发送的命令报文
- QByteArray receive_; // 接收到的响应报文
-
- };
-
- #endif // MYMODBUS_H
|