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

AlphaESS 平台 EMS 3.6 应用层代码解析

本目录是对 AlphaESS Platform EMS 3.6 储能管理系统固件应用层源码的逐文件解析,每个源文件(.c / .h)对应一份独立文档,共 191 份。

想快速定位某个功能在哪实现? 走 索引/README.md —— 那里有"自然语言功能 → 源文件"的反查表(1776 行)、5500+ 条函数/宏/全局变量符号索引,以及检索脚本。

最快的一条命令(在 索引/ 目录下):

node 工具/查找.js 削峰填谷

一、项目概况

项内容
产品AlphaESS 平台 EMS 3.6(储能能量管理系统主控)
版本V0.11.676(git 04e72700,提交说明"G3-S10申请版本号V0.11.676")
主控GD32F407ZG(Cortex-M4)
操作系统uCOS-II(抢占式,OS_TICKS_PER_SEC = 1000)
工程Keil MDK,Target EMS_3_0,工程文件 user/EMS_3_0.uvprojx
编译宏USE_STDPERIPH_DRIVER, GD32F407
机型一台 EMS 可带多台逆变器,支持 6 家厂商协议 + 并机 + 油机 + 充电桩 + BMS

一次完整的控制闭环可以概括为:

电表/CT/BMS/逆变器采样 ──► 各任务缓存到全局数据表 ──► logic/ 计算目标功率
        ▲                                                        │
        │                                                        ▼
        └──── 厂商协议组帧下发 ◄── 安规限值/并机/调度指令 ◄── 控制参数表

二、分层结构

user/        主程序入口、任务创建、版本信息
├── main.c            uCOS-II 启动、17 个任务的静态创建、信号量/标志组初始化
└── version.c         固件版本字符串(脚本可提取的固定格式)

logic/       能量调度核心(业务大脑)
├── logic.c           总调度:采集汇总 → 序控模式优先级链 → 下发
├── ac_control.c      AC 侧(交流耦合)功率控制
├── dc_control.c      DC 侧(直流耦合)功率控制
├── dispatch.c        电网调度指令响应(DNSP / 南澳 CSIP / Sunspec)
├── handler_priority  强制充放电等优先级状态处理
├── generator.c       油机(柴油发电机)启停控制
├── csip_aus.c        澳洲 CSIP-AUS 需求响应
├── self_test.c       系统自检
└── math_tools.c      定点数格式化/解析工具

data/        数据与持久化
├── data.c            EMS 故障码聚合、各类复位
├── system_config/    系统配置表(Flash 读写)
├── resume_data/flash 断电续传数据存储
├── fault_warn_log/   故障告警日志
└── net_event_log/    网络事件日志

midware/     设备中间件(协议与设备适配)
├── inverter/         逆变器:6 家厂商协议 + 并机 + PV 充电器
│   ├── alphaess/  ginlong/  goodwe/  inovance/  kelong/  set/
│   ├── inverter.c    统一抽象层/驱动门面(313 个函数)
│   └── parallel*.c   并机通信(CAN + SCI 双通道)
├── meter/            电表/CT/BackupBox/油机控制器 + 升级
├── bms/              电池管理:Alpha BMS 协议 + 加热/自锁定
├── evc/              充电桩(EVC)
├── afci/             电弧故障保护器
├── interface/        Modbus RTU/TCP、Sunspec、干接点、DRM
├── ethernt/          以太网(W5500)+ 无线(WIFI/4G 棒)
├── auxiliary/        辅助任务:电量积分统计、RTC、设备功能表
└── debug/            ATE 测试、板级测试、USMART 调试 shell

hmi/         人机界面
├── lcd.c / led.c / key.c   LCD 驱动、LED、按键
└── led/                   应用层 LED 逻辑与配置

net/         网络应用层
├── ems.c             与云端 EMS 服务器的业务协议
├── server.c          服务器链路管理
├── ems_boot_handle.c 引导/上线流程
└── *_download.c      各设备固件升级下载分发

common/      通用工具
├── aes/md5/simple_encryption/alpha_generate_pwd   加密与密钥
├── json.c / crc.c / convert.c                     数据格式与校验
├── hex_file_parse.c / s19.c                       固件升级文件解析
└── usmart/                                        串口调试 shell

三、uCOS-II 任务模型

全部任务在 user/main.c 的 start_task() 中静态创建,数字越小优先级越高(uCOS-II 约定)。

任务优先级栈周期/触发职责
task_system_data7512500 ms(OSSemPend 超时值,非 OSTimeDlyHMSM)故障码聚合、各类复位
task_system_aux8512400 ms电量积分、RTC、看门狗喂狗
task_meter9256300 ms电表/CT/BackupBox 采样
task_inverter1051280 ms逆变器 SCI 通道收发包
task_bms11256100 ms电池 CAN 通信、加热控制
task_system_logic_control12512280 ms能量调度核心计算
task_interface_parse13512500 ms干接点/DRM/接口解析
task_ethernet_monitor14256500 ms网络链路监控
task_inverter_can1525630 ms逆变器 CAN 通道 + 并机
task_net_app1651225 ms云端通信业务
task_ethernet1710245 ms以太网收发
task_sampling18256ADC-DMA 信号量模拟量采样
task_modbus_rtu19256UART5 信号量Modbus RTU 从站
task_parallel_sci20256100 ms / UART3 信号量并机 SCI 通道
task_hmi_parse2151210 ms 或 100 ms(见下)按键/LCD/LED
task_usmart22512100 ms调试 shell(受 DEBUG_SUMART 门控)
start_task30256一次创建上述任务后自挂起

