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.
 
 
 
 

226 line
5.5 KiB

  1. /**
  2. * @file modbus.h
  3. * @author zhangcheng
  4. * @brief modbus数据结构文件
  5. * @version v0.1
  6. * @date 2025-07-25
  7. *
  8. * @copyright Copyright (c) 2025
  9. */
  10. #ifndef _MODBUS_H
  11. #define _MODBUS_H
  12. /**
  13. * @brief 线圈寄存器地址映射,数量,占用字节总量
  14. * @details
  15. * @note
  16. * @attention
  17. */
  18. #define COIL_REGISTER_ADRR (0x10000000)
  19. #define COIL_REGISTER_NUMBER (0x2710)
  20. #define COIL_REGISTER_SIZE (1250)
  21. /**
  22. * @brief 数据寄存器地址映射,数量,占用字节总量
  23. * @details
  24. * @note
  25. * @attention
  26. */
  27. #define DATA_REGISTER_ADRR (0x10000000 | 0x04F0)
  28. #define DATA_REGISTER_NUMBER (0x2710)
  29. #define DATA_REGISTER_SIZE (20000)
  30. /**
  31. * @brief 保持寄存器地址映射,数量,占用字节总量
  32. * @details
  33. * @note
  34. * @attention
  35. */
  36. #define KEEP_REGISTER_ADRR (0x40024000)
  37. #define KEEP_REGISTER_NUMBER (0x800)
  38. #define KEEP_REGISTER_SIZE (4096)
  39. /**
  40. * @brief modbus发送数据帧和接收数据帧返回结果
  41. * @details
  42. * @note
  43. * @attention
  44. */
  45. typedef enum {
  46. MODBUS_TURE = 0, ///< 正确
  47. MODBUS_FALSE ///< 错误
  48. } RESUIL;
  49. /**
  50. * @brief modbus操作对象类型
  51. * @details
  52. * @note
  53. * @attention
  54. */
  55. typedef enum {
  56. OPERATE_COIL = 0x00, ///< 线圈
  57. OPERATE_REGISTER = 0x01, ///< 寄存器
  58. } OPERATE_OBJ_TYPE;
  59. /**
  60. * @brief modbus操作类型
  61. * @details
  62. * @note
  63. * @attention
  64. */
  65. typedef enum {
  66. OPERATE_READ = 0x00, ///< 读操作
  67. OPERATE_WRITE = 0x01, ///< 写操作
  68. } OPERATE_TYPE;
  69. /**
  70. * @brief modbus协议格式
  71. * @details
  72. * @note
  73. * @attention
  74. */
  75. typedef enum {
  76. MODBUS_STANDARD = 0, ///< 标准格式
  77. MODBUS_EXT ///< 扩展格式
  78. } MODBUS_FORMAT;
  79. /**
  80. * @brief modbus功能码类型
  81. * @details
  82. * @note
  83. * @attention
  84. */
  85. typedef enum {
  86. READ_COIL = 0x01, ///< 读多个线圈
  87. READ_KEEP_REGISTER = 0x03, ///< 读多个保持寄存器
  88. WRITE_ONE_COIL = 0x05, ///< 写单个线圈
  89. WRITE_COIL = 0x0F, ///< 写多个线圈
  90. WRITE_KEEP_REGISTER = 0x10, ///< 写多个保持寄存器
  91. READ_OUT_SCOPE_REGISTER = 0x64, ///< 读范围外寄存器
  92. READ_ALL_SINGULAR_REGISTER = 0x65, ///< 读所有单数个寄存器
  93. READ_CORRESPONDENCE_HISTORY = 0x66 ///< 读通信历史
  94. } FUNCTION_CODE_TYPE;
  95. /**
  96. * @brief modbus通信历史类型
  97. * @details
  98. * @note
  99. * @attention
  100. */
  101. typedef struct {
  102. uint16_t byteLenght;
  103. uint8_t historyCount;
  104. uint8_t index;
  105. uint8_t data[512];
  106. } CORRESPONDENCE_HISTORY;
  107. /**
  108. * @brief modbus返回错误码类型
  109. * @details
  110. * @note
  111. * @attention
  112. */
  113. typedef enum {
  114. ERROR_NONE = 0, ///< 无错误
  115. ERROR_INVALID_FUNCTION = 0x01, ///< 非法功能
  116. ERROR_INVALID_DATA_ADDR = 0x02, ///< 非法数据地址
  117. ERROR_INVALID_DATA_VALUE = 0x03, ///< 非法数据值
  118. ERROR_SLAVE_DEVICE_FAUIL = 0x04, ///< 从设备故障
  119. ERROR_SLAVE_DEVICE_CONFIRM = 0x05, ///< 从设备确认
  120. ERROR_SLAVE_DEVICE_BUSY = 0x06, ///< 从设备忙
  121. ERROR_SLAVE_DEVICE_NO_ACK = 0x07, ///< 从设备无响应
  122. ERROR_SLAVE_DEVICE_MEM0RY = 0x08, ///< 存储偶然错误
  123. ERROR_DATA_READ_ONLY = 0x09, ///< 只读数据
  124. ERROR_FRAME_FORMAT = 0x10, ///< 帧格式错误
  125. ERROR_DATA_OVER = 0x11 ///< 数据溢出
  126. } ERROR_CODE_TYPE;
  127. /**
  128. * @brief modbus发送帧结构
  129. * @details
  130. * @note
  131. * @attention
  132. */
  133. typedef struct
  134. {
  135. uint8_t deviceNumber; ///< 设备号
  136. uint8_t writeByteLenght; ///< 写入字节长度
  137. uint8_t *data; ///< 数据缓冲区
  138. uint16_t memoryAddr; ///< 起始内存地址
  139. uint16_t readCount; ///< 读取数量
  140. uint16_t writeCount; ///< 写入数量
  141. uint16_t CRCValue; ///< CRC校验值
  142. uint32_t extMemoryAddr; ///< 扩展内存地址
  143. MODBUS_FORMAT format; ///< 协议格式
  144. FUNCTION_CODE_TYPE functionCode; ///< 功能码
  145. } REQUEST_FRAME;
  146. /**
  147. * @brief modbus应答帧结构
  148. * @details
  149. * @note
  150. * @attention
  151. */
  152. typedef struct
  153. {
  154. uint8_t deviceNumber; ///< 设备号
  155. uint8_t *data; ///< 数据缓冲区
  156. uint16_t memoryAddr; ///< 起始内存地址
  157. uint16_t returnByteCount; ///< 返回字节数
  158. uint16_t CRCValue; ///< CRC校验值
  159. uint32_t extMemoryAddr; ///< 扩展内存地址
  160. MODBUS_FORMAT format; ///< 协议格式
  161. FUNCTION_CODE_TYPE functionCode; ///< 功能码
  162. ERROR_CODE_TYPE errorCode; ///< 错误码
  163. OPERATE_OBJ_TYPE operateObjType; ///< 操作对象类型
  164. OPERATE_TYPE operateType; ///< 操作类型
  165. } ACK_FRAME;
  166. /**
  167. * @brief 支持的功能数量
  168. * @details
  169. *
  170. * @param[in] 无
  171. *
  172. * @return 无
  173. */
  174. #define FUNCTION_CODE_NUMBER 8
  175. /**
  176. * @brief 打印提示信息
  177. * @details
  178. *
  179. * @param[in] string 提示信息
  180. *
  181. * @return 无
  182. */
  183. #define MODBUS_LOG(string) //printf("%s%s, %d\r\n", string, __FILE__, __LINE__)
  184. /**
  185. * @brief 断言
  186. * @details
  187. *
  188. * @param[in] x 检测输入参数是否合法
  189. *
  190. * @return 无
  191. */
  192. #define MODBUS_ASSERT(x) if(!x) printf("param error, %s, %d\r\n", __FILE__, __LINE__)
  193. #endif // !_MODBUS_H