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

alphaess_comm_can.h

源文件路径:midware/inverter/alphaess/alphaess_comm_can.h 所属模块:midware/inverter/alphaess(AlphaESS 逆变器 CAN 通信 + VAVE 电表校准) 代码行数:219

1. 文件职责

本文件是 alphaess_comm_can.c 的对外契约头文件,集中定义 EMS 与 AlphaESS 逆变器之间 CAN 通信的全部报文 ID(命令字)、逆变器工作模式枚举、以及 VAVE 电表芯片校准参数的数据结构与发送标志位域。它把 CAN 报文的"语义字典"和"参数容器"暴露给上层(HMI、Modbus、逻辑层),使非 CAN 模块也能填写校准数据、读取工作模式。

数据流上,它处在"外部模块写 dsp_meter_calibration_data → alphaess_comm_can.c 组帧下发"的入口位置;同时通过 extern 声明把 DSP_METER_CALIBRATION_DATA dsp_meter_calibration_data 与八个函数原型释放给整个工程。本文件不含任何可执行代码,全部是宏、类型与声明。

2. 关键数据结构与宏

名称类型说明
__ALPHAESS_COMM_CAN_H__宏头文件包含守卫
ALPHAESS_INV_DEBUG宏值 (0),本文件(及其实现文件)的调试打印总开关
ALPHAESS_EMS_INV_IDCODE_PACK宏0x181,EMS→INV 身份握手帧 ID
ALPHAESS_EMS_CTRL_BACKUP宏0x184,EMS→INV 备份/UPS 使能控制
ALPHAESS_EMS_INV_SET_CTRL_MODE宏0x190,EMS→INV 控制模式设置(单相/三相不平衡)
ALPHAESS_GINLONG_EMS_CTRL_INV_AC_POWER1宏0x192,EMS→INV AC 有功功率给定(命名残留 Ginlong 前缀)
ALPHAESS_EMS_CTRL_INV_AC_POWER2宏0x193,EMS→INV 直流充放电限值等
ALPHAESS_EMS_READ_BAT_CHG_DISCHG宏0x194,EMS→INV 电池最大充/放电功率
ALPHAESS_EMS_SET_INV_CTRL_ARG1宏0x195,EMS→INV MPPT 百分比 + 备电频率偏移
ALPHAESS_EMS_SEND_BAT_STATE宏0x1A0,EMS→INV 电池运行状态
ALPHAESS_EMS_SEND_BAT_PROTECT宏0x1A1,EMS→INV 电池保护参数
ALPHAESS_INV_EMS_IDCODE_PACK宏0x201,INV→EMS 握手应答
ALPHAESS_INV_EMS_RETURN_RUN_INFO_PACK4~PACKA宏0x263~0x269,INV→EMS 运行数据回传(7 帧)
DSP_METER_RUN_INFO_PACK1~PACK10宏0x301~0x310,VAVE 电表芯片运行数据回传
DSP_METER_CALI_DATA_PACK0~PACKA宏0x340~0x34A,电表校准数据下行帧
DSP_METER_CALI_DATA_PACKB宏0x350,相位数据校准模式(双向,含回读)
DSP_METER_CALI_DATA_PACKC宏0x360,设置储能逆变发电量/买电量
DSP_METER_CALI_DATA_PACKD宏0x361,设置并网机发电量
ZERO_CONFIRM_CNT宏值 5,毛刺滤波判定真实 0 的连续次数阈值
zero_glitch_filter_t结构体int32_t s32_last_value + uint8_t zero_cnt,偶发 0 毛刺滤波器状态
ALPHAESS_OPERATION_MODE_E枚举逆变器工作模式:ALPHAESS_POWER_ON_E(0)、WAIT_E(1)、BYPASS_E(2)、CHECK_E(3)、ON_GRID_E(4)、OFF_GRID_E(5)、SELF_TEST_E(6)、FAULT_E(7)、UPDATA_E(8)、SHUTDOWN_E(9)、DC_MODE_E(10)、POWER_ON_E_2(255)
SEND_CALIBRATION_DATA_FLAG联合体u16 u16_all 与 16 位位域 bit 的联合;bit0~bit13 依次对应 0x340/341/342/343/344/345/346/347/348/349/34A/350/360/361 的"待发送"标志,bit14/bit15 保留
DSP_METER_CALIBRATION_DATA结构体电表校准全量参数:R/S/T 三相电压校准点、电网电流校准点、PV 电流校准点、电网放电功率校准点 0/1、PV 放电功率校准点 0/1、电网充电功率校准点 0/1、校准模式与复位、清除电量指令(bit0 放电/bit1 发电/bit2 并网机发电)、CT 自检使能、相位校准数据与触发、储能逆变发电量/买电量高低字节、并网机发电量高低字节;#pragma pack(1) 紧凑布局
dsp_meter_calibration_data全局变量声明extern,实体定义在 alphaess_comm_can.c:27

3. 函数清单

