fix: 修复放电功能相关的若干问题

1. 修改apps/chrg/applications/utils/chrg_sink.c:
   - 调整寄存器数组长度,新增继电器控制相关的初始化配置
   - 在放电初始化前先关闭所有功率板继电器
2. 修改apps/chrg/applications/thread/chrg_north.c:
   - 修复变量类型不匹配问题,将uint8_t改为rt_uint8_t
   - 新增参数合法性校验逻辑,避免空指针和越界访问
   - 新增电压状态标记,仅在电压有效后才将低压视为故障
   - 修复无符号整数溢出问题,避免电压差值计算异常
   - 优化电流异常时的状态机切换逻辑
   - 非工作状态下重置所有状态标记
This commit is contained in:
yhf
2026-07-18 23:01:25 +08:00
parent 1b72b7bb78
commit ee76d8782d
3 changed files with 167 additions and 11 deletions
+28 -5
View File
@@ -208,8 +208,14 @@ void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
struct chrg_switch_t *pSW, struct chrg_north_t *pNOR)
{
rt_uint16_t volt_mv = ((frame_data[4] << 8) | frame_data[5]) * 10;
static uint8_t volt_low[TOTAL_SOU_CHS] = {0};
static uint8_t no_curr[TOTAL_SOU_CHS] = {0};
static rt_uint8_t volt_low[TOTAL_SOU_CHS] = {0};
static rt_uint8_t no_curr[TOTAL_SOU_CHS] = {0};
static rt_uint8_t volt_set_ok[TOTAL_SOU_CHS] = {0};
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
return;
}
pSW->VZ = ((frame_data[14] << 8) | frame_data[15]);
pSW->VF = ((frame_data[16] << 8) | frame_data[17]);
@@ -220,25 +226,42 @@ void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
if(pSW->sink.On_work == 1 && pSW->sink.test.test_mode == 0) {
if (volt_mv <= WORK_MIN_VOLT) { // 电压过低,禁止进入工作状态机
// volt_low[idx]++;
/* Treat low voltage as a fault only after voltage was once valid. */
if (volt_set_ok[idx] == 1) {
if (++volt_low[idx] >= 5) {
volt_set_ok[idx] = 0;
no_curr[idx] = 0;
pSW->sink.work_mode = SINK_WORK_LOW;
}
}
// if(volt_low[idx]>=5) pSW->sink.work_on_step = SINK_WORK_LOW; // 复位工作状态机
}
else{ // 电压稳定时执行工作状态机(继电器/工作模式切换)
volt_low[idx] = 0;
volt_set_ok[idx] = 1;
pSW->change_flag = 0;
if((pSW->sink.pro_loadv - volt_mv) <= 2000){
/* Avoid unsigned underflow when actual voltage is above target. */
if ((rt_uint32_t)volt_mv + 2000 >= pSW->sink.pro_loadv) {
pSW->sink.work_mode = SINK_WORK_RUNING;
/* Voltage is normal but current is still zero: retry from WAIT. */
if (pSW->Now_current <= 200) {
if(no_curr[idx]++>=5){
if (++no_curr[idx] >= 5) {
pSW->sink.work_mode = SINK_WORK_WAIT;
no_curr[idx] = 0;
}
}
else no_curr[idx] = 0;
else {
no_curr[idx] = 0;
}
} else {
no_curr[idx] = 0;
}
}
}
else{
volt_low[idx] = 0;
no_curr[idx] = 0;
volt_set_ok[idx] = 0;
// pSW->sink.work_on_step = SINK_WORK_STOP; // 复位工作状态机
}
chrg_sink_work(idx,pSW);
+5 -2
View File
@@ -448,8 +448,8 @@ static int chrg_sink_work_init(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
{
struct chrg_south_t *pSOU = &chrgsouth;
struct chrg_north_t *pNOR = &chrgnorth;
rt_uint16_t regs[3] = {REG_CURRENT_OUT + 1, REG_MODE, 0};
rt_uint16_t vals[3] = {0, pSW->CV_mode, 0};
rt_uint16_t regs[4] = {REG_CURRENT_OUT + 1, REG_MODE, 0, 0};
rt_uint16_t vals[4] = {0, pSW->CV_mode, 0, 0};
rt_uint8_t count = 2;
if (pSW->sink.test.test_mode_old == 1) {
@@ -459,6 +459,9 @@ static int chrg_sink_work_init(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
regs[count] = ModbusRTU_DYNA_CMD_MODE_FLAG;
vals[count++] = ModbusRTU_DYNA_CMD_MODE_STOP;
}
/* Close both power-board relays before starting sink init. */
regs[count] = REG_REL_ON;
vals[count++] = ALL_REL_OFF;
if (chrg_sou_com_batch_submit(idx, regs, vals, count) != 0) {
return -1;
}
+130
View File
@@ -0,0 +1,130 @@
*** Using Compiler 'V6.16', folder: 'D:\Program Files\Keil_v5\ARM\ARMCLANG\Bin'
Rebuild target 'chrg'
compiling main.c...
compiling chrg_switch.c...
compiling chrg_wdt.c...
compiling chrg_gpio.c...
compiling chrg_tmr.c...
compiling chrg_fal.c...
compiling chrg_tty.c...
compiling chrg_led.c...
compiling chrg_vcom.c...
compiling chrg_rel.c...
compiling chrg_roll_nor.c...
compiling chrg_north.c...
compiling chrg_south.c...
compiling chrg_comm.c...
compiling chrg_roll_sou.c...
compiling chrg_lcd.c...
compiling chrg_thread.c...
compiling chrg_source.c...
compiling chrg_sink.c...
compiling chrg_north_pkg.c...
compiling chrg_eload.c...
compiling chrg_utils.c...
compiling syscall_mem.c...
compiling syscalls.c...
compiling cctype.c...
compiling cstdlib.c...
compiling cstring.c...
compiling ctime.c...
compiling cunistd.c...
compiling cwchar.c...
compiling device.c...
compiling hwtimer.c...
compiling completion_comm.c...
compiling completion_up.c...
compiling condvar.c...
compiling dataqueue.c...
compiling pipe.c...
compiling ringblk_buf.c...
compiling ringbuffer.c...
compiling waitqueue.c...
compiling workqueue.c...
compiling dev_pin.c...
compiling dev_serial.c...
compiling dev_watchdog.c...
compiling stm32f4xx_hal_msp.c...
compiling board.c...
compiling drv_flash_f4.c...
compiling drv_gpio.c...
compiling drv_tim.c...
compiling drv_usart.c...
compiling drv_usbd.c...
compiling drv_wdt.c...
compiling drv_common.c...
compiling fal.c...
compiling fal_flash.c...
compiling fal_partition.c...
compiling fal_rtt.c...
compiling shell.c...
compiling msh_parse.c...
compiling cmd.c...
compiling msh.c...
compiling clock.c...
compiling components.c...
compiling cpu_up.c...
compiling defunct.c...
compiling idle.c...
compiling ipc.c...
compiling irq.c...
compiling kservice.c...
compiling memheap.c...
compiling mempool.c...
compiling object.c...
compiling scheduler_comm.c...
compiling scheduler_up.c...
compiling thread.c...
compiling timer.c...
compiling rt_vsnprintf_tiny.c...
compiling kerrno.c...
compiling kstring.c...
compiling rt_vsscanf.c...
compiling kstdio.c...
compiling atomic_arm.c...
compiling div0.c...
compiling showmem.c...
assembling context_rvds.S...
compiling cpuport.c...
compiling usbdevice.c...
compiling cdc_vcom.c...
compiling usbdevice_core.c...
assembling startup_stm32f405xx.s...
compiling system_stm32f4xx.c...
compiling stm32f4xx_hal_gpio.c...
compiling stm32f4xx_hal_flash.c...
compiling stm32f4xx_hal_usart.c...
compiling stm32f4xx_hal_rng.c...
compiling stm32f4xx_hal_uart.c...
compiling stm32f4xx_hal_wwdg.c...
compiling stm32f4xx_hal_tim.c...
compiling stm32f4xx_hal_cryp_ex.c...
compiling stm32f4xx_hal_pwr.c...
compiling stm32f4xx_hal_rcc.c...
compiling stm32f4xx_hal_hcd.c...
compiling stm32f4xx_ll_usb.c...
compiling stm32f4xx_hal_pccard.c...
compiling stm32f4xx_hal_flash_ex.c...
compiling stm32f4xx_hal_flash_ramfunc.c...
compiling stm32f4xx_hal_tim_ex.c...
compiling stm32f4xx_hal_lptim.c...
compiling stm32f4xx_hal_cec.c...
compiling stm32f4xx_hal_cryp.c...
compiling stm32f4xx_hal.c...
compiling stm32f4xx_hal_iwdg.c...
compiling stm32f4xx_hal_pcd_ex.c...
compiling stm32f4xx_hal_pcd.c...
compiling stm32f4xx_hal_crc.c...
compiling stm32f4xx_hal_dma_ex.c...
compiling stm32f4xx_hal_cortex.c...
compiling stm32f4xx_hal_dma.c...
compiling stm32f4xx_hal_rcc_ex.c...
compiling stm32f4xx_hal_pwr_ex.c...
compiling ulog.c...
compiling console_be.c...
linking...
Program Size: Code=140360 RO-data=15152 RW-data=8544 ZI-data=13712
FromELF: creating hex file...
After Build - User command #1: fromelf --bin .\build\keil\Obj\chrg.axf -o build/chrg.bin
".\build\keil\Obj\chrg.axf" - 0 Error(s), 0 Warning(s).
Build Time Elapsed: 00:00:29