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

set_comm_usart_s5.h

源文件路径:midware/inverter/set/set_comm_usart_s5.h 所属模块:midware/inverter/set(盛能杰 Senergy S5 / S5-II / M10 逆变器串口通信驱动) 代码行数:833

1. 文件职责

本文件是 set_comm_usart_s5.c 的对外契约头,定义了 EMS 与盛能杰(Senergy,代码前缀 senergys5 / 模块名 SET_TYPE)储能逆变器通信所需的全部常量、寄存器地址、数据结构类型与对外接口声明。

它处在数据流的「接口定义」环节,本身不含任何可执行逻辑(无函数定义、无变量定义),只被 set_comm_usart_s5.c、set_comm_can.c、inverter.c 通过 #include 引入。文件头部注释里的 @file :set_comm_s5.h 与文件名 set_comm_usart_s5.h 不一致,是历史改名遗留。

需要注意的是,本文件内部对另一份代码 set_upgrade_s5.h(第 14 行)做了 include,因为通讯模块要向升级模块借用应答码常量与升级标志接口;同时它依赖 includes.h 提供的 u8/u16/u32/s8/s16/s32 等平台类型定义。

2. 关键数据结构与宏

2.1 调试开关与常量宏

名称类型说明
GET_VARIABLE_NAME(variable)宏#variable 字符串化,用于打印变量名(第 16 行)
SENERGYS5_INV_DEBUG宏(=0)串口收发总调试开关
SENERGYS5_INV_VERSION_DEBUG宏(=0)新旧协议版本一致性自检打印开关
SENERGYS5_INV_COMM_DEBUG宏(=0)通讯总调试
SENERGYS5_INV_MODEL_RECOGNITION_DEBUG宏(=0)型号识别调试
SENERGYS5_INV_COMM_INIT_DEBUG、SENERGYS5_INV_COMM_INIT_USART_DEBUG宏(=0)通讯初始化 / 串口初始化调试
SENERGYS5_INV_PRODUCT_MODEL_DEBUG宏(=0)产品型号查询调试
SENERGYS5_INV_DATA_INIT_DEBUG、SENERGYS5_INV_CONTRIL_FLAG_INIT_DEBUG(原文拼写为 CONTRIL)、SENERGYS5_INV_CONTRIL_INFO_INIT_DEBUG宏(=0)数据/控制标志/控制信息初始化调试
SENERGYS5_INV_DATA_CHECK_HANDLE_DEBUG宏(=0)数据决策函数调试
SENERGYS5_INV_SN_MODEL_NAME_DEBUG、SENERGYS5_INV_VERSIONS_INFO_DEBUG宏(=0)SN/型号名与版本信息查询调试
SENERGYS5_INV_REAL_TIME_DATAT1/2/3宏(=0)三组实时数据解析调试(名称中 DATAT 为拼写笔误)
SENERGYS5_INV_SYSTEM_FUNCTION、_FUNCTION2、_FUNCTION3、SENERGYS5_INV_REGULATION_PARAMETER宏(=0)系统功能参数与并网法规参数查询调试
SENERGYS5_INV_SET_GFCI_ENABLE_DEBUG、_SET_SATEY_CODE_DEBUG、_SET_N_LINE_DETECT_DEBUG、_SET_NPE_SHORT_ENABLE宏(=0)各项设置动作调试
SENERGYS5_TIME_30MS / 100MS / 250MS / 1S / 1M宏30 / 100 / 250 / 1000 / 60000(毫秒),调度周期单位
MODEL_QUERY_TIMEOUT_CNT宏(20)型号查询失联判定次数
SENERGYS5_MAX_REGISTER_NUM宏(100)单帧最多读写寄存器个数
SENERGYS5_PCK_LEN宏(100)SENERGYS5_DAT_PCK_INV_T.u8_data 数组长度
SENERGYS5_INV_RECV_BUFFER_SIZE宏(256)接收缓冲字节数
SENERGYS5_INV_INSTRUCT_BUFFER_SIZE宏(10)指令缓冲长度(本文件及其 .c 均未实际使用)
SENERGYS5_DAT_PCK_INTERVAL_INV宏(100)相邻两帧最小间隔(ms)
SENERGYS5_INV_RATED_POWER_5KW / 5_5KW / 6KW / 9_999KW / 10KW宏5000 / 5500 / 6000 / 9999 / 10000(W),额定功率档位
SENERGYS5_INV_BAUDRATE_LOW、_HIGH宏9600、57600,波特率自适应两档
SENERGYS5_SLAVE_ADDRESS宏从机地址 0x01
SENERGYS5_FUNC_READ_CODE / WRITE_SINGLE_CODE / WRITE_MULTI_CODE宏Modbus 功能码 0x03 / 0x06 / 0x10
SENERGYS5_FUNC_READ_ABNORMAL_CODE / WRITE_SINGLE_ABNORMAL_CODE / WRITE_MULTI_ABNORMAL_CODE宏异常响应功能码 0x83 / 0x86 / 0x90
SENERGYS5_FUNC_FACTORY_ATE_CODE、SENERGYS5_FUNC_INSIDE_CODE宏厂内 ATE 0x80、内部指令 0x90
SENERGYS5_INSTRUCT_READ_DSP_VARIATE(0x04)、READ_DSP_EEPROM(0x05)、WRITE_DSP_EEPROM(0x06)、RESET_DSP_EEPROM(0x08)、WRITE_DSP_NN(0x12)、WRITE_DSP_NPE(0x13)宏功能码 0x80 下的 ATE 指令子码
SENERGYS5_INSTRUCT_WRITE_MAX_DISCHG_CURR(0x00)、WRITE_MAX_CHG_CURR(0x01)、WRITE_DISCHG_CUT_VOLT(0x02)、WRITE_CHG_CUT_VOLT(0x03)、WRITE_BMS_STATUS(0x04)、WRITE_CONTROL_MODEL(0x90)、WRITE_OPEN_VOLT_FAC(0x93)宏功能码 0x90 下的内部指令子码

