Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

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