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

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_INFO0x0000设备信息(机型/SN/额定功率/版本),数量 INOVANCE_NUM_QUERY_INV_DEVICE_INFO = 27(45-46)
INOVANCE_ADDR_REGISTER_QUERY_INV_ENERGY_STATISTICS0x010A能量统计,数量 = 2(48-49)
INOVANCE_ADDR_REGISTER_QUERY_INV_RUNNING_DATA0x010C运行数据,数量 = 66(51-52)
INOVANCE_ADDR_REGISTER_QUERY_INV_ERROR_MSG0x0136故障信息,数量 = 16(54-55)——未被 .c 引用
INOVANCE_ADDR_REGISTER_QUERY_INV_PARALLEL_RUNNING_DATA0x0400并机运行数据(57)——未被 .c 引用
INOVANCE_ADDR_REGISTER_SET_INV_RTC_CALIBRATION0x0500RTC 校准,数量 = 3(59-60)
INOVANCE_ADDR_REGISTER_SET_INV_CLEAR_ENERGY0x1000清电量(62)
INOVANCE_ADDR_REGISTER_SET_INV_CLEAR_FAULT0x1001清故障(64)
INOVANCE_ADDR_REGISTER_SET_INV_START_STOP0x1002启停(66)
INOVANCE_ADDR_REGISTER_SET_INV_ON_OFF0x1003开关机(68)
INOVANCE_ADDR_REGISTER_SET_INV_SOFT_RESTART0x1004软重启(70)
INOVANCE_ADDR_REGISTER_SET_INV_MACHINE_MODE0x1005油机模式(72)
INOVANCE_ADDR_REGISTER_SET_INV_PARALLEL_MODE0x1006并机模式(74)——未被 .c 引用
INOVANCE_ADDR_REGISTER_SET_INV_BAT_AWAKE0x1007电池唤醒(76)——未被 .c 引用
INOVANCE_ADDR_REGISTER_SET_INV_MPPT_SCAN_ENABLE0x1008阴影扫描使能(78)
INOVANCE_ADDR_REGISTER_SET_INV_GRID_FORMING_ENABLE0x1009grid-forming 使能(80)
INOVANCE_ADDR_REGISTER_SET_INV_GRID_ADAPTIVE_ENABLE0x100A相序自适应使能(82)
INOVANCE_ADDR_REGISTER_SET_INV_BAT_TYPE0x100B电池类型(84)
INOVANCE_ADDR_REGISTER_SET_INV_WEAK_POWER_GRID0x100C弱电网使能(86)——未被 .c 引用
INOVANCE_ADDR_REGISTER_SET_INV_ZERO_DRIFT0x100D零漂类型(88)——仅出现在被注释的 inovance_zero_drift_type() 中
INOVANCE_ADDR_REGISTER_SET_INV_BAT_HEATING0x100F电池加热使能(起始),后两个寄存器为加热电压 0x1010、加热电流 0x1011
INOVANCE_ADDR_REGISTER_SET_INV_BAT_HEATER_STATE0x1012加热膜接入状态(92)
INOVANCE_ADDR_REGISTER_SET_INV_EMS_RAMP_STATE0x101EEMS 爬坡状态(94)——未被 .c 引用
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_PROTECT_ARG10x1200安规功能使能 64 位位域(低 32 位占 0x1200-0x1201)(96)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY0x1400主安规编号(0x1401 为子安规编号)(100)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_VOLTAGE_PROTECT0x1402电压保护,数量 18(102-103)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_FREQUENCY_PROTECT0x1416频率保护,数量 14(105-106)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT10x1426安规参数 1(并网等待/重连、ISO、DCI),数量 5(108-109)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT20x142D安规参数 2(GFCI、PF、固定 Q),数量 8(111-112)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_POWER_REGULATE0x1600有功功率调节,数量 14(114-115)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_REACTIVE_POWER0x1700无功功率设置,数量 18(117-118)
INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT30x1013安规参数 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_PACK0x181EMS→逆变器 身份握手
INOVANCE_EMS_INV_SET_CTRL_MODE0x190EMS→逆变器 控制模式
INOVANCE_EMS_CTRL_INV_AC_POWER10x192EMS→逆变器 交流有功设定
INOVANCE_EMS_CTRL_INV_BAT_STATE0x193EMS→逆变器 电池充放电限值
INOVANCE_EMS_SEND_BMS_POWER_LIMIT0x194EMS→逆变器 BMS 功率限值
INOVANCE_EMS_SET_INV_CTRL_ARG10x195EMS→逆变器 MPPT/频率偏移/UPS
INOVANCE_EMS_SEND_BAT_RUNNING_DATA0x1A0EMS→逆变器 电池运行数据
INOVANCE_EMS_SEND_BAT_PROTECT0x1A1EMS→逆变器 电池保护参数
INOVANCE_INV_EMS_IDCODE_PACK0x201逆变器→EMS 身份应答
INOVANCE_INV_EMS_RUN_INFO_PACK4~PACKA0x263~0x269逆变器→EMS 电网/备电/机侧运行数据(7 帧)