2.2 寄存器地址与数量宏

上位机读/写时以「地址 + 寄存器个数」成对出现(地址宏与 SENERGYS5_NUM_xxx / SENERGYM5_NUM_xxx 配对)。注意 SENERGYM5_NUM_REAL_TIME_DATA1(第 140 行)存在拼写笔误 SENERGYM5 而非 SENERGYS5,但它在 .c 中被正常使用。

公共寄存器

地址宏地址数量宏说明
SENERGYS5_ADDR_INV_ON_OFF_STATE0x6001SENERGYS5_NUM_INV_ON_OFF_STATE(0x01)开、关机状态(可读可写)

只写寄存器

地址宏地址数量宏说明
SENERGYS5_ADDR_GRID_CHARGE_ENABLE0x21150x02允许 Grid 充电使能 + AC 功率上限
SENERGYS5_ADDR_EPS_ENABLE0x211C0x01UPS / BACKUP 使能
SENERGYS5_ADDR_RESET_DSP_EEPROM0x60060x01清除 DSP EEPROM(G2 独有)
SENERGYS5_ADDR_RESET_DSP0x2E060x01DSP 重启,需处于待机状态
SENERGYS5_ADDR_BAT_HEATING_ENABLE0x2E090x01进入加热模式,需并网或待机旁路
SENERGYS5_ADDR_BAT_HEATING_VOLT0x2F0E0x01加热输出电压,单位 0.1V
SENERGYS5_ADDR_BAT_HEATING_CURR0x2F080x01加热输出电流,单位 0.01A
SENERGYS5_ADDR_BAT_CURR_CALIBRATION_ENABLE0x2E040x01BMS 电池电流校准使能

只读(查询)寄存器

地址宏地址数量宏说明
SENERGYS5_ADDR_REAL_TIME_DATA10x1001M5=0x4A,非 M5=0x64实时数据 1:AC 侧电气量、PV1~PV4、机温、运行模式、故障字 1~3、降载原因、无功/视在功率、功率因数、系统状态、母线电压、电池电流、HS 温度
SENERGYS5_ADDR_REAL_TIME_DATA20x2E500x01实时数据 2:故障字 6
SENERGYS5_ADDR_REAL_TIME_DATA30x2F00新版本 0x1C / 老版本 0x15实时数据 3:母线电压、DCDC 步数与状态、电池电流、故障字 4、check_flag、功率限值、最大充放电电流
SENERGYS5_ADDR_MODELNAME_SN0x1A000x24型号名 + SN
SENERGYS5_ADDR_INV_VERSIONS_INFO0x1A190x59master/slave/dcdc 版本、料号、机型基本参数
SENERGYS5_ADDR_AC_ACTIVE_APPARENT_POWER_HIGH0x1A4E0x02额定 AC 有功/视在功率高 16 位
SENERGYS5_ADDR_AC_ACTIVE_APPARENT_POWER_LOW0x1A460x02额定 AC 有功/视在功率低 16 位
SENERGYS5_ADDR_PRODUCTION_TYPE0x1A5A0x01逆变器产品型号
SENERGYS5_ADDR_SELF_TEST_PROGRESS0x52100x03自检进度、自检结果、自检使能
SENERGYS5_ADDR_INV_DEBUG0x2F2D0x06DEBUG_0x2F2D ~ 0x2F32