本文件为纯声明头文件,不含函数定义;下表列出其声明的全部函数原型(均在 alphaess_comm_can.h:208~215)。

函数名作用域说明
alphaess_comm_init_can全局声明(原型)初始化 CAN1 与 CAN 侧发送标志,实体见 alphaess_comm_can.c:60
ems_ate_reset_dsp全局声明(原型)ATE 模式复位 DSP:连发 AC 功率/DC 限值/电池功率/电池状态,实体见 alphaess_comm_can.c:83
alphaess_inverter_comm_can全局声明(原型)CAN 通信主循环:握手、周期下发、接收解析、链路丢失检测,实体见 alphaess_comm_can.c:1057
alphaess_inverter_can_data_check全局声明(原型)CAN 收到数据的后处理与重发标志置位,实体见 alphaess_comm_can.c:1330
parse_alphaess_work_mode全局声明(原型)将 ALPHAESS 工作模式码翻译为项目统一运行模式码,实体见 alphaess_comm_can.c:118
handle_alphaess_inv_set_battery_shutdown_flag全局声明(原型)声明为"根据电池侧空开状态处理逆变器关机标志",全工程无任何定义,属死声明
zero_glitch_filter全局声明(原型)采样值偶发 0 毛刺滤波,实体见 alphaess_comm_can.c:1374
zero_glitch_filter_reset全局声明(原型)复位毛刺滤波器状态,实体见 alphaess_comm_can.c:1399

4. 核心逻辑解析

本文件无状态机与算法实现,核心逻辑体现在CAN 报文 ID 空间的划分与校准标志位域的位序约定上。

4.1 CAN ID 空间划分

文件用注释显式把 CAN ID 分成两组,形成一条不对称的双向约定:

EMS → INV(0x1xx / 0x3xx 下行)

ID用途
0x181身份握手,数据域 ASCII "AlphaESS"
0x184备份(UPS)使能
0x190控制模式(单相 / 三相不平衡)
0x192AC 有功功率给定(总有功 + A/B/C 相)
0x193DC 充放电限值 + 软启动 + 电池连接状态 + 电池总电流
0x194电池最大充放电功率(变化时发)
0x195MPPT 百分比 + 备份频率偏移
0x1A0电池运行状态
0x1A1电池保护参数
0x340~0x34A, 0x350, 0x360, 0x361电表校准与电量设置

INV → EMS(0x2xx / 0x3xx 上行)

ID用途
0x201握手应答
0x263~0x269运行数据回传(电网/备份/逆变器三相电压电流功率、频率、电池功率、工作模式)
0x301~0x310VAVE 电表芯片运行数据
0x350相位校准数据回读

注意 0x350 同时出现在两个方向(DSP_METER_CALI_DATA_PACKB,:68 与 :1291 的处理),下行写校准数据、上行读回读值;0x340~0x34A、0x360、0x361 为纯下行。此外 0x181/0x201、0x192/0x263~0x269 等上下行 ID 之间没有固定的 +0x80 或镜像关系,只能查表匹配。

4.2 校准标志位域(SEND_CALIBRATION_DATA_FLAG.bit)

位域与帧 ID 的映射由实现文件 ems_send_dsp_meter_calibration_data()(alphaess_comm_can.c:980)按 switch(i) 消费,约定如下:

bit字段名对应帧
0u8_send_volt_calibration_flag0x340 电压校准
1u8_send_curr_calibration_flag0x341 电网电流校准
2u8_send_pvcurr_calibration_flag0x342 PV 电流校准
3u8_send_pdischg_calibration0_flag0x343 放电功率校准 0
4u8_send_pdischg_calibration1_flag0x344 放电功率校准 1
5u8_send_pvpdischg_calibration0_flag0x345 PV 放电功率校准 0
6u8_send_pvpdischg_calibration1_flag0x346 PV 放电功率校准 1
7u8_send_pchg_calibration0_flag0x347 充电功率校准 0
8u8_send_pchg_calibration1_flag0x348 充电功率校准 1
9u8_send_calibration_mode_flag0x349 校准模式
10u8_send_ct_self_check_mode_flag0x34A CT 自检
11u8_send_set_calibration_mode_flag0x350 相位数据校准
12u8_send_set_inverter_gen_flag0x360 储能逆变发电量
13u8_send_set_pgu_gen_falg0x361 并网机发电量

因为位域在 #pragma pack(1) 内按声明顺序自低到高分配,u16_all 的 bit 序与上表一致;使用方只需对 u16_all 按位或即可一次挂起多帧。

4.3 zero_glitch_filter_t 的状态语义

zero_glitch_filter_t 的设计意图写在结构体成员注释里(:78~:79):s32_last_value 保存"上一个有效值",zero_cnt 保存"连续 0 计数"。调用方(alphaess_comm_can.c 的接收解析分支)为每个物理量各自持有一份 static 状态,配合 ZERO_CONFIRM_CNT = 5 实现"偶发 0 沿用电网表上次值、连续 5 次 0 才认真实 0"的抗毛刺策略。

