You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

131 lines
3.2 KiB

  1. /******************************************************************************
  2. * Copyright (C) 2025-.
  3. *
  4. * File Name: mymodbus.h
  5. * Description: Modbus RTU协议封装类,支持线圈和寄存器的读写操作
  6. * Others:
  7. * Version: 1.0
  8. * Author: lipengpeng
  9. * Date: 2025-7-23
  10. *
  11. ******************************************************************************/
  12. #ifndef MYMODBUS_H
  13. #define MYMODBUS_H
  14. #include <QObject>
  15. #include <QByteArray>
  16. #include <QVector>
  17. #include <QString>
  18. #include <QtGlobal>
  19. /**
  20. * @class MyModbus
  21. * @brief Modbus RTU协议封装类
  22. *
  23. * 提供Modbus RTU协议的核心功能实现,包括:
  24. * 1. 读线圈/寄存器(功能码0x01/0x03)
  25. * 2. 写多个线圈(功能码0x0F)
  26. * 3. 写多个寄存器(功能码0x10)
  27. * 4. CRC校验计算与验证
  28. * 5. 响应报文解析
  29. *
  30. * @note 使用时需先通过Set()方法设置从站参数
  31. */
  32. class MyModbus : public QObject
  33. {
  34. Q_OBJECT
  35. public:
  36. /**
  37. * @brief 默认构造函数
  38. */
  39. MyModbus(QObject *parent = nullptr);
  40. /**
  41. * @brief 设置Modbus通信参数
  42. * @param stationAddress 从站地址
  43. * @param functionCode 功能码
  44. * @param startAdress 起始地址
  45. * @param length 数据长度
  46. */
  47. bool setStation(quint16 stationAddress, quint16 functionCode,
  48. quint16 startAdress, quint16 length);
  49. /**
  50. * @brief 生成读线圈/寄存器命令
  51. *
  52. * 根据当前参数生成读取命令(功能码01或03)
  53. */
  54. void readCoilAndReg();
  55. /**
  56. * @brief 生成写多个线圈命令
  57. * @param coils 要写入的线圈状态数组
  58. */
  59. void writeCoil(QVector<bool> &coils);
  60. /**
  61. * @brief 生成写多个寄存器命令
  62. * @param values 要写入的寄存器值数组
  63. */
  64. void writeRegister(QVector<quint16> &values);
  65. /**
  66. * @brief 获取待发送的命令报文
  67. * @return 完整的Modbus命令报文
  68. */
  69. QByteArray sendCommand();
  70. /**
  71. * @brief 处理接收到的响应报文
  72. * @param revMessage 接收到的原始报文
  73. * @return 通过CRC校验的有效报文
  74. */
  75. QByteArray receive(const QByteArray &revMessage);
  76. /**
  77. * @brief 检查响应报文中的错误码
  78. * @return 0表示正常,非0表示异常码
  79. */
  80. quint8 errorCheck();
  81. /**
  82. * @brief 解析读线圈响应报文
  83. * @return 线圈状态数组
  84. */
  85. QVector<bool> analReadCoil();
  86. /**
  87. * @brief 解析读寄存器响应报文
  88. * @return 寄存器值数组
  89. */
  90. QVector<quint16> analReadReg();
  91. /**
  92. * @brief 计算CRC校验值
  93. * @param data 待计算的数据
  94. * @return CRC校验值
  95. */
  96. quint16 calculateCrc(const QByteArray &data);
  97. /**
  98. * @brief 校验报文的CRC值
  99. * @param data 待校验的报文
  100. * @return true表示校验通过,false表示校验失败
  101. */
  102. bool crcCheck(const QByteArray &data);
  103. private:
  104. quint16 stationAddress_; // 从站地址
  105. quint16 functionCode_; // 功能码
  106. quint16 startAddress_; // 起始地址
  107. quint16 length_; // 数据长度
  108. QByteArray sendCommand_; // 待发送的命令报文
  109. QByteArray receive_; // 接收到的响应报文
  110. };
  111. #endif // MYMODBUS_H