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

dc_control.h

源文件路径:logic/dc_control.h 所属模块:logic(能量调度核心) 代码行数:48

1. 文件职责

本文件是 logic/dc_control.c 的对外接口头文件,声明 DC 侧(直流耦合机 / 储能一体机)功率控制的 17 个函数原型,覆盖「DC 总功率控制」与「DC 三相不平衡控制」两条链路,外加填谷/削峰命令入口。它不定义任何结构体、枚举或宏常量(除 include guard 外),只做原型暴露;所有涉及的状态与功率结果都通过 g_t_logic_info(定义在 logic/logic.h)传递。原型整体包在 #ifdef INV_DC_CTRL 内,标识这套接口只在编译期选中「DC 控逆变器型号」的产品形态下生效。

2. 关键数据结构与宏

名称类型说明
__DC_CONTROL_H__宏include guard
INV_DC_CTRL条件编译宏由 midware/inverter/inverter.h:176 依据 INVERTER_TYPE 派生;未定义时本头文件全部函数原型不可见

本文件不定义结构体、枚举、联合体、位域,也没有除 include guard 外的宏常量。进入 dc_control.c 参与运算的全部类型(LOGIC_TABLE_T、LOGIC_CONTROL_PARAMETER_T、LOGIC_CONTROL_SPECIAL_HANDLE_T、PEAKSHVING_STATE_E 等)都来自 logic/logic.h(由 dc_control.c:13 包含),本头文件不做任何类型定义。

3. 函数清单

函数名作用域说明(一句话)
dc_control_total_power_limit全局(原型)DC 总功率控制限幅:电池功率钳到 ±充放电上限,逆变与并网设定钳到 [0, 额定输出],定义于 logic/dc_control.c:39
dc_control_total_power_bat_force_charge全局(原型)DC 强充模式功率计算,定义于 logic/dc_control.c:83
dc_control_total_power_bat_force_discharge全局(原型)DC 强放模式功率计算,定义于 logic/dc_control.c:120
dc_control_total_power_bat_power_control全局(原型)DC 电池功率控制模式(跟随上位指令),定义于 logic/dc_control.c:170
dc_control_total_power_self_use_calculate全局(原型)DC 自发自用模式下按电表功率调节电池功率(含扰动计数),定义于 logic/dc_control.c:183
dc_control_total_power_no_bat_calculate全局(原型)DC 无电池模式:电池功率置 0,仅按 max feedin 跟踪逆变设定,定义于 logic/dc_control.c:479
dc_control_total_power_gc_chgpower_calculate全局(原型)DC 油机充电功率模式计算,定义于 logic/dc_control.c:504
dc_control_three_phase_power_limit全局(原型)DC 三相不均衡各相功率限幅,定义于 logic/dc_control.c:750
dc_control_three_phase_power_bat_force_charge全局(原型)DC 三相不均衡强充模式,定义于 logic/dc_control.c:818
dc_control_three_phase_power_bat_force_discharge全局(原型)DC 三相不均衡强放模式,定义于 logic/dc_control.c:839
dc_control_three_phase_power_bat_power_control全局(原型)DC 三相不均衡电池功率控制模式,定义于 logic/dc_control.c:877
dc_control_three_phase_power_self_use_calculate全局(原型)DC 三相不均衡自发自用逐相扰动调节(本文件最大函数,940 行),定义于 logic/dc_control.c:892
dc_control_three_phase_power_no_bat_calculate全局(原型)DC 三相不均衡无电池模式,定义于 logic/dc_control.c:1832
dc_time_valley_fill_calculate全局(原型)DC 填谷功率计算(三状态滞环 + 斜坡),定义于 logic/dc_control.c:1869
dc_time_peak_clip_calculate全局(原型)DC 削峰功率计算,定义于 logic/dc_control.c:1963
dc_ctrl_time_peak_clip_command全局(原型)DC 削峰命令入口(含滞环状态机),定义于 logic/dc_control.c:1987
dc_ctrl_time_valley_fill_command全局(原型)DC 填谷命令入口(计算 + 限幅两段式),定义于 logic/dc_control.c:1951

共 17 个原型,全部对应 logic/dc_control.c 中的全局定义,无 static 函数、无函数指针、无回调。

结构上的不对称:填谷一侧是 dc_ctrl_time_valley_fill_command() → dc_time_valley_fill_calculate() + dc_control_total_power_limit() 两段式;削峰一侧的入口 dc_ctrl_time_peak_clip_command() 内部自带滞环状态机并转调 dc_time_peak_clip_calculate(),而 dc_time_peak_clip_calculate() 也可被独立调用 —— 两套时序并不对称。

4. 核心逻辑解析

本文件是纯声明文件,不含可执行逻辑。契约层面要点如下:

4.1 两条平行链路

链路入口函数族使用的节拍时间戳字段写入的结果字段
DC 总功率控制dc_control_total_power_*、dc_time_*、dc_ctrl_time_*u32_calculation_dc_total_inv_tick(部分函数另用 u32_calculation_dc_total_bat_tick)g_t_logic_info.s32_dc_total_set_bat_power / s32_dc_total_set_inv_power / s32_dc_total_set_grid_power
DC 三相不平衡dc_control_three_phase_power_*u32_calculation_dc_three_phase_inv_tickg_t_logic_info.s32_dc_three_phase_set_bat_power / s32_dc_three_phase_set_inv_a/b/c_power

