修复了短路测试下由于发送运行时间太短导致1~2持续抢占南向发送
修复了V_ON在运行状态下不能发送新的设置值的问题 chore: 更新版本号并新增运行中修改V_On功能 1. 更新多个文件的版本号至V1.1.14~V1.1.15 2. 新增Sink通道运行中修改V_On时下发Eload_Start_V_ON逻辑 3. 新增Sink电压判定可选来源配置,支持协议板或功率板电压 4. 优化chrg_sink_parse函数,新增实际电压读取和序号更新 5. 调整短路测试补发周期至50ms,移除冗余宏定义 6. 更新修改日志文档,新增V1.1.15版本变更记录 7. 新增协议板YMODEM升级文档
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_comm.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.1.10
|
||||
当前版本号 : V1.1.15
|
||||
主要功能 : 实现对外通讯协议 MODBUS 服务端,以独立线程等待处理响应请求数据。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
@@ -27,7 +27,7 @@
|
||||
#include "stm32f4xx_hal.h"
|
||||
|
||||
#define HOLD_REG_FIRMWARE_VERSION 0x0300U /* 协议板固件版本,只读 */
|
||||
#define CHRG_FIRMWARE_VERSION 0x011AU /* 当前协议板版本:V1.1.10 */
|
||||
#define CHRG_FIRMWARE_VERSION 0x011FU /* 当前协议板版本:V1.1.15 */
|
||||
|
||||
rt_uint8_t ucDiscInBuf[(TOTAL_DISC_REGS+BITS_UCHAR-1)/BITS_UCHAR];
|
||||
rt_uint8_t ucCoilBuf[(TOTAL_COIL_REGS+BITS_UCHAR-1)/BITS_UCHAR];
|
||||
@@ -618,7 +618,7 @@ eMBException funcReadHoldingRegister (rt_uint8_t *reqFrame, rt_uint16_t reqLen,
|
||||
|
||||
/*
|
||||
* 协议板版本号使用独立的只读地址0x0300,不占用现有通道保持寄存器空间。
|
||||
* 当前版本V1.1.10编码为0x011A,Modbus响应按高字节在前返回01 1A。
|
||||
* 当前版本V1.1.15编码为0x011F,Modbus响应按高字节在前返回01 1F。
|
||||
* 该特殊地址只支持一次读取一个寄存器,避免与普通连续寄存器混用。
|
||||
*/
|
||||
if (regAddress == HOLD_REG_FIRMWARE_VERSION) {
|
||||
@@ -2563,6 +2563,7 @@ static eMBException chrg_comm_apply_sink_effect(rt_uint8_t ch,
|
||||
rt_bool_t protocol_voltage_only;
|
||||
rt_bool_t protocol_current_change;
|
||||
rt_bool_t protocol_data_changed;
|
||||
rt_bool_t von_changed;
|
||||
rt_uint8_t curr_test;
|
||||
rt_uint8_t curr_test_old;
|
||||
rt_uint8_t old_cv_mode = pReal->CV_mode;
|
||||
@@ -2587,6 +2588,17 @@ static eMBException chrg_comm_apply_sink_effect(rt_uint8_t ch,
|
||||
!full_handshake_change;
|
||||
protocol_voltage_only = diff_info.pro_voltage_changed &&
|
||||
!full_handshake_change && !protocol_current_change;
|
||||
von_changed = (pReal->sink.volt_on != pShadow->sink.volt_on);
|
||||
if ((sink_work == 0x01) && (old_on_work == 1U) && von_changed) {
|
||||
rt_uint16_t reg = Eload_Start_V_ON;
|
||||
rt_uint16_t val = (pShadow->sink.volt_on <= 500U) ?
|
||||
500U : pShadow->sink.volt_on;
|
||||
|
||||
if (chrg_sou_com_batch_submit((eIDX_SOU_CH)ch, ®,
|
||||
&val, 1U) != 0) {
|
||||
return MB_EX_SLAVE_BUSY;
|
||||
}
|
||||
}
|
||||
rt_memcpy(pReal, pShadow, sizeof(struct chrg_switch_t));
|
||||
|
||||
if (sink_work == 0x01) {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_comm.h
|
||||
完成日期 :
|
||||
当前版本号 : V1.1.10
|
||||
当前版本号 : V1.1.15
|
||||
主要功能 : 实现对外通讯协议 MODBUS 服务端,以独立线程等待处理响应请求数据。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_north.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.1.10
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 实现北向通信交互,包括接收命令解析,发送请求命令,切换通路。以独立线程处理。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
@@ -212,13 +212,13 @@ void chrg_source_setting(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
|
||||
|
||||
/*****************************************************************
|
||||
函数名称: chrg_sink_parse
|
||||
函数描述: 解析北向负载板0x20回码,提取D+/D-电压到VZ/VF
|
||||
函数描述: 解析北向负载板0x20回码,提取实际电压和D+/D-电压
|
||||
输入参数: frame_data:完整北向回码 idx:当前通道 pSW:通道控制结构体
|
||||
pNOR:北向总控结构体
|
||||
输出参数: 更新pSW->VZ(D+)、pSW->VF(D-)
|
||||
输出参数: 更新pSW->Sink_voltage、VZ(D+)、VF(D-)
|
||||
返回说明: -
|
||||
其它说明: Sink电压状态机判定已迁移至chrg_sink_volt_judge,
|
||||
由北向轮询线程基于eload.c更新的Now_voltage驱动
|
||||
其它说明: Sink电压状态机可通过SINK_VON_VOLTAGE_SOURCE选择使用本回码
|
||||
实际电压或功率板实际电压
|
||||
*****************************************************************/
|
||||
void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
|
||||
struct chrg_switch_t *pSW, struct chrg_north_t *pNOR)
|
||||
@@ -227,6 +227,9 @@ void chrg_sink_parse(rt_uint8_t *frame_data, eIDX_SOU_CH idx,
|
||||
return;
|
||||
}
|
||||
|
||||
pSW->Sink_voltage = (rt_uint16_t)(((frame_data[4] << 8) |
|
||||
frame_data[5]) * 10U);
|
||||
pSW->Sink_voltage_seq++;
|
||||
pSW->VZ = ((frame_data[14] << 8) | frame_data[15]);
|
||||
pSW->VF = ((frame_data[16] << 8) | frame_data[17]);
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_north.h
|
||||
完成日期 :
|
||||
当前版本号 : V1.0
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 实现北向通信交互,包括接收命令解析,发送请求命令,切换通路。以独立线程处理。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
@@ -16,6 +16,20 @@
|
||||
#include "chrg_sink.h"
|
||||
#include "chrg_def.h"
|
||||
|
||||
/* V_On启停判定电压源:切换后需重新编译固件。 */
|
||||
#define SINK_VON_VOLTAGE_FROM_PROTOCOL 1U
|
||||
#define SINK_VON_VOLTAGE_FROM_POWER 2U
|
||||
#ifndef SINK_VON_VOLTAGE_SOURCE
|
||||
#define SINK_VON_VOLTAGE_SOURCE SINK_VON_VOLTAGE_FROM_POWER
|
||||
#endif
|
||||
#if (SINK_VON_VOLTAGE_SOURCE != SINK_VON_VOLTAGE_FROM_PROTOCOL) && \
|
||||
(SINK_VON_VOLTAGE_SOURCE != SINK_VON_VOLTAGE_FROM_POWER)
|
||||
#error "Invalid SINK_VON_VOLTAGE_SOURCE"
|
||||
#endif
|
||||
|
||||
/* 南向COM批次中单通道连续收到有效回码后的最大发送条数。 */
|
||||
#define SOU_COM_BURST_MAX 10U
|
||||
|
||||
#define THR_NAME_NORTH "thr.nor"
|
||||
#define DEV_NAME_NORTH "uart3"
|
||||
|
||||
@@ -23,10 +37,10 @@
|
||||
#define MIN_FRAME_LENGTH (5) // 帧最短5字节
|
||||
#define WORK_MIN_VOLT 500 // 工作电压下限,单位mV
|
||||
#define NORTH_FRAME_DEBUG 0x00 // 北向UART原始收发帧
|
||||
#define NORTH_SOURCE_DEBUG 0x01 // Source协议解析及组帧
|
||||
#define NORTH_SINK_DEBUG 0x01 // Sink协议解析及组帧
|
||||
#define NORTH_SOURCE_DEBUG 0x00 // Source协议解析及组帧
|
||||
#define NORTH_SINK_DEBUG 0x00 // Sink协议解析及组帧
|
||||
#define SOUTH_FRAME_DEBUG 0x00 // 南向UART原始收发帧
|
||||
#define SOUTH_COMMAND_DEBUG 0x00 // 南向寄存器写命令
|
||||
#define SOUTH_COMMAND_DEBUG 0x01 // 南向寄存器写命令
|
||||
#define COMM_FRAME_DEBUG 0x00 // COM UART原始收发帧
|
||||
#define COMM_DEBUG 0x00 // COM寄存器读写过程
|
||||
#define COMM_TRIM_DEBUG 0x00 // COM校准参数解析
|
||||
@@ -56,6 +70,8 @@ struct chrg_switch_t {
|
||||
rt_uint8_t change_flag; //正在调整功率标志位
|
||||
rt_uint16_t Now_voltage; // 当前电压 mV
|
||||
rt_uint16_t Now_current; // 当前电流 mA
|
||||
rt_uint16_t Sink_voltage; // 协议板0x20回码的实际电压 mV
|
||||
rt_uint32_t Sink_voltage_seq; // 协议板实际电压有效回码序号
|
||||
rt_uint16_t VZ;
|
||||
rt_uint16_t VF;
|
||||
};
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_roll_nor.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.1.10
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 实现北向通信轮巡请求命令。以独立线程处理。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
@@ -1033,7 +1033,7 @@ void chrg_roll_nor_thread_entry (void *data)
|
||||
source_waiting = chrg_roll_nor_source_wait_process(idx, pSW);
|
||||
sink_waiting = chrg_roll_nor_sink_wait_process(idx, pSW);
|
||||
|
||||
/* 全通道Sink电压判定:使用eload实际电压Now_voltage与V_On比较,
|
||||
/* 全通道Sink电压判定:使用配置的V_On电压源与V_On比较,
|
||||
* 判定后统一由chrg_sink_work执行;短路测试由该入口负责WORK_START保活。 */
|
||||
for (i = 0; i < TOTAL_NOR_CHS; i++) {
|
||||
struct chrg_switch_t *psw = &pNOR->sw[i];
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_roll_nor.h
|
||||
完成日期 :
|
||||
当前版本号 : V1.1.10
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 实现北向通信轮巡请求命令。以独立线程处理。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_roll_sou.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.0
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 实现南向通信轮巡请求命令。以独立线程处理。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
@@ -26,7 +26,6 @@
|
||||
#define SOU_MUTEX_TIMEOUT_MS 100
|
||||
#define SOU_RESPONSE_TIMEOUT_MS 20
|
||||
#define SOU_COM_MAX_ATTEMPTS 3
|
||||
#define SOU_COM_BURST_MAX 10U
|
||||
#define SOU_COM_RETRY_YIELD_MS 1U
|
||||
#define SOU_REL_SWITCH_DELAY_MS 100U
|
||||
#define SOU_CHANNEL_BIT(ch) ((rt_uint8_t)(1U << (ch)))
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_sink.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.0
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 北向数据sink请求数据填充及发送。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
@@ -41,6 +41,10 @@ static rt_tick_t g_sink_unload_query_tick[TOTAL_SOU_CHS] = {0};
|
||||
static rt_uint8_t g_sink_unload_confirm_count[TOTAL_SOU_CHS] = {0};
|
||||
/* 记录各通道短路测试最近一次WORK_START的发送时间。 */
|
||||
static rt_tick_t g_sink_short_start_tick[TOTAL_SOU_CHS] = {0};
|
||||
#if SINK_VON_VOLTAGE_SOURCE == SINK_VON_VOLTAGE_FROM_PROTOCOL
|
||||
/* 只消费新的协议板0x20电压回码,避免同一帧重复计入稳定次数。 */
|
||||
static rt_uint32_t g_sink_von_voltage_seq[TOTAL_SOU_CHS] = {0};
|
||||
#endif
|
||||
|
||||
enum {
|
||||
SINK_UNLOAD_NEXT_RUNNING = 0,
|
||||
@@ -263,9 +267,8 @@ static int chrg_sink_work_init(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
|
||||
regs[0] = REG_REL_ON; vals[0] = ALL_REL_OFF;
|
||||
regs[1] = REG_REL_ON; vals[1] = FU_REL_ON;
|
||||
regs[2] = REG_CURRENT_OUT + 1; vals[2] = 0;
|
||||
regs[3] = REG_MODE; vals[3] = pSW->CV_mode;
|
||||
regs[4] = Eload_Start_V_ON; vals[4] =
|
||||
(pSW->sink.volt_on <= 500) ? 500 : pSW->sink.volt_on;
|
||||
regs[3] = REG_MODE; vals[3] = pSW->CV_mode;
|
||||
regs[4] = Eload_Start_V_ON; vals[4] = (pSW->sink.volt_on <= 500) ? 500 : pSW->sink.volt_on;
|
||||
regs[5] = ModbusRTU_ShortTest_CMD_MODE_FLAG;
|
||||
vals[5] = ModbusRTU_DYNA_CMD_MODE_STOP;
|
||||
count = 6U;
|
||||
@@ -875,9 +878,18 @@ static rt_uint8_t chrg_sink_voltage_confirm_count(rt_uint16_t target_volt_mv)
|
||||
SINK_VOLT_CONFIRM_5V_COUNT : SINK_VOLT_CONFIRM_NORMAL_COUNT;
|
||||
}
|
||||
|
||||
static rt_uint16_t chrg_sink_von_voltage_get(const struct chrg_switch_t *pSW)
|
||||
{
|
||||
#if SINK_VON_VOLTAGE_SOURCE == SINK_VON_VOLTAGE_FROM_PROTOCOL
|
||||
return pSW->Sink_voltage;
|
||||
#else
|
||||
return pSW->Now_voltage;
|
||||
#endif
|
||||
}
|
||||
|
||||
/*****************************************************************
|
||||
函数名称: chrg_sink_volt_judge
|
||||
函数描述: 使用南向功率板实际电压Now_voltage与V_On比较,驱动负载进入RUNING
|
||||
函数描述: 使用配置的V_On电压源与V_On比较,控制负载启停
|
||||
输入参数: idx:南向通道 pSW:通道控制结构体
|
||||
输出参数: 更新sink.work_mode并调用chrg_sink_work
|
||||
返回说明: 0:处理完成 <0:参数错误
|
||||
@@ -890,20 +902,31 @@ int chrg_sink_volt_judge(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
|
||||
static rt_uint8_t volt_set_ok[TOTAL_SOU_CHS] = {0};
|
||||
static rt_uint8_t volt_stable_count[TOTAL_SOU_CHS] = {0};
|
||||
static rt_tick_t running_start_tick[TOTAL_SOU_CHS] = {0};
|
||||
rt_uint16_t von_voltage;
|
||||
|
||||
if ((idx >= TOTAL_SOU_CHS) || (pSW == RT_NULL)) {
|
||||
return -1;
|
||||
}
|
||||
#if SINK_VON_VOLTAGE_SOURCE == SINK_VON_VOLTAGE_FROM_PROTOCOL
|
||||
if (pSW->Sink_voltage_seq == g_sink_von_voltage_seq[idx]) {
|
||||
return chrg_sink_work(idx, pSW);
|
||||
}
|
||||
g_sink_von_voltage_seq[idx] = pSW->Sink_voltage_seq;
|
||||
#endif
|
||||
von_voltage = chrg_sink_von_voltage_get(pSW);
|
||||
stable_confirm_count = chrg_sink_voltage_confirm_count(
|
||||
pSW->sink.pro_loadv);
|
||||
|
||||
if ((pSW->sink.On_work == 1) && (pSW->sink.test.test_mode == 0)) {
|
||||
if (pSW->Now_voltage <= WORK_MIN_VOLT) {
|
||||
if (von_voltage <= WORK_MIN_VOLT) {
|
||||
volt_stable_count[idx] = 0;
|
||||
if (volt_set_ok[idx] == 1 && ++volt_low[idx] >= 50) {
|
||||
volt_set_ok[idx] = 0;
|
||||
no_curr[idx] = 0;
|
||||
}
|
||||
if (pSW->sink.work_mode == SINK_WORK_RUNING) {
|
||||
return chrg_sink_work_load_stop(idx, pSW);
|
||||
}
|
||||
} else {
|
||||
volt_low[idx] = 0;
|
||||
volt_set_ok[idx] = 1;
|
||||
@@ -918,7 +941,7 @@ int chrg_sink_volt_judge(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
|
||||
/* 掉电安全批次完成前,不得进入RUNING。 */
|
||||
volt_stable_count[idx] = 0;
|
||||
no_curr[idx] = 0;
|
||||
} else if (pSW->Now_voltage > pSW->sink.volt_on) {
|
||||
} else if (von_voltage > pSW->sink.volt_on) {
|
||||
if ((pSW->sink.work_mode != SINK_WORK_RUNING) &&
|
||||
(pSW->sink.work_mode != SINK_WORK_LOAD_STANDBY)) {
|
||||
if (volt_stable_count[idx] < stable_confirm_count) {
|
||||
@@ -934,6 +957,10 @@ int chrg_sink_volt_judge(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
|
||||
} else if (pSW->sink.work_mode == SINK_WORK_LOAD_STANDBY) {
|
||||
volt_stable_count[idx] = 0;
|
||||
no_curr[idx] = 0;
|
||||
if (chrg_sink_load_should_start(pSW)) {
|
||||
/* 因输入电压不足停止带载后,电压恢复时重新进入稳定确认。 */
|
||||
pSW->sink.work_mode = SINK_WORK_WAIT;
|
||||
}
|
||||
} else if ((pSW->Now_current > 200) || (pSW->sink.loadc < 200)) {
|
||||
volt_stable_count[idx] = 0;
|
||||
no_curr[idx] = 0;
|
||||
@@ -948,6 +975,10 @@ int chrg_sink_volt_judge(eIDX_SOU_CH idx, struct chrg_switch_t *pSW)
|
||||
} else {
|
||||
volt_stable_count[idx] = 0;
|
||||
no_curr[idx] = 0;
|
||||
/* 配置电压源低于负载设置的V_On时,立即停止电子负载。 */
|
||||
if (pSW->sink.work_mode == SINK_WORK_RUNING) {
|
||||
return chrg_sink_work_load_stop(idx, pSW);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_sink.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.0
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 北向数据sink请求数据填充及发送,命令字定义。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
@@ -22,7 +22,7 @@ struct chrg_switch_t;
|
||||
#define SINK_TEST_OCP 2
|
||||
#define SINK_TEST_DYNA 3
|
||||
/* 短路测试期间按该周期补发WORK_START,防止功率板因超时停止。 */
|
||||
#define SINK_SHORT_START_INTERVAL_MS 30U
|
||||
#define SINK_SHORT_START_INTERVAL_MS 50U
|
||||
//短路测试结构体
|
||||
struct test_short {
|
||||
rt_uint16_t hold_time; // 短路测试时间
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_source.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.1.10
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 北向数据source请求数据填充及发送。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/****************************************************************************
|
||||
文件名称 : chrg_source.c
|
||||
完成日期 :
|
||||
当前版本号 : V1.1.10
|
||||
当前版本号 : V1.1.14
|
||||
主要功能 : 北向数据source请求数据填充及发送,命令字定义。
|
||||
版本历史 : 创建原始版本
|
||||
说明 :
|
||||
|
||||
@@ -0,0 +1,9 @@
|
||||
*** Using Compiler 'V6.16', folder: 'D:\keil mdk 2\ARM\ARMCLANG\Bin'
|
||||
Build target 'chrg'
|
||||
compiling chrg_comm.c...
|
||||
linking...
|
||||
Program Size: Code=151160 RO-data=15928 RW-data=9356 ZI-data=16036
|
||||
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:02
|
||||
Reference in New Issue
Block a user