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

set_comm_can.h

源文件路径: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宏 0CAN 通信主调试开关,量产为 0
SET_CAN_INV_COMM_INIT_DEBUG宏 0CAN 初始化调试开关
SET_CAN_INV_COMM_DEBUG宏 0CAN 收发过程调试开关
SET_CAN_INV_DATA_CHECK_DEBUG宏 0数据限幅检查调试开关(本文件中未被使用)
SET_CAN_INV_BAT_PROTECT_ARG_DEBUG宏 0电池保护参数下发调试开关
SET_CAN_INV_DC_CTRL_POWER宏 0DC 功率控制帧内容打印开关

2.2 CAN 帧 ID 宏

名称类型说明
SET_EMS_INV_IDCODE_PACK宏 0x181EMS→INV 握手/ID 码帧,数据域为 ASCII "AlphaESS"
SET_EMS_INV_ACCURACY_CALIBRATION宏 0x198EMS→INV 电池电流校准帧(事件触发,非同周期帧)
SET_EMS_CTRL_INV_DC_POWER1宏 0x199EMS→INV DC 侧功率控制帧,8 字节(工作模式/MPPT/AC 限幅百分比/充放电电流)
SET_EMS_SEND_BAT_PROTECT_ARG宏 0x1A1EMS→INV 电池保护参数下发帧(充放电截止电压、最大充放电电流)
SET_INV_EMS_IDCODE_PACK宏 0x201INV→EMS 握手应答帧,收到即认为握手完成
SET_INV_EMS_PARA_SET_RESULT_PACK宏 0x202INV→EMS 参数设置结果应答帧,d0/d1 为被应答的命令字
SET_INV_EMS_RETURN_RUN_INFO_PACK1宏 0x26BINV→EMS 回读 1:并网有功功率/并网频率、备电有功功率/备电频率
SET_INV_EMS_RETURN_RUN_INFO_PACK2宏 0x26CINV→EMS 回读 2:并网电压、备电电压
SET_INV_EMS_RETURN_RUN_INFO_PACK3宏 0x26DINV→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 的分工:

5. 对外接口

导出(供其他模块使用):

名称使用者
g_t_set_comm_can_infoset_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. 依赖关系

7. 备注与风险点

  1. SET_CAN_INV_DATA_CHECK_DEBUG(第 18 行)定义后在本工程内无任何引用,属于遗留宏;同样 SET_CAN_INV_DC_CTRL_POWER 仅在 set_comm_can.c 的调试打印分支里用。
  2. 头文件声明与实现注释不一致:set_comm_can.c:52-58 的注释块写的是 kelong_inverter_comm,但紧跟其后的函数是 send_ems_inv_idcode_cmd(static,未在本头文件声明)。这是从科隆模块拷贝模板留下的痕迹,容易误导阅读。
  3. GET_VARIABLE_NAME 宏放在对外头文件里,会污染所有包含者的命名空间,且与逆变器协议无直接关系。
  4. SET_COMM_CAN_T 内没有成员表示"0x1A1 已发送/待发送之外的中断状态",所有跨状态判断都靠 set_comm_can.c 里的 static 局部量(如 s_u32_inv_lost_tick),头文件无法完整反映 CAN 通道状态,做多文件重构时需注意。
  5. 工程中共有两个同名协议头文件(set_comm_can.h / set_comm_usart_s5.h)都定义了 GET_VARIABLE_NAME,若两者同时包含且宏体不一致会产生重定义冲突(当前两者宏体相同,暂不冲突)。