EMS 知识库
首页 / knowledge/代码解析/midware/inverter/alphaess

alphaess_upgrade.h

源文件路径:midware/inverter/alphaess/alphaess_upgrade.h 所属模块:midware/inverter/alphaess(AlphaESS 逆变器通信协议 — 固件升级) 代码行数:75

1. 文件职责

本文件是 alphaess_upgrade.c 的对外接口头文件,定义 AlphaESS 逆变器串口固件升级协议所需的命令字宏、状态枚举、升级上下文结构体,以及 7 个导出函数原型。它只做声明与类型定义,不含任何实现代码,被 alphaess_upgrade.c 自身包含,也通过 midware/inverter/inverter.c、alphaess_comm_usart.c 间接参与升级进度查询。它同时被 #include "includes.h" 拉入工程公共依赖链,属于"升级子模块的窄接口层"。头文件中的 ALPHAESS_UPGRADE_TABLE_T 只在前向声明层面暴露类型,实际实例 s_alphaess_upgrade_tab 是 .c 内的 static 变量,外部只能通过 alphaess_read_upgrade_* 系列函数访问。

2. 关键数据结构与宏

名称类型(结构体/枚举/宏/联合体)说明
__ALPHAESS_UPGRADE_H__宏(卫哨)防重复包含宏,alphaess_upgrade.h:9-10
ALPHAESS_UPGRADE_DEBUG宏取值 0,编译期开关;置 1 后 alphaess_upgrade.c 中所有 printf 调试分支生效(alphaess_upgrade.h:16)
EMS_INV_SHAKE_HANDS宏0x301,"EMS→INV 握手"命令字;本模块未使用,实际由 kelong CAN 升级使用(alphaess_upgrade.h:19)
EMS_INV_SEND_UPGRADE_FILE宏0x302,发送升级文件命令字;本模块未使用(alphaess_upgrade.h:20)
EMS_INV_CHECK_UPGRADE_FILE宏0x303,校验升级文件命令字;本模块未使用(alphaess_upgrade.h:21)
EMS_INV_CHECK_UPGRADE_SATTE宏0x304,查询升级状态命令字;本模块未使用(alphaess_upgrade.h:22)
UPGRADE_DATA_MAX_LEN宏224,单帧最大有效载荷字节数,直接决定数据帧缓冲区 u8_upgrade_data_buf[232] 与启动帧 112 字节布局(alphaess_upgrade.h:24)
INV_EMS_ACK宏0x401,逆变器应答命令字;本模块未使用(alphaess_upgrade.h:27)
ALPHAESS_UPGRADE_OBJECT_E枚举升级对象:ALPHAESS_NONE(0) 空闲 / ALPHAESS_MASTER(1) 升 CPU1 / ALPHAESS_SLAVE(2) 升 CPU2(alphaess_upgrade.h:30-35)
ALPHAESS_UPGRADE_SATE_E枚举升级流程状态:ALPHA_UPGRADE_START(启动帧 0x41) / ALPHA_SEND_UPGRADE_FILE(数据帧 0x42) / ALPHA_UPGRADE_END(结束帧 0x43) / ALPHA_UPGRADE_FAULT(失败)(alphaess_upgrade.h:37-45)。枚举中两处被注释掉的历史状态:ALPHA_QUERY_NUMBER_ROWS、ALPHA_CHECK_UPGRADE_FILE
ALPHAESS_UPGRADE_TABLE_T结构体升级上下文表(alphaess_upgrade.h:47-63),字段见下表

ALPHAESS_UPGRADE_TABLE_T 字段逐项:

字段类型说明
u32_cpu1_file_lenu32CPU1 固件文件长度,取自 SDRAM 描述头前 4 字节(大端)
u32_cpu2_file_lenu32CPU2 固件文件长度,取自描述头偏移 54 处 4 字节
u16_send_cpu1_file_numu16CPU1 总帧数(描述头,大端)
u16_send_cpu2_file_numu16CPU2 总帧数(描述头,大端)
u16_file_send_cntu16当前待发帧号,写入数据帧第 3–4 字节(大端)
u8_cpu1_upgrade_addru8*CPU1 镜像基址,运行时指向 g_u8_fw_sdram1
u8_cpu2_upgrade_addru8*CPU2 镜像基址,运行时指向 g_u8_fw_sdram2
u8_upgrade_objectu8当前升级对象,取 ALPHAESS_UPGRADE_OBJECT_E 值
u8_upgrade_start_buf[112]u8[]0x41 启动帧发送缓冲,组帧后恰好 112 字节用满
u8_upgrade_data_buf[232]u8[]0x42 数据帧发送缓冲,6 字节头 + 224 载荷 + 2 字节 CRC
u8_upgrade_end_buf[7]u8[]0x43 结束帧发送缓冲,03 43 45 4E 44 CRC
u32_upgrade_cpu1_file_offsetu32CPU1 已传偏移,初值 128(跳过描述头),每帧步进 224
u32_upgrade_cpu2_file_offsetu32CPU2 已传偏移,初值 0
u32_upgrade_finish_ticku32升级成功时刻的 OSTimeGet(),供通信丢连阈值补偿使用

3. 函数清单

本文件只含函数声明(原型),实现均在 alphaess_upgrade.c;下表列出全部原型及其实现位置。

函数名作用域说明
alphaess_upgrade_handle全局(声明)升级主状态机,实现于 alphaess_upgrade.c:245
alphaess_read_upgrade_flag_master全局(声明)读 CPU1 升级标志,实现于 alphaess_upgrade.c:619
alphaess_read_upgrade_percent_master全局(声明)读 CPU1 升级百分比,实现于 alphaess_upgrade.c:630
alphaess_read_upgrade_flag_slave全局(声明)读 CPU2 升级标志,实现于 alphaess_upgrade.c:648
alphaess_read_upgrade_percent_slave全局(声明)读 CPU2 升级百分比,实现于 alphaess_upgrade.c:659
alphaess_get_upgrade_finish_tick全局(声明)读升级完成时刻 tick,实现于 alphaess_upgrade.c:688
alphaess_read_upgrade_file_offset全局(声明)读累计已传输字节数,实现于 alphaess_upgrade.c:677

