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_STATE | 0x6001 | SENERGYS5_NUM_INV_ON_OFF_STATE(0x01) | 开、关机状态(可读可写) |
只写寄存器
| 地址宏 | 地址 | 数量宏 | 说明 |
|---|---|---|---|
SENERGYS5_ADDR_GRID_CHARGE_ENABLE | 0x2115 | 0x02 | 允许 Grid 充电使能 + AC 功率上限 |
SENERGYS5_ADDR_EPS_ENABLE | 0x211C | 0x01 | UPS / BACKUP 使能 |
SENERGYS5_ADDR_RESET_DSP_EEPROM | 0x6006 | 0x01 | 清除 DSP EEPROM(G2 独有) |
SENERGYS5_ADDR_RESET_DSP | 0x2E06 | 0x01 | DSP 重启,需处于待机状态 |
SENERGYS5_ADDR_BAT_HEATING_ENABLE | 0x2E09 | 0x01 | 进入加热模式,需并网或待机旁路 |
SENERGYS5_ADDR_BAT_HEATING_VOLT | 0x2F0E | 0x01 | 加热输出电压,单位 0.1V |
SENERGYS5_ADDR_BAT_HEATING_CURR | 0x2F08 | 0x01 | 加热输出电流,单位 0.01A |
SENERGYS5_ADDR_BAT_CURR_CALIBRATION_ENABLE | 0x2E04 | 0x01 | BMS 电池电流校准使能 |
只读(查询)寄存器
| 地址宏 | 地址 | 数量宏 | 说明 |
|---|---|---|---|
SENERGYS5_ADDR_REAL_TIME_DATA1 | 0x1001 | M5=0x4A,非 M5=0x64 | 实时数据 1:AC 侧电气量、PV1~PV4、机温、运行模式、故障字 1~3、降载原因、无功/视在功率、功率因数、系统状态、母线电压、电池电流、HS 温度 |
SENERGYS5_ADDR_REAL_TIME_DATA2 | 0x2E50 | 0x01 | 实时数据 2:故障字 6 |
SENERGYS5_ADDR_REAL_TIME_DATA3 | 0x2F00 | 新版本 0x1C / 老版本 0x15 | 实时数据 3:母线电压、DCDC 步数与状态、电池电流、故障字 4、check_flag、功率限值、最大充放电电流 |
SENERGYS5_ADDR_MODELNAME_SN | 0x1A00 | 0x24 | 型号名 + SN |
SENERGYS5_ADDR_INV_VERSIONS_INFO | 0x1A19 | 0x59 | master/slave/dcdc 版本、料号、机型基本参数 |
SENERGYS5_ADDR_AC_ACTIVE_APPARENT_POWER_HIGH | 0x1A4E | 0x02 | 额定 AC 有功/视在功率高 16 位 |
SENERGYS5_ADDR_AC_ACTIVE_APPARENT_POWER_LOW | 0x1A46 | 0x02 | 额定 AC 有功/视在功率低 16 位 |
SENERGYS5_ADDR_PRODUCTION_TYPE | 0x1A5A | 0x01 | 逆变器产品型号 |
SENERGYS5_ADDR_SELF_TEST_PROGRESS | 0x5210 | 0x03 | 自检进度、自检结果、自检使能 |
SENERGYS5_ADDR_INV_DEBUG | 0x2F2D | 0x06 | DEBUG_0x2F2D ~ 0x2F32 |
系统功能参数 2(NPE 短接)
| 地址宏 | 地址 | 数量 | 说明 |
|---|---|---|---|
SENERGYS5_ADDR_SYSTEM_FUNCTION2 | 0x2157 | 0x01 | NPE 短接状态 |
系统功能参数 3
| 地址宏 | 地址 | 数量 | 说明 |
|---|---|---|---|
SENERGYS5_ADDR_SYSTEM_FUNCTION3 | 0x2E01 | 0x03 | NN 短接检测、强制 bypass、电压频率宽范围 |
SENERGYS5_ADDR_NN_SHORT_CHECK_ENABLE | 0x2E01 | 0x01 | NN 短接检测使能 |
SENERGYS5_ADDR_FORCE_BYPASS_ENABLE | 0x2E02 | 0x01 | 强制 Bypass 使能 |
SENERGYS5_ADDR_OPEN_VOLT_FAC_ENABLE | 0x2E03 | 0x01 | 电压频率宽范围使能 |
SENERGYS5_ADDR_INV_CTRL_ACCURACY_ENABLE | 0x2E04 | 0x01 | DC 控制功率校准使能 |
并网法规基本参数
| 地址宏 | 地址 | 数量 | 说明 |
|---|---|---|---|
SENERGYS5_ADDR_REGULATION_PARAMETER | 0x5000 | 0x30 | 并网法规基本参数整块 |
SENERGYS5_ADDR_SET_GRID_CONNECT_DELAY_TIME | 0x5000 | 0x02 | 首次并网 / 重连等待时间 |
SENERGYS5_ADDR_OFP_DERATING_ENABLE | 0x5017 | 0x01 | 过频曲线使能 0:Disable 1:Enable |
SENERGYS5_ADDR_SET_REGULATION_PARAMETER2 | 0x5018 | 0x01 | 十分钟过压保护点 |
SENERGYS5_ADDR_ACTIVE_POWER_RISE | 0x5023 | 0x01 | 非首次并网功率缓起,0.01%/s |
SENERGYS5_ADDR_SET_VOLT_RESTORE_VALUE | 0x5027 | 0x02 | 过/欠压恢复阈值 |
SENERGYS5_ADDR_ACTIVE_POWER_FIRST_RISE | 0x5029 | 0x01 | 首次并网功率缓起,0.01%/s |
SENERGYS5_ADDR_SET_REGULATION_PARAMETER4 | 0x502B | 0x01 | 十分钟过压保护时间 |
SENERGYS5_ADDR_ACTIVE_POWER_FALL | 0x502C | 0x01 | 非首次并网功率缓降,0.01%/s |
SENERGYS5_ADDR_ACTIVE_POWER_RECONNECT | 0x5019 | 0x01 | 重连并网功率缓起,0.01%/s |
并网法规曲线参数
| 地址宏 | 地址 | 数量 | 说明 |
|---|---|---|---|
SENERGYS5_ADDR_REGULATION_CURVE | 0x5030 | 0x58 | 法规曲线整块 |
SENERGYS5_ADDR_REACTIVE_MODE | 0x5030 | 0x01 | 无功模式 |
SENERGYS5_ADDR_REACTIVE_VOLT_CURVE | 0x503C | 0x04 | 无功电压(Q-V)曲线 4 点 |
SENERGYS5_ADDR_SET_ACTIVE_VOLT_CURVE | 0x5049 | 0x04 | 有功电压(P-V)曲线 4 点 |
SENERGYS5_ADDR_UFP_DERATING_ENABLE | 0x5080 | 0x01 | 欠频曲线使能 |
系统功能参数 1
| 地址宏 | 地址 | 数量 | 说明 |
|---|---|---|---|
SENERGYS5_ADDR_SYSTEM_FUNCTION | 0x5100 | 0x30 | 系统功能 1 整块:安规码、孤岛、绝缘电阻、低电压穿越、PV 连接类型 |
SENERGYS5_ADDR_INV_SATEY_COUNTRY | 0x5101 | 0x01 | 国家安规码 |
SENERGYS5_ADDR_GFCI_ENABLE | 0x5118 | 0x01 | GFCI 检测使能 |
SENERGYS5_ADDR_PV_CONNECT_TYPE | 0x5109 | 0x01 | PV 连接类型设置 |
SENERGYS5_ADDR_ISLANDING_CHECK | 0x510E | 0x01 | 孤岛检查功能 |
SENERGYS5_ADDR_SET_ACTIVE_VOLT_CURVE_ENABLE | 0x511D | 0x01 | 有功电压曲线使能 |
SENERGYS5_ADDR_ACTIVE_POWER_RISE_FALL_ENABLE | 0x512B | 0x01 | 非首次并网功率缓升缓降使能 |
SENERGYS5_ADDR_LEAKAGE_CUR_ENABLE | 0x512D | 0x01 | 漏电流检测使能(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_tab | SENERGYS5_COMM_INFO_T | extern,定义在 .c 第 37 行 |
s_senergys5_device_info_tab | SENERGYS5_INV_DEVICE_INFO_T | extern,定义在 .c 第 43 行 |
s_senergys5_control_info_tab | SENERGYS5_INV_CONTROL_INFO_T | extern,定义在 .c 第 44 行 |
s_u_senergys5_error_mapping_table | SENERGYS5_ERROR_U | extern,定义在 .c 第 45 行 |
s_u_senergys5_error_mapping_table2 | SENERGYS5_ERROR_U2 | extern,定义在 .c 第 46 行 |
s_senergys5_set_info | SENERGYS5_SYSTEM_SET_ENABLE_FLAG_U | extern,定义在 .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 的两个视图承担了不同角色:
bit视图(逐项标志):.c 中由senergys5_data_check_handle()置位(检测到配置与回读不一致时),由各设置函数在收到合法应答后清位。word视图(4 个字节):senergys5_set_inv_system_function_state()在每个设置函数执行后检查word.<组名>_all == FALSE,为真则认为「本组已全部下发完毕」,于是把对应查询标志位置 TRUE 触发整组回读。
即:位级标志驱动单次下发,字节级汇总驱动整组回读。四组分别是并网法规基本参数、并网法规曲线、系统功能 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.h | u8/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. 依赖关系
依赖:
includes.h(平台类型与通用宏)set_upgrade_s5.h(升级模块应答码与型别)
被依赖:
midware/inverter/set/set_comm_usart_s5.c(第 17 行 include)—— 主要实现方midware/inverter/set/set_comm_can.c—— 使用同一批外设状态结构体做 CAN 侧处理midware/inverter/inverter.c—— 通过本文件声明的 6 个 extern 变量读取 S5 系列的全部运行数据(实时功率、故障字、版本、安规参数、加热状态等),并调用 5 个初始化/查询入口
7. 备注与风险点
- 文件名与文件头注释不一致:头部
@file :set_comm_s5.h(第 2 行)与实际文件名set_comm_usart_s5.h不符,且声明了与实际导出集合不匹配的内容,属历史改名遗留。 - 悬空函数声明
senergys5_data_init(第 824 行):全工程无定义、无调用。若后续误以为该函数存在并调用,会在链接阶段报错。 send_bat_heat_to_set_inv、s_senergys5_CEC_DNSP_set_state未在头文件声明,但 .c 中定义为全局(非 static)。其它模块调用它们时没有原型可见,存在隐式声明导致的返回类型/参数不匹配风险。- 拼写笔误集中在标识符里,且已固化到接口:
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_...vssenergyG2_...大小写混用。
SENERGYS5_ERROR_U的注释重复:第 566 行与第 556 行都标//BYTE4,第二个实际应为BYTE5。位域总长度按u64_all计算正好 64 位,因此布局本身正确,但注释误导。- 位域跨字节依赖编译器布局:
SENERGYS5_ERROR_U等联合体用位域直接映射从机 16 位整字。ARM Compiler 的位域分配顺序(小端、低位在前)与逆变器厂商的约定必须一致;换编译器或加#pragma pack会影响整个解码逻辑。头文件本身未定义字节序或对齐约束。 u16_inv_ac_max_active_power与u32_nominal_ac_active_power类型不统一(SENERGYS5_INV_DEVICE_INFO_T内),一个 16 位一个 32 位,.c 中直接相互赋值比较,超过 65535W 的机型会溢出。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 档位完全没被引用。- 同一地址被多个语义宏复用(0x5000、0x5030、0x2E01、0x2E04),宏名不含「整块/单项」区分,阅读 .c 时必须结合寄存器数量参数才能确定语义,容易误改。
SENERGYS5_NUM_EPS_ENABLE(0x01) 被当作通用「读 1 个寄存器」常量在 .c 中复用于电池加热状态/电压/电流/BMS 校准四处长度校验(.c 第 2924、2971、3010、3051 行),语义错配。SENERGYS5_NUM_AC_ACTIVE_APPARENT_POWER_HIGH/LOW都是 0x02,而 .c 里对这两组寄存器执行的是「写 2 个寄存器」操作;宏名里的NUM在读/写两种用途下含义相同(寄存器个数),这一点从命名上不易区分写方向。- 调试宏全部为 0 但保留了
#if ((X == 1) || (Y == 1))的双条件写法,说明历史上这些开关曾被临时置 1 调试;宏名中出现DATAT、CONTRIL等笔误,属于未清理的临时调试遗留。 - 头文件未使用 include guard 之外的任何版本号/兼容性标记,但
SENERGYS5_INV_SATEY_COUNTRY_TYPE的取值会随逆变器固件版本演进(如新增SENERGYS5_RD647 = 0x5C、EN_50549_IE = 0x48)。EMS 与 DSP 之间没有协议版本协商机制,安规码不一致时只能靠senergys5_get_safety_type_inv_to_server里的软映射兜底。 SENERGYS5_DAT_PCK_INV_T定义了却未被任何代码实例化,属预留抽象或历史遗留类型。