inovance_comm_usart.h
源文件路径:
midware/inverter/inovance/inovance_comm_usart.h所属模块:midware/inverter/inovance(汇川 Inovance 逆变器通信协议) 代码行数:783
1. 文件职责
本文件是汇川(Inovance)逆变器 SCI(Modbus-RTU 串口)通道的协议契约头文件:它集中定义了该通道使用的全部寄存器地址表、功能码、位域联合体、事件标志表、通信总表结构与对外函数原型,是 inovance_comm_usart.c 与 inovance_comm_can.c 共享的类型与常量来源。
数据流位置上,它本身不产生任何行为,而是"数据字典 + 类型定义":INOVANCE_TABLE_T(g_t_inovance_comm_info)是全通道的运行时状态容器,INOVANCE_SCI_FLAG_U(u64_sci_flag)是驱动主循环的位标志表,INOVANCE_ERROR1_U/INOVANCE_WARNING1_U 等联合体是逆变器故障/告警原始位域的直接映射。
被谁使用:inovance_comm_usart.c(第 14 行 include)大量使用全部定义;inovance_comm_can.c 复用其中的 CAN 帧 ID 宏(125-141 行)与 INOVANCE_TABLE_T 中的 CAN 字段;midware/inverter/inverter.c 通过同一份全局表读取机型等信息。
本文件不定义任何函数体、不创建任务,只做声明与宏定义;第 775-782 行的 8 个函数原型是本通道的对外接口契约。
2. 关键数据结构与宏
2.1 通信参数与通用宏
| 名称 | 类型 | 说明 |
|---|---|---|
INOVANCE_INV_DEBUG | 宏 | SCI 通道调试打印总开关,值 0(第 17 行) |
INOVANCE_SAFETY_DEBUG | 宏 | 安规参数调试打印开关,值 0(第 18 行) |
EMS_INV_ID_CODE | 宏字符串 | "ALPHAESS",EMS 身份识别码(第 20 行);在本目录 .c 中未被引用 |
INOVANCE_MAX_REGISTER_NUM | 宏 | 单次读写寄存器数量上限 100(第 23 行),用作 ems_send_ctrl_data_to_inovance() 的组帧合法性判据 |
INOVANCE_INV_RECV_BUFFER_SIZE | 宏 | 接收缓冲长度 512(第 24 行),s_u8_inovance_recv_buf 与黑匣子缓冲均用此值 |
INOVANCE_DAT_PCK_INTERVAL_INV | 宏 | 帧间最小间隔与串口发送超时,100 ms(第 25 行) |
INOVANCE_EMS_INV_COMM_LOST_TIME | 宏 | SCI 通讯丢失判据 30 000 ms(第 26 行) |
INOVANCE_INV_INIT_TIME | 宏 | 上电查询设备信息的重试周期 2 000 ms(第 27 行) |
INOVANCE_BLACK_BOX_TIME | 宏 | 黑匣子各步骤等待时间 4 000 ms(第 28 行) |
INOVANCE_BLACK_BOX_POINTS_T | 宏 | 录波总点数 320(第 30 行)——在 .c 中未被引用(FAULT_SCORD_T 的数组维度是硬编码的 320,见 net/ems.h:454) |
INOVANCE_BLACK_BOX_POINTS_S | 宏 | 每帧点数 4(第 31 行) |
INOVANCE_BLACK_BOX_POINTS_NUM | 宏 | 录波帧数 80(第 32 行),80 × 4 = 320 |
INOVANCE_BLACK_BOX_DATA_OFFSET | 宏 | 录波帧内每点的字节步长 70(第 33 行) |
MAX_REQUEST_NUM | 宏 | 黑匣子流程最大请求次数 30(第 34 行) |
TOTAL_CHANNELS_16 / TOTAL_CHANNELS_32 | 宏 | 录波 16 位通道数 19 / 32 位通道数 8(第 35-36 行),与 FAULT_SCORD_T.s16_channel[19]/s32_channel[8] 对应 |
S16_DATA_START_OFFSET / S32_DATA_START_OFFSET | 宏 | 录波点内数据起始偏移 5 / 43(第 37-38 行)——定义了但 .c 中未使用,save_fault_scord() 仍写死 5 和 43 |
2.2 Modbus 从站与功能码
| 名称 | 类型 | 说明 |
|---|---|---|
INOVANCE_SLAVE_ADDRESS = 0x01 | 宏 | 逆变器 Modbus 从站地址(第 40 行) |
INOVANCE_FUNC_READ_HOLDING_REGISTER = 0x03 | 宏 | 读保持寄存器(第 41 行) |
INOVANCE_FUNC_WRITE_SIGNAL_HOLDING_REGISTER = 0x06 | 宏 | 写单个保持寄存器(第 42 行) |
INOVANCE_FUNC_WRITE_MULTIPLE_HOLDING_REGISTER = 0x10 | 宏 | 写多个保持寄存器(第 43 行) |
2.3 逆变器保持寄存器地址表(第 45-122 行)
| 名称 | 值 | 说明 |
|---|---|---|
INOVANCE_ADDR_REGISTER_QUERY_INV_DEVICE_INFO | 0x0000 | 设备信息(机型/SN/额定功率/版本),数量 INOVANCE_NUM_QUERY_INV_DEVICE_INFO = 27(45-46) |
INOVANCE_ADDR_REGISTER_QUERY_INV_ENERGY_STATISTICS | 0x010A | 能量统计,数量 = 2(48-49) |
INOVANCE_ADDR_REGISTER_QUERY_INV_RUNNING_DATA | 0x010C | 运行数据,数量 = 66(51-52) |
INOVANCE_ADDR_REGISTER_QUERY_INV_ERROR_MSG | 0x0136 | 故障信息,数量 = 16(54-55)——未被 .c 引用 |
INOVANCE_ADDR_REGISTER_QUERY_INV_PARALLEL_RUNNING_DATA | 0x0400 | 并机运行数据(57)——未被 .c 引用 |
INOVANCE_ADDR_REGISTER_SET_INV_RTC_CALIBRATION | 0x0500 | RTC 校准,数量 = 3(59-60) |
INOVANCE_ADDR_REGISTER_SET_INV_CLEAR_ENERGY | 0x1000 | 清电量(62) |
INOVANCE_ADDR_REGISTER_SET_INV_CLEAR_FAULT | 0x1001 | 清故障(64) |
INOVANCE_ADDR_REGISTER_SET_INV_START_STOP | 0x1002 | 启停(66) |
INOVANCE_ADDR_REGISTER_SET_INV_ON_OFF | 0x1003 | 开关机(68) |
INOVANCE_ADDR_REGISTER_SET_INV_SOFT_RESTART | 0x1004 | 软重启(70) |
INOVANCE_ADDR_REGISTER_SET_INV_MACHINE_MODE | 0x1005 | 油机模式(72) |
INOVANCE_ADDR_REGISTER_SET_INV_PARALLEL_MODE | 0x1006 | 并机模式(74)——未被 .c 引用 |
INOVANCE_ADDR_REGISTER_SET_INV_BAT_AWAKE | 0x1007 | 电池唤醒(76)——未被 .c 引用 |
INOVANCE_ADDR_REGISTER_SET_INV_MPPT_SCAN_ENABLE | 0x1008 | 阴影扫描使能(78) |
INOVANCE_ADDR_REGISTER_SET_INV_GRID_FORMING_ENABLE | 0x1009 | grid-forming 使能(80) |
INOVANCE_ADDR_REGISTER_SET_INV_GRID_ADAPTIVE_ENABLE | 0x100A | 相序自适应使能(82) |
INOVANCE_ADDR_REGISTER_SET_INV_BAT_TYPE | 0x100B | 电池类型(84) |
INOVANCE_ADDR_REGISTER_SET_INV_WEAK_POWER_GRID | 0x100C | 弱电网使能(86)——未被 .c 引用 |
INOVANCE_ADDR_REGISTER_SET_INV_ZERO_DRIFT | 0x100D | 零漂类型(88)——仅出现在被注释的 inovance_zero_drift_type() 中 |
INOVANCE_ADDR_REGISTER_SET_INV_BAT_HEATING | 0x100F | 电池加热使能(起始),后两个寄存器为加热电压 0x1010、加热电流 0x1011 |
INOVANCE_ADDR_REGISTER_SET_INV_BAT_HEATER_STATE | 0x1012 | 加热膜接入状态(92) |
INOVANCE_ADDR_REGISTER_SET_INV_EMS_RAMP_STATE | 0x101E | EMS 爬坡状态(94)——未被 .c 引用 |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_PROTECT_ARG1 | 0x1200 | 安规功能使能 64 位位域(低 32 位占 0x1200-0x1201)(96) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY | 0x1400 | 主安规编号(0x1401 为子安规编号)(100) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_VOLTAGE_PROTECT | 0x1402 | 电压保护,数量 18(102-103) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_FREQUENCY_PROTECT | 0x1416 | 频率保护,数量 14(105-106) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT1 | 0x1426 | 安规参数 1(并网等待/重连、ISO、DCI),数量 5(108-109) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT2 | 0x142D | 安规参数 2(GFCI、PF、固定 Q),数量 8(111-112) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_POWER_REGULATE | 0x1600 | 有功功率调节,数量 14(114-115) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_REACTIVE_POWER | 0x1700 | 无功功率设置,数量 18(117-118) |
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT3 | 0x1013 | 安规参数 3(恢复点、降额率曲线),数量 12(121-122) |
注意:
..._ARGUMENT3定义在文件末尾(121-122 行),与其它安规宏的排布顺序不一致,地址也跳回 0x1013 段;..._POWER_REGULATE_NUM(14) 与..._REACTIVE_POWER_NUM(18) 两个数量宏在.c中并未使用(代码分别硬编码 8 和 17)。
2.4 CAN 帧 ID(第 125-141 行)
| 名称 | 值 | 说明 |
|---|---|---|
INOVANCE_EMS_INV_IDCODE_PACK | 0x181 | EMS→逆变器 身份握手 |
INOVANCE_EMS_INV_SET_CTRL_MODE | 0x190 | EMS→逆变器 控制模式 |
INOVANCE_EMS_CTRL_INV_AC_POWER1 | 0x192 | EMS→逆变器 交流有功设定 |
INOVANCE_EMS_CTRL_INV_BAT_STATE | 0x193 | EMS→逆变器 电池充放电限值 |
INOVANCE_EMS_SEND_BMS_POWER_LIMIT | 0x194 | EMS→逆变器 BMS 功率限值 |
INOVANCE_EMS_SET_INV_CTRL_ARG1 | 0x195 | EMS→逆变器 MPPT/频率偏移/UPS |
INOVANCE_EMS_SEND_BAT_RUNNING_DATA | 0x1A0 | EMS→逆变器 电池运行数据 |
INOVANCE_EMS_SEND_BAT_PROTECT | 0x1A1 | EMS→逆变器 电池保护参数 |
INOVANCE_INV_EMS_IDCODE_PACK | 0x201 | 逆变器→EMS 身份应答 |
INOVANCE_INV_EMS_RUN_INFO_PACK4~PACKA | 0x263~0x269 | 逆变器→EMS 电网/备电/机侧运行数据(7 帧) |
这 16 个宏本文件定义后主要由
inovance_comm_can.c使用(详见inovance_comm_can.c.md第 2 节),在inovance_comm_usart.c中未被引用。
2.5 黑匣子(故障录波)宏(第 143-147 行)
| 名称 | 值 | 说明 |
|---|---|---|
INOVANCE_BBOX_ADDR | 0xFE | 黑匣子从站地址 |
FUNC_READ_BBOX | 0x03 | 标准读寄存器 |
FUNC_READ_BBOX_INDEX | 0x06 | 写单个寄存器(用于设置目录/索引指针) |
FUNC_READ_BBOX_DATA | 0x16 | 自定义读数据功能码 |
2.6 枚举
| 名称 | 类型 | 说明 |
|---|---|---|
INOVANCE_INV_VAR_RESPONSE_MODE_E (149) | 枚举 | 无功响应模式:INOVANCE_NO_VAR_RESPONSE=0、INOVANCE_FIX_POWER_FACTOR=1、INOVANCE_POWER_PF=2(cosφ(p))、INOVANCE_FIX_REACTIVE_POWER=3、INOVANCE_VOLT_VAR_LINEAR=4(Q(U) 线性)、INOVANCE_VOLT_VAR_LOOP=5(Q(U) 滞环)、INOVANCE_RESPONSE_MODE_MAX 为哨兵。query_inv_safety_reactive_power_data() 据此设置 safty_mode_u.BIT |
INOVANCE_TYPE_E (161) | 枚举 | 机型:INOVANCE_TYPE_NONE=0、T12=1、T15=2、T20=3、T20_OLD=52。query_inv_device_info() 据此选择额定参数与 SUB_T12/T15/T20 子机型 |
INOVANCE_OPERATE_CODE_E (171) | 枚举 | 启停操作码:INOVANCE_OPERATE_NONE=0、STOP=1、START=2 |
BLACKBOX_STATE_E (709) | 枚举 | 黑匣子读取状态机:QUERY_BLACK_BOX=0、WAIT_DIRECTORY_UPLOAD、READ_DIRECTORY_CONTENT、SET_INDEX_NUM、WAIT_FAULTDATA_UPLOAD、READ_DIRECTORY |
2.7 位域联合体
| 名称 | 类型 | 说明 |
|---|---|---|
INOVANCE_ERROR1_U (178) | 联合体 | 故障字 1,64 位。三种视图:u64_all(整字比较/上报)、word.u16_word1~4(按字解析)、bit.*(63 个具名位,按 BYTE0~BYTE7 注释分组)。覆盖母线过压、半桥硬件过压、母线不平衡、逆变硬件过流、PV1~4 反接/软件过压/软件反接/软件过流、输出过载、各类过温、BDC 过流/预充/自检失败、GFCI、绝缘、PE、各类零漂、DCI、继电器故障、电池继电器粘连/断开、电池过压/欠压、EMS SCI/CAN、EEPROM 读写失败、FPGA、多路复选器、电网谐振、PV 散热器过温等 |
INOVANCE_ERROR2_U (275) | 联合体 | 故障字 2:BYTE0 电网过流、备电过压/欠压、PV1~3 硬件过压、负载过流、平衡桥零漂;BYTE1 逆变电流控制错误、电网缺相/相序失败、电网三相与负载三相零漂;BYTE2 加热膜开关超时、加热电流/电压故障;bit20 之后为未命名占位位(bit20~bit63),说明协议高 44 位尚未建模 |
INOVANCE_WARNING1_U (371) | 联合体 | 告警字 1:电网过压/欠压/过频/欠频、EMS-BMS 丢失、电池断开、电池过压/欠压、内外风扇故障、黑匣子 FLASH、RTC、孤岛、HVRT/LVRT、电网缺相、板温告警;BYTE3 之后为未命名占位 |
INOVANCE_WARNING2_U (468) | 联合体 | 告警字 2:只有 u64_all 与 word 视图,没有 bit 逐位定义,属于占位/未完成建模 |
INOVANCE_SAFETY_FUNCTION_ENABLE_U (482) | 联合体 | 安规功能使能位域(对应寄存器 0x1200-0x1201)。具名位:有功控制、起始斜率、电网电压降载(P-V)、电网频率降载(P-F)、无功控制、LVRT、HVRT、电网电压保护、电网频率保护、10 min 过压保护、孤岛检测、DCI 检测、绝缘检测、GFCI 检测、UPS 电压保护、DCV 检测、过温降载、N-PE 继电器检测、L/N 反接保护、N/N 反接保护、N 继电器检测、N-PE 短路等;bit32 之后为占位 |
INOVANCE_SCI_FLAG_U (579) | 联合体 | 本通道的核心事件标志表(g_t_inovance_comm_info.u64_sci_flag)。BYTE0/BYTE1/BYTE2:查询类标志(设备信息、安规、油机模式、MPPT、grid-forming、安规功能/电压/频率/参数 1~3/功率调节/无功、故障录波、相序自适应、加热模式、加热膜状态、澳洲 CEC);BYTE5:u8_set_inv_on_off_flag、u8_set_inv_safesub_flag、u8_set_inv_safety_argument3_flag、u8_inovance_bat_heater_sta_flag、u8_set_bat_heater_state_flag;BYTE6:u8_set_bat_heating_mode_flag、u8_set_phase_adaptive_enable_flag、u8_set_inv_safety_reactive_power_flag、u8_set_inv_safety_power_regulate_flag、u8_set_inv_safety_argument2_flag、u8_set_inv_safety_argument1_flag、u8_set_inv_safety_fre_protect_flag、u8_set_inv_safety_vol_protect_flag;BYTE7:u8_set_bat_type_flag、u8_set_inv_safety_function_flag、u8_set_grid_forming_enable_flag、u8_set_mppt_scan_enable_flag、u8_set_inv_rtc_calibration_flag、u8_set_inv_machine_mode、u8_set_inv_safety_flag、u8_set_inv_start_stop_flag;另有 u8_check_inv_info_flag(bit0) 与 u8_special_Australia_cec_flag(bit18) |
2.8 结构体
| 名称 | 类型 | 说明 |
|---|---|---|
INOVANCE_RUN_INFO_T (676) | 结构体 | SCI 通道特有的运行信息(与 CAN 通道上报的实时功率数据互补):u16_inv_type、u16_grid_rated_volt/freq、s16_machine_temp1~5、u16_pv_power_total、u8_generator_mode、u8_backupbox_mode、u8_parallel_mode、u8_mppt_scan_enable、u8_display_type、u8_grid_forming_enable、u8_bat_type、u8_phase_adaptive_enable、u8_bat_heating_enable、u16_bat_heating_volt、u16_bat_heating_current、u8_bat_heater_state,尾部 tmp1~tmp6 为调试槽 |
INOVANCE_TABLE_T (719) | 结构体 | 通信总表,实例 g_t_inovance_comm_info。成员分三组:(a) SCI 组——INOVANCE_SCI_FLAG_U u64_sci_flag 加 6 个 tick(u32_ems_inv_comm_tick、u32_query_inv_device_info_tick、u32_query_inv_running_data_tick、u32_query_inv_safety_tick、u32_query_inv_energy_statistics_tick、u32_set_inv_rtc_calibration_tick);(b) CAN 组——5 个下发标志(u8_ems_inv_idcode_flag、u8_set_inv_ctrl_arg1_flag、u8_set_inv_ctrl_mode_flag、u8_set_inv_bms_power_limit_flag、u8_set_inv_bat_protect_flag)与 3 个 tick(u32_ems_inv_idcode_tick、u32_ems_send_inv_ctrl_power_tick、u32_ems_inv_can_comm_tick);(c) 运行数据组——u64_inv_fault1/2、u64_inv_warning1/2、INOVANCE_RUN_INFO_T t_run_info、INOVANCE_SAFETY_FUNCTION_ENABLE_U u_safety_function_enable、u8_save_config_flag。该结构是 SCI 与 CAN 两个 .c 文件的共享状态中枢 |
INOVANCE_SPECIAL_SAFETY_TABLE_T (754) | 结构体 | 特殊安规暂存表,实例 g_t_inovance_special_safety。用于承接 0x1600 功率调节块与 0x1700 无功块中没有对应 EMS 字段的中间量:u16_power_regulate_tmp1/2/3、u16_p_pf_mode_p4、u16_p_pf_mode_pf1/pf2、u16_ovp1_value、u16_ovp1_time、u8_p_v_mode_down_load_enable |
2.9 对外符号声明(第 772-782 行)
| 名称 | 类型 | 说明 |
|---|---|---|
g_t_inovance_comm_info | extern INOVANCE_TABLE_T | 通信总表,定义在 inovance_comm_usart.c:30 |
g_t_inovance_special_safety | extern INOVANCE_SPECIAL_SAFETY_TABLE_T | 特殊安规暂存表,定义在 inovance_comm_usart.c:31 |
inovance_write_data | 函数原型 | 串口发送出口 |
inovance_inverter_data_check | 函数原型 | 变化检测器 |
inovance_comm_init | 函数原型 | 通道初始化 |
inovance_inverter_comm | 函数原型 | 通道主循环 |
inovance_set_inv_start_stop | 函数原型 | 启停命令下发 |
inovance_set_inv_on_of | 函数原型 | 开关机命令下发 |
read_blackbox_handle | 函数原型 | 黑匣子读取状态机 |
inovance_get_self_test_data | 函数原型 | 全工程无定义,属残留声明 |
3. 函数清单
本文件为纯声明头文件,不包含任何函数定义,因此没有可列举的函数实体。文件中的函数相关条目仅为第 775-782 行的 8 条 extern 函数原型,已在 2.9 节完整列出:
| 函数名 | 作用域 | 说明 |
|---|---|---|
inovance_write_data | 全局(外部) | 串口发送出口,加帧间节流后调用 usart2_send_data() |
inovance_inverter_data_check | 全局(外部) | EMS 配置与逆变器状态的变化检测器 |
inovance_comm_init | 全局(外部) | 初始化 usart2 并置位全部首次下发/查询标志 |
inovance_inverter_comm | 全局(外部) | SCI 通道主循环(标志位驱动) |
inovance_set_inv_start_stop | 全局(外部) | 写 0x1002 启停命令并返回执行结果 |
inovance_set_inv_on_of | 全局(外部) | 写 0x1003 开关机命令并返回执行结果 |
read_blackbox_handle | 全局(外部) | 黑匣子故障录波读取状态机 |
inovance_get_self_test_data | 全局(外部) | 仅声明,无实现、无调用者 |
4. 核心逻辑解析
本文件是纯声明文件,不含可执行逻辑,故"核心逻辑"以"类型设计与协议约定"的角度说明这些声明如何约束 .c 的行为。
4.1 位域联合体的三种视图与用法约定
6 个联合体都遵循同一模式:u64_all(整字)+ word.u16_wordX(按 Modbus 16 位寄存器粒度)+ bit.*(逐位语义)。这一设计直接对应运行数据的解析方式:
- 接收与比较用整字视图:
query_inv_running_data()把响应中 87~118 字节的 8 个 16 位字填入u64_inv_fault1.word.u16_word1~4等(inovance_comm_usart.c:2190-2205),随后用u64_all与上一拍比较来判断"故障是否变化"(2224-2231 行); - 语义翻译用位视图:
inovance_parse_inv_err_msg()读取bit.u8_pv1_reverse等具体位(1866-1976 行); - 下发用字视图:安规功能使能位域填入
bit.*后按word.u16_word1/2拆成两个寄存器写出(866-871 行)。
INOVANCE_ERROR2_U、INOVANCE_WARNING1_U、SAFETY_FUNCTION_ENABLE_U 的未命名占位位(bit20~bit63)表明协议高 44 位尚未建模;INOVANCE_WARNING2_U 完全没有 bit 视图,其解析只能按字使用。
4.2 标志表驱动的调度约定
INOVANCE_SCI_FLAG_U 把标志分为两类,形成固定的调度语义:
u8_query_*_flag(查询类):置位表示"需要读取该参数"。查询函数成功后清 0,失败保持 1 由主循环下一轮重试。u8_set_*_flag(设置类):置位表示"需要下发该参数"。下发函数收到有效响应后清 0,并同时把对应的u8_query_*_flag置 1 形成回读闭环;失败则保持 1 重试。
u8_check_inv_info_flag(bit0)是一个特殊标志:它不是请求标志,而是"是否允许执行变化检测"的门控位——设备信息查询完成前为 FALSE,完成后为 TRUE(inovance_comm_usart.c:2611/2625),inovance_inverter_data_check() 的首行就以此为提前返回条件(2409-2412 行)。
u8_special_Australia_cec_flag(bit18)由 set_inv_safesub() 成功后置位(1013 行),是"澳洲场景一次性补配置"的触发位。
4.3 寄存器地址表与数量宏的契约
地址宏与数量宏成对定义,构成 .c 中组帧参数的唯一来源。数量宏的取值与 .c 的调用点对照:
| 宏 | 值 | .c 实际使用 | 一致性 |
|---|---|---|---|
INOVANCE_NUM_QUERY_INV_DEVICE_INFO | 27 | query_inv_device_info() 用 27 | 一致 |
INOVANCE_NUM_QUERY_INV_ENERGY_STATISTICS | 2 | query_inv_energy_statistics() 用 2 | 一致 |
INOVANCE_NUM_QUERY_INV_RUNNING_DATA | 66 | query_inv_running_data() 用 66 | 一致 |
INOVANCE_NUM_SET_INV_RTC_CALIBRATION | 3 | set_inv_rtc_calibration() 用 3 | 一致 |
..._SAFETY_VOLTAGE_PROTECT_NUM | 18 | 用 18 | 一致 |
..._SAFETY_FREQUENCY_PROTECT_NUM | 14 | 用 14 | 一致 |
..._SAFETY_ARGUMENT1_NUM | 5 | 用 5 | 一致 |
..._SAFETY_ARGUMENT2_NUM | 8 | 用 8 | 一致 |
..._SAFETY_ARGUMENT3_NUM | 12 | 用 12 | 一致 |
..._POWER_REGULATE_NUM | 14 | 代码硬编码 8 | 不一致(.c 只读写 8 个寄存器) |
..._REACTIVE_POWER_NUM | 18 | 代码硬编码 17 | 不一致(.c 只读写 17 个寄存器) |
后两项是隐含的协议差异风险:若逆变器固件按 14/18 个寄存器返回,.c 中"响应字节数必须等于 8*2 / 17*2"的校验会失败,导致参数永远无法同步。
4.4 数据域长度契约与协议帧
本文件通过 INOVANCE_MAX_REGISTER_NUM(100)、INOVANCE_INV_RECV_BUFFER_SIZE(512)、功能码宏三者,与 .c 的组帧/解帧逻辑形成约束:
- 写多寄存器帧最长可达
7 + 100*2 = 207字节,而.c的发送缓冲只有 128 字节(ems_send_ctrl_data_to_inovance()的l_u8_tx_buf[128]),头文件允许的上限超出了实现缓冲的容量,见第 7 节风险点。 - 接收缓冲 512 字节对于 66 个寄存器的读响应(
3 + 132 + 2 = 137字节)与黑匣子帧(70 × 4 = 280 字节量级)都足够,无溢出风险。
4.5 与 uCOS-II / 任务调度的关系
本文件不涉及 RTOS 对象,但 INOVANCE_TABLE_T 中 9 个 u32_*_tick 字段的设计与 uCOS-II 的 OSTimeGet() 强绑定:
u32_ems_inv_comm_tick:最后成功事务时间戳,主循环用abs(tick - OSTimeGet()) > 30 000判通讯丢失;u32_query_inv_running_data_tick、u32_query_inv_energy_statistics_tick、u32_set_inv_rtc_calibration_tick、u32_query_inv_device_info_tick:周期任务节流基准(500 ms / 60 s / 24 h / 2 s);u32_ems_inv_idcode_tick、u32_ems_send_inv_ctrl_power_tick、u32_ems_inv_can_comm_tick:CAN 侧对应的时间戳;u32_query_inv_safety_tick:声明了但在.c中从未被读写,属未使用字段。
由于 OSTime 为 32 位毫秒计数(约 49.7 天回绕),每个节流点都需要回绕保护;该保护逻辑写在各 .c 调用点,而非本头文件,属于"约定未写进契约"的隐患。
4.6 关键全局变量如何被读写
| 变量 | 写方 | 读方 | 触发条件 |
|---|---|---|---|
g_t_inovance_comm_info.u64_sci_flag | inovance_comm_init()、inovance_inverter_data_check()、各 set_*/query_* 成功/失败分支 | 各 set_* 函数(读 t_run_info 期望值)、主循环 | 由配置变化、控制命令变化、周期 tick 到点、通讯丢失重初始化触发 |
g_t_inovance_comm_info.u64_inv_fault1/2、u64_inv_warning1/2 | query_inv_running_data()(2190-2205) | inovance_parse_inv_err_msg()、inovance_inverter_data_check()(RTC 告警 2491) | 每 500 ms 刷新一次 |
g_t_inovance_comm_info.u_safety_function_enable | query_inv_safety_function_enable()(912-913) | set_inv_safety_function_enable()(844,作为下发基准被逐位覆盖) | 每次回读成功 |
g_t_inovance_comm_info.t_run_info | 各 query_*/set_* 函数 | inovance_inverter_data_check()、inovance_comm_can.c | 查询成功或变化检测触发 |
g_t_inovance_comm_info.u8_save_config_flag | 设备信息查询(2056)、运行数据解析(2221)、CAN 侧置位 | inovance_inverter_data_check()(2510) | 配置差异被检出时 |
g_t_inovance_special_safety | query_inv_safety_power_regulate_data()(1651-1655)、query_inv_safety_reactive_power_data()(1825-1827) | set_inv_safety_power_regulate_data()(1592-1599)、set_inv_safety_reactive_power_data()(1724-1728) | 回读成功后缓存,下次下发时原样回填 |
5. 对外接口
5.1 本文件导出的函数
第 775-782 行的 8 条函数原型(见 2.9 节与第 3 节)。其中 7 个在 inovance_comm_usart.c 中有定义,inovance_get_self_test_data 无定义。
5.2 本文件导出的变量
| 变量 | 声明位置 | 实际定义位置 | 使用者 |
|---|---|---|---|
g_t_inovance_comm_info | inovance_comm_usart.h:772 | inovance_comm_usart.c:30 | inovance_comm_usart.c、inovance_comm_can.c、inverter.c |
g_t_inovance_special_safety | inovance_comm_usart.h:773 | inovance_comm_usart.c:31 | 目前仅 inovance_comm_usart.c |
5.3 本文件导出的类型与宏
- 使能开关:
INOVANCE_INV_DEBUG、INOVANCE_SAFETY_DEBUG - 时间/长度常量:
INOVANCE_DAT_PCK_INTERVAL_INV、INOVANCE_EMS_INV_COMM_LOST_TIME、INOVANCE_INV_INIT_TIME、INOVANCE_BLACK_BOX_TIME、INOVANCE_MAX_REGISTER_NUM、INOVANCE_INV_RECV_BUFFER_SIZE、MAX_REQUEST_NUM、TOTAL_CHANNELS_16/32、S16_DATA_START_OFFSET、S32_DATA_START_OFFSET、INOVANCE_BLACK_BOX_POINTS_T/S/NUM、INOVANCE_BLACK_BOX_DATA_OFFSET - 协议常量:
INOVANCE_SLAVE_ADDRESS、三个功能码宏、约 30 个寄存器地址宏与数量宏、16 个 CAN 帧 ID、4 个黑匣子宏 - 类型:4 个枚举、6 个位域联合体、3 个结构体(
INOVANCE_RUN_INFO_T、INOVANCE_TABLE_T、INOVANCE_SPECIAL_SAFETY_TABLE_T)
5.4 本文件引用的外部头文件
| 头文件 | 用途 |
|---|---|
includes.h(第 13 行) | 基础类型 u8/u16/u32/s16/s32/u64、TRUE/FALSE、标准库与 uCOS-II 头 |
inovance_upgrade.h(第 14 行) | 升级模块接口(.c 中调用 inovance_read_upgrade_flag_*、inovance_upgrade_handle);本头文件本身未直接使用其符号,属传递性引入 |
6. 依赖关系
依赖(本文件 include)
includes.h:提供全部基础类型与布尔常量。inovance_upgrade.h:升级模块接口(传递性依赖,inovance_comm_usart.c需要使用)。
被依赖(谁 include 本文件)
midware/inverter/inovance/inovance_comm_usart.c:14—— 全部宏、类型、全局表与函数原型。midware/inverter/inovance/inovance_comm_can.c—— 复用 CAN 帧 ID 宏(0x181~0x269)、INOVANCE_TABLE_T中的 CAN 字段、INOVANCE_INV_INIT_TIME。- 间接:任何 include 了
inovance_comm_usart.h的翻译单元都能访问g_t_inovance_comm_info(例如机型识别后读取t_run_info.u16_inv_type)。
7. 备注与风险点
INOVANCE_MAX_REGISTER_NUM(100) 与实现缓冲不匹配。头文件允许一次写 100 个寄存器(数据域 200 字节),而ems_send_ctrl_data_to_inovance()的l_u8_tx_buf[128](inovance_comm_usart.c:131)只能容纳7 + 121字节。当前调用点最多 18 个寄存器,尚未触发;但契约本身不安全,建议把宏降到 60 以下或扩大实现缓冲。INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_POWER_REGULATE_NUM(14) 与..._REACTIVE_POWER_NUM(18) 与实际使用不符。.c只读写 8 个和 17 个寄存器,且响应长度校验写成硬编码(s_u8_inovance_recv_buf[2] == 8*2/17*2)。若逆变器固件按 14/18 应答,这两个参数块将永远同步失败。同时这两个数量宏事实上成了死宏,容易误导后续开发者按 14/18 编号寄存器。S16_DATA_START_OFFSET/S32_DATA_START_OFFSET定义后从未使用(第 37-38 行,注释里明确写着"原硬编码5/43")。save_fault_scord()仍写死 5 和 43,属于只做了一半的常量集中化重构,后续协议字段调整时极易改漏。INOVANCE_BLACK_BOX_POINTS_T(320) 定义了但.c未使用。实际数组维度在FAULT_SCORD_T(net/ems.h:454-455)中硬编码为 320;两个"320"彼此独立,若录波点数变更需同时改三处(含INOVANCE_BLACK_BOX_POINTS_NUM × _S的隐含乘积关系)。INOVANCE_BLACK_BOX_DATA_OFFSET(70) 与通道布局不自洽。save_fault_scord()的 32 位通道最后一个字节偏移为46 + 7*4 = 74,已越过 70 的步长,会读到相邻点的数据。步长或 32 位通道数至少有一个是错的。inovance_get_self_test_data只声明无定义(第 782 行)。全工程搜索仅此一处,属残留接口;虽然无人调用故链接不报错,但会让人误以为存在自检数据接口。INOVANCE_WARNING2_U缺少bit视图(468-480 行)。只有一个 64 位整字和word视图,说明告警字 2 的位定义未完成;一旦需要按位判断告警 2 的语义,只能硬编码位掩码。INOVANCE_ERROR2_U、INOVANCE_WARNING1_U、INOVANCE_SAFETY_FUNCTION_ENABLE_U存在大段未命名占位位(bit20~bit63)。功能使能位域 64 位中只有低 31 位具名,与寄存器0x1200-0x1201只下发低 32 位(set_inv_safety_function_enable()只填u16_word1/2)一致,即高 32 位属于协议预留,暂无实际含义。u16_ovp1_value/u16_ovp1_time在INOVANCE_SPECIAL_SAFETY_TABLE_T中定义但从未被读写(第 765-766 行,.c中引用次数为 0);u16_power_regulate_tmp2(第 757 行)仅出现在被INOVANCE_SAFETY_DEBUG关闭的调试printf中(.c:1621),实际收发流程完全跳过它。这三个字段属于遗留/占位。u32_query_inv_safety_tick是死字段(第 727 行)。在inovance_comm_usart.c中从未被读写,安规查询实际由标志位驱动而非周期 tick。EMS_INV_ID_CODE("ALPHAESS") 在本目录.c中无引用。CAN 通道的身份握手使用小写"AlphaESS"(见inovance_comm_can.c),此处的大写宏为未使用定义,两处字符串写法不一致,属命名遗留。INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT3(0x1013) 定义位置突兀(121-122 行):它被放在 0x1600/0x1700 之后,与其它 0x14xx 安规宏分离,地址也回跳到 0x1013 段。功能正确但组织混乱,容易在批量修改安规寄存器时被遗漏。- 通讯丢失常量单位不自洽:
INOVANCE_EMS_INV_COMM_LOST_TIME(30\*1000)、INOVANCE_INV_INIT_TIME(2\*1000)、INOVANCE_BLACK_BOX_TIME(4\*1000) 单位是毫秒,而INOVANCE_DAT_PCK_INTERVAL_INV(100) 虽然也是毫秒但数值写法不同(无*1000);同一个头文件里混用两种"毫秒表达风格",注释又缺失,容易误读。相比之下BLACK_BOX_DATA_OFFSET、POINTS_*等是纯计数量,无单位提示。 INOVANCE_INV_RECV_BUFFER_SIZE(512) 对黑匣子帧是否足够未做静态校验。blackbox_recv_data()按usart2_get_data_len()的长度直接写入s_u8_blackbox_recv_buf(512 字节,.c:3062),长度来自硬件层;若黑匣子一次返回超过 512 字节则溢出。此处依赖usart2驱动侧的缓冲上限,头文件未做任何约束或断言。