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

inverter.c

本页目录1. 文件职责2. 关键数据结构与宏2.1 本文件定义/引用的全局对象2.2 本文件大量写入/读取的外部全局结构(按厂商分桶)2.3 本文件消费的关键宏 / 枚举2.4 文件作用域内的 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),把下面七块内容按厂商分支统一暴露给上层:

  1. 配置数据 g_t_inv_info.t_config_data(持久化到 Flash);
  2. 运行数据 g_t_inv_info.t_run_info;
  3. 安规参数总表 g_t_inv_info.t_safty_info;
  4. 安规自检过程/结果 g_t_inv_info.t_safty_tset_info[3];
  5. 控制命令 g_t_inv_info.t_control_cmd、控制参数 g_t_inv_info.t_control_parameter;
  6. 升级/调试 g_t_inv_info.t_debug_log、AFCI g_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_infoINVERTER_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_infoPARALLEL_HOST_MACHINE_RUNNING_INFO_T[]extern(inverter.c:40),并机主机运行信息数组。sys_shutdown_handle() 读 [0].u8_drm_mode 参与停机判定(inverter.c:847)。
g_u8_dc_disturbance_countu8extern(inverter.c:41),直流扰动计数,inverter_get_dc_disturbance_count()(inverter.c:2748)读取,盛能杰 M10 机型做 1 << (n-1) 指数放大。

2.2 本文件大量写入/读取的外部全局结构(按厂商分桶)

本文件的「置脏标志」模式依赖以下厂商通信上下文,均为跨模块全局变量(定义在各厂商模块或 data/):

名称归属模块说明
g_t_kelong_comm_infokelong/科华侧标志,本文件引用 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_infoginlong/锦浪侧,引用 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_infoalphaess/沃太侧,引用 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_infogoodwe/固德威侧,引用 1 次(u8_set_iso_limit_flag,inverter.c:4056)。
g_t_inovance_comm_infoinovance/汇川侧,引用 77 次;主用 u64_sci_flag.bit.* 位域,另用 u8_set_inv_ctrl_arg1_flag。
s_senergys5_set_infoset/set_comm_usart_s5.h:819(extern)盛能杰 S5 使能位联合体,本文件以 s_senergys5_set_info.bit.xxx = TRUE 置位,共 25 处。
s_senergys5_task_tabset/set_comm_usart_s5.h:814(extern)盛能杰 S5 任务表,本文件只写 u8_set_inv_npe_short_enable_flag(inverter.c:4775)。
g_t_system_base_infodata/system_config读 u16_oem_flag(贴牌判定,inverter.c:1069、1395、1449 等 23 处)、s8_sn[6](显示类型判定,inverter.c:1816、1849)。
g_system_custom_infodata/system_config客户自定义机型名/显示类型覆盖(inverter.c:1388、1778)。
g_system_function_infodata/system_config读 t_dev_fun.ems_fun_3_u.bit.u8_gfci_en 功能使能位(inverter.c:549)。
g_t_logic_infologic/读 u8_drm_mode、u8_uk_G100_SystemState、u8_fine_tuning_range_zero_flag(inverter.c:846-848、2542)。
g_t_parallel_total_machine_networkinverter/parallel_comm读 u8_run_machine_precept(inverter.c:2961)。
g_stEMSInfonet/读 bIsLogin 判据(断网计时,inverter.c:807、896)。
g_t_fast_dispatch_flaglogic/uCOS-II 事件标志组,三个任务用它做同步(inverter.c:1054、1185、1207)。
g_t_ate_ctrolmidware/ate读 u8_set_passthrough_can_test_flag(inverter.c:1227)。
g_t_task_run_statusmidware/debug仅调试计数(inverter.c:1180、1282)。

2.3 本文件消费的关键宏 / 枚举