4.4 打包与对齐约定

#pragma pack(1) ... #pragma pack()(:99、:204)包住 SEND_CALIBRATION_DATA_FLAG 与 DSP_METER_CALIBRATION_DATA,保证结构体内无填充字节,便于按偏移整体读写或跨模块二进制对齐。需要注意 DSP_METER_CALIBRATION_DATA 前四个字段是 SEND_CALIBRATION_DATA_FLAG(2B) + u16 + u16,后续全为 s16/u16,因此结构体内所有校准点偏移都是偶数字节,不存在字节错位问题。

5. 对外接口

本文件导出

符号类型使用者
全部 ALPHAESS_* / DSP_METER_* 帧 ID 宏宏alphaess_comm_can.c(组帧/解析)、alphaess_upgrade.c(alphaess_comm_init_can)
ALPHAESS_OPERATION_MODE_E枚举alphaess_comm_can.c:parse_alphaess_work_mode
SEND_CALIBRATION_DATA_FLAG联合体DSP_METER_CALIBRATION_DATA 内嵌
DSP_METER_CALIBRATION_DATA结构体alphaess_comm_can.c、以及任何需要填写校准参数的模块
dsp_meter_calibration_data全局变量(extern)由 alphaess_comm_can.c:27 定义;HMI/Modbus 可写入
zero_glitch_filter_t结构体alphaess_comm_can.c 内 static 滤波器实例
八个函数原型声明见第 3 节

本文件依赖的外部符号

来源使用内容
includes.h(:13)聚合头,提供 u8/u16/s16/s32/int32_t/uint8_t 等基础类型与工程公共头

除 includes.h 外不 include 任何其他头文件,因此本头文件不能单独编译,必须放在 includes.h 之后。

6. 依赖关系

依赖

被依赖

7. 备注与风险点

  1. handle_alphaess_inv_set_battery_shutdown_flag 无定义(:213):全工程仅有此一处声明,任何调用都会链接失败。属版本遗留的死声明,建议删除或补实现。
  2. zero_glitch_filter() / zero_glitch_filter_reset() 被导出但无外部调用者(:214~:215):全工程搜索仅在 alphaess_comm_can.c 内使用,zero_glitch_filter_reset 甚至在本文件之外完全未被调用,属未被使用的接口。
  3. 命名残留:ALPHAESS_GINLONG_EMS_CTRL_INV_AC_POWER1(:21)带 GINLONG(锦浪)前缀,实际是 AlphaESS 的 0x192 帧,应为跨厂商复制粘贴残留,易误导。
  4. DSP_METER_CALIBRATION_DATA 存在语义重复字段(:136~:137 与 :176~:177):u16_calibration_enable / u16_reset_calibration_mode 与后面的 u16_calib_mode / u16_reset_calib_mode 名称、含义高度重叠,后者才是 ems_send_349pack 实际使用的字段(alphaess_comm_can.c:841~844),前者疑似废弃。
  5. DSP_METER_CALI_DATA_PACKA 与 DSP_METER_CALI_DATA_PACKB 的 ID 不连续(:67~:68):PACKA = 0x34A、PACKB = 0x350,跳过了 0x34B~0x34F,而 PACKC = 0x360、PACKD = 0x361 又跳回 0x36x 段。这种"十六进制后缀命名 + 不连续数值"的组合极易被误读为连续地址。
  6. DSP_METER_RUN_INFO_PACK10 的编号是十进制 10(:54),而相邻宏用十六进制后缀 A~F(:48~:53)。0x301~0x30F 用 A~F,第十六个却写作 PACK10,命名风格不一致(值 0x310 正确)。
  7. ALPHAESS_OPERATION_MODE_E 与实现文件的 switch 不完全对齐(:82~:96 对比 alphaess_comm_can.c:123~165):枚举里定义了 ALPHAESS_SHUTDOWN_E(9),但 parse_alphaess_work_mode 的 switch 没有该 case,会落到 default: 0xff;ALPHAESS_UPDATA_E(8) 虽有 case 但返回 0(l_u8_run_mode 初值),语义不明显。
  8. 位域 bit14/bit15 无实际用途(:125~:126),仅为补齐 16 位;若将来新增校准帧需注意帧 ID 与 bit 序号需要同步维护两处。
  9. ZERO_CONFIRM_CNT 为固定 5 且不可配置(:74):不同物理量(电压/有功功率)的采样率与噪声特性不同,共用同一阈值是简化处理,注释也仅说明"连续 N 次为 0 判定为真实 0"。
  10. 头文件不自包含:依赖 includes.h 提供的定长类型,若在其他子系统中单独 include 会编译失败;建议在头内显式 include includes.h(当前已通过 :13 包含,但 zero_glitch_filter_t 使用了标准 int32_t/uint8_t,混用工程自定义 u8/s16 与 C99 类型,风格不统一)。