这 16 个宏本文件定义后主要由 inovance_comm_can.c 使用(详见 inovance_comm_can.c.md 第 2 节),在 inovance_comm_usart.c 中未被引用。

2.5 黑匣子(故障录波)宏(第 143-147 行)

名称值说明
INOVANCE_BBOX_ADDR0xFE黑匣子从站地址
FUNC_READ_BBOX0x03标准读寄存器
FUNC_READ_BBOX_INDEX0x06写单个寄存器(用于设置目录/索引指针)
FUNC_READ_BBOX_DATA0x16自定义读数据功能码

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_infoextern INOVANCE_TABLE_T通信总表,定义在 inovance_comm_usart.c:30
g_t_inovance_special_safetyextern 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.*(逐位语义)。这一设计直接对应运行数据的解析方式:

INOVANCE_ERROR2_U、INOVANCE_WARNING1_U、SAFETY_FUNCTION_ENABLE_U 的未命名占位位(bit20~bit63)表明协议高 44 位尚未建模;INOVANCE_WARNING2_U 完全没有 bit 视图,其解析只能按字使用。

4.2 标志表驱动的调度约定

INOVANCE_SCI_FLAG_U 把标志分为两类,形成固定的调度语义:

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_INFO27query_inv_device_info() 用 27一致
INOVANCE_NUM_QUERY_INV_ENERGY_STATISTICS2query_inv_energy_statistics() 用 2一致
INOVANCE_NUM_QUERY_INV_RUNNING_DATA66query_inv_running_data() 用 66一致
INOVANCE_NUM_SET_INV_RTC_CALIBRATION3set_inv_rtc_calibration() 用 3一致
..._SAFETY_VOLTAGE_PROTECT_NUM18用 18一致
..._SAFETY_FREQUENCY_PROTECT_NUM14用 14一致
..._SAFETY_ARGUMENT1_NUM5用 5一致
..._SAFETY_ARGUMENT2_NUM8用 8一致
..._SAFETY_ARGUMENT3_NUM12用 12一致
..._POWER_REGULATE_NUM14代码硬编码 8不一致(.c 只读写 8 个寄存器)
..._REACTIVE_POWER_NUM18代码硬编码 17不一致(.c 只读写 17 个寄存器)

后两项是隐含的协议差异风险:若逆变器固件按 14/18 个寄存器返回,.c 中"响应字节数必须等于 8*2 / 17*2"的校验会失败,导致参数永远无法同步。

4.4 数据域长度契约与协议帧

本文件通过 INOVANCE_MAX_REGISTER_NUM(100)、INOVANCE_INV_RECV_BUFFER_SIZE(512)、功能码宏三者,与 .c 的组帧/解帧逻辑形成约束:

4.5 与 uCOS-II / 任务调度的关系