名称来源说明
INVERTER_TYPEinverter.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_MAXinverter.h:163-170厂商类型码 0~7。get_inverter_type() 会把 >= INVERTER_MAX 的值纠回 INVERTER_NULL。
INV_DC_CTRL / INV_AC_CTRLinverter.h:175-182由 INVERTER_TYPE 条件定义(科华/盛能杰/锦浪/固德威走 DC 侧,沃太/汇川走 AC 侧)。本快照下两者都未定义(INVERTER_NULL 不匹配任一条件)。
SUB_S3~SUB_B10、SUB_MAXinverter.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~_5inverter.h:154-158调节速率档位,get_inv_regulator_speed()(inverter.c:2635)按 type/sub + 电表总有功分档返回。
INV_POWER_NONE/INV_POWER_ON/INV_POWER_OFFinverter.h启停三态,inverter_power_none/on/off() 写入 t_control_cmd.u8_start_stop(inverter.c:4079/4091/4103)。
INV_STARTUP / INV_SHUTDOWNinverter.hinverter_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_ALLinverter.hPV 通道索引(注意源码拼写为 CHANAEL),inverter_read_pv_*() 按索引取址(inverter.c:2976-3031)。
PHASE_L1~PHASE_L3、PHASE_ALLinverter.h相序索引,inverter_read_grid/inv/backup_*() 按索引取址(inverter.c:3078-3296)。
Safety_Max / SAFESUB_MAX / SAFESUB_DEFAULTinverter.h(安规枚举末位)安规码/子安规范围校验与复位默认值(inverter.c:4338、4341、4367)。
AS4777_2/AS4777_2_2024/AS4777_2_SA/AS4777_NZinverter.h澳规四兄弟,inverter_read_safety_is_AS4777() 统一判定(inverter.c:4315-4328),并参与 P-V 曲线点映射与钳位。
CEI021inverter.h意大利安规,italian_self_test_handle() 的唯一入口条件(inverter.c:331)。
NRS097_2_1inverter.h南非安规,handle_cloud_set_gfci() 用它判定 GFCI 使能与退出恢复(inverter.c:553、566)。
TOR_ERZEUGER / VDE0126_GRinverter.h奥地利列名 / 德国 VDE,sys_safety_special_deal_handle()(inverter.c:964)与 inverter_set_p_pf_mode_p2()(inverter.c:6449)做特殊强制。
PARA_COM_TYPE_NONE/_UART4/_USART3inverter.h并机通信制式,inverter_get_parallel_mode()(inverter.c:2957)与 passthrough_detection_flag()(inverter.c:1924)使用。
BACKUPBOX_5K/_10K/_23Kinverter.h备电箱型号,backupbox_detection_handle() 依 meter_get_meter_type_old(GRID_METER) 识别(inverter.c:762-776)。
BOARD_EMS3_6_E / BOARD_EMS3_6_4_Eboard_init.h板型,参与机型名(inverter.c:1460)、显示类型(1820)、透传能力(1921)判定。
OEM_HHE/OEM_BW/OEM_SUNPOWER/OEM_ZONERGYESS/OEM_DIGIEN/OEM_PEIMARdata/system_config贴牌开关,决定返回的机型名字符串与显示类型。
DISPLAY_LCD_CHARACTER_E/DISPLAY_LCD_RKP_E/DISPLAY_LED_LAMP_PANEL_E/DISPLAY_LED_LAMP_STRIP_E/DISPLAY_LED_BICOLOR_Einverter.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_DONElogic/事件标志位,task_inverter 等 PEND_LOGIC_CALCULATE_DONE、收齐后 POST_INV_CALCULATE_DONE;task_inverter_can 等 PEND_INV_CALCULATE_DONE 且带 OS_FLAG_CONSUME。
TASK_INVERTER_CAN_PRIOuser/main.htask_inverter 用 OSTimeDlyResume() 立刻唤醒 CAN 任务(inverter.c:1186)。
INVERTER_CONFIG_PAGEdata/Flash 配置页号,所有需要落盘的改动都 save_job_post(INVERTER_CONFIG_PAGE)(inverter.c:559、817、830、4342、4428、4740)。
GRID_METER / P1_SAMPLINGmeter.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_MODEinverter.h(INVERTER_REACTPOWER_MODE_E)inverter_get_reactpower_control_mode()(inverter.c:7160)按 safty_mode_u 位域映射。
INVERTER_TYPE_BYTE_WATT_S/_T/NON_BYTE_WATTinverter.h(INVERTER_CATEGORY_E)get_inverter_type_category()(inverter.c:8003)返回贝瓦单相/三相/非贝瓦分类。
SNJ_M5_SPECIAL_HANDLE / NOT_SPECIAL_HANDLEinverter.hinverter_get_special_control_inv_type()(inverter.c:7985)返回,盛能杰 M5 特殊处理标志。
BACKUP_STATUS_E(BACKUP_NULL/DISABLE/ENABLE)inverter.hset_inverter_backup_enable() 形参类型(inverter.c:2092)。
INV_OVERLOAD_STATUS / LEASE_STATUS / GRID_STATUSnet/ 或 data/set_info_status() 的上报事件码(inverter.c:526、800、828、902)。
STATE4_LOCKlogic/(G100)英国 G100 锁定态,参与停机判定(inverter.c:848)。
DEBUG_INVERTER / METER_DEBUG_INFOinverter.h / 工程配置调试打印与任务计数开关;本文件中有 4 处 #if (DEBUG_INVERTER == 1)(inverter.c:527、876、906、1179)。