系统功能参数 2(NPE 短接)

地址宏地址数量说明
SENERGYS5_ADDR_SYSTEM_FUNCTION20x21570x01NPE 短接状态

系统功能参数 3

地址宏地址数量说明
SENERGYS5_ADDR_SYSTEM_FUNCTION30x2E010x03NN 短接检测、强制 bypass、电压频率宽范围
SENERGYS5_ADDR_NN_SHORT_CHECK_ENABLE0x2E010x01NN 短接检测使能
SENERGYS5_ADDR_FORCE_BYPASS_ENABLE0x2E020x01强制 Bypass 使能
SENERGYS5_ADDR_OPEN_VOLT_FAC_ENABLE0x2E030x01电压频率宽范围使能
SENERGYS5_ADDR_INV_CTRL_ACCURACY_ENABLE0x2E040x01DC 控制功率校准使能

并网法规基本参数

地址宏地址数量说明
SENERGYS5_ADDR_REGULATION_PARAMETER0x50000x30并网法规基本参数整块
SENERGYS5_ADDR_SET_GRID_CONNECT_DELAY_TIME0x50000x02首次并网 / 重连等待时间
SENERGYS5_ADDR_OFP_DERATING_ENABLE0x50170x01过频曲线使能 0:Disable 1:Enable
SENERGYS5_ADDR_SET_REGULATION_PARAMETER20x50180x01十分钟过压保护点
SENERGYS5_ADDR_ACTIVE_POWER_RISE0x50230x01非首次并网功率缓起,0.01%/s
SENERGYS5_ADDR_SET_VOLT_RESTORE_VALUE0x50270x02过/欠压恢复阈值
SENERGYS5_ADDR_ACTIVE_POWER_FIRST_RISE0x50290x01首次并网功率缓起,0.01%/s
SENERGYS5_ADDR_SET_REGULATION_PARAMETER40x502B0x01十分钟过压保护时间
SENERGYS5_ADDR_ACTIVE_POWER_FALL0x502C0x01非首次并网功率缓降,0.01%/s
SENERGYS5_ADDR_ACTIVE_POWER_RECONNECT0x50190x01重连并网功率缓起,0.01%/s

并网法规曲线参数

地址宏地址数量说明
SENERGYS5_ADDR_REGULATION_CURVE0x50300x58法规曲线整块
SENERGYS5_ADDR_REACTIVE_MODE0x50300x01无功模式
SENERGYS5_ADDR_REACTIVE_VOLT_CURVE0x503C0x04无功电压(Q-V)曲线 4 点
SENERGYS5_ADDR_SET_ACTIVE_VOLT_CURVE0x50490x04有功电压(P-V)曲线 4 点
SENERGYS5_ADDR_UFP_DERATING_ENABLE0x50800x01欠频曲线使能

系统功能参数 1

地址宏地址数量说明
SENERGYS5_ADDR_SYSTEM_FUNCTION0x51000x30系统功能 1 整块:安规码、孤岛、绝缘电阻、低电压穿越、PV 连接类型
SENERGYS5_ADDR_INV_SATEY_COUNTRY0x51010x01国家安规码
SENERGYS5_ADDR_GFCI_ENABLE0x51180x01GFCI 检测使能
SENERGYS5_ADDR_PV_CONNECT_TYPE0x51090x01PV 连接类型设置
SENERGYS5_ADDR_ISLANDING_CHECK0x510E0x01孤岛检查功能
SENERGYS5_ADDR_SET_ACTIVE_VOLT_CURVE_ENABLE0x511D0x01有功电压曲线使能
SENERGYS5_ADDR_ACTIVE_POWER_RISE_FALL_ENABLE0x512B0x01非首次并网功率缓升缓降使能
SENERGYS5_ADDR_LEAKAGE_CUR_ENABLE0x512D0x01漏电流检测使能(G2 用,bit7 取反表示不检测)

2.3 数据结构类型

