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_tick | g_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_*)。但两侧并非简单复制:
- DC 侧多出
dc_time_valley_fill_calculate()/dc_time_peak_clip_calculate()两个全局函数(AC 侧对应的time_valley_fill_calculate()/time_peak_clip_calculate()未在ac_control.h中声明); - DC 侧少
dc_control_three_phase_power_bat_force_control()(AC 侧的ac_control_three_phase_power_bat_force_control()是独立的三相入口); - 两侧的限幅策略不同(DC 侧逐相
if (<10) → 10硬下限,AC 侧走s32_ac_machine_min_charg_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. 依赖关系
依赖:
system/sys/chip.h(基础类型、uCOS-II 配置链);midware/inverter/inverter.h(型号宏INVERTER_TYPE及由其派生的INV_DC_CTRL)。
被依赖(全部 include 点):
logic/dc_control.c:12logic/logic.c:13
7. 备注与风险点
- 当前构建配置下本头文件等于空壳:
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屏蔽。 #endif缺少注释对应:dc_control.h:46的#endif没有像ac_control.h:78那样标注//#ifdef INV_DC_CTRL,在嵌套条件编译较多的工程里可读性较差。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;。这属工程内常见的隐式全局传递,接口契约不清晰。- 导出粒度偏大:
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()限幅。 - 缺少版本/日期信息:文件头
@version/@date均为空,与工程内其他已填写日期的文件不一致,属遗留填写问题,无功能影响。