Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 

129 lignes
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. public:
  34. /**
  35. * @brief 默认构造函数
  36. */
  37. MyModbus();
  38. /**
  39. * @brief 设置Modbus通信参数
  40. * @param stationAddress 从站地址
  41. * @param functionCode 功能码
  42. * @param startAdress 起始地址
  43. * @param length 数据长度
  44. */
  45. void Set(quint16 stationAddress, quint16 functionCode,
  46. quint16 startAdress, quint16 length);
  47. /**
  48. * @brief 生成读线圈/寄存器命令
  49. *
  50. * 根据当前参数生成读取命令(功能码01或03)
  51. */
  52. void ReadCoilAndReg();
  53. /**
  54. * @brief 生成写多个线圈命令
  55. * @param coils 要写入的线圈状态数组
  56. */
  57. void WriteCoil(QVector<bool> &coils);
  58. /**
  59. * @brief 生成写多个寄存器命令
  60. * @param values 要写入的寄存器值数组
  61. */
  62. void WriteRegister(QVector<quint16> &values);
  63. /**
  64. * @brief 获取待发送的命令报文
  65. * @return 完整的Modbus命令报文
  66. */
  67. QByteArray SendCommand();
  68. /**
  69. * @brief 处理接收到的响应报文
  70. * @param revMessage 接收到的原始报文
  71. * @return 通过CRC校验的有效报文
  72. */
  73. QByteArray Receive(const QByteArray &revMessage);
  74. /**
  75. * @brief 检查响应报文中的错误码
  76. * @return 0表示正常,非0表示异常码
  77. */
  78. int ErrorCheck();
  79. /**
  80. * @brief 解析读线圈响应报文
  81. * @return 线圈状态数组
  82. */
  83. QVector<bool> AnalReadCoil();
  84. /**
  85. * @brief 解析读寄存器响应报文
  86. * @return 寄存器值数组
  87. */
  88. QVector<quint16> AnalReadReg();
  89. /**
  90. * @brief 计算CRC校验值
  91. * @param data 待计算的数据
  92. * @return CRC校验值
  93. */
  94. quint16 CalculateCrc(const QByteArray &data);
  95. /**
  96. * @brief 校验报文的CRC值
  97. * @param data 待校验的报文
  98. * @return true表示校验通过,false表示校验失败
  99. */
  100. bool CrcCheck(const QByteArray &data);
  101. private:
  102. quint16 stationAddress_; // 从站地址
  103. quint16 functionCode_; // 功能码
  104. quint16 startAdress_; // 起始地址
  105. quint16 length_; // 数据长度
  106. QByteArray sendCommand_; // 待发送的命令报文
  107. QByteArray receive_; // 接收到的响应报文
  108. };
  109. #endif // MYMODBUS_H