Modbussimple.h 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #ifndef _MODBUSSIMPLE_H_
  2. #define _MODBUSSIMPLE_H_
  3. #include "main.h"
  4. extern uint8_t Device_addr; // 从设备地址
  5. extern uint32_t g_modbusbuffer[40] ; // 当用DMA发送的时候 帧头要四字节对齐
  6. typedef enum {
  7. MODBUS_TYPE_UINT16,
  8. MODBUS_TYPE_UINT32_BE, // 高字节优先,2个寄存器
  9. MODBUS_TYPE_FLOAT_BE, // float 类型,按 uint32_t 方式输出,2个寄存器
  10. MODBUS_TYPE_OILTYPE
  11. } ModbusDataType;
  12. // 03读指令应答结构体
  13. typedef struct {
  14. uint16_t address; // 寄存器地址
  15. uint8_t length; // 寄存器数量(单位:16位)
  16. ModbusDataType type; // 数据类型
  17. void *data_ptr; // 指向实际数据的指针
  18. } ModbusRegister_t;
  19. extern ModbusRegister_t modbus_map[];
  20. // 06写指令应答结构体
  21. typedef struct {
  22. uint16_t address; // 寄存器地址
  23. bool (*handler)(uint16_t value); // 寄存器处理函数,返回是否应答
  24. } ModbusWriteRegister_t;
  25. extern ModbusWriteRegister_t WriteReg_map[];
  26. // 0x10 写多寄存器映射结构体
  27. typedef struct {
  28. uint16_t start_address; // 起始寄存器地址
  29. uint16_t reg_count; // 占用寄存器数量(比如 float 占 2,字符串占 N)
  30. bool (*handler)(uint16_t *values, void *arg); // 通用处理函数
  31. void *arg; // 额外参数(可以是数组下标、目标变量指针等)
  32. } ModbusWriteMultiRegister_t;
  33. extern ModbusWriteMultiRegister_t WriteMultiReg_map[];
  34. extern size_t REGISTER_MAP_SIZE;
  35. extern size_t MULTI_REGISTER_MAP_SIZE;
  36. uint16_t modbus_crc16(uint8_t *data, uint16_t length) ; // Modbus CRC16(低位在前,高位在后)
  37. bool read_modbus_registers(uint16_t addr, uint16_t len, uint8_t *dest_buf, uint16_t *out_byte_count);
  38. // 将 uint32_t 数组按高字节优先方式拷贝为 Modbus 输出格式(每个 uint32_t 占 4 字节)
  39. void copy_uint32_to_modbus_bytes_be(uint32_t *src, uint16_t start_index, uint16_t word_count, uint8_t *dest_buf, uint16_t *offset) ;
  40. // 功能码 0x03 响应帧(角度浮点数值float)
  41. uint16_t modbus_03response_float(uint8_t device_addr, uint8_t num, float value, uint8_t *out_buf);
  42. // 返回错误响应帧,例如非法功能码、非法地址等错误
  43. uint16_t modbus_error_response(uint8_t addr, uint8_t func_code, uint8_t err_code, uint8_t *buf);
  44. void Set_485_Baudrate(uint16_t baudrate_id);
  45. uint16_t build_modbus_write_cmd(uint8_t device_addr, uint8_t func_code,
  46. uint16_t reg_addr, uint16_t reg_count,
  47. uint16_t *data, uint8_t *out_buf);// Modbus 功能码0x10的写寄存器命令
  48. uint16_t build_modbus_read_cmd(uint8_t device_addr, uint16_t reg_addr, uint16_t reg_num, uint8_t *out_buf) ; // Modbus 读保持寄存器命令帧(功能码 0x03)
  49. #endif