#ifndef MYMODBUS_H #define MYMODBUS_H #include #include #include #include /****************************************************************************** * Copyright (C) 2025-. * * File Name: mymodbus.h * Description: Modbus RTU协议封装类,支持线圈和寄存器的读写操作 * Others: * Version: 1.0 * Author: lipengpeng * Date: 2025-7-23 * ******************************************************************************/ /** * @class MyModbus * @brief Modbus RTU协议封装类 * * 提供Modbus RTU协议的核心功能实现,包括: * 1. 读线圈/寄存器(功能码0x01/0x03) * 2. 写多个线圈(功能码0x0F) * 3. 写多个寄存器(功能码0x10) * 4. CRC校验计算与验证 * 5. 响应报文解析 * * @note 使用时需先通过Set()方法设置从站参数 */ class MyModbus { private: quint16 stationAddress_; // 从站地址 quint16 functionCode_; // 功能码 quint16 startAdress_; // 起始地址 quint16 length_; // 数据长度 QByteArray sendCommand_; // 待发送的命令报文 QByteArray receive_; // 接收到的响应报文 public: /** * @brief 默认构造函数 */ MyModbus(); /** * @brief 设置Modbus通信参数 * @param stationAddress 从站地址 * @param functionCode 功能码 * @param startAdress 起始地址 * @param length 数据长度 */ void Set(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表示异常码 */ int 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); }; #endif // MYMODBUS_H