首页 / knowledge/代码解析/midware/inverter/set
set_comm_can.h
本页目录1. 文件职责2. 关键数据结构与宏2.1 调试与工具宏2.2 CAN 帧 ID 宏2.3 结构体2.4 对外全局变量与函数声明3. 函数清单4. 核心逻辑解析5. 对外接口6. 依赖关系7. 备注与风险点
源文件路径:
midware/inverter/set/set_comm_can.h所属模块:midware/inverter/set(盛能杰 S5 / S5-II / M10 逆变器通信) 代码行数:57
1. 文件职责
本头文件是盛能杰(Senergy)S5 系列逆变器 CAN 通道通信协议的对外声明文件。它把 EMS 与逆变器之间使用的 11 位标准帧 ID 固化成宏(EMS→INV 的 0x18x/0x19x/0x1Ax 下发类,INV→EMS 的 0x20x/0x26x 回读类),并定义了 EMS 侧的发送触发状态结构体 SET_COMM_CAN_T 供底层驱动层读写标志与节拍。文件本身不含任何可执行代码,只被 set_comm_can.c 实现,并被 set_comm_usart_s5.c 用于重置握手/保护参数下发标志。它处在"EMS 调度结果 → CAN 帧"这条数据链的路由表位置。
2. 关键数据结构与宏
2.1 调试与工具宏
| 名称 | 类型 | 说明 |
|---|---|---|
GET_VARIABLE_NAME(variable) | 宏 | #variable 字符串化,调试时打印变量名(第 13 行) |
SET_CAN_INV_DEBUG | 宏 0 | CAN 通信主调试开关,量产为 0 |
SET_CAN_INV_COMM_INIT_DEBUG | 宏 0 | CAN 初始化调试开关 |
SET_CAN_INV_COMM_DEBUG | 宏 0 | CAN 收发过程调试开关 |
SET_CAN_INV_DATA_CHECK_DEBUG | 宏 0 | 数据限幅检查调试开关(本文件中未被使用) |
SET_CAN_INV_BAT_PROTECT_ARG_DEBUG | 宏 0 | 电池保护参数下发调试开关 |
SET_CAN_INV_DC_CTRL_POWER | 宏 0 | DC 功率控制帧内容打印开关 |
2.2 CAN 帧 ID 宏
| 名称 | 类型 | 说明 |
|---|---|---|
SET_EMS_INV_IDCODE_PACK | 宏 0x181 | EMS→INV 握手/ID 码帧,数据域为 ASCII "AlphaESS" |
SET_EMS_INV_ACCURACY_CALIBRATION | 宏 0x198 | EMS→INV 电池电流校准帧(事件触发,非同周期帧) |
SET_EMS_CTRL_INV_DC_POWER1 | 宏 0x199 | EMS→INV DC 侧功率控制帧,8 字节(工作模式/MPPT/AC 限幅百分比/充放电电流) |
SET_EMS_SEND_BAT_PROTECT_ARG | 宏 0x1A1 | EMS→INV 电池保护参数下发帧(充放电截止电压、最大充放电电流) |
SET_INV_EMS_IDCODE_PACK | 宏 0x201 | INV→EMS 握手应答帧,收到即认为握手完成 |
SET_INV_EMS_PARA_SET_RESULT_PACK | 宏 0x202 | INV→EMS 参数设置结果应答帧,d0/d1 为被应答的命令字 |
SET_INV_EMS_RETURN_RUN_INFO_PACK1 | 宏 0x26B | INV→EMS 回读 1:并网有功功率/并网频率、备电有功功率/备电频率 |
SET_INV_EMS_RETURN_RUN_INFO_PACK2 | 宏 0x26C | INV→EMS 回读 2:并网电压、备电电压 |
SET_INV_EMS_RETURN_RUN_INFO_PACK3 | 宏 0x26D | INV→EMS 回读 3:逆变器工作模式、MPPT 启停状态、逆变有功功率、电池功率、电池电压 |
2.3 结构体
| 名称 | 类型 | 说明 |
|---|---|---|
SET_COMM_CAN_T | 结构体 | EMS 侧 CAN 发送触发与节拍容器,共 6 个成员:u8_ems_inv_idcode_flag(握手帧待发标志,1=发 0=不发)、u8_ems_set_inv_bat_protect_arg_flag1(电池保护参数待下发标志)、u32_ems_send_inv_ctrl_power_tick1(0x199 周期帧节拍基准)、u32_ems_inv_idcode_tick(0x181 节拍基准)、u32_inv_send_ems_can_tick1(最近一次收到 0x26B/C/D 的时间戳,用于超时判定)、u32_ems_set_inv_accuracy_calibration_tick(0x198 节拍基准) |
2.4 对外全局变量与函数声明
| 名称 | 类型 | 说明 |
|---|---|---|
g_t_set_comm_can_info | 全局变量(extern) | SET_COMM_CAN_T 类型,定义为非 static 全局量,定义在 set_comm_can.c:26;set_comm_usart_s5.c:4433 也会置位其中的翻标志位 |
set_inverter_comm_can | 函数声明 | CAN 收发主循环(发送 0x199/0x1A1/0x198,接收 0x201/0x202/0x26B~0x26D) |
set_inverter_can_data_check | 函数声明 | 下发前的电池参数限幅与变化检测 |
senergy_comm_init_can | 函数声明 | CAN 波特率(预分频)按子型号初始化 + 发送标志复位 |
set_inverter_comm_ate_can_test | 函数声明 | 产线 ATE 直通模式下的握手帧 1 s 周期发送 |
3. 函数清单
本文件为头文件,仅含函数声明,无函数定义。
| 函数名 | 作用域 | 说明 |
|---|---|---|
set_inverter_comm_can(void) | 全局(声明) | CAN 收发主循环,由 inverter.c 的 task_inverter_can 任务周期调用 |
set_inverter_can_data_check(void) | 全局(声明) | 电池保护参数限幅与变化检测,主循环前先执行 |
senergy_comm_init_can(void) | 全局(声明) | CAN 初始化,由 senergy_model_recognition() 与 senergy_comm_init() 调用 |
set_inverter_comm_ate_can_test(void) | 全局(声明) | ATE 直通测试模式专用握手帧发送 |
4. 核心逻辑解析
本文件无逻辑,仅提供协议字典。需要理解的重点在于帧 ID 的分工:
- 0x181 / 0x201 构成一次握手对:EMS 周期 1 s 重发
"AlphaESS"(8 字节 ASCII),直到收到 0x201 才停止。这个"握手未完成则停发所有控制帧"的设计,使 CAN 断线重连后必须先重新握手。 - 0x199 是唯一的高频控制帧(EMS 侧 45 ms 周期),承载 4 个控制量(工作模式、MPPT 启停、AC 并网功率限幅百分比、电池充/放电电流)。
- 0x1A1 与 0x198 是事件帧,分别由
set_inverter_can_data_check()检测到电池参数变化、以及 BMS 置位u8_ems_send_bat_cur_flag时触发。 - 0x26B/0x26C/0x26D 三帧共同刷新一次完整运行快照;
u32_inv_send_ems_can_tick1用它们的任意一帧到达时间做超时基准(60 s 无帧则重新握手)。
5. 对外接口
导出(供其他模块使用):
| 名称 | 使用者 |
|---|---|
g_t_set_comm_can_info | set_comm_can.c(读写)、set_comm_usart_s5.c:4433-4434(DSP 复位时重置两个待发标志) |
senergy_comm_init_can() | midware/inverter/inverter.c:76(初始化流程)、midware/inverter/set/set_comm_usart_s5.c:475(型号识别成功后) |
set_inverter_can_data_check() | midware/inverter/inverter.c:1223 |
set_inverter_comm_can() | midware/inverter/inverter.c:1224 |
set_inverter_comm_ate_can_test() | midware/inverter/inverter.c:1229 |
依赖的外部符号:includes.h(统一引入 u8/u16/u32/s16/s32、TRUE/FALSE、OSTimeGet/OSTimeDlyHMSM 等 uCOS-II 基础类型与 API)、CAN_MSG_TYPEDEF_T(实际定义在 hardware/can/can0.h:19-27,经 can1.h 间接引入)。
6. 依赖关系
- 依赖:仅
includes.h(工程统一头)。CAN_MSG_TYPEDEF_T不在此文件声明,由包含can1.h的实现文件提供。 - 被依赖:
midware/inverter/set/set_comm_can.c(唯一实现者)midware/inverter/set/set_comm_usart_s5.c(通过set_comm_usart_s5.h→set_comm_can.h间接引用g_t_set_comm_can_info)midware/inverter/inverter.c(通过同一链路口岸调用三个导出函数)
7. 备注与风险点
SET_CAN_INV_DATA_CHECK_DEBUG(第 18 行)定义后在本工程内无任何引用,属于遗留宏;同样SET_CAN_INV_DC_CTRL_POWER仅在set_comm_can.c的调试打印分支里用。- 头文件声明与实现注释不一致:
set_comm_can.c:52-58的注释块写的是kelong_inverter_comm,但紧跟其后的函数是send_ems_inv_idcode_cmd(static,未在本头文件声明)。这是从科隆模块拷贝模板留下的痕迹,容易误导阅读。 GET_VARIABLE_NAME宏放在对外头文件里,会污染所有包含者的命名空间,且与逆变器协议无直接关系。SET_COMM_CAN_T内没有成员表示"0x1A1 已发送/待发送之外的中断状态",所有跨状态判断都靠set_comm_can.c里的 static 局部量(如s_u32_inv_lost_tick),头文件无法完整反映 CAN 通道状态,做多文件重构时需注意。- 工程中共有两个同名协议头文件(
set_comm_can.h/set_comm_usart_s5.h)都定义了GET_VARIABLE_NAME,若两者同时包含且宏体不一致会产生重定义冲突(当前两者宏体相同,暂不冲突)。