函数声明区位于 alphaess_upgrade.h:66-72。

4. 核心逻辑解析

本文件为纯声明文件,无状态机与算法。以下说明其定义的协议契约与内存布局约定,这些约定由 alphaess_upgrade.c 执行。

4.1 协议帧长度契约

三个发送缓冲区的大小并非随手取整,而是与协议帧长度严格对应:

因此 UPGRADE_DATA_MAX_LEN(224)是新帧头/帧尾字段增删时的唯一调节点,改它必须同步改 u8_upgrade_data_buf 的数组长度。

4.2 双重版本号约定(枚举 vs 返回类型)

4.3 升级完成时刻的消费者

u32_upgrade_finish_tick 由 alphaess_get_upgrade_finish_tick() 导出,唯一消费者在 alphaess_comm_usart.c:5450:

if(abs(alphaess_get_upgrade_finish_tick()-OSTimeGet()) < 120* 1000)
    l_u32_ugrade_finish_tick = 90 *1000;

即升级完成后 120 秒内把"逆变器通信丢失"判定阈值额外放宽 90 秒(原本 30 秒),这是本头文件唯一影响实时调度的字段。

4.4 与 uCOS-II 任务/信号量的关系

本头文件不声明任何任务、信号量、邮箱或回调类型;升级流程完全由 alphaess_comm_usart.c:5441 的通信任务同步调用 alphaess_upgrade_handle() 驱动,OSTimeGet() 作为唯一时间基准。导出函数均非可重入(共享 s_alphaess_upgrade_tab),目前只有通信任务一个调用者,故无锁保护。

4.5 关键全局变量读写

本文件本身不定义变量,仅通过 #include "includes.h" 依赖工程公共类型(u8/u16/u32/TRUE/FALSE)。它定义的 ALPHAESS_UPGRADE_TABLE_T 的唯一实例在 .c 中为 static,外部无法直接读写。

5. 对外接口

本文件导出(所有内容均为外部可见):

实际调用方:

导出符号调用方
alphaess_upgrade_handle()midware/inverter/alphaess/alphaess_comm_usart.c:5441
alphaess_read_upgrade_flag_master()midware/inverter/inverter.c:3820
alphaess_read_upgrade_percent_master()midware/inverter/inverter.c:3855
alphaess_read_upgrade_flag_slave()midware/inverter/inverter.c:3890
alphaess_read_upgrade_percent_slave()midware/inverter/inverter.c:3925
alphaess_read_upgrade_file_offset()midware/inverter/inverter.c:3947
alphaess_get_upgrade_finish_tick()midware/inverter/alphaess/alphaess_comm_usart.c:5450

本文件引入的外部依赖:仅 includes.h(alphaess_upgrade.h:13),由它间接提供 u8/u16/u32、TRUE/FALSE 等基础类型;不含任何函数调用。

6. 依赖关系

7. 备注与风险点

  1. EMS_INV_SHAKE_HANDS / EMS_INV_SEND_UPGRADE_FILE / EMS_INV_CHECK_UPGRADE_FILE / EMS_INV_CHECK_UPGRADE_SATTE / INV_EMS_ACK 五个宏在本模块内完全未使用:经全工程检索,它们只出现在 midware/inverter/kelong/kelong_upgrade.h:16-22 与其 .c 的 CAN 帧组装中(kelong_upgrade.c:133/159/188/232/258/285/311)。本头文件应是复制 kelong 版本后改造而来,属版本遗留死宏。
  2. ALPHAESS_UPGRADE_SATE_E 用状态枚举表达协议命令字:枚举值 0..3 与命令字 0x41/0x42/0x43 的对应仅靠注释维系(alphaess_upgrade.h:39-44),实际组帧硬编码 0x41/0x42/0x43(alphaess_upgrade.c:129/196/226),两处不同步时会静默跑错分支。
  3. u8_upgrade_start_buf[112] 无余量:协议若追加字段必须先改数组长度,头文件与 .c 的组帧序列长度没有编译期断言保护。
  4. u8_upgrade_object 声明为 u8:丢失枚举类型信息,赋值 ALPHAESS_MASTER/SLAVE 依赖隐式转换;同时 memset 清零后值为 0,与 ALPHAESS_NONE 语义一致是隐含约定,由 alphaess_read_upgrade_percent_* 的除零防护间接依赖。
  5. 导出函数无重入保护:7 个原型都读同一份 static 上下文,头文件未标注任何线程约束;当前仅通信任务通过 alphaess_upgrade_handle 写、inverter.c 读,属跨任务共享而无锁(读百分比时可能读到部分更新的 offset),只是精度上可容忍。
  6. ALPHAESS_UPGRADE_DEBUG 用 #if 而非 #ifdef 包裹:.c 中写作 #if (ALPHAESS_UPGRADE_DEBUG == 1),若该宏未定义会直接编译报错;这是刻意的强约束,但意味着不能通过 -D 未定义来关闭调试。
  7. ALPHA_QUERY_NUMBER_ROWS、ALPHA_CHECK_UPGRADE_FILE 两个枚举成员被注释保留(alphaess_upgrade.h:40/42),提示协议早期曾有条数查询与文件校验帧,现已废弃;若逆变器新版本 DSP 重新启用需注意枚举值缺口(当前 0,1,2,3 连续,注释不影响编号)。