两条链路在 logic/logic.c 的每个模式入口里都是成对调用的(如 logic/logic.c:1745-1746、1764-1765、1785-1786、1806-1807、1857-1858、2026-2027),并由 logic_charge_dischg_power_limit()(logic/logic.c:1742)在末尾统一限幅。

4.2 与 AC 侧的镜像关系

dc_control.h 的函数名与 logic/ac_control.h 一一镜像(dc_control_total_power_* ↔ ac_control_total_power_*,dc_control_three_phase_power_* ↔ ac_control_three_phase_power_*)。但两侧并非简单复制:

4.3 通信协议 / 定时 / uCOS-II 配合

无。本文件不涉及帧格式、校验、超时重试,不使用 uCOS-II API,不声明信号量或消息邮箱句柄。节拍控制全部落在 dc_control.c 内对 g_t_logic_info.t_logic_control_parameter.u32_calculation_dc_*_tick 与 u32_calculation_interval / u32_calculation_interval_bat 的读写上,本头文件仅通过 LOGIC_CONTROL_PARAMETER_T 间接依赖这些字段。

5. 对外接口

导出(供外部使用):

名称使用方
dc_control_total_power_limit()logic/logic.c:1745(logic_charge_dischg_power_limit() 内)
dc_control_total_power_bat_force_charge()logic/logic.c:1764(bat_force_charge() 内)
dc_control_total_power_bat_force_discharge()logic/logic.c:1785(bat_force_discharge() 内)
dc_control_total_power_bat_power_control()logic/logic.c:1806(bat_power_control() 内)
dc_control_total_power_self_use_calculate()logic/logic.c:1857(self_use_funtion() 内)
dc_control_total_power_no_bat_calculate()logic/logic.c:2026
dc_control_total_power_gc_chgpower_calculate()logic/logic.c:2100(油机模式)
dc_control_three_phase_power_limit()logic/logic.c:1746
dc_control_three_phase_power_bat_force_charge()logic/logic.c:1765
dc_control_three_phase_power_bat_force_discharge()logic/logic.c:1786
dc_control_three_phase_power_bat_power_control()logic/logic.c:1807
dc_control_three_phase_power_self_use_calculate()logic/logic.c:1858
dc_control_three_phase_power_no_bat_calculate()logic/logic.c:2027
dc_ctrl_time_peak_clip_command()logic/logic.c:558(time_peakshaving_command() 内)
dc_ctrl_time_valley_fill_command()logic/logic.c:567(time_peakshaving_command() 内)
dc_time_valley_fill_calculate()无外部调用方(仅 dc_control.c:1953 内部使用),头文件仍导出
dc_time_peak_clip_calculate()无外部调用方(仅 dc_control.c:2016 内部使用),头文件仍导出

本头文件不导出任何全局变量 —— 注意 dc_control.c:19 定义的 u8 g_u8_dc_disturbance_count 是非 static 全局变量,被 midware/inverter/inverter.c:41 用 extern 引用,但本头文件没有对应的 extern 声明。

被调用(本文件引用的外部符号):

名称来源
chip.h#include "chip.h"(dc_control.h:13),提供 u8 / u32 / s32 等基础类型
inverter.h#include "inverter.h"(dc_control.h:14),提供 INV_DC_CTRL 与逆变器型号宏

6. 依赖关系

依赖:

被依赖(全部 include 点):

7. 备注与风险点

  1. 当前构建配置下本头文件等于空壳:INVERTER_TYPE 硬编码为 INVERTER_NULL(midware/inverter/inverter.h:172),INV_DC_CTRL 仅在 INVERTER_TYPE 为 KELONG_TYPE / GINLONG_TYPE / SET_TYPE / GOODWE_TYPE / INVERTER_MAX 之一定义(inverter.h:175-177)。Keil 工程 user/EMS_3_0.uvprojx 的 <Define> 只有 USE_STDPERIPH_DRIVER, GD32F407,未覆盖该宏,因此第 25 行的 #ifdef INV_DC_CTRL 把 17 条原型全部排除,logic/logic.c 中的对应调用点也一并被 #ifdef 屏蔽。
  2. #endif 缺少注释对应:dc_control.h:46 的 #endif 没有像 ac_control.h:78 那样标注 //#ifdef INV_DC_CTRL,在嵌套条件编译较多的工程里可读性较差。
  3. g_u8_dc_disturbance_count 声明位置与归属不一致:该变量定义在 dc_control.c(非 static),被 midware/inverter/inverter.c:2755-2762 引用(用于生成扰动计数位掩码),但既未在本头文件 extern,也未在 inverter.h 声明,而是在 inverter.c:41 局部 extern u8 g_u8_dc_disturbance_count;。这属工程内常见的隐式全局传递,接口契约不清晰。
  4. 导出粒度偏大:dc_time_valley_fill_calculate() 与 dc_time_peak_clip_calculate() 是纯内部计算,唯一调用者在本文件配套的 .c 内(dc_control.c:1953、dc_control.c:2016),却被声明为全局接口;建议收为 static,否则容易被其他模块以「我也调一次」的方式误用,绕过 dc_control_total_power_limit() 限幅。
  5. 缺少版本/日期信息:文件头 @version / @date 均为空,与工程内其他已填写日期的文件不一致,属遗留填写问题,无功能影响。