名称类型说明
SENERGYS5_DAT_PCK_INV_T结构体通用串口报文:u8_slave_addr、u8_func_code、u8_data[100]、u16_len_data。本 .c 未直接实例化,属预留抽象
SENERGYS5_ON_OFF_E枚举SENERGYS5_ON = 0、SENERGYS5_OFF = 1,对应 0x6001
MPPT_CTRL_E枚举MPPT_DEFAULT = 0(交给 DSP 自控)、MPPT_STOP
SENERGYS5_ABNORMAL_CODE_E枚举Modbus 异常码:ABNORMAL1(功能码不符)、ABNORMAL2(寄存器数过多)、ABNORMAL3(地址越界)、ABNORMAL4(值越界/禁写)、MAX_CODE
SENERGYS5_HYBRID_WORK_MODE_E枚举逆变器内部工作模式 0x2100:SELF_USED_MODE 0、FEED_IN_PRIORITY_MODE 1、TIME_BASED_CONTROL 2、BACK_UP_MODE 3、BATTERY_DISCHARGE_MODE 4
SENERGYS5_PV_PANEL_CONNECT_TYPE枚举0x5109:PV_INDEPENDENCE 0、PV_PARALLEL 1、PV_AUTO_CHECK 2
SENERGYS5_INV_PRODUCTION_TYPE_E枚举0x1A5A:ON_GRID 0、AC_NO_LOAD 1、HYBRID_NO_LOAD 2、HYBRID_LOAD 3、AC_LOAD 4、MAX_PRODUCTION_TYPE
SENERGYS5_INV_WORK_MODE_E枚举0x101D:INITIAL_MODE 0x00、STANDBY_MODE 0x01、ONLINE_MODE 0x03、UPS_MODE 0x04、FAULT_MODE 0x05、SHUTDOWN_MODE 0x09
SENERGY_SERIES_E枚举SENERGY_S5_SERIES 0(9600bps)、SENERGY_M_SERIES 1(57600bps),用于波特率自适应表下标
SET_HEAT_TABLE_T结构体电池加热缓存:u8_set_inv_heat_cmd(EMS 下发加热标志)、u8_set_heat_relay_cmd(继电器状态)、u16_set_heat_volt(0.1V)、u16_set_heat_current(0.01A)
SENERGYS5_SYSTEM_STATUS_U联合体 + 位域0x104A 系统状态:u8_operating_mode(3bit,1 待机/3 并网/4 离网)、u8_eps_relay、u8_bat_status(2bit,00 无电池/01 充电/10 放电/11 满电待机)、u8_mppt_pv、u8_grid_status + bit8~bit15
SENERGYS5_INV_SATEY_REATIVE_OUT_MODE枚举0x5030 无功控制模式 0~9:纯有功、恒定功率因数、固定无功、有功功率因数、无功电压曲线、自动有功电压曲线、恒定无功、AS4777 无功电压、无功电压百分比、无功有功曲线
SENERGYS5_INV_SATEY_COUNTRY_TYPE枚举逆变器侧并网安规码(0x5101 取值):AS4777.2/.3=0x0001、CEI-021=0x0006、G98=0x0008、EN50549-1=0x000C、AS4777.2=0x0010、AS4777.2 NZ=0x0011、G99 Type A=0x0018、RD413/RD1699=0x001A、VDE4105:2018=0x001D、EN50549=0x001F、C10/11=0x0020、NRS097-2-1=0x0025、UNE206007=0x0029、AS4777.2 SA=0x002A、VDE0126-50Hz=0x0035、TOR Type B=0x003D、NTS/UNE217001-2/RD647=0x0045、AS4777.2 Vector=0x0047、EN50549-IE=0x0048、RD647=0x005C、MAX_TYPE 100
SENERGYS5_LOAD_DE_RATING_U联合体 + 位域0x1036 降载原因:NTC 高温、PV 输入电压、风扇堵转、软起、市电高频/低压/高压、P 指令、Q 指令、最大输出电流、老化模式、软停 + bit12~bit15
SENERGYS5_INV_SELF_TEST_POGRESS_U联合体 + 位域0x5211 自检结果:OVP、OVP2、UVP、UVP2、OFP、OFP2、UFP、UFP2、abnormal 各 1 bit
SENERGYS5_ERROR_U联合体 + 位域(64bit)故障字 1~4(0x101E/0x101F/0x1020/0x105F)。同时提供 u64_all 与 word.word0~word3 两种视图,便于按 16 位整字读取。含逆变 DC 偏置过流、继电器异常、远程关机、过温、GFCI、PV 反接、系统类型错、风扇异常、母线欠压/过压、内部通讯错、软件不兼容、存储错、Boost/逆变异常、市电 OVP/UVP/丢失/OFP/UFP、PV OVP/UVP/绝缘/弱光、漏流、AFCI、10min 过压、EEPROM 失败、电池丢失/OVP/UVP/放电过流/OTP/UTP、N-L 反接、EPS 过压/短路/过载、内部通讯(EMS↔Master、Master↔DCDC)、DCDC 异常等
SENERGYS5_ERROR_U2联合体 + 位域(16bit)故障字 6:u8_nn_short_error(GRID-EPS 中性线短接)+ bit17~bit31
SENERGYS5_SYSTEM_SET_ENABLE_FLAG_U联合体 + 位域(32bit)4 组「待下发/已完成」状态字。word 视图拆成 4 个字节:u8_system_cure_protection_all(并网法规基本参数)、u8_regulation_curve_all(法规曲线)、u8_system_function1_all(系统功能 1)、u8_system_function3_all(系统功能 3)。bit 视图逐项标记:10min 过压点/时间、过频降载、电压恢复值、并网重连、缓升、缓降、法规速率、重连速率、有功电压曲线、无功模式、Q-V 曲线、欠频降载、有功电压使能、PV 连接类型、孤岛检查、安规码、GFCI、缓升缓降使能、宽范围、N 线检测、bypass 等
SENERGYS5_INV_CONTROL_INFO_T结构体本地控制信息表:混合工作模式、开关机、AC 并网功率限制百分比、电池充放电电流、MPPT 启停、s8_dcdc_evocation_cnt(通讯丢失计数,有符号)、u16_reset_cnt(复位计数)、PV 连接类型、过欠频曲线类型、初始化标志、重连缓升速率
SENERGYS5_INV_DEVICE_INFO_T结构体本地设备信息表(本文件最大的类型)。静态能力:最大 PV 开路电压、MPPT 路数、标称电压/频率、额定 AC 有功/视在功率、AC 接线方式、产品型号。运行状态:运行模式、混合工作模式、开关机、备份状态、加热模式状态/电压/电流、BMS 电流校准、降载原因、输出有功/无功/视在功率、功率因数、系统状态、自检结果、HS 温度、安规码、降载百分比、MPPT 阴影管理与间隔、PV 连接类型、孤岛检查、低电压穿越、绝缘检测、接地电流检测、市电高压降载、无功功率百分比(高低精度)、远程关机、PV/逆变累计电量(0.01kWh)、MPPT 启停、电池电压、过欠频曲线使能状态、宽范围使能状态、NPE 状态、NN 检测状态、自检使能、强制 bypass、无功模式、缓升缓降使能、报警录波 u16_alarm_record_info[6]、逆变功率限制、充放电电流上限、DCDC 步数/状态、AC 最大有功/视在功率
SENERGYS5_COMM_INFO_T结构体通信任务表:adaptive_polling_search[2]({sub_model, baudrate} 波特率自适应表)、9 个查询标志位(SN/型号、版本、法规参数、法规曲线、系统功能 1/2/3、开关机、BACKUP、加热状态)、安规变化标志、Grid 充电使能标志(三态)、开关机设置标志、NPE 设置标志、自检检查标志、DC 控制精度标志、加热设置标志、通讯建立标志、u16_ems_read_inv_debug[6]、6 个 tick(通讯心跳、自检、自检标志、实时数据 1/2/3、调试数据)、u16_query_inv_check_flag、u8_inv_old_version_flag