本表已于 2026-10-15 按源码实测修正。 原表(抄自 app_cfg.h 注释)有 5 处与源码循环尾部实参不一致, 已改正:task_inverter 100→80、task_inverter_can 50→30、task_system_logic_control 300→280、 task_net_app 30→25、task_ethernet_monitor 1000→500。以源码为准。

task_hmi_parse 的周期是条件编译 + 显示类型决定的(hmi/key.c:8956-8979): 字符屏(DISPLAY_LCD_CHARACTER_E)且机型宏不是 GINLONG/GOODWE/KELONG/INVERTER_NULL 时为 10 ms; 其余情况为 100 ms。本明文基线 INVERTER_TYPE == INVERTER_NULL,走到 #else 分支 ⇒ 实际 100 ms。 所以「10 ms」只在特定机型 + 字符屏组合下成立,原表写死 10 ms 是不准确的。

同步原语(user/main.c 的 event_init()):


四、跨模块核心全局变量

这些结构体是各模块之间的实际接口,几乎每个文件都直接读写:

变量定义位置说明
g_t_inv_infomidware/inverter/inverter.c逆变器总表:配置/运行/安规/控制/命令/参数/日志/AFCI
g_t_logic_infologic/logic.c调度总表:配置表 + 三张扩展配置表 + 控制参数 + 各模式中间量
g_t_bat_infomidware/bms/bms.c电池信息(SDRAM 定位,#pragma pack(1))
g_t_ems_infodata/data.cEMS 故障位图
g_t_system_base_info、g_system_function_info、g_system_custom_info、g_system_msg_page_iddata/system_config/system_config.c系统基础参数 / 功能使能位 / 自定义参数 / 消息页号(Flash 持久化)
g_t_logic_info.t_config_datalogic/logic.h:496调度配置表 LOGIC_CONFIG_TAB_T。注意它不是独立全局量,而是 LOGIC_TABLE_T 的字段
g_t_energy_infomidware/auxiliary/system_aux.c电量统计数据
g_t_sunspec_mudbusmidware/interface/modbus/Sunspec 寄存器映射表(783 项)
g_t_metermidware/meter/meter.c电表/CT 数据表

五、文档结构

每份 .md 统一按 7 节组织:

  1. 文件职责 — 该文件在系统中做什么、处在数据流哪个环节、被谁驱动
  2. 关键数据结构与宏 — 结构体/枚举/位域/宏 一览表
  3. 函数清单 — 全部函数(含 static)及一句话说明,不做抽样
  4. 核心逻辑解析 — 状态机迁移条件、算法公式、协议帧格式、时序、全局变量读写
  5. 对外接口 — 导出的函数/全局变量与调用方,以及本文件调用的外部符号
  6. 依赖关系 — include 了什么、被谁 include
  7. 备注与风险点 — 可疑写法、魔法数、越界/竞态、死代码

六、静态分析发现的主要共性问题

以下均为源码静态阅读得出的结论,未做编译与板级验证,详情与行号见各文件文档第 7 节。

1. 编译期机型开关处于"全关闭"状态(影响面最大)

midware/inverter/inverter.h:172 定义 INVERTER_TYPE = INVERTER_NULL(0),而所有厂商分支写作 #if ((INVERTER_TYPE == INVERTER_MAX) || (INVERTER_TYPE == XXX_TYPE))。 按当前 EMS_3_0.uvprojx 的宏定义(仅 USE_STDPERIPH_DRIVER, GD32F407)展开,全部厂商分支与 INV_DC_CTRL/INV_AC_CTRL 都不参与编译。若实际量产工程在别处用 -D 覆盖,本节结论需相应修正。

2. 大量跨任务共享全局变量没有互斥保护

逆变器通信任务、CAN 任务、并机任务、net/server.c、hmi/key.c 都直接读写 g_t_inv_info 等结构体,全程未使用互斥量/临界区;system_aux.c 中还存在整表 memset 重建的竞态。

3. 栈/缓冲区越界(多处,且多为外部可控输入)

4. 整数除零未做保护(多处)

各厂商升级模块的百分比函数、alphaess_comm_usart.c 的降载率计算、bms.c 的电流倍率计算等,分母来自可能为 0 的通信数据。

5. 油机启停逻辑存在死角

logic/generator.c 的 switch (GeneratorMode) 没有 default 分支,NONE_MODE(0) 与枚举空洞值 3 不命中任何 case,油机不会启停。

6. 硬编码凭证与密钥

hmi/key.c 的 ADMIN_PASSWORD / INSTALLER_PASSWORD 为硬编码口令且界面不可改;common/aes.h 的 PUBLIC_KEY 硬编码在头文件;common/simple_encryption.c 的密钥流算法全机共用同一密钥。

7. 条件编译造成的"死代码腐化"

DEBUG_SUMART、MODBUS_RTU_DEBUG、E_LINKER_4G_COMM_DEBUG、DEBUG_SYSTEM_AUX 等宏长期处于关闭状态,其包裹的代码已与主线脱节(有的改 1 就编译失败),generator_charge_energy_statistics 等整个函数被 #if 0 屏蔽但接口仍对外暴露。


七、覆盖范围说明

已解析(191 个文件)

模块文件数
common/22
data/10
logic/18
net/20
hmi/12
midware/106
user/3
合计191

按需求排除的底层代码


八、文档索引

按源文件目录结构组织,. 为源码相对路径的镜像(如 midware/inverter/kelong/kelong_comm.c.md 对应 midware/inverter/kelong/kelong_comm.c)。

common/ (22 个文件)

data/ (10 个文件)

hmi/ (12 个文件)

logic/ (18 个文件)

midware/ (106 个文件)

net/ (20 个文件)

user/ (3 个文件)