inverter.c
static 局部变量3. 函数清单3.1 初始化、内部处理与任务(20 个)3.2 机型识别、机型名与显示类型(17 个)3.3 机型策略常量(27 个)3.4 运行数据读取(27 个)3.5 故障 / 告警 / 电量 / 额定 / 版本 / 升级读取(34 个)3.6 控制命令与一次性动作(14 个)3.7 模式、安规码与开关类设置(18 个)3.8 常用标量参数(PF / 无功 / 斜率 / N-N / GFCI)(9 个)3.9 过欠压 / 过欠频保护定值与恢复值(33 个)3.10 P-V / Q-V / S-PF / P-PF / P-F 曲线与降载(60 个)3.11 保护使能、门限与穿越(40 个)3.12 尾部杂项与查询(14 个)4. 核心逻辑解析4.1 三个 uCOS-II 任务与时序4.2 机型识别与「编译期 + 运行期」双重开关4.3 通信丢失降级4.4 意大利 CEI021 安规自检(italian_self_test_handle + get_self_test_data)4.5 澳洲防逆流软/硬限功率状态机(power_limit_handle)4.6 一键停机 / 按天租赁与启停控制(sys_shutdown_handle)4.7 其它周期性处理4.8 安规参数下发「三件套」模式4.9 P-V / Q-V 曲线点与沃太 3/4 点 ↔ 1/2 点映射4.10 全局变量读写清单(按访问目的)5. 对外接口5.1 本文件导出的接口5.2 本文件导出的全局变量5.3 本文件调用的外部函数(主要)6. 依赖关系7. 备注与风险点7.1 编译期宏与本快照的构建配置(重要)7.2 读函数带副作用7.3 状态机与一次性标志的健壮性7.4 空实现 / 无效实现 / 命名与实现不符7.5 潜在编译期问题7.6 安全与一致性风险7.7 文档维护提示源文件路径:
midware/inverter/inverter.c所属模块:midware/inverter(逆变器统一抽象层 / 厂商驱动力门面) 代码行数:8097
1. 文件职责
本文件是整个 EMS 固件里逆变器(PCS)的统一抽象层与驱动门面。它自身不实现任何厂商的物理层帧格式(那些在 midware/inverter/<vendor>/ 下),而是持有全局设备表 g_t_inv_info(INVERTER_TABLE_T,实例定义于 inverter.c:39),把下面七块内容按厂商分支统一暴露给上层:
- 配置数据
g_t_inv_info.t_config_data(持久化到 Flash); - 运行数据
g_t_inv_info.t_run_info; - 安规参数总表
g_t_inv_info.t_safty_info; - 安规自检过程/结果
g_t_inv_info.t_safty_tset_info[3]; - 控制命令
g_t_inv_info.t_control_cmd、控制参数g_t_inv_info.t_control_parameter; - 升级/调试
g_t_inv_info.t_debug_log、AFCIg_t_inv_info.t_afci_info。
对下,它按 get_inverter_type()(inverter.c:1340)的返回值把轮询分发到六家厂商驱动:kelong(科华)、set(盛能杰)、ginlong(锦浪)、alphaess(沃太/贝瓦/贴牌)、goodwe(固德威)、inovance(汇川),分发点在 inverter.c:1074-1136;对上,它向 logic/(调度算法)、hmi/(LCD/按键/LED)、net/(云端/Modbus)、data/(断电续传/故障录波)提供 inverter_read_* / inverter_set_* / inverter_get_* 系列 API。
它还承载机型相关的策略常量表:AC/DC 调节周期、细调幅值、电池电压上下限、PV 启动电压、并网过载系数、调节速率档位、控制精度、通信丢失降级等,全部以「按 type/sub 分支 return 常量」的硬编码形式写在本文件内(如 get_inv_calculation_interval() inverter.c:2310、get_inv_regulator_speed() inverter.c:2635、inverter_read_grid_overload_factor() inverter.c:3664、get_inv_max_bat_volt() inverter.c:2772)。
数据流位置:厂商驱动的 *_inverter_comm() 填充 g_t_inv_info.t_run_info → logic/ 计算目标功率并写回 t_safty_info / t_control_* → 厂商驱动的组帧函数把参数下发到逆变器;本文件既负责轮询与降级,也负责把上层下发的参数落到 t_safty_info 并置位厂商「待下发」脏标志(见 §4.8)。
本文件同时提供三个 uCOS-II 任务的入口:task_inverter(USART/SCI 侧,inverter.c:1045)、task_inverter_can(CAN 侧 + 并机,inverter.c:1199)、task_parallel_sci(并机 SCI,inverter.c:1296),三者均在 user/main.c:189 / 244 / 299 用 OSTaskCreateExt 静态创建。
规模统计:本文件共 313 个函数定义(其中 14 个 static,299 个全局可见),1014 处分条件编译指令(#if/#ifdef/#else/#elif/#endif)。文件自身的全局变量只有 1 个(g_t_inv_info),另有 2 个 extern 引用(inverter.c:40-41)。
2. 关键数据结构与宏
2.1 本文件定义/引用的全局对象
| 名称 | 类型 | 说明 |
|---|---|---|
g_t_inv_info | INVERTER_TABLE_T | 本文件唯一的全局变量,inverter.c:39 定义(= {0})。全文出现 589 次,是本层的全部状态载体。子结构:u8_init_flag、t_config_data、t_safty_info、t_safty_tset_info[3]、t_run_info、t_control_cmd、t_control_parameter、t_debug_log、t_afci_info。 |
g_t_host_machine_running_info | PARALLEL_HOST_MACHINE_RUNNING_INFO_T[] | extern(inverter.c:40),并机主机运行信息数组。sys_shutdown_handle() 读 [0].u8_drm_mode 参与停机判定(inverter.c:847)。 |
g_u8_dc_disturbance_count | u8 | extern(inverter.c:41),直流扰动计数,inverter_get_dc_disturbance_count()(inverter.c:2748)读取,盛能杰 M10 机型做 1 << (n-1) 指数放大。 |
2.2 本文件大量写入/读取的外部全局结构(按厂商分桶)
本文件的「置脏标志」模式依赖以下厂商通信上下文,均为跨模块全局变量(定义在各厂商模块或 data/):
| 名称 | 归属模块 | 说明 |
|---|---|---|
g_t_kelong_comm_info | kelong/ | 科华侧标志,本文件引用 88 次;如 u8_ems_set_inv_safety_arg_flag1/2/3/4/f/a、u8_ems_set_inv_grid_protect_arg_*、u8_ems_set_inv_ctrl_arg_flag1。 |
g_t_ginlong_info | ginlong/ | 锦浪侧,引用 54 次;含 t_ginlong_comm_info.u8_set_ovp_value_flag、u8_set_pu_v3_flag、u8_change_grid_parameter_tuning_flag、u8_set_special_setting_flag,以及 t_ginlong_rundata、t_ginlong_safety_info、t_control_cmd。 |
g_t_alphaess_comm_info | alphaess/ | 沃太侧,引用 106 次;如 u8_ems_set_function_enable_flag、u8_ems_set_inv_safety_arg_flag4/6、u8_set_inv_ctrl_arg_flag1、u8_ems_set_quiescent_volt_reactpower_support_flag、u8_ac_bat_out_flag、u8_ems_get_self_data_flag。 |
g_t_goodwe_comm_info | goodwe/ | 固德威侧,引用 1 次(u8_set_iso_limit_flag,inverter.c:4056)。 |
g_t_inovance_comm_info | inovance/ | 汇川侧,引用 77 次;主用 u64_sci_flag.bit.* 位域,另用 u8_set_inv_ctrl_arg1_flag。 |
s_senergys5_set_info | set/set_comm_usart_s5.h:819(extern) | 盛能杰 S5 使能位联合体,本文件以 s_senergys5_set_info.bit.xxx = TRUE 置位,共 25 处。 |
s_senergys5_task_tab | set/set_comm_usart_s5.h:814(extern) | 盛能杰 S5 任务表,本文件只写 u8_set_inv_npe_short_enable_flag(inverter.c:4775)。 |
g_t_system_base_info | data/system_config | 读 u16_oem_flag(贴牌判定,inverter.c:1069、1395、1449 等 23 处)、s8_sn[6](显示类型判定,inverter.c:1816、1849)。 |
g_system_custom_info | data/system_config | 客户自定义机型名/显示类型覆盖(inverter.c:1388、1778)。 |
g_system_function_info | data/system_config | 读 t_dev_fun.ems_fun_3_u.bit.u8_gfci_en 功能使能位(inverter.c:549)。 |
g_t_logic_info | logic/ | 读 u8_drm_mode、u8_uk_G100_SystemState、u8_fine_tuning_range_zero_flag(inverter.c:846-848、2542)。 |
g_t_parallel_total_machine_network | inverter/parallel_comm | 读 u8_run_machine_precept(inverter.c:2961)。 |
g_stEMSInfo | net/ | 读 bIsLogin 判据(断网计时,inverter.c:807、896)。 |
g_t_fast_dispatch_flag | logic/ | uCOS-II 事件标志组,三个任务用它做同步(inverter.c:1054、1185、1207)。 |
g_t_ate_ctrol | midware/ate | 读 u8_set_passthrough_can_test_flag(inverter.c:1227)。 |
g_t_task_run_status | midware/debug | 仅调试计数(inverter.c:1180、1282)。 |
2.3 本文件消费的关键宏 / 枚举
| 名称 | 来源 | 说明 | ||
|---|---|---|---|---|
INVERTER_TYPE | inverter.h:172 | 编译期机型开关,本快照定义为 INVERTER_NULL(0)。写法统一为 `#if ((INVERTER_TYPE == INVERTER_MAX) \ | \ | (INVERTER_TYPE == XXX_TYPE)) + if(get_inverter_type() == XXX_TYPE) 两段式;INVERTER_MAX(7)` 相当于「全厂商都编进去」。详见 §7 风险点。 |
INVERTER_NULL/KELONG_TYPE/SET_TYPE/GINLONG_TYPE/ALPHAESS_TYPE/GOODWE_TYPE/INOVANCE_TYPE/INVERTER_MAX | inverter.h:163-170 | 厂商类型码 0~7。get_inverter_type() 会把 >= INVERTER_MAX 的值纠回 INVERTER_NULL。 | ||
INV_DC_CTRL / INV_AC_CTRL | inverter.h:175-182 | 由 INVERTER_TYPE 条件定义(科华/盛能杰/锦浪/固德威走 DC 侧,沃太/汇川走 AC 侧)。本快照下两者都未定义(INVERTER_NULL 不匹配任一条件)。 | ||
SUB_S3~SUB_B10、SUB_MAX | inverter.h(INVERTER_SUB_E) | 子机型码,get_inverter_sub() 用 SUB_MAX 做范围校验,SUB_NULL 兜底。本文件按 sub 决定显示类型、升级能力、策略常量、相数、曲线点数。 | ||
cWaitMode/cSelfCheckMode…cFaultMode(0~10) | inverter.h:20-30 | 逆变器运行模式。inverter_lost_handle() / _can() 在通信丢失时把 u8_run_mode 强置 cFaultMode(inverter.c:189、220);cNormalMode 用于自检/MPPT 扫描门控(inverter.c:363、604);cUPS 用于并离网检测与故障码屏蔽(inverter.c:893、3462)。 | ||
REGULATOR_SPEED_1~_5 | inverter.h:154-158 | 调节速率档位,get_inv_regulator_speed()(inverter.c:2635)按 type/sub + 电表总有功分档返回。 | ||
INV_POWER_NONE/INV_POWER_ON/INV_POWER_OFF | inverter.h | 启停三态,inverter_power_none/on/off() 写入 t_control_cmd.u8_start_stop(inverter.c:4079/4091/4103)。 | ||
INV_STARTUP / INV_SHUTDOWN | inverter.h | inverter_startup()/shutdown() 写 t_run_info.u8_set_inv_on_off(inverter.c:4127、4139)。 | ||
START_SELF_INSPECTION/NOT_SELF_INSPECTION/STOP_SELF_INSPECTION… | inverter.h | 安规自检命令/状态,set_inverter_safty_test_flag() 写 START_SELF_INSPECTION(inverter.c:7232)。 | ||
PV_CHANAEL1~PV_CHANAEL4、PV_CHANAL_ALL | inverter.h | PV 通道索引(注意源码拼写为 CHANAEL),inverter_read_pv_*() 按索引取址(inverter.c:2976-3031)。 | ||
PHASE_L1~PHASE_L3、PHASE_ALL | inverter.h | 相序索引,inverter_read_grid/inv/backup_*() 按索引取址(inverter.c:3078-3296)。 | ||
Safety_Max / SAFESUB_MAX / SAFESUB_DEFAULT | inverter.h(安规枚举末位) | 安规码/子安规范围校验与复位默认值(inverter.c:4338、4341、4367)。 | ||
AS4777_2/AS4777_2_2024/AS4777_2_SA/AS4777_NZ | inverter.h | 澳规四兄弟,inverter_read_safety_is_AS4777() 统一判定(inverter.c:4315-4328),并参与 P-V 曲线点映射与钳位。 | ||
CEI021 | inverter.h | 意大利安规,italian_self_test_handle() 的唯一入口条件(inverter.c:331)。 | ||
NRS097_2_1 | inverter.h | 南非安规,handle_cloud_set_gfci() 用它判定 GFCI 使能与退出恢复(inverter.c:553、566)。 | ||
TOR_ERZEUGER / VDE0126_GR | inverter.h | 奥地利列名 / 德国 VDE,sys_safety_special_deal_handle()(inverter.c:964)与 inverter_set_p_pf_mode_p2()(inverter.c:6449)做特殊强制。 | ||
PARA_COM_TYPE_NONE/_UART4/_USART3 | inverter.h | 并机通信制式,inverter_get_parallel_mode()(inverter.c:2957)与 passthrough_detection_flag()(inverter.c:1924)使用。 | ||
BACKUPBOX_5K/_10K/_23K | inverter.h | 备电箱型号,backupbox_detection_handle() 依 meter_get_meter_type_old(GRID_METER) 识别(inverter.c:762-776)。 | ||
BOARD_EMS3_6_E / BOARD_EMS3_6_4_E | board_init.h | 板型,参与机型名(inverter.c:1460)、显示类型(1820)、透传能力(1921)判定。 | ||
OEM_HHE/OEM_BW/OEM_SUNPOWER/OEM_ZONERGYESS/OEM_DIGIEN/OEM_PEIMAR | data/system_config | 贴牌开关,决定返回的机型名字符串与显示类型。 | ||
DISPLAY_LCD_CHARACTER_E/DISPLAY_LCD_RKP_E/DISPLAY_LED_LAMP_PANEL_E/DISPLAY_LED_LAMP_STRIP_E/DISPLAY_LED_BICOLOR_E | inverter.h | 显示类型枚举,inverter_read_display_type() 返回(inverter.c:1776-1859)。 | ||
TYPE_* 系列字符串宏 | inverter.h | 约 80 个对外机型名(TYPE_SEEDS_G3_T10、TYPE_BYTE_WATT_T10、TYPE_GINLONG_S5、TYPE_GOODWE_AES9_6、TYPE_INOVANCE_T20、贴牌 ZOE_OEM_*/SUNPOWER_OEM_*/PEIMAR_OEM_*/DIGIEN_OEM_* 等),由 inverter_read_system_modle() / inverter_read_inv_type() 返回给云端与 Modbus。 | ||
PEND_LOGIC_CALCULATE_DONE / POST_INV_CALCULATE_DONE / PEND_INV_CALCULATE_DONE | logic/ | 事件标志位,task_inverter 等 PEND_LOGIC_CALCULATE_DONE、收齐后 POST_INV_CALCULATE_DONE;task_inverter_can 等 PEND_INV_CALCULATE_DONE 且带 OS_FLAG_CONSUME。 | ||
TASK_INVERTER_CAN_PRIO | user/main.h | task_inverter 用 OSTimeDlyResume() 立刻唤醒 CAN 任务(inverter.c:1186)。 | ||
INVERTER_CONFIG_PAGE | data/ | Flash 配置页号,所有需要落盘的改动都 save_job_post(INVERTER_CONFIG_PAGE)(inverter.c:559、817、830、4342、4428、4740)。 | ||
GRID_METER / P1_SAMPLING | meter.h | 电网表索引与 P1 采样模式,power_limit_handle()(inverter.c:640)、get_inv_calculation_interval()(2350)、get_inv_regulator_speed()(2642)使用。 | ||
FIX_PF_REACTPOWER_MODE/POWER_PF_REACTPOWER_MODE/FIX_Q_REACTPOWER_MODE/VOLT_VAR_REACTPOWER_MODE/NO_REACTPOWER_MODE | inverter.h(INVERTER_REACTPOWER_MODE_E) | inverter_get_reactpower_control_mode()(inverter.c:7160)按 safty_mode_u 位域映射。 | ||
INVERTER_TYPE_BYTE_WATT_S/_T/NON_BYTE_WATT | inverter.h(INVERTER_CATEGORY_E) | get_inverter_type_category()(inverter.c:8003)返回贝瓦单相/三相/非贝瓦分类。 | ||
SNJ_M5_SPECIAL_HANDLE / NOT_SPECIAL_HANDLE | inverter.h | inverter_get_special_control_inv_type()(inverter.c:7985)返回,盛能杰 M5 特殊处理标志。 | ||
BACKUP_STATUS_E(BACKUP_NULL/DISABLE/ENABLE) | inverter.h | set_inverter_backup_enable() 形参类型(inverter.c:2092)。 | ||
INV_OVERLOAD_STATUS / LEASE_STATUS / GRID_STATUS | net/ 或 data/ | set_info_status() 的上报事件码(inverter.c:526、800、828、902)。 | ||
STATE4_LOCK | logic/(G100) | 英国 G100 锁定态,参与停机判定(inverter.c:848)。 | ||
DEBUG_INVERTER / METER_DEBUG_INFO | inverter.h / 工程配置 | 调试打印与任务计数开关;本文件中有 4 处 #if (DEBUG_INVERTER == 1)(inverter.c:527、876、906、1179)。 |
2.4 文件作用域内的 static 局部变量
本文件没有文件静态变量,但有 30 余个函数内 static,它们承担跨轮次的记忆功能(均在 for(;;) 大循环中每轮被访问):
| 所在函数 | 变量 | 作用 |
|---|---|---|
inverter_lost_handle | s_u8_pcs_lost_flag(inverter.c:117) | 通信丢失边沿检测,只在 0→1 跳变时清运行数据。 |
italian_self_test_handle | s_u8_safty_test_flag、s_u8_cnt、s_u8_safty_test_flag2(328、329、338) | CEI021 自检一次性触发与去抖计数(阈值 3)。 |
overload_recovery_handle | s_u32_opp_time(480) | 过载故障持续 1 小时自动 inverter_reset() 的计时基准。 |
overload_detection_handle | s_u8_preoverload_flag(516) | 过载状态边沿检测,变化时 set_info_status(INV_OVERLOAD_STATUS)。 |
handle_cloud_set_gfci | s_u8_gfci_shield_flag、s_u8_last_safety_status(543、544) | GFCI 屏蔽位记忆 + 上次安规码,用于「退出 NRS097_2_1 自动恢复 GFCI」与「屏蔽位变更即时下发」。 |
mpptscan_handle | s_u32_mpptscan_time(601) | 30 分钟一次 MPPT 扫描的计时基准。 |
power_limit_handle | s_u8_feedin_overrun_flag、s_u8_inv_stop_flag、s_u32_feedin_tick、s_u32_software_limit_tick(631-634) | 澳洲防逆流超限状态机与软/硬限功率去抖计时。 |
sys_shutdown_handle | s_u8_logout_flag、s_u32_logout_sys_shutdown_time(794、795) | 租赁一键停机的断网累计计时。 |
grid_detection | s_u8_premode(893) | 并/离网模式变化检测(初值 cUPS)。 |
sys_anti_theft_handle | s_u8_inv_anti_theft_flag(920) | 防盗标志边沿检测。 |
inverter_generator_mode_handle | s8_generator_start_prestate、s8_p_v_prestate、s8_p_f_prestate(1009-1011) | 油机启停时保存/恢复 P-V、P-F 降载使能。 |
3. 函数清单
全部 313 个函数定义(覆盖本文件 100%,无抽样)。作用域列中「static」即文件内私有,「全局」即经
inverter.h导出。「定义行」为inverter.c中的函数头行号。
3.1 初始化、内部处理与任务(20 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_state_init | 全局 | 63 | 按 get_inverter_type() 调用对应厂商的 *_comm_init() / *_comm_init_can()(六家全覆盖),由 task_inverter 在 u8_init_flag 置位时调用一次。 |
inverter_lost_handle | static | 115 | SCI 侧通信丢失处理:置故障位 3;在 0→1 边沿把 PV/电网/逆变/备电/电池全部运行量清零并把 u8_run_mode 置 cFaultMode。 |
inverter_lost_handle_can | static | 199 | CAN 侧通信丢失处理:丢失时置故障位 10 并清 C 相电压/功率、总功率、频率,u8_run_mode 置 cFaultMode;恢复时清故障位 10。 |
get_self_test_data | static | 234 | CEI021 安规自检数据装配:写 t_safty_tset_info[0] 的 OVP/OVP10/UVP/UVP2/OFP/OFP2/UFP/UFP2 标准值+时间,给 [0..2] 三相位填实际值,清 u_test_res.u16_all,再按机型转发 senergys5/alphaess/ginlong_get_self_test_data()。 |
italian_self_test_handle | static | 326 | 意大利 CEI021 自检触发流程(详见 §4.4)。含 75 行被注释掉的旧状态机实现(394-468)。 |
overload_recovery_handle | static | 478 | 输出过载故障持续 >1h 则(非沃太机型)调 inverter_reset() 尝试自恢复;含 OSTimeGet() 回绕保护。 |
overload_detection_handle | static | 513 | 把「输出过载告警 / 输出过载故障 / 负载 OCP / 电网 OCP」四个位或起来做边沿检测,变化时 set_info_status(INV_OVERLOAD_STATUS)。 |
handle_cloud_set_gfci | 全局 | 540 | 云端 GFCI 屏蔽位处理:功能位 ems_fun_3_u.bit.u8_gfci_en 不使能直接返回;从 NRS097_2_1 退出时自动打开 GFCI 检测并 save_job_post;屏蔽位变化时按取反调 inverter_set_gfci_detect_enable()。形参为 t_config_data.u8_gfci_shield_flag 的地址。 |
ground_fault_handle | static | 581 | 把 u_fault_code / u_fault_extend1_code 里的 GFCI/接地/绝缘位聚合成 u_ground_fault_code 位域,然后调 handle_cloud_set_gfci()。 |
mpptscan_handle | static | 599 | 配置使能 u8_inv_mpptscan_enable 且运行于 cNormalMode 时,每 30 分钟调一次 inverter_mpptscan_start()。 |
power_limit_handle | static | 629 | 澳洲防逆流软/硬限功率状态机(详见 §4.5)。 |
backupbox_detection_handle | static | 755 | 按 meter_get_meter_type_old(GRID_METER) 识别 5K/10K/23K 备电箱并写 t_run_info.u8_bb_enable/u8_bb_model;配置关闭 BB 时强制清 u8_bb_model(防呆)。 |
sys_shutdown_handle | static | 791 | 一键停机/按天租赁 + 断网时长累计 + 逆变器启停控制(详见 §4.6)。 |
grid_detection | static | 891 | 并/离网检测:运行模式在 cNormalMode↔cUPS 之间变化且已登录时 set_info_status(GRID_STATUS)。 |
sys_anti_theft_handle | static | 918 | 防盗:配置置位则持续下发停机(仅沃太机型生效);配置位变化时按新值调用 inverter_shutdown() / inverter_startup()。 |
sys_safety_special_deal_handle | static | 964 | 安规特殊强制:TOR_ERZEUGER 下强制打开有功/无功控制、P-F 降载、启动斜率,置 u8_tor_no_use_flag 并把 LVRT 设为 1840;VDE0126_GR 下强制电网等待/重连时间为 180。 |
inverter_generator_mode_handle | 全局 | 1007 | 油机模式:油机启动时关掉 P-V/P-F 降载,停机后恢复启动前保存的使能值。 |
task_inverter | 全局 | 1045 | uCOS-II 任务(USART/SCI 侧主循环,80ms 周期)。见 §4.1。 |
task_inverter_can | 全局 | 1199 | uCOS-II 任务(CAN 侧主循环,30ms 周期),含并机 CAN 通信与油机功率计算。 |
task_parallel_sci | 全局 | 1296 | uCOS-II 任务(并机 SCI 通信,100ms 周期),只调 parallel_sci_comm_handle()。 |
3.2 机型识别、机型名与显示类型(17 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
set_inverter_init | 全局 | 1316 | 只置 g_t_inv_info.u8_init_flag = TRUE,请求下一轮任务重跑 inverter_state_init()。 |
set_inverter_type | 全局 | 1328 | 写 t_config_data.u8_inv_model。 |
get_inverter_type | 全局 | 1340 | 读 t_config_data.u8_inv_model;若 >= INVERTER_MAX 则就地改回 INVERTER_NULL 再返回(读函数带副作用)。 |
set_inverter_sub | 全局 | 1357 | 写 t_config_data.u8_inv_model_sub。 |
get_inverter_sub | 全局 | 1369 | 读子机型;>= SUB_MAX 时就地改为 SUB_NULL 再返回。 |
inverter_read_system_modle | 全局 | 1386 | 返回对外「系统机型名」字符串:优先客户自定义名,否则按「厂商 + 子机型 + OEM 贴牌 + 板型」查表(覆盖科华/盛能杰/锦浪/沃太/固德威/汇川全部子型),兜底 TYPE_ALPHA_ESS。 |
inverter_read_inv_type | 全局 | 1656 | 返回厂商自己的机型名(TYPE_KELONG_S6、TYPE_SET_M5、TYPE_GINLONG_T10、TYPE_BYTE_WATT_T10、TYPE_GOODWE_AES9_6、TYPE_INOVANCE_T20…),兜底 TYPE_ALPHA_ESS。 |
inverter_read_display_type | 全局 | 1776 | 返回显示类型枚举:客户自定义优先;科华 LED 灯带;盛能杰 S5 字符 LCD、M5/M10 LED 面板;锦浪 T10 灯带、其余双色 LED;沃太按 OEM 与 s8_sn[6]、板型决定字符 LCD / RKP LCD / LED 面板;固德威统一字符 LCD;汇川按 s8_sn[6] 区分;兜底字符 LCD。 |
inv3_upgradeable_flag | 全局 | 1869 | 逆变器是否支持三代升级协议:锦浪、盛能杰 S5、固德威 SP7_6/SP9_6、汇川返回 TRUE,其余 FALSE。 |
passthrough_detection_flag | 全局 | 1909 | 是否支持透传检测:固德威 FALSE;沃太取决于板型是否 BOARD_EMS3_6_E/_4_E;其余按并机制式(PARA_COM_TYPE_UART4/_USART3 为 FALSE)。 |
bms_upgradeable_flag | 全局 | 1939 | BMS 是否可升级:PV Charger From E 机型直接 FALSE;锦浪按子型判电网频率(含 S5 额外看电表频率);其余统一 inverter_read_grid_freq() > 4500(>45Hz)。 |
g100_read_inv_type | 全局 | 1967 | 是否支持英国 G100:科华、盛能杰 S5/S5_II/M10、锦浪 T10、汇川全部,以及沃太 S5/S3_6/S10/B5/B10/T4~T15 子型返回 TRUE。 |
set_inverter_control_bat_disable_flag | 全局 | 2020 | 写 t_run_info.u8_control_bat_disable_flag。 |
get_inverter_control_bat_disable_flag | 全局 | 2032 | 只有锦浪 T10 返回真实标志,其余恒 TRUE(即「不支持电池禁止控制」)。 |
get_storage_grid_air_switch_specs_state | 全局 | 2051 | 返回 t_config_data.u8_switch_specs_state(储能并网空开规格状态)。 |
inverter_get_grid_breaker_specs_enable | 全局 | 2063 | 是否支持并网空开规格配置:盛能杰全部、沃太 S5/B5/S3_6/B3_6/S3/B3/S8/S10/B10 返回 TRUE。 |
set_inverter_backup_enable | 全局 | 2092 | 把 BACKUP_STATUS_E 写入 t_control_cmd.u8_ups_enable(备电 UPS 使能)。 |
3.3 机型策略常量(27 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_get_pv_start_volt | 全局 | 2104 | PV 启动电压:沃太 135、科华 150、盛能杰 M10 为 70 / 其余 150、汇川 200,兜底 250(单位 V)。 |
inverter_get_battery_awaken_pv_start_volt | 全局 | 2141 | 电池唤醒所需 PV 启动电压:沃太 135、汇川 220,兜底 250。 |
inverter_get_pv_connect_state | 全局 | 2162 | 沃太单相机型读 u16_pv_connect_state_single,三相机型读 u16_pv_connect_state,非 0 即有 PV;其余厂商恒 FALSE。 |
inverter_get_chg_from_grid_limit | 全局 | 2193 | 电网充电限值:沃太 90;汇川三相不平衡模式 90 / 否则 150;盛能杰 S5_II 30、M10 10;兜底 50。 |
inverter_get_offset_meter_power | 全局 | 2231 | 电表功率补偿偏置:沃太 50、锦浪 T10 30,其余 0。 |
inverter_get_offset_maxfeedin_power | 全局 | 2256 | 最大馈网功率补偿偏置:沃太 200、锦浪 T10 200,其余 0。 |
inverter_get_ac_machine_min_charg_power | 全局 | 2281 | 三相不平衡并网机最小充电功率:沃太 −10,兜底 −100。 |
inverter_get_control_accuracy | 全局 | 2299 | 控制精度,恒返回 18(不区分机型)。 |
get_inv_calculation_interval | 全局 | 2310 | AC 侧调节周期(ms):CSIP 澳洲爬坡使能时返回 0(禁用周期调节);科华 2000、盛能杰 S5/S5_II 1500 / M10 2800、锦浪 T10 2500 / 其余 2800、沃太(P1 采样且刷新时间 10 时 3000)三相机型 1200、固德威 3000、汇川 1500,兜底 1000。 |
get_inv_power_calculation_time | 全局 | 2385 | DC 侧调节周期(ms):科华 4000、盛能杰 S5 1200、锦浪 T10 4000 / 其余 5000、沃太 1200、固德威 4000、汇川 1500,兜底 1000;CSIP 爬坡时返回 0。 |
get_dispatch_calculation_time | 全局 | 2444 | 调度调节频率(ms):锦浪 2500、固德威 1000、汇川 1500,兜底 100。 |
get_generator_calculation_time | 全局 | 2471 | 油机调节频率(ms):锦浪 2500、固德威 1000,兜底 100。 |
get_inv_ac_power_fine_tuning_range | 全局 | 2494 | AC 侧细调幅值:科华 30、锦浪 T10 −100,兜底 50。 |
get_inv_dc_power_fine_tuning_range | 全局 | 2521 | DC 侧细调幅值:科华 0,兜底 10。 |
get_inv_feedin_power_fine_tuning_range | 全局 | 2540 | 馈网细调幅值:u8_fine_tuning_range_zero_flag 置位则 0;锦浪 T10 0 / 其余 20、盛能杰 0、沃太三相机型 0、汇川 20,兜底 60。 |
get_inv_disturbance_flag | 全局 | 2596 | 逆变扰动标记使能:锦浪 T10 TRUE、锦浪其余 FALSE,兜底 TRUE。 |
get_inv_ups_reserve_soc_enable_default | 全局 | 2620 | UPS 预留 SOC 功能默认值:贝瓦(OEM_BW)FALSE,其余 TRUE。 |
get_inv_regulator_speed | 全局 | 2635 | 调节速率档位:以电表总有功绝对值分档。科华/默认 5 档;盛能杰 S5(>300W 用 2 档,否则 3 档)、S5_II(>300→2、>150→3、否则 5)、M10(>300→1、>100→2、否则 4);锦浪恒 3 档(T10 在 >1000W 时 5 档);沃太三相机型 2 档 / 单相 3 档;固德威 <500W 5 档否则 3 档;汇川恒 2 档。 |
inverter_get_dc_disturbance_count | 全局 | 2748 | 直流扰动计数;盛能杰 M10 且计数 >0 时返回 1 << (count-1)(指数放大),其余原样返回 g_u8_dc_disturbance_count。 |
inverter_get_max_bat_volt | 全局 | 2772 | 电池电压上限(0.1V):科华 4000、锦浪 T10/S6 2880、沃太单相 4500 / 三相 7000、固德威 2880、汇川 6500,兜底 600。 |
inverter_get_min_bat_volt | 全局 | 2823 | 电池电压下限(0.1V):科华 1000、锦浪 T10/S6 1600、沃太 800、固德威 800、汇川 1600,兜底 420。 |
inverter_get_phase_number | 全局 | 2865 | 相数:锦浪 T10/S6、沃太三相机型、汇川返回 3,其余 1。 |
inverter_get_bat_shutdown_flag | 全局 | 2898 | 是否具备电池主动关断:仅沃太与固德威 TRUE。 |
inverter_get_over_power_flag | 全局 | 2912 | 输出过载:仅沃太返回 u_warning_code.bit.u8_output_overload_alarm,其余 FALSE。 |
inverter_get_bat_breaker_statuse | 全局 | 2927 | 返回 t_run_info.u8_inv_bat_breaker_statuse(电池空开状态)。 |
inverter_get_sys_ctrl_state | 全局 | 2939 | 是否由本机做系统控制:未开并机 TRUE;开并机且为主机(u8_parallel_mode == TRUE)TRUE;否则 FALSE。 |
inverter_get_parallel_mode | 全局 | 2957 | 未开并机返回 PARA_COM_TYPE_NONE;否则优先返回 parallel_read_config_machine_precept(),为 0 时回退 g_t_parallel_total_machine_network.u8_run_machine_precept。 |
3.4 运行数据读取(27 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_read_pv_volt | 全局 | 2976 | 按 PV 通道(1~4)返回 u16_pvN_volt(1V)。 |
inverter_read_pv_cur | 全局 | 2997 | 按 PV 通道返回 u16_pvN_cur(0.1A)。 |
inverter_read_pv_power | 全局 | 3018 | 按 PV 通道返回 u32_pvN_power(0.1W);PV_CHANAL_ALL 返回四路之和。 |
inverter_get_pv_start_status | 全局 | 3042 | 沃太走 inverter_get_pv_connect_state();其余判断任一 PV 电压 ≥ inverter_get_pv_start_volt()。 |
inverter_get_battery_awaken_pv_start_status | 全局 | 3060 | 同上,但阈值换成 inverter_get_battery_awaken_pv_start_volt()。 |
inverter_read_grid_volt | 全局 | 3078 | 电网三相电压(1V)。 |
inverter_read_grid_cur | 全局 | 3097 | 电网三相电流(0.1A);PHASE_ALL 返回三相之和。 |
inverter_read_grid_actpower | 全局 | 3118 | 电网三相有功(1W);PHASE_ALL 返回 s32_grid_actpower_t。 |
inverter_read_grid_freq | 全局 | 3139 | 电网频率(0.01Hz)。 |
inverter_read_inv_curr | 全局 | 3151 | 逆变侧三相电流。 |
inverter_read_inv_actpower | 全局 | 3169 | 逆变侧三相有功,PHASE_ALL 返回总功率。 |
inverter_read_inv_reactpower | 全局 | 3190 | 逆变侧三相无功,PHASE_ALL 返回总无功。 |
inverter_read_inv_apparentpower | 全局 | 3211 | 逆变侧三相视在功率,PHASE_ALL 返回总视在。 |
inverter_read_inv_freq | 全局 | 3232 | 逆变频率(0.01Hz)。 |
inverter_read_backup_volt | 全局 | 3244 | 备电侧三相电压。 |
inverter_read_backup_cur | 全局 | 3263 | 备电侧三相电流,PHASE_ALL 返回三相之和。 |
inverter_read_backup_actpower | 全局 | 3284 | 备电侧三相有功,PHASE_ALL 返回总功率。 |
inverter_read_backup_apparentpower | 全局 | 3305 | 沃太返回 s32_backup_apparentpower_t,其余厂商用 s32_backup_actpower_t 代替。 |
inverter_read_backup_freq | 全局 | 3326 | 备电频率(0.01Hz)。 |
inverter_read_bat_volt | 全局 | 3338 | 电池电压(1V)。 |
inverter_read_bat_curr | 全局 | 3350 | 电池电流(0.1A)。 |
inverter_read_bat_power | 全局 | 3362 | 电池功率(1W)。 |
inverter_read_machine_temp | 全局 | 3374 | 机内温度(s8,℃)。 |
inverter_read_run_mode | 全局 | 3386 | 逆变器运行模式(cWaitMode~cUpdateArm)。 |
inverter_read_bus_volt | 全局 | 3398 | 母线电压(1V)。 |
inverter_read_grid_rated_voltage | 全局 | 3409 | 逆变器上报的电网额定电压。 |
inverter_read_grid_rated_freqency | 全局 | 3420 | 逆变器上报的电网额定频率。 |
3.5 故障 / 告警 / 电量 / 额定 / 版本 / 升级读取(34 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_read_pf_value | 全局 | 3432 | 科华读设定值 s8_set_power_factor,其余读实测运行 PF。 |
inverter_read_fault_code | 全局 | 3456 | 返回 64bit 主故障位域;处于 cUPS 且电网频率 <45Hz 时把电网 OVP/OFP/UVP/UFP/相锁故障位屏蔽为 0。 |
inverter_read_fault_code_extend | 全局 | 3481 | 返回扩展故障位域 1(memcpy 到局部联合体后取 u64_all)。 |
inverter_read_fault_code_extend2 | 全局 | 3497 | 返回扩展故障位域 2。 |
inverter_read_fault_code_flag | 全局 | 3513 | 三组故障位域任一非 0 返回 1,否则 0。 |
inverter_read_warning_code | 全局 | 3530 | 返回 64bit 告警位域。 |
inverter_read_ground_fault_code | 全局 | 3542 | 返回 32bit 接地/绝缘故障位域。 |
inverter_read_insulation_fault_code | 全局 | 3554 | 绝缘故障位(布尔转 u8)。 |
inverter_read_grid_fault_flag | 全局 | 3566 | 电网电压/频率告警位或电网 OVP/UVP/OFP/UFP 故障位任一为真即返回 TRUE。 |
inverter_read_energy_pv_input | 全局 | 3580 | 电量:PV 输入。 |
inverter_read_energy_inv_output | 全局 | 3592 | 电量:逆变输出。 |
inverter_read_energy_inv_input | 全局 | 3604 | 电量:逆变输入。 |
inverter_read_energy_bat_charge | 全局 | 3616 | 电量:电池充电。 |
inverter_read_energy_bat_dischg | 全局 | 3628 | 电量:电池放电。 |
inverter_read_rated_dc_charge_power | 全局 | 3640 | 配置表里的 DC 充电额定功率。 |
inverter_read_rated_dc_discharge_power | 全局 | 3652 | 配置表里的 DC 放电额定功率。 |
inverter_read_grid_overload_factor | 全局 | 3664 | 并网过载可长期运行系数(%):沃太单相 220、T8/T10 150、T4/T5/T6 200、T12 165、T15 130、B10/S10 105、其余沃太 140;汇川 125;兜底 200(汇川值会被覆盖为 125)。 |
inverter_read_rated_ac_charge_power | 全局 | 3721 | 配置表里的 AC 充电额定功率。 |
inverter_read_rated_ac_discharge_power | 全局 | 3733 | 配置表里的 AC 放电额定功率。 |
inverter_read_sn | 全局 | 3744 | 返回逆变器 SN(返回前把末字节强制置 0 保证 C 串结尾)。 |
inverter_read_ver_master | 全局 | 3756 | 逆变器主机软件版本串(末字节置 0)。 |
inverter_read_ver_slave | 全局 | 3768 | 逆变器从机软件版本串(末字节置 0)。 |
inverter_read_ver_arm | 全局 | 3780 | 逆变器 ARM 软件版本串(末字节置 0)。 |
inverter_read_hw_ver | 全局 | 3791 | 配置表里的硬件版本串。 |
inverter_read_upgrade_flag_master | 全局 | 3802 | 主机升级标志,转发 6 家厂商的对应读函数;无匹配返回 FALSE。 |
inverter_read_upgrade_percent_master | 全局 | 3839 | 主机升级百分比,转发 6 家厂商;无匹配返回 0。 |
inverter_read_upgrade_flag_slave | 全局 | 3874 | 从机升级标志,转发 6 家厂商。 |
inverter_read_upgrade_percent_slave | 全局 | 3909 | 从机升级百分比,转发 6 家厂商。 |
inverter_read_upgrade_file_offset | 全局 | 3944 | 已传输文件长度:仅沃太转发 alphaess_read_upgrade_file_offset(),其余返回 0。 |
inverter_read_upgrade_file_offset_arm | 全局 | 3958 | 空实现,恒返回 0(注释写「获取逆变器ARM更新百分比」,与实现不符)。 |
inverter_read_upgrade_flag_arm | 全局 | 3968 | ARM/DCDC/外部/FPGA 升级标志:锦浪、盛能杰(get_dcdc_upgrade_flag)、固德威(_external)、汇川(_fpga);无匹配 FALSE。 |
inverter_read_upgrade_percent_arm | 全局 | 3995 | 上述四家的对应百分比读函数;无匹配返回 0。 |
inverter_read_comm_flag | 全局 | 4022 | 逆变器通信正常(u8_inverter_comm_lost_flag == FALSE)。 |
inverter_read_backup_flag | 全局 | 4033 | 备电 UPS 使能位 t_control_cmd.u8_ups_enable。 |
3.6 控制命令与一次性动作(14 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_set_isolation_limit_value | 全局 | 4044 | 写 t_run_info.u16_run_isolation_limit_value(值为 0 直接丢弃);锦浪置 u8_set_isolation_limit_value_flag,固德威置 u8_set_iso_limit_flag。 |
inverter_get_isolation_limit_value | 全局 | 4066 | 读回绝缘阻抗限值。 |
inverter_power_none | 全局 | 4077 | t_control_cmd.u8_start_stop = INV_POWER_NONE。 |
inverter_power_on | 全局 | 4089 | u8_start_stop = INV_POWER_ON。 |
inverter_power_off | 全局 | 4101 | u8_start_stop = INV_POWER_OFF。 |
inverter_get_start_stop_value | 全局 | 4113 | 读启停三态。 |
inverter_startup | 全局 | 4125 | t_run_info.u8_set_inv_on_off = INV_STARTUP。 |
inverter_shutdown | 全局 | 4137 | t_run_info.u8_set_inv_on_off = INV_SHUTDOWN。 |
inverter_get_shutdown_sta | 全局 | 4149 | 读开关机指令状态。 |
inverter_reset | 全局 | 4161 | t_control_cmd.u8_reset = TRUE(一次性复位)。 |
inverter_clearing_fault | 全局 | 4173 | t_control_parameter.u8_clearing_fault = TRUE(一次性清故障)。 |
inverter_reset_dsp_eeprom | 全局 | 4185 | t_control_cmd.u8_reset_dsp_eeprom = TRUE(一次性复位 DSP EEPROM)。 |
inverter_mpptscan_start | 全局 | 4197 | t_control_cmd.u8_mpptscan_start = TRUE。 |
inverter_energy_clear | 全局 | 4209 | 把五路电量(PV 输入、逆变输出/输入、电池充/放)清零并置 u8_clean_energy 通知厂商侧同步清零。 |
3.7 模式、安规码与开关类设置(18 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_set_three_unbalance_mode | 全局 | 4228 | 三相不平衡模式:单相机型或 value > 1 直接返回;值变化时写 t_config_data.u8_inv_three_unbalance_enable 并置锦浪 u8_set_three_unbalance_flag。 |
inverter_get_three_unbalance_mode | 全局 | 4247 | 读 u8_inv_three_unbalance_enable。 |
inverter_set_igfollow_mode | 全局 | 4259 | IGFollow 模式:value > 1 钳为 1;写 u8_inv_igfollow_enable;锦浪置 u8_set_special_setting_flag = IGFOLLOWE_FLAG。 |
inverter_get_igfollow_mode | 全局 | 4283 | 仅锦浪 T10 返回真实值,其余 FALSE。 |
inverter_read_safety | 全局 | 4304 | 读 t_config_data.u8_safety(安规码)。 |
inverter_read_safety_is_AS4777 | 全局 | 4315 | 入参安规码是否属于 AS4777_2 / AS4777_2_2024 / AS4777_2_SA / AS4777_NZ 四者之一。 |
inverter_write_safety | 全局 | 4336 | 写安规码:范围 < Safety_Max 且与现值不同才写,同时把子安规复位为 SAFESUB_DEFAULT 并 save_job_post(INVERTER_CONFIG_PAGE)。 |
inverter_read_safesub | 全局 | 4353 | 读子安规。 |
inverter_write_safesub | 全局 | 4365 | 写子安规:范围 < SAFESUB_MAX 且与现值不同才写(不落盘,与 inverter_write_safety 不一致)。 |
inverter_read_micro_grid_chg_soc | 全局 | 4380 | 读离网充电 SOC(u8_offgrid_chg_soc)。 |
inverter_set_micro_grid_chg_soc | 全局 | 4392 | 写离网充电 SOC(值变化才写)。 |
inverter_set_volt_watt_mode | 全局 | 4407 | 写 t_safty_info.safty_mode_u.BIT.volt_watt_mode;科华置 u8_ems_set_inv_safety_arg_flag1。 |
inverter_set_islanding_check_enable | 全局 | 4423 | 写 t_config_data.u8_islanding_check_enable,值变化才写并 save_job_post。 |
inverter_set_safty_mode | 全局 | 4438 | 安规无功模式设置:先把配置位域 &= 0x01(仅保留 bit0),按 value 1~4 分别置 fix_power_factor/power_pf_mode/fix_reactive_power_mode/volt_var_mode,再整体拷到 t_safty_info.safty_mode_u;科华与汇川额外把原始整数值写进 t_safty_info.safty_mode_u.u16_value 并置各自脏标志;锦浪/沃太/盛能杰分别置对应标志。 |
inverter_set_starting_slope_en | 全局 | 4499 | 写 t_safty_info.u8_starting_slope_en;沃太置 u8_ems_set_function_enable_flag,汇川置 u8_set_inv_safety_function_flag。 |
inverter_set_rev_machine_rate | 全局 | 4520 | 写 t_safty_info.u16_rev_machine_rate(逆变器恢复斜率);置科华/沃太/盛能杰/锦浪/汇川各自标志。 |
inverter_set_regulation_rate | 全局 | 4557 | 写 t_safty_info.u16_regulation_rate(并网功率斜率);置科华/盛能杰/汇川标志。 |
inverter_set_regulation_rate_enable | 全局 | 4581 | 写 t_safty_info.u8_rise_fall_gardient_en(升降斜率使能),不置任何脏标志。 |
3.8 常用标量参数(PF / 无功 / 斜率 / N-N / GFCI)(9 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_set_pf_value | 全局 | 4593 | 写 t_safty_info.s8_set_power_factor;科华置 arg_flag1,锦浪 T10 置两个标志,沃太置 quiescent_volt_reactpower_support_flag,汇川置 argument2_flag。 |
inverter_set_fix_reactpower_value | 全局 | 4630 | 写 s16_set_fix_reactive_power(固定无功);锦浪 T10 / 沃太 / 汇川置对应标志。 |
inverter_set_power_change_slope_limit | 全局 | 4659 | 功率变化斜率限值:< 1000 直接丢弃;写锦浪 t_control_cmd.u16_set_power_change_slope_limit_value。 |
inverter_set_grid_waiting_time | 全局 | 4674 | 写 u16_grid_waiting_time(电网等待时间);科华/锦浪/沃太/盛能杰/汇川全部置标志。 |
inverter_set_reconnect_delay_time | 全局 | 4706 | 写 u16_grid_reconnect_time(重连延时);盛能杰/沃太/锦浪/汇川置标志。 |
inverter_set_n_n_short | 全局 | 4734 | N-N 短接检测状态(0=NA/1=不检测/2=检测):与现值相同直接返回,否则写 t_config_data.u8_nn_short_detect_state 并 save_job_post;沃太/盛能杰置标志。 |
inverter_read_n_n_short | 全局 | 4758 | 从 t_run_info.u16_n_n_short_value 取 bit1 返回((v & 0x02) >> 1)。 |
inverter_set_n_pe_short_enable | 全局 | 4770 | 写 t_control_cmd.u8_n_pe_short_flag;盛能杰(任务表)/沃太/汇川置标志。 |
inverter_set_gfci_detect_enable | 全局 | 4794 | 写 t_safty_info.u8_gfci_detect_enable;沃太/汇川/盛能杰置标志。被 handle_cloud_set_gfci() 调用。 |
3.9 过欠压 / 过欠频保护定值与恢复值(33 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_set_ovp_down_load_start | 全局 | 4817 | 空函数体,无任何操作(保留的接口占位)。 |
inverter_set_ovp_down_load_end | 全局 | 4829 | 空函数体,无任何操作。 |
inverter_set_grid_ovp1_value | 全局 | 4840 | 二阶过压整定值;u8_tor_no_use_flag(奥地利列名失效)为真时直接返回;写 u16_ovp1_value,科华/锦浪/沃太置标志。 |
inverter_set_grid_ovp1_time | 全局 | 4868 | 二阶过压时间;同样受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ovp2_value | 全局 | 4895 | 一阶过压整定值(写 u16_ovp2_value);科华/锦浪/沃太/汇川置标志。 |
inverter_set_grid_ovp2_time | 全局 | 4923 | 一阶过压时间(u16_ovp2_time)。 |
inverter_set_grid_ovp3_value | 全局 | 4951 | 三阶过压整定值(u16_ovp3_value);受 u8_tor_no_use_flag 门控;科华/沃太/汇川置标志。 |
inverter_set_grid_ovp3_time | 全局 | 4977 | 三阶过压时间(u16_ovp3_time);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ovp10min_value | 全局 | 5003 | 10 分钟过压整定值(u16_ovp10min_value);科华/沃太/盛能杰/汇川置标志。 |
inverter_set_grid_ovp10min_time | 全局 | 5031 | 10 分钟过压时间(u16_ovp10min_time)。 |
inverter_set_grid_uvp1_value | 全局 | 5059 | 一阶欠压整定值(u16_uvp1_value);科华/锦浪/沃太/汇川置标志。 |
inverter_set_grid_uvp1_time | 全局 | 5087 | 一阶欠压时间(u16_uvp1_time)。 |
inverter_set_grid_uvp2_value | 全局 | 5115 | 二阶欠压整定值(u16_uvp2_value)。 |
inverter_set_grid_uvp2_time | 全局 | 5143 | 二阶欠压时间(u16_uvp2_time)。 |
inverter_set_grid_uvp3_value | 全局 | 5171 | 三阶欠压整定值(u16_uvp3_value);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_uvp3_time | 全局 | 5197 | 三阶欠压时间(u16_uvp3_time);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ofp1_value | 全局 | 5223 | 一阶过频整定值(u16_ofp1_value)。 |
inverter_set_grid_ofp1_time | 全局 | 5251 | 一阶过频时间(u16_ofp1_time)。 |
inverter_set_grid_ofp2_value | 全局 | 5279 | 二阶过频整定值(u16_ofp2_value);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ofp2_time | 全局 | 5305 | 二阶过频时间(u16_ofp2_time);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ofp3_value | 全局 | 5331 | 三阶过频整定值(u16_ofp3_value);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ofp3_time | 全局 | 5357 | 三阶过频时间(u16_ofp3_time);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ufp1_value | 全局 | 5383 | 一阶欠频整定值(u16_ufp1_value)。 |
inverter_set_grid_ufp1_time | 全局 | 5411 | 一阶欠频时间(u16_ufp1_time)。 |
inverter_set_grid_ufp2_value | 全局 | 5439 | 二阶欠频整定值(u16_ufp2_value);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ufp2_time | 全局 | 5465 | 二阶欠频时间(u16_ufp2_time);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ufp3_value | 全局 | 5491 | 三阶欠频整定值(u16_ufp3_value);受 u8_tor_no_use_flag 门控。 |
inverter_set_grid_ufp3_time | 全局 | 5517 | 三阶欠频时间(u16_ufp3_time);受 u8_tor_no_use_flag 门控。 |
inverter_set_ovp_restore | 全局 | 5543 | 过压恢复值(u16_ovp_restore);科华/锦浪/沃太/盛能杰(u8_ems_set_inv_volt_restore_value_flag)/汇川置标志。 |
inverter_set_uvp_restore | 全局 | 5575 | 欠压恢复值(u16_uvp_restore),标志同 ovp_restore。 |
inverter_set_ofp_restore | 全局 | 5607 | 过频恢复值(u16_ofp_restore)。 |
inverter_set_ufp_restore | 全局 | 5635 | 欠频恢复值(u16_ufp_restore)。 |
inverter_set_reactive_control_percent | 全局 | 5663 | 无功控制百分比(s8_set_reactive_power_control_percentage);仅科华置 arg_flag1。 |
3.10 P-V / Q-V / S-PF / P-PF / P-F 曲线与降载(60 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_set_p_v_mode_v1 | 全局 | 5679 | P-V 曲线点 1 电压;盛能杰额外把值钳位到 [800,1200] 并置 active_volt_cure_flag,科华置 arg_flag3。 |
inverter_set_p_v_mode_p1 | 全局 | 5702 | P-V 点 1 有功(u16_p_v_mode_p1);科华置 arg_flag3。 |
inverter_set_p_v_mode_v2 | 全局 | 5718 | P-V 点 2 电压;盛能杰同样钳位到 [800,1200]。 |
inverter_set_p_v_mode_p2 | 全局 | 5741 | P-V 点 2 有功。 |
inverter_set_p_v_mode_v3 | 全局 | 5757 | P-V 点 3 电压;澳规下先把值钳位到 [1020,1110];沃太时按「单相 或 澳规」映射到 s16_ov_p_v_mode_v1,否则映射到 s16_ov_p_v_mode_v3。 |
inverter_set_p_v_mode_p3 | 全局 | 5803 | P-V 点 3 有功。 |
inverter_set_p_v_mode_v4 | 全局 | 5823 | P-V 点 4 电压;沃太映射规则同 v3(映射到 s16_ov_p_v_mode_v2 / _v4)。 |
inverter_set_p_v_mode_p4 | 全局 | 5872 | P-V 点 4 有功。 |
inverter_set_p_v_mode_trigger_voltage | 全局 | 5892 | P-V 模式触发电压(u16_p_v_mode_trigger_voltage)。 |
inverter_set_p_v_mode_down_load_flag | 全局 | 5908 | P-V 降载使能(u8_p_v_mode_down_load_enable);科华/沃太/汇川置标志。 |
inverter_set_p_v_mode_response_time | 全局 | 5935 | P-V 响应时间(u16_p_v_mode_response_time)。 |
inverter_set_q_v_mode_v1 | 全局 | 5963 | Q-V 点 1 电压;澳规下钳位到 [1020,1110]。 |
inverter_set_q_v_mode_q1 | 全局 | 5998 | Q-V 点 1 无功;u8_tor_no_use_flag 为真时返回。 |
inverter_set_q_v_mode_v2 | 全局 | 6016 | Q-V 点 2 电压;澳规钳位。 |
inverter_set_q_v_mode_q2 | 全局 | 6051 | Q-V 点 2 无功。 |
inverter_set_q_v_mode_v3 | 全局 | 6067 | Q-V 点 3 电压;澳规钳位。 |
inverter_set_q_v_mode_q3 | 全局 | 6102 | Q-V 点 3 无功。 |
inverter_set_q_v_mode_v4 | 全局 | 6118 | Q-V 点 4 电压;澳规钳位。 |
inverter_set_q_v_mode_q4 | 全局 | 6153 | Q-V 点 4 无功;u8_tor_no_use_flag 为真时返回。 |
inverter_set_q_v_mode_pin | 全局 | 6171 | Q-V 曲线有功输入点(u16_q_v_mode_pin)。 |
inverter_set_q_v_mode_pout | 全局 | 6187 | Q-V 曲线有功输出点(u16_q_v_mode_pout)。 |
inverter_set_q_v_mode_k | 全局 | 6203 | Q-V 曲线斜率 k(s16_q_v_mode_k)。 |
inverter_set_q_v_mode_response_time | 全局 | 6219 | Q-V 响应时间。 |
inverter_set_s_pf_mode_p1 | 全局 | 6247 | S-PF(视在功率-PF)点 1 功率。 |
inverter_set_s_pf_mode_pf1 | 全局 | 6263 | S-PF 点 1 PF 值。 |
inverter_set_s_pf_mode_p2 | 全局 | 6279 | S-PF 点 2 功率。 |
inverter_set_s_pf_mode_pf2 | 全局 | 6295 | S-PF 点 2 PF 值。 |
inverter_set_s_pf_mode_p3 | 全局 | 6311 | S-PF 点 3 功率。 |
inverter_set_s_pf_mode_pf3 | 全局 | 6327 | S-PF 点 3 PF 值。 |
inverter_set_s_pf_mode_pin | 全局 | 6343 | S-PF 曲线输入有功点。 |
inverter_set_s_pf_mode_pout | 全局 | 6359 | S-PF 曲线输出有功点。 |
inverter_set_p_f_mode_down_load_flag | 全局 | 6376 | P-F 降载使能(u8_p_f_down_load_enable);盛能杰同时置 OFP/UFP 降载使能两个标志。 |
inverter_set_p_pf_mode_p1 | 全局 | 6408 | P-PF 点 1 功率。 |
inverter_set_p_pf_mode_pf1 | 全局 | 6428 | P-PF 点 1 PF 值。 |
inverter_set_p_pf_mode_p2 | 全局 | 6447 | P-PF 点 2 功率;沃太 + 奥地利列名(TOR_ERZEUGER)时改写 u16_p_pf_mode_p4,否则写 u16_p_pf_mode_p2。 |
inverter_set_p_pf_mode_pf2 | 全局 | 6481 | P-PF 点 2 PF 值。 |
inverter_set_p_pf_mode_p3 | 全局 | 6504 | P-PF 点 3 功率。 |
inverter_set_p_pf_mode_pf3 | 全局 | 6527 | P-PF 点 3 PF 值。 |
inverter_set_p_pf_mode_p4 | 全局 | 6550 | P-PF 点 4 功率。 |
inverter_set_p_pf_mode_pf4 | 全局 | 6573 | P-PF 点 4 PF 值。 |
inverter_set_p_pf_mode_pf5 | 全局 | 6596 | P-PF 点 5 PF 值。 |
inverter_set_p_f_mode | 全局 | 6616 | P-F 模式选择(u16_p_f_mode)。 |
inverter_set_p_f_trigger_over_freq_pm | 全局 | 6636 | 过频降载恢复斜率 Pm(u16_ofp_down_load_restore_pm_slope)。 |
inverter_set_p_f_trigger_under_freq_pn | 全局 | 6657 | 欠频降载恢复斜率 Pn(u16_ufp_down_load_restore_pn_slope)。 |
inverter_set_under_freq_mode | 全局 | 6673 | 欠频模式下 P-F 模式(写 u16_under_p_f_mode);沃太/汇川置标志。 |
inverter_set_ac_out_bat_power | 全局 | 6715 | AC 侧给电池充电功率(s16_set_ac_out_bat_power);沃太置 u8_ac_bat_out_flag。 |
inverter_set_p_f_over_freq_derating_rate | 全局 | 6750 | 过频降载速率(u16_p_f_over_freq_derating_rate)。 |
inverter_set_p_f_under_freq_derating_rate | 全局 | 6778 | 欠频降载速率(u16_p_f_under_freq_derating_rate)。 |
inverter_set_p_f_trigger_over_freq_delay | 全局 | 6802 | 过频触发延时。 |
inverter_set_p_f_trigger_under_freq_delay | 全局 | 6818 | 欠频触发延时。 |
inverter_set_p_f_exit_over_freq_delay | 全局 | 6834 | 过频退出延时。 |
inverter_set_p_f_exit_under_freq_delay | 全局 | 6850 | 欠频退出延时。 |
inverter_set_p_f_exit_over_freq_f1 | 全局 | 6866 | 过频退出频率 f1。 |
inverter_set_p_f_trigger_over_freq_f2 | 全局 | 6882 | 过频触发频率 f2。 |
inverter_set_p_f_cut_off_over_freq_f3 | 全局 | 6910 | 过频截止频率 f3。 |
inverter_set_p_f_exit_under_freq_f3 | 全局 | 6926 | 欠频退出频率 f3。 |
inverter_set_p_f_trigger_under_freq_f2 | 全局 | 6942 | 欠频触发频率 f2。 |
inverter_set_p_f_cut_off_under_freq_f1 | 全局 | 6962 | 欠频截止频率 f1。 |
inverter_set_ofp_down_load_zero_crossing_freq | 全局 | 6978 | 过频降载归零频率点。 |
inverter_set_ufp_down_load_zero_crossing_freq | 全局 | 6994 | 欠频降载归零频率点。 |
3.11 保护使能、门限与穿越(40 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_set_high_low_cross_enable | 全局 | 7010 | 高低电压穿越使能(u8_high_low_cross);科华/锦浪(额外置 FRT/穿越两个标志)/汇川置标志。 |
inverter_set_zero_current_mode_enable | 全局 | 7037 | 零电流模式(u8_zero_current_mode);锦浪/沃太置标志。 |
inverter_set_zero_current_voltage_value | 全局 | 7058 | 零电流模式电压(u16_zero_current_voltage);不置任何厂商脏标志。 |
inverter_set_low_cross_voltage_value | 全局 | 7071 | 低电压穿越(LVRT)电压(u16_lvrt_grid_volt);仅科华置标志。被 sys_safety_special_deal_handle() 用于 TOR_ERZEUGER 强制 1840。 |
inverter_set_high_cross_voltage_value | 全局 | 7088 | 高电压穿越(HVRT)电压(u16_hvrt_grid_volt);仅科华置标志。 |
inverter_set_actpower_control_enable | 全局 | 7104 | 有功控制使能:写 t_config_data.u8_actpowet_control_enable;沃太时同时把值写到 t_safty_info.u8_p_v_mode_down_load_enable;盛能杰/汇川置标志。 |
inverter_set_reactpower_control_enable | 全局 | 7132 | 无功控制使能:写 t_config_data.u8_reactpower_control_enable;沃太时同时写 t_safty_info.u8_reactpower_control_enable。 |
inverter_get_reactpower_control_mode | 全局 | 7160 | 按 t_safty_info.safty_mode_u 位域优先级返回无功模式枚举。 |
inverter_set_mppt_percentage | 全局 | 7195 | MPPT 百分比:u8_pv_switch == TRUE 时强制 0;与现值相同直接返回;写 t_run_info.u16_mppt_percentage 并置科华/沃太/汇川标志。 |
set_inverter_safty_test_flag | 全局 | 7230 | 置 t_control_cmd.u8_safety_test_enable = START_SELF_INSPECTION。 |
get_inverter_safty_test_info_send_server_flag | 全局 | 7242 | 读 t_safty_tset_info[0].u8_test_info_send_server_flag。 |
set_inverter_safty_test_info_send_server_flag | 全局 | 7254 | 写上述标志(第 0 相位)。 |
get_inverter_safty_test_info_send_app_flag | 全局 | 7266 | 读 t_safty_tset_info[0].u8_test_info_send_app_flag。 |
set_inverter_safty_test_info_send_app_flag | 全局 | 7278 | 写上述标志(第 0 相位)。 |
inverter_set_gfci_30mA_pro_threshold | 全局 | 7290 | GFCI 30mA 门限;沃太/汇川置标志。 |
inverter_set_gfci_60mA_pro_threshold | 全局 | 7310 | GFCI 60mA 门限;沃太/汇川置标志。 |
inverter_set_gfci_150mA_pro_threshold | 全局 | 7330 | GFCI 150mA 门限;沃太/汇川置标志。 |
inverter_set_gfci_300mA_pro_threshold | 全局 | 7350 | GFCI 300mA 门限;沃太/汇川置标志。 |
inverter_set_island_detect_enable | 全局 | 7371 | 孤岛检测;u8_tor_no_use_flag 为真时返回;写 t_run_info.u16_island_pro_value。 |
inverter_set_ln_reserve_pro_enable | 全局 | 7394 | L-N 反接保护;写 t_run_info.u16_ln_reserve_pro_value。 |
inverter_set_freq_change_pro_threshold | 全局 | 7415 | 频率变化率保护门限(u16_freq_change_pro_threshold)。 |
inverter_set_freq_change_pro_time | 全局 | 7436 | 频率变化率保护时间(u16_freq_change_pro_time)。 |
inverter_set_iso_pro_enable | 全局 | 7457 | 绝缘阻抗保护使能;写 t_run_info.u16_iso_pro_value。 |
inverter_set_iso_pro_threshold | 全局 | 7478 | 绝缘阻抗保护门限(u16_iso_pro_threshold)。 |
inverter_set_dci_pro_enable | 全局 | 7499 | 直流分量保护使能;写 t_run_info.u16_dci_pro_value。 |
inverter_set_dci_pro_threshold | 全局 | 7520 | 直流分量门限(u16_dci_pro_threshold)。 |
inverter_set_dci_pro_time | 全局 | 7541 | 直流分量保护时间(u16_dci_pro_time)。 |
inverter_set_afci_detect_enable | 全局 | 7562 | AFCI 检测使能;写 t_run_info.u16_afci_detection_value;沃太置标志。 |
inverter_set_pv_curr_monitor_enable | 全局 | 7578 | PV 电流监测;写 t_run_info.u16_pv_curr_monitor_value。 |
inverter_set_dcv_pro_enable | 全局 | 7594 | 直流电压保护;写 t_run_info.u16_dcv_pro_value。 |
inverter_set_wave_detection_enable | 全局 | 7615 | 波形检测;写 t_run_info.u16_wave_detection_value。 |
inverter_set_battery_activation_enable | 全局 | 7632 | 电池激活使能;写 t_run_info.u16_battery_activation_value。 |
inverter_set_fast_wave_detection_enable | 全局 | 7649 | 快速波形检测;写 t_run_info.u16_fast_wave_detection_value。 |
inverter_set_ups_volt_pro_enable | 全局 | 7666 | UPS 电压保护;写 t_run_info.u16_ups_volt_pro_value。 |
inverter_set_pe_short_enable | 全局 | 7687 | PE 短接使能;写 t_control_cmd.u8_n_pe_short_flag。 |
inverter_set_pe_loss_check_flag | 全局 | 7704 | PE 丢失检测标志;写 t_run_info.u8_pe_loss_check_flag。 |
inverter_set_bypass_flag | 全局 | 7721 | 旁路使能;写 t_run_info.u8_inv_bypass_enable;沃太/盛能杰置标志。被 sys_shutdown_handle() 用于沃太「带一键停机时改走旁路而非直接关机」。 |
inverter_set_phase_negation | 全局 | 7742 | 相序取反:与现值相同直接返回;写 t_config_data.u8_phase_negation_en。 |
inverter_set_operation_mode | 全局 | 7763 | 运行模式:与现值相同直接返回;写 t_run_info.u8_inv_operation_mode。 |
inverter_set_ofp_preference_mode | 全局 | 7783 | 过频优先模式(u8_ofp_preference);仅汇川置标志。 |
3.12 尾部杂项与查询(14 个)
| 函数名 | 作用域 | 定义行 | 说明 |
|---|---|---|---|
inverter_support_low_volt_bms_restart | 全局 | 7799 | 是否支持低压 BMS 重启:仅盛能杰 S5_II / M10 为 TRUE。 |
inverter_read_p_v_mode_v3 | 全局 | 7820 | P-V 点 3 电压回读:沃太时按「单相 或 澳规」返回 s16_ov_p_v_mode_v1,否则返回 s16_ov_p_v_mode_v3;其余厂商返回 u16_p_v_mode_v3。与 inverter_set_p_v_mode_v3() 的映射互为逆运算。 |
inverter_read_p_v_mode_v4 | 全局 | 7848 | P-V 点 4 电压回读,规则同上(映射到 s16_ov_p_v_mode_v2 / _v4)。 |
inverter_get_backup_freq | 全局 | 7876 | 备电频率原值。 |
inverter_get_backup_freq_basic | 全局 | 7888 | 备电频率归一化到基频:45~55Hz 归 5000,55~65Hz 归 6000,其余保持初值 5000。 |
get_dma_data_debug_flag | 全局 | 7914 | CT 判断/调试标志:科华、盛能杰全部、锦浪 S5 返回 TRUE;沃太三相机型返回 FALSE、其余沃太 TRUE;兜底 FALSE。 |
get_14a_enwg_bat_min_power | 全局 | 7959 | 14a EnWG 功率不足时电池最低充电功率:汇川返回 (bms_read_total_volt()/100)*21/10,其余 600。 |
inverter_set_afci_self_check_clear | 全局 | 7975 | 入参为 0 时清 t_afci_info.u8_afci_self_result_shut_down 并 ems_set_fault_bit(27, FALSE)。 |
inverter_get_special_control_inv_type | 全局 | 7985 | 仅盛能杰 S5_II 返回 SNJ_M5_SPECIAL_HANDLE,其余 NOT_SPECIAL_HANDLE。 |
get_inverter_type_category | 全局 | 8003 | 沃太单相/三相归类为 INVERTER_TYPE_BYTE_WATT_S / _T,其余 INVERTER_TYPE_NON_BYTE_WATT。 |
inverter_set_dc_double_charge_power | 全局 | 8032 | 逆变器两倍电池充电功率使能;写 t_config_data.u8_inv_dc_double_pcharge_en,沃太置 u8_ems_set_inv_dc_double_pcharge_flag。 |
inverter_set_italy_anti_backflow | 全局 | 8049 | 意大利防逆流使能;写 t_config_data.u8_italy_anti_backflow_en,沃太置标志。 |
get_risk_of_system_installation_plan | 全局 | 8066 | 是否有电池适配方案错误风险:仅盛能杰 M10 返回 TRUE。 |
inverter_set_dnsp_regulation_rate | 全局 | 8087 | 盛能杰专用:把 setsoftgradw 换算成百分比斜率((x*60*100)/AC放电额定功率)后同时写入并网调节斜率与恢复斜率。 |
4. 核心逻辑解析
4.1 三个 uCOS-II 任务与时序
| 任务 | 入口 | 创建位置 | 周期 | 事件标志 | |
|---|---|---|---|---|---|
task_inverter | inverter.c:1045 | user/main.c:189 | OSTimeDlyHMSM(0,0,0,80) ≈ 80ms(inverter.c:1188) | OSFlagPend(g_t_fast_dispatch_flag, PEND_LOGIC_CALCULATE_DONE, WAIT_SET_ALL, 20ms);收齐后 OSFlagPost(POST_INV_CALCULATE_DONE) 并 OSTimeDlyResume(TASK_INVERTER_CAN_PRIO) | |
task_inverter_can | inverter.c:1199 | user/main.c:244 | OSTimeDlyHMSM(0,0,0,30) ≈ 30ms(inverter.c:1285) | `OSFlagPend(..., PEND_INV_CALCULATE_DONE, WAIT_SET_ALL \ | OS_FLAG_CONSUME, 20ms)` |
task_parallel_sci | inverter.c:1296 | user/main.c:299 | OSTimeDlyHMSM(0,0,0,100) ≈ 100ms(inverter.c:1305) | 无 |
task_inverter 的每轮处理顺序(inverter.c:1052-1189):
- 等
PEND_LOGIC_CALCULATE_DONE(20ms 超时,允许空转); - 若
u8_init_flag为真则清标志并调inverter_state_init()—— 即厂商驱动初始化是在任务首轮或set_inverter_init()之后才执行; - (非
OEM_HHE)用故障位 16 上报「机型未识别 / 与编译期机型不一致」:条件为get_inverter_type() == INVERTER_NULL || INVERTER_TYPE == INVERTER_NULL || (get_inverter_type() != INVERTER_TYPE && INVERTER_TYPE != INVERTER_MAX)(inverter.c:1071)。注意此判断把「编译期机型为 NULL」直接判为异常; - 六家厂商分发轮询(详见 §4.2),盛能杰/锦浪/沃太还受
get_passthrough_flag()(透传测试时跳过)与u8_ate_mode_flag(ATE 模式跳过)门控; - 依次执行 13 个内部处理:
inverter_lost_handle→italian_self_test_handle→overload_recovery_handle→ground_fault_handle→mpptscan_handle→power_limit_handle→backupbox_detection_handle→sys_shutdown_handle→sys_anti_theft_handle→grid_detection→inverter_pvcharger_info_handle(PV Charger 模块)→overload_detection_handle→sys_safety_special_deal_handle→inverter_generator_mode_handle; - 若本轮等到事件标志,则置
POST_INV_CALCULATE_DONE并唤醒 CAN 任务,最后延时 80ms。
task_inverter_can 的每轮处理顺序(inverter.c:1205-1286):等 PEND_INV_CALCULATE_DONE → 各厂商 CAN 侧收发(沃太额外处理 u8_ate_reset_dsp_flag 调 ems_ate_reset_dsp())→ inverter_lost_handle_can() → parallel_can_comm_handle() → parallel_data_handle() → calculate_gc_chgpower()(油机充电功率)→ 延时 30ms。
4.2 机型识别与「编译期 + 运行期」双重开关
本文件所有厂商分支都是两段式:
#if ((INVERTER_TYPE == INVERTER_MAX) || (INVERTER_TYPE == GINLONG_TYPE))
if (get_inverter_type() == GINLONG_TYPE) { /* 锦浪 */ }
#endif
外层的 #if 决定该厂商代码是否参与编译(由 inverter.h:172 的 INVERTER_TYPE 决定,INVERTER_MAX(7) 表示全编译),内层 if 决定运行时是否走该分支。运行期机型来自 g_t_inv_info.t_config_data.u8_inv_model(Flash 持久化,可被云端/Modbus/按键改写),因此同一份固件可在多机型间切换(在 INVERTER_TYPE == INVERTER_MAX 时)。
inverter_read_system_modle()(inverter.c:1386-1647)与 inverter_read_inv_type()(inverter.c:1656-1767)是两套并行的字符串查表:前者是「系统/贴牌对外名」(含 ZOE_OEM_*、SUNPOWER_OEM_*、PEIMAR_OEM_*、DIGIEN_OEM_*、BYTE_WATT_OEM_*),后者是「厂商内生机型名」。两者都先看客户自定义覆盖(g_system_custom_info.u8_inv_flag),最后兜底 TYPE_ALPHA_ESS。
4.3 通信丢失降级
- SCI 侧(
inverter_lost_handleinverter.c:115-190):把u8_inverter_comm_lost_flag同步到故障位 3;用函数内 statics_u8_pcs_lost_flag做边沿检测,只在 0→1 跳变的那一轮执行清零动作:PV1~4 电压/电流/功率、电网三相电压/电流/有功/总功率/频率、逆变侧三相有功/总功率/频率、备电三相电压/电流/有功/总功率/频率、电池电压/电流/功率、机温、母线电压、运行 PF 全部置 0,u8_run_mode置cFaultMode。丢失期间不做周期性清零(避免打断厂商写值)。 - CAN 侧(
inverter_lost_handle_caninverter.c:199-221):丢失时置故障位 10,并每轮清 C 相电网电压/有功、总功率、电网频率、逆变总功率、逆变频率、电池功率,u8_run_mode置cFaultMode;恢复时清故障位 10 并直接return(不清零,等厂商驱动回填)。
4.4 意大利 CEI021 安规自检(italian_self_test_handle + get_self_test_data)
italian_self_test_handle()(inverter.c:326-469)的触发条件是 t_safty_info.u8_safety == CEI021。
- 锦浪 T10 分支(
inverter.c:335-360):用两层 static 标志s_u8_safty_test_flag、s_u8_safty_test_flag2+ 计数器s_u8_cnt:- 当
g_t_ginlong_info.t_ginlong_rundata.u8_inv_system_status == 3(并网运行)且第一个标志为假时,置u8_set_italy_complete_inspection_enable = TRUE并锁定第一个标志; - 当
u8_cei_test_full_enable_value != 2(自检未完成)且第二个标志仍为假时,s_u8_cnt++,连续 3 轮(约 240ms)满足后置第二个标志,并同时置「送服务器」「送 APP」两个上报标志。
- 当
- 其它机型分支(
inverter.c:361-391):inverter_read_run_mode() == cNormalMode时s_u8_cnt++,沃太额外置u8_ems_get_self_data_flag和u8_ems_get_cei_self_checking_data_flag请求取数据;计数 >3 时锁定标志、清计数、置「送服务器」标志(沃太另置「送 APP」标志)。 get_self_test_data()(inverter.c:234-317)由上述流程每一轮都调用:把 OVP(2645/200ms)、OVP10(2530/3)、UVP(1955/1500ms)、UVP2(345/200ms)、OFP(5020/100ms)、OFP2(5150/100ms)、UFP(4980/100ms)、UFP2(4750/100ms) 的标准值与时间写进t_safty_tset_info[0],再给[0..2]三相写入固定的「实际值/实际时间」(OVP 2644/199、OVP10 2529/3、UVP 1956/1490、UVP2 347/198、OFP 5019/99、OFP2 5149/95、UFP 4982/100、UFP2 4751/100),最后把[0].u_test_res.u16_all清 0,并按机型转发senergys5/alphaess/ginlong_get_self_test_data()。inverter.c:394-468是一整段被注释掉的旧版自检状态机(三态NOT_SELF_INSPECTION/IN_SELF_INSPECTION/SELF_INSPECTION_COMPLETE,依赖 BMS 就绪与 SOC),保留但不再生效。
4.5 澳洲防逆流软/硬限功率状态机(power_limit_handle)
inverter.c:629-746。前置条件:inverter_read_grid_freq() > 4500(>45Hz)且(软限或硬限使能)。
- 输入:
l_s32_feedin_power = -meter_read_actpower(GRID_METER, PHASE_T)(负号把「买电为正」翻成「馈网为正」);上限阈值logic_read_max_feedin_power()+100,下限阈值logic_read_max_feedin_power()-100,且下限不低于 60。 - 迟滞 + 去抖:
l_s32_feedin_power > high且距上次 tick 超过 4000ms → 置s_u8_feedin_overrun_flag;超限后l_s32_feedin_power <= low且持续 5000ms → 解除超限标志。 - 软限功率(
u8_inv_software_limit_enable):超限或电网表通信中断时,距s_u32_software_limit_tick超过 8000ms 则置t_control_parameter.u8_set_inv_softstart = TRUE(请求厂商驱动做软启动/降功率),否则清 FALSE。 - 硬限功率(
u8_inv_hardware_limit_enable):超限或电网表中断时,把t_run_info.u8_inv_softstop_flag置 TRUE(软停机),并做边沿保护避免重复置位。 - 条件不满足时统一清
u8_set_inv_softstart、u8_inv_softstop_flag并刷新两个 tick。
4.6 一键停机 / 按天租赁与启停控制(sys_shutdown_handle)
inverter.c:791-882,两个相互独立的子逻辑:
(1)断网时长累计(u8_sys_shutdown_flag == SYS_SHUTDOWN_STOP_DAYS 时):g_stEMSInfo.bIsLogin == FALSE(断网)时启动 s_u32_logout_sys_shutdown_time 计时;每满 1 小时 u16_sys_logout_hours++ 并 save_job_post(INVERTER_CONFIG_PAGE);累计达到 u16_sys_shutdown_days * 24 时钳位到上限并 set_info_status(LEASE_STATUS)。重新上线或非按天租赁时清 s_u8_logout_flag。首次进入断网时若「已累计小时/24 < 停机天数」则先把累计值清零(视为新的租赁周期)。
(2)逆变器启停判定:l_u8_inv_on_off_flag 由 7 个条件的「或」组成——g_t_logic_info.u8_drm_mode == 0(DRM 允许关断)、并机主机 u8_drm_mode == 0、英国 G100 STATE4_LOCK、u8_inv_softstop_flag(软限功率触发)、u8_sys_shutdown_flag == SYS_SHUTDOWN_START、按天租赁累计超期、t_afci_info.u8_afci_self_result_shut_down(AFCI 自检要求停机)。
- 需要停机且当前已开机(
u8_start_stop == 2):沃太 + 一键停机非 0 时改走inverter_set_bypass_flag(TRUE)(旁路而非直接关机),其余调inverter_power_off()。 - 允许开机且(
u8_start_stop == 1或处于旁路):先inverter_set_bypass_flag(FALSE)再inverter_power_on()。
4.7 其它周期性处理
| 处理 | 逻辑 |
|---|---|
过载自恢复 overload_recovery_handle(478) | u_fault_code.bit.u8_output_overload 持续超过 1 小时 → 记录当前 OSTimeGet() 并(非沃太机型)调 inverter_reset();含 OSTimeGet() 回绕保护(OSTimeGet() < s_u32_opp_time 时重置基准)。 |
过载状态上报 overload_detection_handle(513) | 四路过载位(告警输出过载 / 故障输出过载 / 扩展故障 2 的负载 OCP / 电网 OCP)取或,边沿变化时 set_info_status(INV_OVERLOAD_STATUS)。 |
GFCI ground_fault_handle(581) + handle_cloud_set_gfci(540) | 先把主/扩展故障位的 GFCI、接地电流、绝缘位聚合成 u_ground_fault_code 32bit 位域;再做云侧屏蔽位同步:功能位未使能直接返回;从 NRS097_2_1 退出时自动打开 GFCI 检测并 save_job_post;仍在 NRS097_2_1 时若屏蔽位变化则按取反值调 inverter_set_gfci_detect_enable()。 |
MPPT 扫描 mpptscan_handle(599) | 配置使能 + cNormalMode 时每 30 分钟调 inverter_mpptscan_start()。 |
备电箱识别 backupbox_detection_handle(755) | 配置 u8_bb_enable == FALSE 时强制 u8_bb_model = 0(防呆);否则按 meter_get_meter_type_old(GRID_METER) 把 5K/10K/23K 映射为 u8_bb_enable=TRUE + u8_bb_model=1/2/3,未识别则回落到配置值。 |
并离网检测 grid_detection(891) | static s_u8_premode(初值 cUPS);模式在 cNormalMode ↔ cUPS 间变化且已登录时 set_info_status(GRID_STATUS)。 |
防盗 sys_anti_theft_handle(918) | 配置 u8_sys_anti_theft_flag != FALSE 时持续下 inverter_shutdown()(仅沃太);配置为假时按边沿在新值与旧值间切换 inverter_startup() / inverter_shutdown()。 |
安规特殊 sys_safety_special_deal_handle(964) | TOR_ERZEUGER:把 u8_tor_no_use_flag 设为「沃太或汇川」,若有功控制/无功控制/P-F 降载/启动斜率任一未开则全部强制打开,且 LVRT 电压强制为 1840。VDE0126_GR:电网等待时间与重连延时强制为 180。 |
油机模式 inverter_generator_mode_handle(1007) | 油机启动(get_generator_start_flag() 0→1)时关闭 P-V/P-F 降载;停机后恢复启动前保存的使能值(两个 static 每轮在油机停止时刷新)。 |
4.8 安规参数下发「三件套」模式
除少数例外,本文件所有 inverter_set_*() 都遵循同一模板(以 inverter_set_grid_ovp1_value() inverter.c:4840-4866 为例):
void inverter_set_grid_ovp1_value(u16 value)
{
if (g_t_inv_info.t_safty_info.u8_tor_no_use_flag == TRUE) return; // 可选:安规屏蔽门控
g_t_inv_info.t_safty_info.u16_ovp1_value = value; // ① 落到安规总表
#if ((INVERTER_TYPE == INVERTER_MAX) || (INVERTER_TYPE == KELONG_TYPE))
if (get_inverter_type() == KELONG_TYPE)
g_t_kelong_comm_info.u8_ems_set_inv_grid_protect_arg_flag3 = TRUE; // ② 置该厂商的「待下发」脏标志
#endif
#if ((INVERTER_TYPE == INVERTER_MAX) || (INVERTER_TYPE == GINLONG_TYPE))
if (get_inverter_type() == GINLONG_TYPE)
g_t_ginlong_info.t_ginlong_comm_info.u8_set_ovp_value_flag = TRUE;
#endif
#if ((INVERTER_TYPE == INVERTER_MAX) || (INVERTER_TYPE == ALPHAESS_TYPE))
if (get_inverter_type() == ALPHAESS_TYPE)
g_t_alphaess_comm_info.u8_ems_set_inv_safety_arg_flag4 = TRUE;
#endif
}
关键点:
- 参数值本身不做单位换算、不做范围校验(唯一例外见下),调用者(
logic/、hmi/、net/)负责保证量纲与合法性; - 脏标志由各厂商模块在自己的通信任务里清零并组帧下发,本文件不跟踪「已下发」;
- 每家厂商的标志名各不相同(科华用
u8_ems_set_inv_*,锦浪用t_ginlong_comm_info.u8_set_*,沃太用u8_ems_set_*,汇川统一用u64_sci_flag.bit.*,盛能杰用s_senergys5_set_info.bit.*),新增厂商需逐函数补齐 5~6 个分支,极易漏项; - 少数带门的例外:
u8_tor_no_use_flag == TRUE时全部 OVP/UVP/OFP/UFP 定值与孤岛检测直接丢弃(inverter.c:4843、4870、4953、4979、5173、5199、5281、5307、5333、5359、5441、5467、5493、5519、6000、6155、7373)——该标志由sys_safety_special_deal_handle()对奥地利列名场景置位; - 少数带钳位的例外:盛能杰 P-V 点 1/2 电压钳位到 [800,1200](
inverter.c:5689、5728);澳规下 Q-V 与 P-V 点 3/4 电压钳位到 [1020,1110](inverter.c:5760、5826、5966、6019、6070、6121);inverter_set_power_change_slope_limit()丢弃< 1000的入参(inverter.c:4661); - 少数带落盘的例外:
inverter_write_safety(4342)、inverter_set_islanding_check_enable(4428)、inverter_set_n_n_short(4740)、handle_cloud_set_gfci(559)、sys_shutdown_handle(817/830)会save_job_post(INVERTER_CONFIG_PAGE);而inverter_write_safesub(4365)不落盘。
4.9 P-V / Q-V 曲线点与沃太 3/4 点 ↔ 1/2 点映射
沃太在「单相机型」或「澳规(AS4777 系列)」下只暴露 2 个曲线点,需要把上层的第 3、4 点重映射到 t_safty_info 里的 s16_ov_p_v_mode_v1/v2;三相机型则在非澳规下使用 s16_ov_p_v_mode_v3/v4:
- 写侧
inverter_set_p_v_mode_v3()(inverter.c:5771-5784):if (单相 || AS4777) → s16_ov_p_v_mode_v1 = 值; else → s16_ov_p_v_mode_v3 = 值; - 写侧
inverter_set_p_v_mode_v4()(inverter.c:5838-5851):同理映射到s16_ov_p_v_mode_v2/s16_ov_p_v_mode_v4。 - 读侧
inverter_read_p_v_mode_v3/v4()(inverter.c:7820、7848)做逆映射,保证「读回与写入一致」。 - 另一处特殊映射:
inverter_set_p_pf_mode_p2()(inverter.c:6447-6453)在「沃太 +TOR_ERZEUGER」时把值写到u16_p_pf_mode_p4,否则写u16_p_pf_mode_p2。
4.10 全局变量读写清单(按访问目的)
| 变量/字段 | 读 | 写 | 说明 |
|---|---|---|---|
g_t_inv_info.t_config_data | 大量(机型、安规、并机、BB、限功率使能、u8_gfci_shield_flag 地址) | set_inverter_type/sub、inverter_write_safety/safesub、inverter_set_* 系列 | 持久化配置,部分写操作带 save_job_post(INVERTER_CONFIG_PAGE)。 |
g_t_inv_info.t_run_info | 全部 inverter_read_*、inverter_lost_handle*、grid_detection、power_limit_handle、inverter_read_fault_code | inverter_lost_handle*(清零)、inverter_startup/shutdown、inverter_set_bypass_flag、inverter_set_pe_loss_check_flag、各保护使能位 | 厂商驱动写主体,本文件负责清零、命令位与部分使能位。 |
g_t_inv_info.t_safty_info | sys_safety_special_deal_handle、inverter_get_reactpower_control_mode、inverter_read_pf_value、曲线钳位读改 | 约 190 个 inverter_set_*() | 安规参数总表,本文件是主要写方。 |
g_t_inv_info.t_safty_tset_info[0..2] | get_/set_inverter_safty_test_info_send_*_flag | get_self_test_data(标准值/实际值/清结果位) | 安规自检数据。 |
g_t_inv_info.t_control_cmd | inverter_get_start_stop_value、inverter_read_backup_flag | inverter_power_none/on/off、inverter_reset、inverter_reset_dsp_eeprom、inverter_mpptscan_start、inverter_energy_clear、inverter_set_n_pe_short_enable、inverter_set_pe_short_enable、set_inverter_safty_test_flag | 控制命令与一次性标志。 |
g_t_inv_info.t_control_parameter | task_inverter/task_inverter_can(ATE 模式、ATE 复位 DSP 门控) | power_limit_handle(u8_set_inv_softstart)、inverter_clearing_fault | 控制参数/一次性动作。 |
g_t_inv_info.t_afci_info | sys_shutdown_handle(u8_afci_self_result_shut_down 参与停机判定) | inverter_set_afci_self_check_clear | AFCI 停机与清除。 |
各厂商 g_t_*_comm_info / s_senergys5_set_info | 极少(italian_self_test_handle 读锦浪侧) | 大量置脏标志(见 §2.2 计数) | 跨模块「待下发」通道。 |
g_t_fast_dispatch_flag | 三个任务 OSFlagPend | task_inverter OSFlagPost | uCOS-II 事件同步。 |
5. 对外接口
5.1 本文件导出的接口
本文件共 313 个函数中 299 个为全局可见(14 个函数为 static,不导出)。全局函数按用途分为 11 类,均由 midware/inverter/inverter.h 声明:
| 类别 | 代表函数 | 主要调用方 |
|---|---|---|
| 任务入口 | task_inverter、task_inverter_can、task_parallel_sci | user/main.c(OSTaskCreateExt,main.c:189/244/299) |
| 生命周期 | inverter_state_init、set_inverter_init | task_inverter(inverter.c:1066) |
| 机型识别 | get_inverter_type、get_inverter_sub、set_inverter_type、set_inverter_sub、inverter_read_system_modle、inverter_read_inv_type、inverter_read_display_type、get_inverter_type_category | logic/、hmi/(含 hmi/ui/ 7 个文件)、net/、midware/interface/modbus、midware/interface/dry_node、midware/interface/drm、data/system_config |
| 运行数据读取 | inverter_read_pv_*、inverter_read_grid_*、inverter_read_inv_*、inverter_read_backup_*、inverter_read_bat_*、inverter_read_run_mode、inverter_read_fault_code*、inverter_read_warning_code、inverter_read_energy_* | logic/(ac_control/dc_control)、hmi/+hmi/ui/、net/、midware/inverter/<vendor>、midware/meter、midware/interface/modbus、midware/bms、midware/afci、midware/auxiliary、system/board_init |
| 机型策略常量 | get_inv_calculation_interval、get_inv_power_calculation_time、get_dispatch_calculation_time、get_inv_regulator_speed、get_inv_*_fine_tuning_range、inverter_get_max/min_bat_volt、inverter_get_phase_number、inverter_read_grid_overload_factor | logic/(调度主循环定时与细调)、net/ |
| 控制命令 | inverter_power_on/off/none、inverter_startup/shutdown、inverter_reset、inverter_clearing_fault、inverter_mpptscan_start、inverter_energy_clear、inverter_set_bypass_flag | logic/、net/、hmi/、midware/interface/dry_node、midware/interface/drm、本文件内部(sys_shutdown_handle、sys_anti_theft_handle、overload_recovery_handle、mpptscan_handle) |
| 安规参数下发 | 约 190 个 inverter_set_* | logic/(ac_control/dc_control 写安规点)、net/(云端下发)、midware/interface/modbus(本地 Modbus 下发)、midware/interface/drm、midware/afci、本文件内部(sys_safety_special_deal_handle、inverter_generator_mode_handle、handle_cloud_set_gfci、inverter_set_dnsp_regulation_rate) |
| 安规码读写 | inverter_read_safety、inverter_read_safety_is_AS4777、inverter_write_safety、inverter_read_safesub、inverter_write_safesub | net/(云端改安规)、hmi/、本文件内部(handle_cloud_set_gfci、inverter_set_p_v_mode_v3/v4、inverter_read_p_v_mode_v3/v4、inverter_set_p_pf_mode_p2) |
| 升级状态 | inverter_read_upgrade_flag_master/slave/arm、inverter_read_upgrade_percent_*、inverter_read_upgrade_file_offset*、inv3_upgradeable_flag、bms_upgradeable_flag | net/(云端升级流程、进度上报) |
| 特征能力查询 | passthrough_detection_flag、g100_read_inv_type、inverter_get_grid_breaker_specs_enable、inverter_get_sys_ctrl_state、inverter_get_parallel_mode、inverter_get_bat_shutdown_flag、inverter_support_low_volt_bms_restart、get_dma_data_debug_flag、get_risk_of_system_installation_plan、inverter_get_special_control_inv_type、inverter_get_backup_freq_basic、get_14a_enwg_bat_min_power | logic/、net/、midware/ 各子系统按能力门控 |
| 自检上报标志 | set_inverter_safty_test_flag、get/set_inverter_safty_test_info_send_server_flag、get/set_inverter_safty_test_info_send_app_flag | net/(把自检数据同步云端/APP)、本文件内部(italian_self_test_handle) |
| GFCI 云设置 | handle_cloud_set_gfci | 本文件内部 ground_fault_handle(inverter.c:589);函数对外可见,可被云侧直接复用 |
5.2 本文件导出的全局变量
只有 1 个:INVERTER_TABLE_T g_t_inv_info(inverter.c:39)。它被全工程 40+ 个 .c 文件直接读写,涉及目录:
data/fault_warn_log、data/system_config、data/resume_data/flash、logic、hmi、hmi/ui、net、midware/afci、midware/auxiliary、midware/bms、midware/bms/alpha、midware/debug、midware/interface、midware/interface/dry_node、midware/interface/modbus、midware/interface/drm、midware/meter、midware/ethernt/wireless、midware/inverter(本文件)、midware/inverter/{alphaess,ginlong,goodwe,inovance,kelong,set}、midware/inverter/parallel_comm、system/board_init。
5.3 本文件调用的外部函数(主要)
| 被调函数 | 归属 | 用途 |
|---|---|---|
kelong_inverter_comm、kelong_inverter_data_check、kelong_comm_init、kelong_read_upgrade_* | kelong/ | 科华收发与升级状态 |
senergys5_inverter_comm、senergy_model_recognition、senergy_comm_init*、senergys5_get_*、set_inverter_can_data_check、set_inverter_comm_can、set_inverter_comm_ate_can_test | set/ | 盛能杰收发、机型识别、升级状态 |
ginlong_inverter_comm、ginlong_inverter_comm_can、ginlong_inverter_data_check、ginlong_comm_init*、ginlong_get_self_test_data、ginlong_read_upgrade_* | ginlong/ | 锦浪收发、自检数据、升级状态 |
alphaess_inverter_comm_usart、alphaess_inverter_comm_can、alphaess_inverter_data_check、alphaess_inverter_can_data_check、alphaess_comm_init*、alphaess_get_self_test_data、alphaess_read_upgrade_*、ems_ate_reset_dsp | alphaess/、ate | 沃太收发、自检数据、ATE 复位 DSP |
goodwe_inverter_comm、goodwe_inverter_data_check、goodwe_comm_init、goodwe_read_upgrade_* | goodwe/ | 固德威收发与升级 |
inovance_inverter_comm、inovance_inverter_comm_can、inovance_inverter_data_check(_can)、inovance_comm_init*、inovance_read_upgrade_* | inovance/ | 汇川收发与升级 |
parallel_can_comm_handle、parallel_sci_comm_handle、parallel_data_handle、parallel_read_config_machine_precept | inverter/parallel_comm | 并机通信与数据处理 |
meter_read_actpower、meter_read_connect_status、meter_get_meter_type_old、meter_get_meter_or_ct、meter_read_P1_refresh_time、meter_read_frequent | meter/ | 电表数据与型号 |
ems_set_fault_bit、set_info_status、save_job_post | ems/、data/ | 故障位上/下、状态上报、Flash 落盘 |
logic_read_max_feedin_power | logic/ | 防逆流功率上限阈值 |
sys_limited_by_csip_judge、csip_aus_get_ramp_enable | csip_aus | 澳洲 CSIP 爬坡模式 |
bms_get_ready_enable(旧自检代码注释中)、bms_read_total_volt | bms/ | 14a EnWG 功率换算 |
get_generator_start_flag、calculate_gc_chgpower | generator | 油机状态与功率 |
get_passthrough_flag、get_board_type、pvcharger_read_machine_mode、inverter_pvcharger_info_handle | 各模块 | 透传/板型/PV Charger 门控 |
OSFlagPend、OSFlagPost、OSTimeDlyHMSM、OSTimeDlyResume、OSTimeGet | UCOSII/ | 任务同步与计时 |
6. 依赖关系
包含的头文件(inverter.c:16-37):
| 头文件 | 用途 |
|---|---|
inverter.h | 本模块唯一定义头:INVERTER_TABLE_T 及全部子类型、GRID_REGULATION_E、INVERTER_SUB_E、厂商类型码、控制命令码。 |
data.h | g_t_system_base_info / g_system_custom_info / g_system_function_info 等系统配置与 save_job_post。 |
system_config.h | 板型/系统参数。 |
alphaess_comm_usart.h、alphaess_comm_can.h | 沃太 USART/CAN 驱动接口与 g_t_alphaess_comm_info。 |
ginlong_comm_usart.h、ginlong_comm_can.h | 锦浪接口与 g_t_ginlong_info。 |
kelong_comm.h | 科华接口与 g_t_kelong_comm_info。 |
goodwe_comm.h | 固德威接口与 g_t_goodwe_comm_info。 |
set_comm_can.h、set_comm_usart_s5.h | 盛能杰 CAN/USART 接口;s_senergys5_set_info(:819)、s_senergys5_task_tab(:814)两处 extern 亦来自后者。 |
inovance_comm_usart.h、inovance_comm_can.h | 汇川接口与 g_t_inovance_comm_info。 |
ate.h | g_t_ate_ctrol、ems_ate_reset_dsp。 |
board_init.h | get_board_type、BOARD_* 板型宏。 |
meter.h | meter_* 系列与 GRID_METER。 |
logic.h | g_t_logic_info、logic_read_max_feedin_power、get_inv_* 周期函数的声明归属。 |
key.h | 按键模块(本文件未见直接调用,属遗留包含)。 |
ems.h | ems_set_fault_bit、set_info_status、g_stEMSInfo。 |
generator.h | get_generator_start_flag、calculate_gc_chgpower。 |
bms.h | bms_read_total_volt 等。 |
modbus.h | 本地 Modbus 寄存器映射(本文件未直接调用,供同层其它函数使用)。 |
csip_aus.h | sys_limited_by_csip_judge、csip_aus_get_ramp_enable。 |
被依赖方向:
user/main.c ──创建──> task_inverter / task_inverter_can / task_parallel_sci
│
├─> midware/inverter/{kelong,set,ginlong,alphaess,goodwe,inovance}/*_comm*.c
│ (轮询收发 + 机型识别 + 升级状态,写 t_run_info)
├─> midware/inverter/parallel_comm/* (并机)
├─> midware/meter/* (电网表 / 备电箱识别)
├─> midware/afci、generator、bms、csip_aus、ate
└─> data/(save_job_post)、ems/(故障位)
logic/* ──读运行数据/机型策略常量──> inverter.c ──写 t_safty_info/t_control_*──> 厂商驱动下发
net/*、hmi/*、hmi/ui/*、midware/interface/{modbus,dry_node,drm}/* ──读/写──> inverter.c
7. 备注与风险点
7.1 编译期宏与本快照的构建配置(重要)
- 本文件所有厂商分支都包在
#if ((INVERTER_TYPE == INVERTER_MAX) || (INVERTER_TYPE == XXX_TYPE))里。本快照inverter.h:172定义为#define INVERTER_TYPE (INVERTER_NULL)即 0;user/EMS_3_0.uvprojx的<Define>只有USE_STDPERIPH_DRIVER, GD32F407,全工程再无第二处定义(grep -rnE "define[ \t]+INVERTER_TYPE"仅命中该行)。因此按本快照默认配置:所有厂商#if分支均不参与编译,task_inverter不会调用任何厂商收发函数,纯靠#if提供分支的函数(如inverter_get_pv_start_volt()2104、inverter_get_max_bat_volt()2772、inverter_read_system_modle()1386)会直接落到兜底return。分析任一厂商行为时必须以「INVERTER_TYPE被改为对应机型码或INVERTER_MAX(7)」为前提。若要一份固件支持全部厂商,应把该行改为INVERTER_MAX。 - 同理,
inverter.h:175-182的INV_DC_CTRL/INV_AC_CTRL在INVERTER_NULL下两个都没有被定义,任何#ifdef INV_DC_CTRL/INV_AC_CTRL的地方都会走空分支。
7.2 读函数带副作用
get_inverter_type()(1340-1348)与get_inverter_sub()(1369-1377)在返回值越界时直接改写g_t_inv_info.t_config_data。它们被全工程高频调用(含中断/其他任务上下文),属于「读取即写 Flash 影子数据」的设计,若此时恰好有其它任务在组帧下发配置,可能出现读到中间态。建议越界时只返回兜底值,不写回。inverter_read_sn/ver_master/ver_slave/ver_arm(3744/3756/3768/3780)在返回前写[...][sizeof-1] = 0,即修改被读对象。虽然意图是保证字符串终止,但对const语义不友好,且若缓冲区恰好被厂商驱动正在写(DMA/中断),有破坏数据的窗口。
7.3 状态机与一次性标志的健壮性
italian_self_test_handle()(326)的 static 标志s_u8_safty_test_flag、s_u8_safty_test_flag2、s_u8_cnt在整个函数体内没有任何「安规已不是 CEI021 则复位」的路径(旧版实现在被注释掉的394-403里才有这段复位逻辑)。安规切换或机型切换后标志不会自清,「送服务器/送 APP」标志可能不再产生。另外锦浪 T10 与其它机型共用同一个函数级s_u8_safty_test_flag,机型切换时两套语义会互相污染。get_self_test_data()在 CEI021 下每轮任务(≈80ms)都被完整重算:既白耗 CPU,又把t_safty_tset_info[0].u_test_res.u16_all反复清 0。若厂商驱动在两次调用之间刚写入自检结果位,会被立刻抹掉。overload_recovery_handle()(478):只要输出过载故障位保持为真,就每小时无条件inverter_reset()(沃太除外),永不止息。对持续性硬件过载,这会形成周期性复位风暴,且没有任何重试上限或告警升级。power_limit_handle()(629)依赖abs(OSTimeGet() - tick)计算间隔,用abs()(int 版)处理 u32 差值,在OSTimeGet()回绕附近行为依赖隐式符号转换,虽有多处 tick 刷新兜底,仍建议显式做无符号差。sys_anti_theft_handle()(918):配置为「已设防盗」时每轮都inverter_shutdown();如果配置读到一半(Flash 重载)出现假值,可能造成反复停机。
7.4 空实现 / 无效实现 / 命名与实现不符
| 位置 | 问题 |
|---|---|
inverter_set_ovp_down_load_start(4817)、inverter_set_ovp_down_load_end(4829) | 函数体为空,无任何赋值或标志置位。若上线在调用它们,参数会被静默丢弃。 |
inverter_read_upgrade_file_offset_arm(3958) | 恒返回 0,但上方注释写「获取逆变器 ARM 更新百分比」,与实现不符;配套的 inverter_read_upgrade_percent_arm(3995)才是真实百分比。 |
inverter_set_zero_current_voltage_value(7058) | 只写 t_safty_info.u16_zero_current_voltage,未置任何厂商脏标志,等于该参数不会下发。 |
inverter_set_regulation_rate_enable(4581) | 只写 u8_rise_fall_gardient_en,同样无任何脏标志。 |
inverter_set_zero_current_voltage_value、inverter_set_fix_reactpower_value 等 | 头注释(形参名/类型)与实现不一致:如 inverter_set_volt_watt_mode(u8) 的 @Name 写 u16(4401 vs 4407);inverter_set_fix_reactpower_value 的 @Name 写 (s8 value) 而实现是 (s16 value)(4624 vs 4630);inverter_set_isolation_limit_value 的 @Name 与实现一致但 @Brief 为空。注释形参类型在 8 个函数中与实际不符,容易误导调用方。 |
inverter_set_ac_out_bat_enable(6695-6706) | 整函数被注释掉(保留为 //void ...),仅 inverter_set_ac_out_bat_power 生效。 |
handle_cloud_set_gfci(540) | 函数名与实现不符:它不只处理 GFCI 屏蔽,还负责「退出 NRS097_2_1 时自动恢复」;且形参是 u8*,函数内部直接解引用,调用方必须保证非 NULL(虽有判空,但判空在 l_u8_current_safety_status 读取之后使用,顺序无实际风险)。 |
inverter_set_safty_mode(4438) | 语义不一致:对科华/汇川把原始整数值(1~4)直接写进 t_safty_info.safty_mode_u.u16_value,对其它厂商则写的是位域展开后的联合体值。同一个字段在不同机型下含义不同,读回逻辑(inverter_get_reactpower_control_mode 按位域解析)在科华/汇川下会得到错误结果。 |
inverter_set_dnsp_regulation_rate(8087-8097) | ((setsoftgradw * 60) * 100) / inverter_read_rated_ac_discharge_power() 未做除零检查;若 AC 放电额定功率尚未从 Flash 载入或读到 0,会触发整数除零异常(Cortex-M4 上 SDIV 除零结果为 0 且不陷入,但会得到静默错误值)。 |
| 死代码 | italian_self_test_handle 内 394-468(75 行旧状态机)、6725-6741(inverter_set_under_freq_mode 旧实现)、8080-8086(inverter_set_dnsp_regulation_rate 的重复 doc 注释)均为被注释代码。 |
7.5 潜在编译期问题
sys_shutdown_handle()的调试打印(inverter.c:879)引用了s_u8_inv_stop_days,该标识符在本函数作用域内并未声明(函数内只有s_u8_logout_flag、s_u32_logout_sys_shutdown_time)。当前DEBUG_INVERTER == 0使其不参与编译,但一旦打开调试开关就会编译失败。inverter_get_reactpower_control_mode()(7160)等函数访问safty_mode_u.BIT.*位域,位域布局依赖编译器与#pragma pack;本文件在t_safty_info/t_config_data之间来回整体赋值safty_mode_u.u16_value(4458),若两处位域定义顺序不一致会造成错位。- 全文件含 1014 处条件编译指令,
#if嵌套最深达 3 层,可读性与「改一处漏一处」风险较高;新增厂商机型时,本文件内至少 200 个函数需要逐个人工补齐分支。
7.6 安全与一致性风险
- 无范围校验:约 190 个安规参数 setter 直接把外部(云端/Modbus)传入的值写进
t_safty_info并置脏标志,仅 6 处做钳位/丢弃(5689、5728、5760、5826、5966、6019、6070、6121、4661)。恶意或错误的上位机指令可把过压/过频保护定值设成任意值,需要在上游net/或logic/侧补校验。 - 跨模块直接写全局:本文件不通过 setter,直接写
s_senergys5_set_info/s_senergys5_task_tab(盛能杰)与g_t_ginlong_info、g_t_kelong_comm_info等的内部字段(共 300+ 处),破坏了模块封装,且这些字段的并发访问没有任何锁保护。 u8_tor_no_use_flag是隐式全局门控:一旦被sys_safety_special_deal_handle()置真,所有 OVP/UVP/OFP/UFP 定值、孤岛检测设定会被静默丢弃(return而非拒绝),上层无法感知下发失败。- 落盘不一致:
inverter_write_safety落盘、inverter_write_safesub不落盘;inverter_set_islanding_check_enable、inverter_set_n_n_short落盘,而大多数使能类 setter 不落盘。掉电后哪些参数保留取决于调用点,需逐个核对,容易产生「现场行为与配置页面不一致」的投诉。 - 事件标志超时被当作正常:
task_inverter的OSFlagPend超时为 20ms,os_flag未匹配时本轮仍会继续跑完所有处理并再次延时 80ms;task_inverter_can的OSFlagPend带OS_FLAG_CONSUME,若task_inverter因异常路径未OSFlagPost,CAN 侧会连续超时但不会报错,通信丢失只能靠inverter_lost_handle_can()兜底。
7.7 文档维护提示
- 本文件共 313 个函数,其中约 250 个是「一个赋值 + 若干脏标志」的模板函数。后续若统一改造为「表驱动 + 回调」,可把本文件体积压缩一个数量级;在改造前,新增参数必须同时更新:
t_safty_info字段、本文件的 setter、6 家厂商的组帧函数与脏标志、net/云端寄存器映射、hmi/页面与 Modbus 表。 - 与本文档配套的
inverter.h.md(docs/knowledge/代码解析/midware/inverter/inverter.h.md)给出全部结构体/枚举的逐字段说明,类型细节以该文档为准;本文档只覆盖inverter.c的实现行为。