2.4 外部符号声明

名称类型说明
s_senergys5_task_tabSENERGYS5_COMM_INFO_Textern,定义在 .c 第 37 行
s_senergys5_device_info_tabSENERGYS5_INV_DEVICE_INFO_Textern,定义在 .c 第 43 行
s_senergys5_control_info_tabSENERGYS5_INV_CONTROL_INFO_Textern,定义在 .c 第 44 行
s_u_senergys5_error_mapping_tableSENERGYS5_ERROR_Uextern,定义在 .c 第 45 行
s_u_senergys5_error_mapping_table2SENERGYS5_ERROR_U2extern,定义在 .c 第 46 行
s_senergys5_set_infoSENERGYS5_SYSTEM_SET_ENABLE_FLAG_Uextern,定义在 .c 第 47 行

3. 函数清单

本文件不包含任何函数定义,仅有 9 条对外接口原型声明(第 821~829 行)。下表列出全部原型及其真实定义位置。

函数名作用域说明
senergy_comm_init声明为全局(原型 821 行)通讯初始化入口;定义在 set_comm_usart_s5.c:358,由 inverter.c:74 调用
senergy_model_recognition声明为全局(原型 822 行)型号识别/波特率自适应;定义在 set_comm_usart_s5.c:449,由 inverter.c:1094 调用
senergys5_inverter_comm声明为全局(原型 823 行)通讯任务总入口;定义在 set_comm_usart_s5.c:6199,由 inverter.c:1090 每周期调用
senergys5_data_init声明为全局(原型 824 行)悬空声明:全工程(含 .c)无任何定义,也从未被调用
senergys5_query_inv_product_model声明为全局(原型 825 行)查询产品型号,返回 u8;定义在 set_comm_usart_s5.c:3068
senergys5_control_flag_init声明为全局(原型 826 行)控制标志复位;定义在 set_comm_usart_s5.c:857
senergys5_get_self_test_data声明为全局(原型 827 行)意大利安规自检数据收集;定义在 set_comm_usart_s5.c:4675,由 inverter.c:302 调用
senergy_comm_init_usart声明为全局(原型 828 行)USART2 波特率初始化;定义在 set_comm_usart_s5.c:389,由 inverter.c:75 调用
senergys5_query_inv_update_versions_info声明为全局(原型 829 行)通用版本查询(带参数);定义在 set_comm_usart_s5.c:1949,由 set_upgrade_s5.c:678 调用