本文件不涉及 RTOS 对象,但 INOVANCE_TABLE_T 中 9 个 u32_*_tick 字段的设计与 uCOS-II 的 OSTimeGet() 强绑定:

由于 OSTime 为 32 位毫秒计数(约 49.7 天回绕),每个节流点都需要回绕保护;该保护逻辑写在各 .c 调用点,而非本头文件,属于"约定未写进契约"的隐患。

4.6 关键全局变量如何被读写

变量写方读方触发条件
g_t_inovance_comm_info.u64_sci_flaginovance_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/2query_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_enablequery_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_safetyquery_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_infoinovance_comm_usart.h:772inovance_comm_usart.c:30inovance_comm_usart.c、inovance_comm_can.c、inverter.c
g_t_inovance_special_safetyinovance_comm_usart.h:773inovance_comm_usart.c:31目前仅 inovance_comm_usart.c

5.3 本文件导出的类型与宏

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)

被依赖(谁 include 本文件)

7. 备注与风险点

  1. 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 以下或扩大实现缓冲。
  2. 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 编号寄存器。
  3. S16_DATA_START_OFFSET / S32_DATA_START_OFFSET 定义后从未使用(第 37-38 行,注释里明确写着"原硬编码5/43")。save_fault_scord() 仍写死 5 和 43,属于只做了一半的常量集中化重构,后续协议字段调整时极易改漏。
  4. INOVANCE_BLACK_BOX_POINTS_T(320) 定义了但 .c 未使用。实际数组维度在 FAULT_SCORD_T(net/ems.h:454-455)中硬编码为 320;两个"320"彼此独立,若录波点数变更需同时改三处(含 INOVANCE_BLACK_BOX_POINTS_NUM × _S 的隐含乘积关系)。
  5. INOVANCE_BLACK_BOX_DATA_OFFSET(70) 与通道布局不自洽。save_fault_scord() 的 32 位通道最后一个字节偏移为 46 + 7*4 = 74,已越过 70 的步长,会读到相邻点的数据。步长或 32 位通道数至少有一个是错的。
  6. inovance_get_self_test_data 只声明无定义(第 782 行)。全工程搜索仅此一处,属残留接口;虽然无人调用故链接不报错,但会让人误以为存在自检数据接口。
  7. INOVANCE_WARNING2_U 缺少 bit 视图(468-480 行)。只有一个 64 位整字和 word 视图,说明告警字 2 的位定义未完成;一旦需要按位判断告警 2 的语义,只能硬编码位掩码。
  8. 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 位属于协议预留,暂无实际含义。
  9. 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),实际收发流程完全跳过它。这三个字段属于遗留/占位。
  10. u32_query_inv_safety_tick 是死字段(第 727 行)。在 inovance_comm_usart.c 中从未被读写,安规查询实际由标志位驱动而非周期 tick。
  11. EMS_INV_ID_CODE("ALPHAESS") 在本目录 .c 中无引用。CAN 通道的身份握手使用小写 "AlphaESS"(见 inovance_comm_can.c),此处的大写宏为未使用定义,两处字符串写法不一致,属命名遗留。
  12. INOVANCE_ADDR_REGISTER_SET_INV_SAFETY_ARGUMENT3(0x1013) 定义位置突兀(121-122 行):它被放在 0x1600/0x1700 之后,与其它 0x14xx 安规宏分离,地址也回跳到 0x1013 段。功能正确但组织混乱,容易在批量修改安规寄存器时被遗漏。
  13. 通讯丢失常量单位不自洽: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_* 等是纯计数量,无单位提示。
  14. INOVANCE_INV_RECV_BUFFER_SIZE(512) 对黑匣子帧是否足够未做静态校验。blackbox_recv_data() 按 usart2_get_data_len() 的长度直接写入 s_u8_blackbox_recv_buf(512 字节,.c:3062),长度来自硬件层;若黑匣子一次返回超过 512 字节则溢出。此处依赖 usart2 驱动侧的缓冲上限,头文件未做任何约束或断言。