2.4 文件作用域内的 static 局部变量

本文件没有文件静态变量,但有 30 余个函数内 static,它们承担跨轮次的记忆功能(均在 for(;;) 大循环中每轮被访问):

所在函数变量作用
inverter_lost_handles_u8_pcs_lost_flag(inverter.c:117)通信丢失边沿检测,只在 0→1 跳变时清运行数据。
italian_self_test_handles_u8_safty_test_flag、s_u8_cnt、s_u8_safty_test_flag2(328、329、338)CEI021 自检一次性触发与去抖计数(阈值 3)。
overload_recovery_handles_u32_opp_time(480)过载故障持续 1 小时自动 inverter_reset() 的计时基准。
overload_detection_handles_u8_preoverload_flag(516)过载状态边沿检测,变化时 set_info_status(INV_OVERLOAD_STATUS)。
handle_cloud_set_gfcis_u8_gfci_shield_flag、s_u8_last_safety_status(543、544)GFCI 屏蔽位记忆 + 上次安规码,用于「退出 NRS097_2_1 自动恢复 GFCI」与「屏蔽位变更即时下发」。
mpptscan_handles_u32_mpptscan_time(601)30 分钟一次 MPPT 扫描的计时基准。
power_limit_handles_u8_feedin_overrun_flag、s_u8_inv_stop_flag、s_u32_feedin_tick、s_u32_software_limit_tick(631-634)澳洲防逆流超限状态机与软/硬限功率去抖计时。
sys_shutdown_handles_u8_logout_flag、s_u32_logout_sys_shutdown_time(794、795)租赁一键停机的断网累计计时。
grid_detections_u8_premode(893)并/离网模式变化检测(初值 cUPS)。
sys_anti_theft_handles_u8_inv_anti_theft_flag(920)防盗标志边沿检测。
inverter_generator_mode_handles8_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_handlestatic115SCI 侧通信丢失处理:置故障位 3;在 0→1 边沿把 PV/电网/逆变/备电/电池全部运行量清零并把 u8_run_mode 置 cFaultMode。
inverter_lost_handle_canstatic199CAN 侧通信丢失处理:丢失时置故障位 10 并清 C 相电压/功率、总功率、频率,u8_run_mode 置 cFaultMode;恢复时清故障位 10。
get_self_test_datastatic234CEI021 安规自检数据装配:写 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_handlestatic326意大利 CEI021 自检触发流程(详见 §4.4)。含 75 行被注释掉的旧状态机实现(394-468)。
overload_recovery_handlestatic478输出过载故障持续 >1h 则(非沃太机型)调 inverter_reset() 尝试自恢复;含 OSTimeGet() 回绕保护。
overload_detection_handlestatic513把「输出过载告警 / 输出过载故障 / 负载 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_handlestatic581把 u_fault_code / u_fault_extend1_code 里的 GFCI/接地/绝缘位聚合成 u_ground_fault_code 位域,然后调 handle_cloud_set_gfci()。
mpptscan_handlestatic599配置使能 u8_inv_mpptscan_enable 且运行于 cNormalMode 时,每 30 分钟调一次 inverter_mpptscan_start()。
power_limit_handlestatic629澳洲防逆流软/硬限功率状态机(详见 §4.5)。
backupbox_detection_handlestatic755按 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_handlestatic791一键停机/按天租赁 + 断网时长累计 + 逆变器启停控制(详见 §4.6)。
grid_detectionstatic891并/离网检测:运行模式在 cNormalMode↔cUPS 之间变化且已登录时 set_info_status(GRID_STATUS)。
sys_anti_theft_handlestatic918防盗:配置置位则持续下发停机(仅沃太机型生效);配置位变化时按新值调用 inverter_shutdown() / inverter_startup()。
sys_safety_special_deal_handlestatic964安规特殊强制: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全局1045uCOS-II 任务(USART/SCI 侧主循环,80ms 周期)。见 §4.1。
task_inverter_can全局1199uCOS-II 任务(CAN 侧主循环,30ms 周期),含并机 CAN 通信与油机功率计算。
task_parallel_sci全局1296uCOS-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全局1939BMS 是否可升级: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全局2104PV 启动电压:沃太 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全局2310AC 侧调节周期(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全局2385DC 侧调节周期(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全局2494AC 侧细调幅值:科华 30、锦浪 T10 −100,兜底 50。
get_inv_dc_power_fine_tuning_range全局2521DC 侧细调幅值:科华 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全局2620UPS 预留 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全局3968ARM/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全局4077t_control_cmd.u8_start_stop = INV_POWER_NONE。
inverter_power_on全局4089u8_start_stop = INV_POWER_ON。
inverter_power_off全局4101u8_start_stop = INV_POWER_OFF。
inverter_get_start_stop_value全局4113读启停三态。
inverter_startup全局4125t_run_info.u8_set_inv_on_off = INV_STARTUP。
inverter_shutdown全局4137t_run_info.u8_set_inv_on_off = INV_SHUTDOWN。
inverter_get_shutdown_sta全局4149读开关机指令状态。
inverter_reset全局4161t_control_cmd.u8_reset = TRUE(一次性复位)。
inverter_clearing_fault全局4173t_control_parameter.u8_clearing_fault = TRUE(一次性清故障)。
inverter_reset_dsp_eeprom全局4185t_control_cmd.u8_reset_dsp_eeprom = TRUE(一次性复位 DSP EEPROM)。
inverter_mpptscan_start全局4197t_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全局4259IGFollow 模式: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全局4734N-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全局500310 分钟过压整定值(u16_ovp10min_value);科华/沃太/盛能杰/汇川置标志。
inverter_set_grid_ovp10min_time全局503110 分钟过压时间(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全局5679P-V 曲线点 1 电压;盛能杰额外把值钳位到 [800,1200] 并置 active_volt_cure_flag,科华置 arg_flag3。
inverter_set_p_v_mode_p1全局5702P-V 点 1 有功(u16_p_v_mode_p1);科华置 arg_flag3。
inverter_set_p_v_mode_v2全局5718P-V 点 2 电压;盛能杰同样钳位到 [800,1200]。
inverter_set_p_v_mode_p2全局5741P-V 点 2 有功。
inverter_set_p_v_mode_v3全局5757P-V 点 3 电压;澳规下先把值钳位到 [1020,1110];沃太时按「单相 或 澳规」映射到 s16_ov_p_v_mode_v1,否则映射到 s16_ov_p_v_mode_v3。
inverter_set_p_v_mode_p3全局5803P-V 点 3 有功。
inverter_set_p_v_mode_v4全局5823P-V 点 4 电压;沃太映射规则同 v3(映射到 s16_ov_p_v_mode_v2 / _v4)。
inverter_set_p_v_mode_p4全局5872P-V 点 4 有功。
inverter_set_p_v_mode_trigger_voltage全局5892P-V 模式触发电压(u16_p_v_mode_trigger_voltage)。
inverter_set_p_v_mode_down_load_flag全局5908P-V 降载使能(u8_p_v_mode_down_load_enable);科华/沃太/汇川置标志。
inverter_set_p_v_mode_response_time全局5935P-V 响应时间(u16_p_v_mode_response_time)。
inverter_set_q_v_mode_v1全局5963Q-V 点 1 电压;澳规下钳位到 [1020,1110]。
inverter_set_q_v_mode_q1全局5998Q-V 点 1 无功;u8_tor_no_use_flag 为真时返回。
inverter_set_q_v_mode_v2全局6016Q-V 点 2 电压;澳规钳位。
inverter_set_q_v_mode_q2全局6051Q-V 点 2 无功。
inverter_set_q_v_mode_v3全局6067Q-V 点 3 电压;澳规钳位。
inverter_set_q_v_mode_q3全局6102Q-V 点 3 无功。
inverter_set_q_v_mode_v4全局6118Q-V 点 4 电压;澳规钳位。
inverter_set_q_v_mode_q4全局6153Q-V 点 4 无功;u8_tor_no_use_flag 为真时返回。
inverter_set_q_v_mode_pin全局6171Q-V 曲线有功输入点(u16_q_v_mode_pin)。
inverter_set_q_v_mode_pout全局6187Q-V 曲线有功输出点(u16_q_v_mode_pout)。
inverter_set_q_v_mode_k全局6203Q-V 曲线斜率 k(s16_q_v_mode_k)。
inverter_set_q_v_mode_response_time全局6219Q-V 响应时间。
inverter_set_s_pf_mode_p1全局6247S-PF(视在功率-PF)点 1 功率。
inverter_set_s_pf_mode_pf1全局6263S-PF 点 1 PF 值。
inverter_set_s_pf_mode_p2全局6279S-PF 点 2 功率。
inverter_set_s_pf_mode_pf2全局6295S-PF 点 2 PF 值。
inverter_set_s_pf_mode_p3全局6311S-PF 点 3 功率。
inverter_set_s_pf_mode_pf3全局6327S-PF 点 3 PF 值。
inverter_set_s_pf_mode_pin全局6343S-PF 曲线输入有功点。
inverter_set_s_pf_mode_pout全局6359S-PF 曲线输出有功点。
inverter_set_p_f_mode_down_load_flag全局6376P-F 降载使能(u8_p_f_down_load_enable);盛能杰同时置 OFP/UFP 降载使能两个标志。
inverter_set_p_pf_mode_p1全局6408P-PF 点 1 功率。
inverter_set_p_pf_mode_pf1全局6428P-PF 点 1 PF 值。
inverter_set_p_pf_mode_p2全局6447P-PF 点 2 功率;沃太 + 奥地利列名(TOR_ERZEUGER)时改写 u16_p_pf_mode_p4,否则写 u16_p_pf_mode_p2。
inverter_set_p_pf_mode_pf2全局6481P-PF 点 2 PF 值。
inverter_set_p_pf_mode_p3全局6504P-PF 点 3 功率。
inverter_set_p_pf_mode_pf3全局6527P-PF 点 3 PF 值。
inverter_set_p_pf_mode_p4全局6550P-PF 点 4 功率。
inverter_set_p_pf_mode_pf4全局6573P-PF 点 4 PF 值。
inverter_set_p_pf_mode_pf5全局6596P-PF 点 5 PF 值。
inverter_set_p_f_mode全局6616P-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全局6715AC 侧给电池充电功率(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全局7195MPPT 百分比: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全局7290GFCI 30mA 门限;沃太/汇川置标志。
inverter_set_gfci_60mA_pro_threshold全局7310GFCI 60mA 门限;沃太/汇川置标志。
inverter_set_gfci_150mA_pro_threshold全局7330GFCI 150mA 门限;沃太/汇川置标志。
inverter_set_gfci_300mA_pro_threshold全局7350GFCI 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全局7394L-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全局7562AFCI 检测使能;写 t_run_info.u16_afci_detection_value;沃太置标志。
inverter_set_pv_curr_monitor_enable全局7578PV 电流监测;写 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全局7666UPS 电压保护;写 t_run_info.u16_ups_volt_pro_value。
inverter_set_pe_short_enable全局7687PE 短接使能;写 t_control_cmd.u8_n_pe_short_flag。
inverter_set_pe_loss_check_flag全局7704PE 丢失检测标志;写 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全局7820P-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全局7848P-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全局7914CT 判断/调试标志:科华、盛能杰全部、锦浪 S5 返回 TRUE;沃太三相机型返回 FALSE、其余沃太 TRUE;兜底 FALSE。
get_14a_enwg_bat_min_power全局795914a 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_inverterinverter.c:1045user/main.c:189OSTimeDlyHMSM(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_caninverter.c:1199user/main.c:244OSTimeDlyHMSM(0,0,0,30) ≈ 30ms(inverter.c:1285)`OSFlagPend(..., PEND_INV_CALCULATE_DONE, WAIT_SET_ALL \OS_FLAG_CONSUME, 20ms)`
task_parallel_sciinverter.c:1296user/main.c:299OSTimeDlyHMSM(0,0,0,100) ≈ 100ms(inverter.c:1305)无

task_inverter 的每轮处理顺序(inverter.c:1052-1189):

  1. 等 PEND_LOGIC_CALCULATE_DONE(20ms 超时,允许空转);
  2. 若 u8_init_flag 为真则清标志并调 inverter_state_init() —— 即厂商驱动初始化是在任务首轮或 set_inverter_init() 之后才执行;
  3. (非 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. 六家厂商分发轮询(详见 §4.2),盛能杰/锦浪/沃太还受 get_passthrough_flag()(透传测试时跳过)与 u8_ate_mode_flag(ATE 模式跳过)门控;
  5. 依次执行 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;
  6. 若本轮等到事件标志,则置 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 通信丢失降级

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。

4.5 澳洲防逆流软/硬限功率状态机(power_limit_handle)

inverter.c:629-746。前置条件:inverter_read_grid_freq() > 4500(>45Hz)且(软限或硬限使能)。

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 自检要求停机)。

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
}

关键点:

  1. 参数值本身不做单位换算、不做范围校验(唯一例外见下),调用者(logic/、hmi/、net/)负责保证量纲与合法性;
  2. 脏标志由各厂商模块在自己的通信任务里清零并组帧下发,本文件不跟踪「已下发」;
  3. 每家厂商的标志名各不相同(科华用 u8_ems_set_inv_*,锦浪用 t_ginlong_comm_info.u8_set_*,沃太用 u8_ems_set_*,汇川统一用 u64_sci_flag.bit.*,盛能杰用 s_senergys5_set_info.bit.*),新增厂商需逐函数补齐 5~6 个分支,极易漏项;
  4. 少数带门的例外: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() 对奥地利列名场景置位;
  5. 少数带钳位的例外:盛能杰 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);
  6. 少数带落盘的例外: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:

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_codeinverter_lost_handle*(清零)、inverter_startup/shutdown、inverter_set_bypass_flag、inverter_set_pe_loss_check_flag、各保护使能位厂商驱动写主体,本文件负责清零、命令位与部分使能位。
g_t_inv_info.t_safty_infosys_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_*_flagget_self_test_data(标准值/实际值/清结果位)安规自检数据。
g_t_inv_info.t_control_cmdinverter_get_start_stop_value、inverter_read_backup_flaginverter_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_parametertask_inverter/task_inverter_can(ATE 模式、ATE 复位 DSP 门控)power_limit_handle(u8_set_inv_softstart)、inverter_clearing_fault控制参数/一次性动作。
g_t_inv_info.t_afci_infosys_shutdown_handle(u8_afci_self_result_shut_down 参与停机判定)inverter_set_afci_self_check_clearAFCI 停机与清除。
各厂商 g_t_*_comm_info / s_senergys5_set_info极少(italian_self_test_handle 读锦浪侧)大量置脏标志(见 §2.2 计数)跨模块「待下发」通道。
g_t_fast_dispatch_flag三个任务 OSFlagPendtask_inverter OSFlagPostuCOS-II 事件同步。

5. 对外接口

5.1 本文件导出的接口

本文件共 313 个函数中 299 个为全局可见(14 个函数为 static,不导出)。全局函数按用途分为 11 类,均由 midware/inverter/inverter.h 声明:

类别代表函数主要调用方
任务入口task_inverter、task_inverter_can、task_parallel_sciuser/main.c(OSTaskCreateExt,main.c:189/244/299)
生命周期inverter_state_init、set_inverter_inittask_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_categorylogic/、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_factorlogic/(调度主循环定时与细调)、net/
控制命令inverter_power_on/off/none、inverter_startup/shutdown、inverter_reset、inverter_clearing_fault、inverter_mpptscan_start、inverter_energy_clear、inverter_set_bypass_flaglogic/、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_safesubnet/(云端改安规)、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_flagnet/(云端升级流程、进度上报)
特征能力查询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_powerlogic/、net/、midware/ 各子系统按能力门控
自检上报标志set_inverter_safty_test_flag、get/set_inverter_safty_test_info_send_server_flag、get/set_inverter_safty_test_info_send_app_flagnet/(把自检数据同步云端/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_testset/盛能杰收发、机型识别、升级状态
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_dspalphaess/、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_preceptinverter/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_frequentmeter/电表数据与型号
ems_set_fault_bit、set_info_status、save_job_postems/、data/故障位上/下、状态上报、Flash 落盘
logic_read_max_feedin_powerlogic/防逆流功率上限阈值
sys_limited_by_csip_judge、csip_aus_get_ramp_enablecsip_aus澳洲 CSIP 爬坡模式
bms_get_ready_enable(旧自检代码注释中)、bms_read_total_voltbms/14a EnWG 功率换算
get_generator_start_flag、calculate_gc_chgpowergenerator油机状态与功率
get_passthrough_flag、get_board_type、pvcharger_read_machine_mode、inverter_pvcharger_info_handle各模块透传/板型/PV Charger 门控
OSFlagPend、OSFlagPost、OSTimeDlyHMSM、OSTimeDlyResume、OSTimeGetUCOSII/任务同步与计时

6. 依赖关系

包含的头文件(inverter.c:16-37):

头文件用途
inverter.h本模块唯一定义头:INVERTER_TABLE_T 及全部子类型、GRID_REGULATION_E、INVERTER_SUB_E、厂商类型码、控制命令码。
data.hg_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.hg_t_ate_ctrol、ems_ate_reset_dsp。
board_init.hget_board_type、BOARD_* 板型宏。
meter.hmeter_* 系列与 GRID_METER。
logic.hg_t_logic_info、logic_read_max_feedin_power、get_inv_* 周期函数的声明归属。
key.h按键模块(本文件未见直接调用,属遗留包含)。
ems.hems_set_fault_bit、set_info_status、g_stEMSInfo。
generator.hget_generator_start_flag、calculate_gc_chgpower。
bms.hbms_read_total_volt 等。
modbus.h本地 Modbus 寄存器映射(本文件未直接调用,供同层其它函数使用)。
csip_aus.hsys_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 编译期宏与本快照的构建配置(重要)

7.2 读函数带副作用

7.3 状态机与一次性标志的健壮性

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 潜在编译期问题

7.6 安全与一致性风险

  1. 无范围校验:约 190 个安规参数 setter 直接把外部(云端/Modbus)传入的值写进 t_safty_info 并置脏标志,仅 6 处做钳位/丢弃(5689、5728、5760、5826、5966、6019、6070、6121、4661)。恶意或错误的上位机指令可把过压/过频保护定值设成任意值,需要在上游 net/ 或 logic/ 侧补校验。
  2. 跨模块直接写全局:本文件不通过 setter,直接写 s_senergys5_set_info / s_senergys5_task_tab(盛能杰)与 g_t_ginlong_info、g_t_kelong_comm_info 等的内部字段(共 300+ 处),破坏了模块封装,且这些字段的并发访问没有任何锁保护。
  3. u8_tor_no_use_flag 是隐式全局门控:一旦被 sys_safety_special_deal_handle() 置真,所有 OVP/UVP/OFP/UFP 定值、孤岛检测设定会被静默丢弃(return 而非拒绝),上层无法感知下发失败。
  4. 落盘不一致:inverter_write_safety 落盘、inverter_write_safesub 不落盘;inverter_set_islanding_check_enable、inverter_set_n_n_short 落盘,而大多数使能类 setter 不落盘。掉电后哪些参数保留取决于调用点,需逐个核对,容易产生「现场行为与配置页面不一致」的投诉。
  5. 事件标志超时被当作正常:task_inverter 的 OSFlagPend 超时为 20ms,os_flag 未匹配时本轮仍会继续跑完所有处理并再次延时 80ms;task_inverter_can 的 OSFlagPend 带 OS_FLAG_CONSUME,若 task_inverter 因异常路径未 OSFlagPost,CAN 侧会连续超时但不会报错,通信丢失只能靠 inverter_lost_handle_can() 兜底。

7.7 文档维护提示