对比说明:.c 中实际存在 110 个函数定义,其中大量 static(如 senergys5_inv_write_data、senergys5_ems_send_query_data_to_inv、各查询/设置函数)没有在本头文件中声明。本头文件另外导出了 send_bat_heat_to_set_inv、s_senergys5_CEC_DNSP_set_state 也未出现——这两个全局函数在 .c 中定义但头文件未声明,调用方靠隐式声明或自身 extern。接口声明与实际导出集合不一致,属历史遗留。

4. 核心逻辑解析

本文件为纯声明文件,无状态机与算法。以下说明它对 .c 行为的约束方式。

4.1 它定义了通信协议的报文骨架

头文件通过 SENERGYS5_SLAVE_ADDRESS、三个标准功能码、三个异常功能码、两个扩展功能码(0x80 / 0x90)以及 SENERGYS5_PCK_LEN(100)、SENERGYS5_INV_RECV_BUFFER_SIZE(256)、SENERGYS5_MAX_REGISTER_NUM(100) 三组长度上限,把「Modbus RTU + 盛能杰私有扩展」的帧格式固定在编译期。.c 中的 5 种组帧函数(senergys5_ems_send_query_data_to_inv 等)全部只使用这些宏,不出现裸数字。

总线时序参数由 SENERGYS5_DAT_PCK_INTERVAL_INV(100ms) 与 SENERGYS5_TIME_30MS/100MS/250MS/1S/1M 提供,.c 中所有 OSTimeGet() 差值判断都以它们为周期基准(例如实时数据 1 的 5 * SENERGYS5_TIME_100MS)。

4.2 它把寄存器映射固化为一组「地址 + 数量」宏

每一条业务查询/设置在 .c 中都只写一对宏,例如实时数据 1 用 (SENERGYS5_ADDR_REAL_TIME_DATA1, SENERGYS5_NUM_REAL_TIME_DATA1)。这一层抽象的好处是:寄存器表若变动只需改头文件;代价是同一个地址被多个语义不同的宏复用(0x5000 同时是 REGULATION_PARAMETER 与 SET_GRID_CONNECT_DELAY_TIME;0x5030 同时是 REGULATION_CURVE 与 REACTIVE_MODE;0x2E01 同时是 SYSTEM_FUNCTION3 与 NN_SHORT_CHECK_ENABLE;0x2E04 同时是 INV_CTRL_ACCURACY_ENABLE 与 BAT_CURR_CALIBRATION_ENABLE),阅读时必须结合调用点才能判断当前用的是「整块读」还是「单项写」。

4.3 位域联合体是故障码与状态的统一解码器

SENERGYS5_ERROR_U、SENERGYS5_ERROR_U2、SENERGYS5_SYSTEM_STATUS_U、SENERGYS5_LOAD_DE_RATING_U、SENERGYS5_INV_SELF_TEST_POGRESS_U 五个联合体采用同一套设计:外层是 u16_all / u32_all / u64_all 整型视图,内层是 bit 位域视图,另有 word 视图供 SENERGYS5_ERROR_U 按 16 位整字读取。.c 的做法是:从机应答里按 16 位整字写入 word.wordN 或 u16_all,再由 .c 里的映射函数逐 bit 翻译成 EMS 的另一套故障位定义。这样做的原因是两套故障位定义完全不同、无法按位对齐。

