Files
chrg/apps/chrg/applications/utils/chrg_eload.h
T
wrh b58b47f64a chrg: 完成V1.1.31版本迭代更新
1.  更新各文件版本号至V1.1.31,固件版本寄存器设为0x012F
2.  南向通道选通:仅在GPIO选通成功后才更新物理通道缓存
3.  重构寄存器地址解码逻辑,统一0x06/0x10功能码的地址校验
4.  新增功率板短路/OCP/动态测试状态定义0x05/0x06/0x07
5.  移除电流命令覆盖逻辑,改为按顺序排队等待回码
6.  优化轮询线程:每次发送前重新选通通道,选通失败则跳过当前任务
7.  新增测试态退出确认流程,初始化和关机时需确认功率板退出测试态
8.  增加跨通道写入保护,拒绝多寄存器写跨通道操作
9.  补充多处中文注释,优化调试日志输出格式
2026-09-17 12:05:37 +08:00

338 lines
13 KiB
C

/****************************************************************************
文件名称 : chrg_eload.h
完成日期 :
当前版本号 : V1.1.28
主要功能 : 源载命令数据解析,封装,读写请求,寄存器定义,数据结构定义。
版本历史 : 创建原始版本
说明 :
******************************************************************************/
#ifndef __CHRG_ELOAD_H__
#define __CHRG_ELOAD_H__
#include <rtthread.h>
#include "chrg_def.h"
//显示的类别
#define SHOW_STATUS 0x00
#define SHOW_VOLT 0x01
#define SHOW_CURR 0x02
#define SHOW_RIPPLE 0x03
#define SHOW_DZF 0x04
// 恒压
static const rt_uint8_t CV[29] = {
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
0x43, 0x48, 0x31, 0x5F, 0x52, 0x75, 0x6E, 0x5F, 0x53, 0x74, 0x61,
0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xBA, 0xE3, 0xD1, 0xB9, 0x22
};
// 恒流
static const rt_uint8_t CC[29] = {
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
0x43, 0x48, 0x31, 0x5F, 0x52, 0x75, 0x6E, 0x5F, 0x53, 0x74, 0x61,
0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xBA, 0xE3, 0xC1, 0xF7, 0x22
};
// 停止
static const rt_uint8_t STOP[29] = {
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
0x43, 0x48, 0x31, 0x5F, 0x52, 0x75, 0x6E, 0x5F, 0x53, 0x74, 0x61,
0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xCD, 0xA3, 0xD6, 0xB9, 0x22
};
// 电源
static const rt_uint8_t SOURCE[30] = {
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
0x43, 0x48, 0x31, 0x5F, 0x46, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F,
0x6E, 0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xB5, 0xE7, 0xD4, 0xB4, 0x22
};
// 负载
static const rt_uint8_t LOAD[30] = {
0x73,0x74,0x61,0x74,0x75,0x73,0x2E,
0x43, 0x48, 0x31, 0x5F, 0x46, 0x75, 0x6E, 0x63, 0x74, 0x69, 0x6F,
0x6E, 0x2E, 0x74, 0x78, 0x74, 0x3D, 0x22, 0xB8, 0xBA, 0xD4, 0xD8, 0x22
};
//寄存器
#define MB_REGISTER_RD (0x03) // 读寄存器
#define MB_REGISTER_WR (0x06) // 写寄存器
#define MB_REGISTER_MORE_WR (0x10) // 写多个寄存器
#define REG_STA1 (0x00) // R 16bit 工作状态1
#define STA1_CHARGING (0x00) // 预充电中
#define STA1_READY (0x01) // 就绪/停止
#define STA1_RUNNING (0x02) // 运行
#define STA1_FAULT (0x03) // 故障
#define STA1_SHORT_TEST (0x05) // 短路测试中
#define STA1_OCP_TEST (0x06) // OCP测试中
#define STA1_DYNA_TEST (0x07) // 动态测试中
#define REG_CV 0X07 // 电压地址
#define REG_REL_ON (0X01) // 主继电器控制寄存器
#define ALL_REL_OFF (0X00) // 关闭主继电器
#define MAIN_REL_ON (0X01) // 打开主继电器(关闭滤波继电器)
#define FU_REL_ON (0X02) // 打开副继电器(关闭主继电器)
#define ALL_REL_ON (0X03) // 打开俩个继电器
#define REG_STA2 (0x01) // R 16bit 工作状态2
#define STA2_PRE_REL_CLOSE (1<<0) // 预充继电器闭合
#define STA2_MAIN_REL_CLOSE (1<<1) // 主继电器闭合
#define REG_FAULT1 (0x02) // R 16bit 故障状态1
#define FAULT1_LOW_IN_VOL (1<<0) // 输入欠压
#define FAULT1_OVER_IN_VOL (1<<1) // 输入过压
#define FAULT1_OVER_IN_CUR (1<<2) // 输入过流
#define FAULT1_OVER_OUT_VOL (1<<3) // 输出过压
#define FAULT1_OVER_OUT_CUR (1<<4) // 输出过流
#define REG_FAULT2 (0x03) // R 16bit 故障状态2
#define FALUT2_FLASH (1<<0) // 存储异常
#define REG_ELOAD (0x04) // RW 16bit 源载指令 默认负载
#define ELOAD_SOURCE (0x01) // 电源
#define ELOAD_LOAD (0x02) // 负载
#define REG_WORK (0x05) // W 16bit 工作指令
#define WORK_START (0x01) // 启动
#define WORK_STOP (0x02) // 停止
#define WORK_RESET (0x03) // 故障复位
#define WORK_SAVE (0xAA) // 存储数据到FLASH
#define WORK_RESTORE (0xBB) // 恢复默认参数
#define REG_MODE (0x06) // RW 16bit 工作模式
#define MODE_CONSTANT_VOLTAGE (0x01) // 恒压
#define MODE_CONSTANT_CURRENT (0x02) // 恒流
#define MODE_OPEN_LOOP (0x03) // 开环
#define MODE_CONSTANT_POWER (0x04) // 恒功率
#define MODE_CONSTANT_RESISTANCE (0x05) // 恒阻
#define REG_VOLTAGE_OUT (0x07) // RW 32bit 输出电压 0.001V (0~60V) 默认5V
#define REG_CURRENT_OUT (0x09) // RW 32bit 输出电流 0.001A (0~60A) 默认1A
#define REG_TEMPERATUE (0x0B) // RWP 16bit 读取温度 0.01C (0~100C)
#define REG_VERSION (0x0C) // R 16bit 版本号 0~0xFFFF
#define REG_ADDRESS (0x0D) // RWP 16bit 从机地址
#define REG_SET_VOL (0x0E) // RW 32bit 设定电压
#define REG_SET_CUR (0x10) // RW 32bit 设定电流
#define REG_POWER (0x14) // RW 32bit 功率 0.01W (0~600W)
#define REG_RESISTANCE (0x16) // RW 16bit 电阻 0.001R
#define REG_LIMIT_VOL (0x17) // RW 32bit 电压限值 0.001V (0~60V) 默认48V
#define REG_LIMIT_VUR (0x19) // RW 32bit 电流限值 0.001A (0~60A) 默认10A
#define REG_ADJUST_VOL_K (0x1B) // RWP 16bit 电压矫正K 0~65535 默认4096
#define REG_ADJUST_VOL_B (0x1C) // RWP 16bit 电压矫正B 0~65535 默认0
#define REG_ADJUST_CUR_K (0x1D) // RWP 16bit 电流矫正K 0~65535 默认4096
#define REG_ADJUST_CUR_B (0x1E) // RWP 16bit 电流矫正B 0~65535 默认0
#define REG_VOL_LOOP_KP (0x1F) // RWP float 电压环KP 0.001~100 默认0.1
#define Eload_Start_V_ON 0x20 //10 16寄存器存储电子负载启动电压,负载检测到电压值为启动电压,才开启电子负载;可配
#define REG_VOL_LOOP_KI (0x21) // RWP float 电压环KI 0.001~100 默认0.01
#define REG_CUR_LOOP_KP (0x23) // RWP float 电流环KP 0.001~100 默认0.1
#define REG_CUR_LOOP_KI (0x25) // RWP float 电流环KI 0.001~100 默认0.01
#define REG_POWER_LOOP_KP (0x27) // RWP float 功率环KP 0.001~100 默认0.1
#define REG_POWER_LOOP_KI (0x29) // RWP float 功率环KI 0.001~100 默认0.01
#define REG_RESIS_LOOP_KP (0x2B) // RWP float 恒阻环KP 0.001~100 默认0.1
#define REG_RESIS_LOOP_KI (0x2D) // RWP float 恒阻环KI 0.001~100 默认0.01
#define REG_TEMP_PROTECT (0x2F) // RWP 16bit 温度保护值 0.01C (60~100C) 默认90C
#define RESET_NORTH_ADDR 0xF0 // 北向复位地址
#define RESET_NORTH_VALUE 0x0001 // 北向复位值
#define RESET_SOUTH_ADDR 0xE0 // 南向复位地址
#define RESET_SOUTH_VALUE 0x61 //南向复位值
typedef enum {
MB_R_PART1 = 0, // 寄存器分段1
MB_R_PART2, // 寄存器分段2
TOTAL_MB_R
} eIDX_MB_PART;
/* South board firmware version register: one 16-bit register at 0x0301. */
#define MODBUSRTU_SW_VERSION_REG 0x0301U
#define MODBUSRTU_SW_VERSION_LEN 1U
#define SIZE_P1_RD 19 // 读19个寄存器
#define SIZE_P2_RD 28 // 读28个寄存器
#pragma pack(push,1)
struct eload_p1_t {
rt_uint16_t status1; // reg0
rt_uint16_t status2; // reg1
rt_uint16_t fault1; // reg2
rt_uint16_t fault2; // reg3
rt_uint16_t eload; // reg4
rt_uint16_t work_cmd; // reg5
rt_uint16_t work_mode; // reg6
rt_uint32_t voltage; // reg7-8
rt_uint32_t current; // reg9-10
rt_uint16_t SHORT_volt; // reg11
rt_uint16_t SHORT_curr; // reg12
rt_uint16_t OCP_volt; // reg13
rt_uint16_t OCP_curr; // reg14
rt_uint16_t Vpkp; // reg15
rt_uint16_t Vpkn; // reg16
rt_uint16_t Vpp; // reg17
rt_uint16_t Ripple; // reg18
};
struct eload_p2_t {
rt_uint32_t power; // reg20-21
rt_uint16_t resistance; // reg22
rt_uint32_t limit_vol; // reg23-24
rt_uint32_t limit_cur; // reg25-26
rt_uint16_t adj_vol_k; // reg27
rt_uint16_t adj_vol_b; // reg28
rt_uint16_t adj_cur_k; // reg29
rt_uint16_t adj_cur_b; // reg30
rt_uint32_t loop_vol_kp; // reg31-32 float
rt_uint32_t loop_vol_ki; // reg33-34 float
rt_uint32_t loop_cur_kp; // reg35-36 float
rt_uint32_t loop_cur_ki; // reg37-38 float
rt_uint32_t loop_pwr_kp; // reg39-40 float
rt_uint32_t loop_pwr_ki; // reg41-42 float
rt_uint32_t loop_resis_kp; // reg43-44 float
rt_uint32_t loop_resis_ki; // reg45-46 float
rt_uint16_t temperature; // reg47
};
struct chrg_eload_t {
rt_uint16_t status1; // 工作状态1
rt_uint16_t status2; // 工作状态2
rt_uint16_t fault1; // 故障状态1
rt_uint8_t fault2; // 故障状态2
rt_uint8_t eload; // 源载 1:电源 2:负载
rt_uint8_t work; // 工作指令
rt_uint8_t mode; // 工作模式
rt_uint32_t voltage; // 电压
rt_uint32_t current; // 电流
rt_uint16_t SHORT_volt;// 短路电压
rt_uint16_t SHORT_curr;// 短路电流
rt_uint16_t OCP_volt; //OCP电压
rt_uint16_t OCP_curr; //OCP电流
rt_uint16_t vpkp; //量测正峰值
rt_uint16_t vpkn; //量测负峰值
rt_uint16_t vpp; //量测峰峰值
rt_uint16_t Ripple; //读取纹波
};
#pragma pack(pop)
/*****************************************************************
函数名称: chrg_eload_read_regs
函数描述: 向南向发送读取寄存器
输入参数: addr:地址 reg:寄存器起始地址 len:寄存器个数
输出参数: -
返回说明: <0: 错误 >0:发送数据长度
其它说明: -
*****************************************************************/
extern int chrg_eload_read_regs (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t len);
/*****************************************************************
Function: chrg_eload_read_version
Description: Request the south board firmware version register.
Input: addr: south board address
Output: -
Return: <0: error, >0: sent length
*****************************************************************/
extern int chrg_eload_read_version (rt_uint8_t addr);
/*****************************************************************
函数名称: chrg_eload_write_reg
函数描述: 向南向发送写单个寄存器
输入参数: addr:地址 reg:寄存器地址 value:写入值
输出参数: -
返回说明: <0: 错误 >0:发送数据长度
其它说明: -
*****************************************************************/
extern int chrg_eload_write_reg (rt_uint8_t addr, rt_uint16_t reg, rt_uint16_t value);
/*****************************************************************
函数名称: chrg_eload_refresh
函数描述: 分段请求读取寄存器表
输入参数: addr:地址 part:分段
输出参数: -
返回说明: <0: 错误 >0:发送数据长度
其它说明: 实际运行过程只需要读取前13个寄存器即可,即分段0
*****************************************************************/
extern int chrg_eload_refresh (rt_uint8_t addr, rt_uint8_t part);
/*****************************************************************
函数名称: chrg_eload_parse
函数描述: 解析源载返回数据
输入参数: idx:通道 pt:分段0 *data:数据区 len:数据长度
输出参数: -
返回说明: <0: 错误 0:正确
其它说明: -
*****************************************************************/
extern int chrg_eload_parse (rt_uint8_t idx, rt_uint8_t pt, rt_uint8_t *data, rt_uint16_t len);
/*****************************************************************
Function: chrg_eload_parse_version
Description: Parse and store a valid south board firmware version.
Input: idx: channel, data: Modbus response, len: response length
Output: firmware version is stored at the channel version register
Return: 0: valid, <0: invalid response
*****************************************************************/
extern int chrg_eload_parse_version (rt_uint8_t idx, rt_uint8_t *data, rt_uint16_t len);
/*****************************************************************
函数名称: chrg_eload_get_sample_seq
函数描述: 获取指定南向通道P1量测数据的更新序号
输入参数: idx:南向功率板通道
输出参数: -
返回说明: 当前通道量测序号,通道非法时返回0
其它说明: 每成功解析一帧P1数据后递增,用于区分控制命令前后的新旧量测
*****************************************************************/
extern rt_uint32_t chrg_eload_get_sample_seq(rt_uint8_t idx);
extern void chrg_eload_ripple_filter_reset(rt_uint8_t idx);
extern void chrg_eload_ripple_filter_relay_start(rt_uint8_t idx);
extern void chrg_eload_ripple_filter_relay_stop(rt_uint8_t idx);
// 定义2条继电器指令,控制主继电器和滤波继电器(保留原有有效指令,移除未使用的停止指令)
static const rt_uint8_t EXTRA_CMD_SOURCE[8] = {0x03, 0x06, 0x00, 0x01, 0x00, 0x01, 0x18, 0x28};
extern int chrg_eload_send_relay(rt_uint8_t cmd_type);
//写入多寄存器
extern int chrg_eload_write_More_reg(rt_uint8_t addr,
rt_uint16_t reg_start,
rt_uint16_t reg_num,
const rt_uint16_t *data_buf);
extern void chrg_write_cv(rt_uint16_t curr,rt_uint16_t volt);
extern int chrg_eload_send_ymodem_data (rt_uint8_t *buf, rt_uint16_t leng);
/*****************************************************************
函数名称: chrg_eload_set_ymodem_resp / chrg_eload_get_ymodem_resp / chrg_eload_clear_ymodem_resp
函数描述: Ymodem升级时南向板应答字节的存取接口
chrg_roll_sou在RUN_UPDATA模式下捕获南向返回的原始ymodem应答(ACK/NAK/C)
chrg_comm的ymodem_send根据此应答决定给上位机的响应位
输入参数: resp: 南向返回的ymodem应答字节 (ACK=0x06 / NAK=0x15 / 'C'=0x43)
输出参数: get返回当前缓存的应答字节,0表示无应答
返回说明: -
其它说明: -
*****************************************************************/
extern void chrg_eload_set_ymodem_resp(rt_uint8_t resp);
extern rt_uint8_t chrg_eload_get_ymodem_resp(void);
extern void chrg_eload_clear_ymodem_resp(void);
#endif