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

alphaess_comm_usart.h

源文件路径:midware/inverter/alphaess/alphaess_comm_usart.h 所属模块:midware/inverter/alphaess(逆变器厂商协议:AlphaESS 三相/单相储能逆变器 Modbus-RTU 串口协议) 代码行数:727

1. 文件职责

本头文件定义 AlphaESS 逆变器串口(SCI/UART2,Modbus-RTU)通信协议的全部对外契约:寄存器地址常量、功能码、收发缓冲区尺寸、超时值,以及承载"EMS → DSP"下发参数与"DSP → EMS"回读数据的巨型状态结构体 ALPHAESS_TABLE_T。它不包含任何可执行逻辑,只提供类型、宏与函数声明,被 alphaess_comm_usart.c(唯一实现者)严格依赖,也被 alphaess_comm_can.c、alphaess_upgrade.c、midware/afci/*、midware/interface/modbus/*、midware/inverter/inverter.c 等文件通过 g_t_alphaess_comm_info 共享状态。

在数据流中本文件处于"协议字典"的位置:上层能量调度(logic/)与配置(data/)的结果最终要通过这里定义的寄存器地址写到 DSP;DSP 的遥测/故障/告警位域也由这里定义的结构体承接,再被 inverter.c 分发给 HMI、Modbus 从站和云端。

2. 关键数据结构与宏

名称类型说明
DEBUG_ALPHAESS_INV宏调试打印总开关,置 1 时开启大量 printf(行 17,当前为 0)
ALPHAESS_MAX_REGISTER_NUM宏单次多寄存器写最大寄存器数,100(行 19),用于 ems_send_ctrl_data_to_inv_alphaess 的入参合法性检查
ALPHAESS_INV_RECV_BUFFER_SIZE宏接收缓冲区 s_u8_recv_buf 长度,256 字节(行 20)
ALPHAESS_DATA_RCV_TIMEOUT宏收发超时基准,500(行 21,uCOS-II tick,即 500 ms)
ALPHAESS_SLAVR_ADDRESS宏逆变器 Modbus 从站地址,0x03(行 23)
ALPHAESS_FUNC_READ_HOLDING_REGISTER宏Modbus 功能码 0x03,读保持寄存器(行 24)
ALPHAESS_FUNC_READ_INPUT_REGISTER宏Modbus 功能码 0x04,读输入寄存器(行 25)
ALPHAESS_FUNC_WRITE_SIGNAL_HOLDING_REGISTER宏Modbus 功能码 0x06,写单个保持寄存器(行 26)
ALPHAESS_FUNC_WRITE_MULTIPLE_HOLDING_REGISTER宏Modbus 功能码 0x10,写多个保持寄存器(行 27)
ALPHAESS_SEND_ERROR_COUNT_MAX宏单个写操作连续失败上限,3 次(行 29);达到后部分函数放弃重试并"当作成功"
ALPHAESS_ADDR_REG_QUERY_INV_DEVICE_INFO / _NUM_宏设备信息区:起始 30000,长度 73 寄存器(行 31-32)
ALPHAESS_ADDR_REG_QUERY_INV_RUNNING_DATA / _NUM_宏运行数据区:起始 30200,长度 115 寄存器(行 34-35)
ALPHAESS_ADDR_REG_QUERY_INV_EXTAND1_RUNNING_DATA / _NUM_宏扩展运行数据区:起始 30331,长度 16 寄存器(行 37-38)
ALPHAESS_ADDR_REG_QUERY_INV_RUNNING_DATA_PARALLEL / _NUM_宏并机运行数据:起始 32000,长度 16(行 40-41,本文件未使用,供 CAN 侧/预留)
ALPHAESS_ADDR_REG_SET_INV_SN_CMD / _NUM_宏写 SN:40102,16 寄存器(行 43-44)
ALPHAESS_ADDR_REG_CLEAR_ENERGY_CMD / _NUM_宏清除发电量:40102…(行 46-47,5 寄存器)
ALPHAESS_ADDR_REG_SET_INV_START_STOP / _NUM_宏开关机:40126,1 寄存器(行 49-50)
ALPHAESS_ADDR_REG_SET_INV_ON_OFF / _NUM_宏逆变器 ON/OFF 指令:40127(行 52-53)
ALPHAESS_ADDR_REG_EMS_RESTART_DSP_CMD / _NUM_宏复位 DSP:40128(行 55-56)
ALPHAESS_ADDR_REG_INV_MODE_CMD / _NUM_宏运行模式:40130(行 58-59)
ALPHAESS_ADDR_REG_SET_PV_CAPACITY / _NUM_宏PV 装机容量:40134(行 61-62)
ALPHAESS_ADDR_REG_SET_MAX_FEEDIN_PERCENT / _NUM_宏最大馈网功率比例:40135(行 64-65)
ALPHAESS_ADDR_REG_CLEAR_INV_WARNING / _NUM_宏清除告警:40147(行 67-68)
ALPHAESS_ADDR_REG_CLEAR_INV_FAULT / _NUM_宏清除故障:40148(行 70-71,本文件未引用)
ALPHAESS_ADDR_REG_GENERATOR_FLAG / _NUM_宏油机(Generator)使能:40149(行 73-74)
ALPHAESS_ADDR_REG_GRID_FORMING_FLAG / _NUM_宏Grid-Forming 使能:40150(行 76-77)
ALPHAESS_ADDR_REG_SET_INV_PARALLEL / _NUM_宏并机设置:40151(行 79-80)
ALPHAESS_ADDR_REG_SET_BACKUPBOX_ENABLE / _NUM_宏BackupBox(BB)使能:40152(行 82-83)
ALPHAESS_ADDR_REG_SET_MPPT_ENABLE / _NUM_宏MPPT 扫描使能:40153(行 85-86)
ALPHAESS_ADDR_REG_SET_PHASE_NEGATION / _NUM_宏相序自适应:40156(行 88-89)
ALPHAESS_ADDR_REG_SET_PV_CHARGER_MODE / _NUM_宏PV-Charger 模式:40157(行 91-92)
ALPHAESS_ADDR_REG_SET_PE_LOSS_CHECK_FLAG / _NUM_宏PE 丢失检测:40159(行 94-95)
ALPHAESS_ADDR_REG_SET_INV_BYPASS_MODE / _NUM_宏逆变器 Bypass 模式:40161(行 97-98)
ALPHAESS_ADDR_REG_SET_AFCI_FAULT_ENABLE / _NUM_宏AFCI 报错使能位:40166(行 100-101)
ALPHAESS_ADDR_REG_SET_FUNCTION_ENABLE / _NUM_宏功能使能块:41000,26 寄存器(行 103-104),一次写 52 字节
ALPHAESS_ADDR_REG_SET_AFCI_ENABLE / _NUM_宏AFCI 使能位:41023(行 106-107)
ALPHAESS_ADDR_REG_SET_HEAT_EN / _NUM_宏电池加热指令:41028(行 109-110)
ALPHAESS_ADDR_REG_SET_ITALY_ANTI_BACKFLOW_EN / _NUM_宏意大利防逆流使能:41031(行 112-113)
ALPHAESS_ADDR_REG_SET_BATTERY_TYPE / _NUM_宏电池类型:41106(行 115-116)
ALPHAESS_ADDR_REG_SET_DISCHARGE_CUT_VOLT / _NUM_宏放电截止电压:41108(行 118-119)
ALPHAESS_ADDR_REG_SET_CHARGE_CUT_VOLT / _NUM_宏充电截止电压:41111(行 121-122)
ALPHAESS_ADDR_REG_SET_HEAT_CUT_VOLT / _NUM_宏电池加热充放电电压:41134,2 寄存器(行 124-125)
ALPHAESS_ADDR_REG_SET_BAT_ADAPT_EN / _NUM_宏电池自适应使能:41136(行 127-128)
ALPHAESS_ADDR_REG_SET_BAT_PROTECT_PARA / _NUM_宏电池自适应保护参数:41137,3 寄存器(行 130-131)
ALPHAESS_ADDR_REG_SET_HEAT_RELAY_STA / _NUM_宏电池加热继电器状态:41140(行 133-134)
ALPHAESS_ADDR_REG_SET_2_CHG_EN / _NUM_宏两倍电池充电标志:41141(行 136-137)
ALPHAESS_ADDR_REG_QUERY_INV_SAFETY / _NUM_宏安规国家码:42000(行 140-141)
ALPHAESS_ADDR_REG_QUERY_INV_SELF_TEST_DATA / _NUM_宏安规参数块:42001,47 寄存器(行 143-144)
ALPHAESS_NUM_SET_INV_SELF_TEST_0_DATA宏首次并网保护值长度,4 寄存器(行 145)
ALPHAESS_ADDR_REG_SET_INV_SELF_TEST_1_DATA / _NUM_宏过/欠压保护参数:42005,16 寄存器(行 147-148)
ALPHAESS_ADDR_REG_FREQ_PROTECT / _NUM_宏过/欠频保护参数:42021,12 寄存器(行 150-151)
ALPHAESS_ADDR_REG_SET_INV_SELF_TEST_2_DATA / _NUM_宏其他安规参数:42033,15 寄存器(行 153-154)
ALPHAESS_ADDR_REG_SET_INV_FIRST_ONGRID_TIME / _NUM_宏首次并网时间:42037,2 寄存器(行 156-157,本文件未直接引用)
ALPHAESS_ADDR_REG_SET_INV_GFCI_30MA/60MA/150MA/300MA_PRO_DATA宏四档 GFCI 保护阈值地址 42044~42047(行 159-162);ALPHAESS_NUM_SET_INV_GFCI_PRO_DATA = 1
ALPHAESS_ADDR_REG_QUERY_INV_CEI_SELF_CHECKING / _NUM_宏三相机意大利安规自检数据:42048,81 寄存器(行 165-166)
ALPHAESS_ADDR_REG_SET_SAFTY_ACTPOWER_SETTING / _NUM_宏安规有功/频率降载参数:43000,51 寄存器(行 168-169)
ALPHAESS_ADDR_REG_SET_QUIESCENT_REACTPOWER_SUPPORT / _NUM_宏静态电压无功支撑 Q(U)/cosφ(P):44000,26 寄存器(行 171-172)
ALPHAESS_ADDR_REG_SET_PU_MODE_ACTIVE_RESPONSE_3TAU / _NUM_宏PU 模式有功响应时间常数(3τ):44034,2 寄存器(行 174-175)
AFCI_RUN_MODE_ALLOW(m)宏判定逆变器运行模式是否允许 AFCI 自检:cNormalMode/cUPS/cByPassMode 三者之一(行 178-179)
ALPHAESS_SAFETY_COUNTRY_E枚举逆变器侧安规国家/标准码(行 182-217),含 50/60 Hz 默认、AS4777-2020 A/B/C/NZ、NRS097、CEI021、VDE4105、EN50549、UNE217002、TOR、C10_11、VDE0126、G99/G98、MEA/PEA、NC2022、PPDS、NC_RFG、NF50549、INMETRO、EN50549_IE/NED、SI_4777、MSZ、NA_EEA_NE7_CH、SRPS 等;显式赋值 20/25/32/38 保留跳号
ALPHAESS_INV_MODEL_SUB_E枚举逆变器型号子类型(行 219-239),S5/S3.6/S3/B5/B3.6/B3/S8/S6/S10/B10=12/T10=20/T4/T6/T8/T5/T12/T15,ALPHAESS_BW_G3_S5_INV2 = '1' 兼容旧编码
ALPHAESS_INV_BAT_TYPE_E枚举电池类型:96 V/150 V/300 V/9640-9650/DCDC 升压/铅酸(行 241-252),同一枚举内另定义 P=0(并联)、S=3(串联)复用值
ALPHAESS_INV_VAR_RESPONSE_MODE_E枚举无功响应模式:无响应/固定 PF/cosφ(P)/固定 Q/Q(U) 线性/Q(U) 滞环(行 254-264)
ALPHAESS_ERROR1_U联合体4 字节故障字 1(行 266-312),u32_err1_all 与 32 个 1 bit 域互为视图:母线软超时/母线过压/欠压/短路、逆变软超时、逆变过压/欠压、相位短路、过载、并网反向、LPE 反向、EMS SCI/CAN、各路基准电压、NTC 丢失、电池欠压/过压、GFCI 器件/GFCI、各 HCT/CT 异常、各继电器、ISO
ALPHAESS_ERROR2_U联合体4 字节故障字 2(行 314-360):DCI、看门狗、开环、DSP 自检、软件不一致、N/PE 丢失、并机 CAN/同步信号/软件差异/模块错误/负功率/多主机/开机不一致、硬件版本差异、母线不平衡、逆变线短路、DC/AC SPD、AFCI 故障等
ALPHAESS_WARNING1_U联合体4 字节告警字 1(行 362-408):PV 高压、电池开路/过压/欠压/反接、母线过压、电网丢失/电压/频率/10 min 电压/瞬时过压、PE 丢失、LN 反接、过载、过温/低温、GFCI、ISO、DCI、DCV、孤岛、NTC、风扇异常、N 丢失、EMS SCI/CAN、并机告警、并机 N 丢失、电池数量异常、相序、电压波峰因数
ALPHAESS_WARNING2_U联合体4 字节告警字 2(行 410-456):Flash ID/读写、机型、逆变欠压、软/硬件过流、Boost/Buck-Boost 过流、母线欠压、无 PV 输入、输入/输出限功率、过频/过压/过温降载、HVRT/LVRT、并机定位/平均过载/模块地址重复/并机进入失败/功率不平衡/开机不一致、DCV 采样异常、母线不平衡、PV 反接、AFCI 告警
CEI_MAP_T结构体意大利 CEI 自检寄存器映射项(行 458-464):value_offset/time_offset/res_offset(字节偏移)+ type(0=OVP2…6=UFP1,7=OVP10MIN)
CEI_SAFTY_TEST_RESULT_U联合体16 位 CEI 自检结果位图(行 466-492),每位对应一项 value/time 校验结果,u16_all 为 0x5555 表示全通过
ALPHAESS_RUN_TABLE_T结构体逆变器运行原始数据表(行 494-581),约 90 个字段:累计运行时间、工作模式、温度组(模块/PV Boost/电池 Buck-Boost/功率板/控制板/各继电器)、母线电压、PV 三/四路电压电流功率、组串电流 1~6、电池前后电压/两路电流/总电流/功率、逆变三相电压电流频率、视在/有功/无功功率、功率因数、电网三相及线电压频率、备电侧电压电流频率功率、限功率状态、ISO、GFCI RMS/DC、CEI 回读值、开关状态、并机 ID/数量、u_cei_test_res[3] 三相自检结果
ALPHAESS_START_CONFIG_TABLE_T结构体EMS 侧"已下发配置快照"(行 583-608),用于与最新目标值做变化检测:充/放电截止电压、PV 容量、最大馈网比例、电池类型、启停、UPS、油机、Grid-Forming、BB、MPPT、BB 机型、PV-Charger 模式、无功控制、ON/OFF、电网电压/频率降载、Bypass、并机方案、电池输出/输入电流、电池瞬时额定电压
ALPHAESS_HEAT_TABLE_T结构体电池加热数据快照(行 612-618):加热指令、加热继电器指令、加热电压(0.1 V)、加热电流(0.01 A)
INVERTER_PARALLEL联合体并机配置字节(行 620-630):bit0 使能、bit1 主机/从机、bit2 单相/三相
ALPHAESS_TABLE_T结构体本文件的核心状态容器(行 632-712):系统型号与波特率、约 60 个"请求/应答标志位"(u8_ems_set_*_flag / u8_ems_get_*_flag)、若干 tick 时间戳(通信存活、波特率自检、运行数据轮询、参数初始化、运行模式轮询)、变化检测时间戳,以及运行结果字段 u32_inv_fault1/2、u32_inv_warning1/2、u8_inv_parallel、t_alphaess_run_info;尾部还混入了 CAN 侧的 u8_ems_inv_idcode_flag、u8_set_inv_ctrl_mode_flag 等字段
g_t_alphaess_comm_info全局变量声明extern ALPHAESS_TABLE_T g_t_alphaess_comm_info;(行 715),实体定义在 alphaess_comm_usart.c:36

3. 函数清单

本文件为头文件,不含函数定义,仅含 6 个函数原型声明(供实现文件与少量外部调用方使用):

函数名作用域说明
alphaess_comm_init全局(声明)声明于行 718;实现于 alphaess_comm_usart.c:110,初始化通信标志位与 SCI 波特率
alphaess_write_data全局(声明)声明于行 720;实现于 alphaess_comm_usart.c:262,向 uart2 发送原始字节流
alphaess_recv_data全局(声明)声明于行 721;实现于 alphaess_comm_usart.c:285,从 uart2 收帧并做 CRC 校验后的长度回传
alphaess_inverter_comm_usart全局(声明)声明于行 723;实现于 alphaess_comm_usart.c:5090,逆变器串口主通信状态机(周期调用)
alphaess_inverter_data_check全局(声明)声明于行 724;实现于 alphaess_comm_usart.c:5530,检测上层配置变化并置位下发标志
alphaess_get_self_test_data全局(声明)声明于行 725;实现于 alphaess_comm_usart.c:946,汇总意大利安规自检结果

4. 核心逻辑解析

头文件没有运行时逻辑,这里说明它定义的两条"契约",它们是理解 .c 实现的必要前提。

4.1 寄存器地图与语义分区

地址按功能分段,代码中大量使用 ALPHAESS_ADDR_REG_* 常量而非裸数字,因此读 .c 时可从常量名反推语义:

4.2 请求/应答标志位协议

ALPHAESS_TABLE_T 中约 60 个 u8_ems_set_*_flag / u8_ems_get_*_flag 构成事实上的"消息邮箱":alphaess_inverter_data_check() 检测到配置或回读值变化时把对应 set/get 标志置 TRUE 并立即退出(不发送),下一轮 alphaess_inverter_comm_usart() 看到标志为 TRUE 才发一帧,收到合法应答后清标志。头文件与 .c 共同保证了这条不对称分工:"探测/置标志"在 data_check 里,"发送/清标志"在 comm 里。

4.3 编码/换算约定

5. 对外接口

本文件导出的符号

符号类型供谁使用
g_t_alphaess_comm_info全局变量(extern 声明)alphaess_comm_can.c、alphaess_upgrade.c、midware/afci/afci_comm.c、midware/afci/afci_upgrade.c、midware/interface/modbus/modbus.c、sunspec_business.c、sunspec_modbus.c、midware/inverter/inverter.c
alphaess_comm_init函数声明midware/inverter/inverter.c:89、midware/inverter/alphaess/alphaess_upgrade.c:533,582,以及本模块内部 alphaess_comm_usart.c:5462,5691
alphaess_write_data函数声明midware/afci/afci_comm.c:67,109,763、midware/afci/afci_upgrade.c:102,204,231,以及 .c 内部收发函数
alphaess_recv_data函数声明midware/afci/afci_upgrade.c:127,以及 .c 内部所有查询/设置函数
alphaess_inverter_comm_usart函数声明midware/inverter/inverter.c:1116
alphaess_inverter_data_check函数声明midware/inverter/inverter.c:1117
alphaess_get_self_test_data函数声明midware/inverter/inverter.c:308
全部 ALPHAESS_ADDR_REG_*、功能码、缓冲尺寸宏宏主要被 alphaess_comm_usart.c 与 alphaess_comm_can.c 使用
ALPHAESS_* 枚举、ALPHAESS_ERROR*_U、ALPHAESS_WARNING*_U、ALPHAESS_RUN_TABLE_T 等类型类型被 alphaess_comm_can.c 复用(CAN 侧把同一套位域映射到 CAN 报文)

本文件依赖的外部符号

#include "includes.h"(工程公共头,含 u8/u16/s32/bool 与 uCOS-II 声明)与 #include "alphaess_upgrade.h"(行 13-14)。枚举 cNormalMode/cUPS/cByPassMode、DEFAULT_50HZ/AS4777_2/TOR_ERZEUGER 等 EMS 侧安规码、SUB_S5…SUB_T15 机型码、PVCHARGR_FROM_E、OEM_BW 等均来自 includes.h 汇聚的其它模块头文件(如 midware/inverter/inverter.h、data/system_config.h)。

6. 依赖关系

7. 备注与风险点

  1. 枚举跳号与"同名同值":ALPHAESS_SAFETY_COUNTRY_E 显式跳过 20/25/32/38 之间的若干值(行 204、209、215、216),说明 DSP 侧码表并非连续,新增标准时若插值会错位。ALPHAESS_INV_BAT_TYPE_E 在同一个枚举里既列电池化学类型又列 P=0/S=3 的并联/串联语义(行 243-251),两套含义共用一套枚举,调用处极易混淆。
  2. ALPHAESS_BW_G3_S5_INV2 = '1'(行 238):用字符常量参与数值比较,且与 ALPHAESS_BW_G3_T10_INV = 20 这类显式值混用,可读性差;实际只在 .c:1044 的 switch 中被匹配。
  3. ALPHAESS_ADDR_REG_CLEAR_ENERGY_CMD(40102)与 ALPHAESS_ADDR_REG_SET_INV_SN_CMD(40202)注释与常量名不一致:行 43/46 的地址值需与 DSP 手册核对,注释里 _NUM_ 语义为寄存器个数而非字节数。
  4. 结构体把 CAN 字段混进 SCI 结构(行 696-703 u8_ems_inv_idcode_flag、u32_ems_send_inv_ctrl_power_tick1 等):串口与 CAN 两套协议共用一个全局状态体,任何一处误用都会跨协议互相干扰。
  5. 位域联合体依赖编译器布局:ALPHAESS_ERROR1_U 等用 u8 x:1 逐位声明,位序与字节序完全依赖 Keil ARMCC 的实现(小端、低位先分配)。行 340-358 中大量 u8_bit18~u8_bit31 占位未命名语义,DSP 侧若扩展位定义,此处必须同步补齐,否则会静默把新故障吞掉。
  6. u8_display_type 在 ALPHAESS_RUN_TABLE_T 中被定义为 u8(行 578),但 .c:1139 赋值时写的是 (u32)((buf[69]<<8)|buf[70]),高位被截断——如果 DSP 真的用到 >255 的显示类型码会丢信息。
  7. ALPHAESS_ADDR_REG_QUERY_INV_RUNNING_DATA_PARALLEL(32000)和 ALPHAESS_ADDR_REG_SET_INV_FIRST_ONGRID_TIME(42037)、ALPHAESS_ADDR_REG_CLEAR_INV_FAULT(40148)在本文件对应的 .c 中未被使用,属于历史遗留或预留给 CAN 侧,删除前需确认无外部引用。
  8. 注释错别字/不一致:行 106 注释 "AFCI使能位" 地址 41023 与行 103 注释 "功能使能" 41000 的位置语义需注意;行 168 注释 "有功设置" 实为"安规有功/频率降载参数块"。