/****************************************************************************** * 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 #include #include #include #include /** * @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 &coils); /** * @brief 生成写多个寄存器命令 * @param values 要写入的寄存器值数组 */ void writeRegister(QVector &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 analReadCoil(); /** * @brief 解析读寄存器响应报文 * @return 寄存器值数组 */ QVector 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