增加modbus绑定

This commit is contained in:
冯佳
2025-12-18 22:24:25 +08:00
parent 9773cb5a0a
commit e5eaf2172f
13 changed files with 1443 additions and 216 deletions

View File

@ -131,6 +131,15 @@ MenuErrCode menu_param_set_value(uint16_t param_id, float value);
* @return 错误码
*/
MenuErrCode menu_param_get_value(uint16_t param_id, float* value);
/**
* @brief 获取参数类型
* @param param_id 参数ID
* @param type 输出参数,参数类型
* @return 错误码
*/
MenuErrCode menu_param_get_type(uint16_t param_id, MenuParamType* type);
#endif // MENU_CONFIG_ENABLE_PARAM
#if MENU_CONFIG_ENABLE_LANG
@ -149,4 +158,86 @@ MenuErrCode menu_lang_set_current(uint8_t lang_id);
MenuErrCode menu_lang_get_current(uint8_t* lang_id);
#endif // MENU_CONFIG_ENABLE_LANG
/************************** Modbus映射功能启用时有效 **************************/
#if MENU_CONFIG_ENABLE_MODBUS_MAP
/**
* @brief Modbus寄存器类型符合Modbus协议标准
*/
typedef enum {
MODBUS_REG_TYPE_COIL = 0, ///< 线圈1位地址范围00001-09999
MODBUS_REG_TYPE_DISCRETE_INPUT, ///< 离散输入1位地址范围10001-19999
MODBUS_REG_TYPE_HOLDING_REG, ///< 保持寄存器16位地址范围40001-49999
MODBUS_REG_TYPE_INPUT_REG, ///< 输入寄存器16位地址范围30001-39999
} ModbusRegType;
/**
* @brief Modbus寄存器读写权限
*/
typedef enum {
MODBUS_PERM_READ_ONLY = 0, ///< 只读(如离散输入、输入寄存器)
MODBUS_PERM_WRITE_ONLY, ///< 只写(如线圈)
MODBUS_PERM_READ_WRITE, ///< 读写(如保持寄存器)
} ModbusPerm;
/**
* @brief Modbus映射结构体对外只读内部初始化
*/
typedef struct {
uint16_t param_id; ///< 关联的参数ID
ModbusRegType reg_type; ///< 寄存器类型
uint16_t reg_addr; ///< 寄存器起始地址协议地址如40001
uint8_t reg_count; ///< 占用寄存器数量如32位浮点占2个16位寄存器
ModbusPerm perm; ///< 读写权限
uint8_t byte_order; ///< 字节序0-小端1-大端2-Modbus标准
} ModbusMap;
/**
* @brief 注册参数与Modbus寄存器的映射关系
* @param param_id 参数ID需已通过menu_param_register注册
* @param reg_type 寄存器类型
* @param reg_addr 寄存器起始地址协议地址如40001
* @param reg_count 占用寄存器数量如1:16位2:32位4:64位
* @param perm 读写权限
* @param byte_order 字节序可选默认使用MENU_CONFIG_MODBUS_BYTE_ORDER
* @return 错误码
*/
MenuErrCode menu_modbus_map_register(uint16_t param_id, ModbusRegType reg_type, uint16_t reg_addr, uint8_t reg_count, ModbusPerm perm, uint8_t byte_order);
/**
* @brief 根据参数ID查询Modbus映射关系
* @param param_id 参数ID
* @param map 输出参数,映射关系结构体
* @return 错误码
*/
MenuErrCode menu_modbus_map_query_by_param(uint16_t param_id, ModbusMap* map);
/**
* @brief 根据寄存器地址和类型查询Modbus映射关系
* @param reg_type 寄存器类型
* @param reg_addr 寄存器地址
* @param map 输出参数,映射关系结构体
* @return 错误码
*/
MenuErrCode menu_modbus_map_query_by_reg(ModbusRegType reg_type, uint16_t reg_addr, ModbusMap* map);
/**
* @brief 将参数值写入对应的Modbus寄存器双向转换参数值→寄存器数据
* @param param_id 参数ID
* @param reg_buf 输出参数寄存器数据缓冲区需足够大如32位占2个16位寄存器
* @param buf_len 缓冲区长度(输入),实际写入长度(输出)
* @return 错误码
*/
MenuErrCode menu_modbus_map_param_to_reg(uint16_t param_id, uint8_t* reg_buf, uint8_t* buf_len);
/**
* @brief 将Modbus寄存器数据读取到参数值双向转换寄存器数据→参数值
* @param param_id 参数ID
* @param reg_buf 输入参数,寄存器数据缓冲区
* @param buf_len 缓冲区长度
* @return 错误码
*/
MenuErrCode menu_modbus_map_reg_to_param(uint16_t param_id, const uint8_t* reg_buf, uint8_t buf_len);
#endif // MENU_CONFIG_ENABLE_MODBUS_MAP
#endif // MENU_H