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.
 
 
 

129 lines
3.1 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 <QByteArray>
  15. #include <QVector>
  16. #include <QString>
  17. #include <QtGlobal>
  18. /**
  19. * @class MyModbus
  20. * @brief Modbus RTU协议封装类
  21. *
  22. * 提供Modbus RTU协议的核心功能实现,包括:
  23. * 1. 读线圈/寄存器(功能码0x01/0x03)
  24. * 2. 写多个线圈(功能码0x0F)
  25. * 3. 写多个寄存器(功能码0x10)
  26. * 4. CRC校验计算与验证
  27. * 5. 响应报文解析
  28. *
  29. * @note 使用时需先通过Set()方法设置从站参数
  30. */
  31. class MyModbus
  32. {
  33. private:
  34. quint16 stationAddress_; // 从站地址
  35. quint16 functionCode_; // 功能码
  36. quint16 startAdress_; // 起始地址
  37. quint16 length_; // 数据长度
  38. QByteArray sendCommand_; // 待发送的命令报文
  39. QByteArray receive_; // 接收到的响应报文
  40. public:
  41. /**
  42. * @brief 默认构造函数
  43. */
  44. MyModbus();
  45. /**
  46. * @brief 设置Modbus通信参数
  47. * @param stationAddress 从站地址
  48. * @param functionCode 功能码
  49. * @param startAdress 起始地址
  50. * @param length 数据长度
  51. */
  52. void Set(quint16 stationAddress, quint16 functionCode,
  53. quint16 startAdress, quint16 length);
  54. /**
  55. * @brief 生成读线圈/寄存器命令
  56. *
  57. * 根据当前参数生成读取命令(功能码01或03)
  58. */
  59. void ReadCoilAndReg();
  60. /**
  61. * @brief 生成写多个线圈命令
  62. * @param coils 要写入的线圈状态数组
  63. */
  64. void WriteCoil(QVector<bool> &coils);
  65. /**
  66. * @brief 生成写多个寄存器命令
  67. * @param values 要写入的寄存器值数组
  68. */
  69. void WriteRegister(QVector<quint16> &values);
  70. /**
  71. * @brief 获取待发送的命令报文
  72. * @return 完整的Modbus命令报文
  73. */
  74. QByteArray SendCommand();
  75. /**
  76. * @brief 处理接收到的响应报文
  77. * @param revMessage 接收到的原始报文
  78. * @return 通过CRC校验的有效报文
  79. */
  80. QByteArray Receive(const QByteArray &revMessage);
  81. /**
  82. * @brief 检查响应报文中的错误码
  83. * @return 0表示正常,非0表示异常码
  84. */
  85. int ErrorCheck();
  86. /**
  87. * @brief 解析读线圈响应报文
  88. * @return 线圈状态数组
  89. */
  90. QVector<bool> AnalReadCoil();
  91. /**
  92. * @brief 解析读寄存器响应报文
  93. * @return 寄存器值数组
  94. */
  95. QVector<quint16> AnalReadReg();
  96. /**
  97. * @brief 计算CRC校验值
  98. * @param data 待计算的数据
  99. * @return CRC校验值
  100. */
  101. quint16 CalculateCrc(const QByteArray &data);
  102. /**
  103. * @brief 校验报文的CRC值
  104. * @param data 待校验的报文
  105. * @return true表示校验通过,false表示校验失败
  106. */
  107. bool CrcCheck(const QByteArray &data);
  108. };
  109. #endif // MYMODBUS_H