SENERGYS5_ERROR_U 里保留了大量 bit32~bit63 占位位(含一处注释重复写了两遍 //BYTE4,实际第二个应为 BYTE5),这是为了在不改变整体布局的前提下适配逆变器厂商后续新增位。

4.4 「4 字节状态字」是设置流程的闭环协议

SENERGYS5_SYSTEM_SET_ENABLE_FLAG_U 的两个视图承担了不同角色:

即:位级标志驱动单次下发,字节级汇总驱动整组回读。四组分别是并网法规基本参数、并网法规曲线、系统功能 1、系统功能 3;bit 视图里也恰好分成 4 个字(bit0~8 第一组、bit9~15 第二组、bit16~23 第三组、bit24~31 第四组),与该分组一一对应。

4.5 冗余的长度宏与语义错配

同一「读 1 个寄存器」在很多地方都被写成 SENERGYS5_NUM_EPS_ENABLE(0x01),例如电池加热状态校验本应使用 SENERGYS5_NUM_BAT_HEATING_ENABLE。因为这几个宏的值都是 1,当前行为正确,但这种「常量语义复用」在本头文件中已经存在多处(SENERGYS5_NUM_EPS_ENABLE 被当作通用 1 使用),一旦某个寄存器数量调整就会静默失效。

5. 对外接口

5.1 本文件导出

宏:全部调试开关、时序常量、寄存器地址与数量、功能码/指令码、从机地址、缓冲区大小(详见第 2.1、2.2 节)。

类型:21 个类型定义(8 个枚举、6 个结构体、7 个联合体)——SENERGYS5_DAT_PCK_INV_T、SENERGYS5_ON_OFF_E、MPPT_CTRL_E、SENERGYS5_ABNORMAL_CODE_E、SENERGYS5_HYBRID_WORK_MODE_E、SENERGYS5_PV_PANEL_CONNECT_TYPE、SENERGYS5_INV_PRODUCTION_TYPE_E、SENERGYS5_INV_WORK_MODE_E、SENERGY_SERIES_E、SET_HEAT_TABLE_T、SENERGYS5_SYSTEM_STATUS_U、SENERGYS5_INV_SATEY_REATIVE_OUT_MODE、SENERGYS5_INV_SATEY_COUNTRY_TYPE、SENERGYS5_LOAD_DE_RATING_U、SENERGYS5_INV_SELF_TEST_POGRESS_U、SENERGYS5_ERROR_U、SENERGYS5_ERROR_U2、SENERGYS5_SYSTEM_SET_ENABLE_FLAG_U、SENERGYS5_INV_CONTROL_INFO_T、SENERGYS5_INV_DEVICE_INFO_T、SENERGYS5_COMM_INFO_T。

全局变量(extern,6 个):s_senergys5_task_tab、s_senergys5_device_info_tab、s_senergys5_control_info_tab、s_u_senergys5_error_mapping_table、s_u_senergys5_error_mapping_table2、s_senergys5_set_info。

函数原型(9 个):见第 3 节。实际消费者是 midware/inverter/inverter.c(senergy_comm_init、senergy_comm_init_usart、senergy_model_recognition、senergys5_inverter_comm、senergys5_get_self_test_data)与 midware/inverter/set/set_upgrade_s5.c(senergys5_query_inv_update_versions_info)。

5.2 本文件依赖

来源使用内容
includes.hu8/u16/u32/s8/s16/s32、bool、TRUE/FALSE 等平台类型与宏
set_upgrade_s5.h(第 14 行 include)借出升级模块的应答码 SENERGYS5_INV_REPLY_CODE(0xA5)、SENERGYS5_INV_REPLY_CODE1(0x55) 与升级标志接口;.c 通过本头文件间接获得这些符号

注意:头文件不 include inverter.h,但 .c 第 13 行先 include inverter.h 再 include 本文件,因此 SENERGYS5_INV_DEVICE_INFO_T 等类型对 inverter.c 可见。这也意味着依赖顺序被隐式约束:任何 include 本文件但不先 include inverter.h 的编译单元可能拿不到完整的类型定义。midware/inverter/set/set_comm_can.c 与本文件同目录,实际使用顺序需按该 .c 的 include 顺序核对。

6. 依赖关系

依赖:

被依赖:

7. 备注与风险点

  1. 文件名与文件头注释不一致:头部 @file :set_comm_s5.h(第 2 行)与实际文件名 set_comm_usart_s5.h 不符,且声明了与实际导出集合不匹配的内容,属历史改名遗留。
  2. 悬空函数声明 senergys5_data_init(第 824 行):全工程无定义、无调用。若后续误以为该函数存在并调用,会在链接阶段报错。
  3. send_bat_heat_to_set_inv、s_senergys5_CEC_DNSP_set_state 未在头文件声明,但 .c 中定义为全局(非 static)。其它模块调用它们时没有原型可见,存在隐式声明导致的返回类型/参数不匹配风险。
  4. 拼写笔误集中在标识符里,且已固化到接口:
    • SENERGYM5_NUM_REAL_TIME_DATA1(第 140 行,应为 SENERGYS5)—— 该笔误宏在 .c 第 6122 行被正常使用,一旦有人「修正」拼写就会破坏编译。
    • SENERGYS5_INV_SELF_TEST_POGRESS_U(应为 PROGRESS)、SENERGYS5_INV_SATEY_REATIVE_OUT_MODE(应为 SAFETY_REACTIVE)、SENERGYS5_INV_CONTRIL_FLAG_INIT_DEBUG(应为 CONTROL)、SENERGYS5_INV_REAL_TIME_DATAT1/2/3(多了 T)、SENERGY_SERIES_E(应为 SENERGYS5)、u8_inv_set_heat_relay_cmd、.c 中的 senergyg2_... vs senergyG2_... 大小写混用。
  5. SENERGYS5_ERROR_U 的注释重复:第 566 行与第 556 行都标 //BYTE4,第二个实际应为 BYTE5。位域总长度按 u64_all 计算正好 64 位,因此布局本身正确,但注释误导。
  6. 位域跨字节依赖编译器布局:SENERGYS5_ERROR_U 等联合体用位域直接映射从机 16 位整字。ARM Compiler 的位域分配顺序(小端、低位在前)与逆变器厂商的约定必须一致;换编译器或加 #pragma pack 会影响整个解码逻辑。头文件本身未定义字节序或对齐约束。
  7. u16_inv_ac_max_active_power 与 u32_nominal_ac_active_power 类型不统一(SENERGYS5_INV_DEVICE_INFO_T 内),一个 16 位一个 32 位,.c 中直接相互赋值比较,超过 65535W 的机型会溢出。
  8. SENERGYS5_INV_INSTRUCT_BUFFER_SIZE(10) 定义了但全工程未使用;SENERGYS5_INV_RATED_POWER_5_5KW、_6KW 及 SENERGYS5_INV_RATED_POWER_10KW 在 .c 中的使用也不完整(SUB_M10 只在非澳规时用 10kW、澳规用 9999W),5.5/6kW 档位完全没被引用。
  9. 同一地址被多个语义宏复用(0x5000、0x5030、0x2E01、0x2E04),宏名不含「整块/单项」区分,阅读 .c 时必须结合寄存器数量参数才能确定语义,容易误改。
  10. SENERGYS5_NUM_EPS_ENABLE(0x01) 被当作通用「读 1 个寄存器」常量在 .c 中复用于电池加热状态/电压/电流/BMS 校准四处长度校验(.c 第 2924、2971、3010、3051 行),语义错配。
  11. SENERGYS5_NUM_AC_ACTIVE_APPARENT_POWER_HIGH/LOW 都是 0x02,而 .c 里对这两组寄存器执行的是「写 2 个寄存器」操作;宏名里的 NUM 在读/写两种用途下含义相同(寄存器个数),这一点从命名上不易区分写方向。
  12. 调试宏全部为 0 但保留了 #if ((X == 1) || (Y == 1)) 的双条件写法,说明历史上这些开关曾被临时置 1 调试;宏名中出现 DATAT、CONTRIL 等笔误,属于未清理的临时调试遗留。
  13. 头文件未使用 include guard 之外的任何版本号/兼容性标记,但 SENERGYS5_INV_SATEY_COUNTRY_TYPE 的取值会随逆变器固件版本演进(如新增 SENERGYS5_RD647 = 0x5C、EN_50549_IE = 0x48)。EMS 与 DSP 之间没有协议版本协商机制,安规码不一致时只能靠 senergys5_get_safety_type_inv_to_server 里的软映射兜底。
  14. SENERGYS5_DAT_PCK_INV_T 定义了却未被任何代码实例化,属预留抽象或历史遗留类型。