logic.h
#pragma pack(1) 包裹,logic.h:137–644)2.4 导出的全局变量3. 函数清单4. 核心逻辑解析4.1 内存布局契约:#pragma pack(1) + STATIC_ASSERT4.2 顶层聚合 LOGIC_TABLE_T 的分层4.3 SEQUENCE_CONTROL_MODE_E 与优先级链的对应4.4 字节复用与位域4.5 读取接口族的四类语义4.6 与 uCOS-II 的接口约定5. 对外接口5.1 本文件导出的接口5.2 本文件依赖的外部符号6. 依赖关系6.1 依赖6.2 被依赖7. 备注与风险点源文件路径:
logic/logic.h所属模块:logic(能量调度核心) 代码行数:710
1. 文件职责
本文件是 EMS 能量调度核心模块的公共接口头文件,同时承担两项职责:一是定义 logic 模块的全局数据总线 LOGIC_TABLE_T 及其全部成员类型(配置表、运行参数表、状态机枚举、位域联合体),二是导出 logic/logic.c 对外提供的调度入口、读取接口与配置接口。整个工程中凡是要读当前序列控制模式、当前 AC/DC 设定功率、各种截止 SOC、EPO 状态、§14a EnWG 限值的模块,都通过本文件声明的函数或直接访问 g_t_logic_info 来取数;凡是 DC 控 / AC 控 / 派发 / 油机 / 自检等子模块,则通过本文件声明的函数原型被 logic.c 反向调用。它处在「数据契约」的环节:logic.c 是唯一的写入者,logic.h 定义写入内容的类型与读取窗口,HMI、net、midware 等数十个文件依赖它。
2. 关键数据结构与宏
2.1 宏常量
| 名称 | 类型 | 说明 |
|---|---|---|
__LOGIC_H__ | 宏 | include guard(logic.h:9) |
DEBUG_LOGIC | 宏(值 0) | 调试打印总开关;logic.c 中大量 #if (DEBUG_LOGIC) 块受其控制 |
REGULATOR_SPEED | 宏(值 5) | 调节速度常量 |
HYBIRD_SYSTEM_MODE / DC_SYSTEM_MODE / AC_SYSTEM_MODE | 宏(0x03 / 0x02 / 0x01) | 系统类型:混合 / 直流 / 交流,对应 LOGIC_CONFIG_TAB_T.u8_system_mode |
UPS_RESERVE_SOC_MAX / UPS_RESERVE_SOC_MIN | 宏(100 / 4) | UPS 预留 SOC 上下限(百分比) |
GC_CHARGE / GC_RATE | 宏(1 / 2) | 油机(Generator)控制方式:按充电 / 按功率比例 |
CURRENT_FLUCTUATION_MARGIN | 宏(值 5) | 电流波动裕度 |
LOGIC_CTROL_SPECIAL_MAX_COUNT | 宏(值 2) | para_tables[] 数组长度,对应 2 组特殊机型速度参数 |
STATIC_ASSERT / ASSERT_FLASH_SECTOR_SIZE | 宏(外部 midware/debug/debug.h:16/19) | 编译期断言与 Flash 扇区大小别名,被本文件 4 处使用(见 4.1) |
2.2 枚举
| 名称 | 类型 | 说明 |
|---|---|---|
LOGIC_CONTROL_SPECIAL_INV_TYPE_E | 枚举(logic.h:35) | 特殊逆变器机型标记:NOT_SPECIAL_HANDLE=0、SNJ_M5_SPECIAL_HANDLE |
SEQUENCE_CONTROL_MODE_E | 枚举(logic.h:41) | 核心状态机状态集,20 项,从 NOT_SEQUEN_CECONTROL=0 起顺序编号:GC_CECONTROL、NO_BAT_CECONTROL、CMD_FORCE_CHARGE_MODE、SYS_FORCE_CHARGE_MODE、BAT_FORCE_CHARGE_MODE、DISPATCH_BAT_MODE、DISPATCH_FREQ_MODE、DISPATCH_MODE、TIME_FORCE_CHARGE_MODE、TIME_FORBID_DISCHG_MODE、SELFUSE_MODE、USER_FORCE_CHARGE_MODE、FORCE_BAT_FEEDIN_MODE、TIME_PRECHARGE_MODE、TIME_ALLOW_DISCHG_MODE、SELF_TEST_CHARGE_MODE、SOC_CALIBRATIONG_MODE、TIME_PEAK_SHAVING_MODE、SMART_CONTROL_MODE |
RESERVE_SOC_EN_E | 枚举(logic.h:65) | 预留 SOC 使能:RESERVE_SOC_DISABLE=0、RESERVE_SOC_ENABLE |
DER_CONTROL_STATUS_E | 枚举(logic.h:71) | CSIP-AUS DER 控制态:DER_NORMAL=0、DER_CONTROL、DER_CONTROL_DEFAULT |
UK_G100_STATE_REASON_E | 枚举(logic.h:78) | 英国 G100 触发原因 7 项(0 s–15 s、15 s–60 s、>60 s、30 天 3 次、通讯故障等) |
UK_G100_STATE_E | 枚举(logic.h:90) | 英国 G100 状态:STATE1_NORMAL=1、STATE2_OVER_LIMIT、STATE3_FOBID_FEEDIN、STATE4_LOCK。注意从 1 起编号,与 0 值域的其他枚举不同 |
PEAKSHVING_STATE_E | 枚举(logic.h:99) | 削峰填谷状态:INITIAL_IDLE=0、NO_INVERTER_POWER_STATE、POWER_REGULATION_STATE |
EPO_STATUS_E | 枚举(logic.h:107) | EPO 状态:EPO_IDLE=0、EPO_SEND_SHUTDOWN、EPO_SEND_STARTUP |
RRCR_EZA_STATUS_E | 枚举(logic.h:114) | 德国远程功率限值:ALL_DISABLE=0、RRCR_ENABLE、EZA_ENABLE |
FAST_DISPATCH_FLAG_E | 枚举(logic.h:121) | 快速调度事件标志位:FAST_DISPATCH_IDLE=0、POST_PEND_FAST_ENABLE=1、POST_LOGIC_CALCULATE_DONE=2、PEND_LOGIC_CALCULATE_DONE=3、POST_INV_CALCULATE_DONE=4、PEND_INV_CALCULATE_DONE=7。与 g_t_fast_dispatch_flag 事件标志组逐位对应 |
SMART_CONTROL_STATE_E | 枚举(logic.h:131) | 智能化控制:STATE_NORMAL=0、STATE_OVERMATCH |
2.3 结构体与联合体(整体被 #pragma pack(1) 包裹,logic.h:137–644)
| 名称 | 类型 | 说明 |
|---|---|---|
LOGIC_CONTROL_PARAMETER_T | 结构体(logic.h:138) | 系统运行参数镜像表:逆变器特性(调节步长、扰动标记、过载系数、AC/DC 计算间隔、微调范围、自耗、控制精度、补偿功率、maxfeedin 偏置、三相不平衡最小充电功率)、逆变器规格(相数、额定输入/输出/充/放功率)、逆变器运行信息(PV/电网状态、三相 Grid/INV/Backup 电压功率频率、PV 功率、电池功率电流)、电池规格与运行信息(SOC、电压、总功率)、电表运行信息(连接状态、三相电压功率)、调节参数(5 个强充标记、s32_max_feedin_power、s32_storage_feedin_power、充放电限值、电流限值、6 个计算间隔 tick、u8_logic_power_calculation_sync_flag、u16_dc_disturbance_count) |
LOGIC_CONTROL_SPECIAL_HANDLE_T | 结构体(logic.h:240) | 特殊机型调节速度参数组,8 个 u8 字段,logic.c 中以 para_tables[2] 实例化 |
UK_G100_TABLE_T | 结构体(logic.h:252) | G100 持久化状态:u8_reserved[4]、u32_tick_state2[3]、u32_tick_state3[3](两级三次事件时间戳环形表)、u8_system_state(UK_G100_STATE_E)、u8_state_reason(UK_G100_STATE_REASON_E) |
SOC_CALIBRATION_TABLE_T | 结构体(logic.h:263) | SOC 校准配置:使能、周期使能、周期天数、下次校准年月日分钟、上次校准年月日分钟 |
SMART_CONTROL_TABLE_T | 结构体(logic.h:278) | 智能化控制配置:u8_charge_cutoff_soc(1%)、超充起止时间(min)、u32_pv_max_power(W)、u8_ctrl_date(day) |
LOGIC_CONFIG_TAB_T | 结构体(logic.h:288) | 主逻辑配置表,落盘主体:u16_head、旧版时间段强充/允放(各 2 段 + Charger_Cut_SOC + UPS_Reserve_SOC)、PV 容量(储能机/并网机)、u8_max_feedin_percent、系统类型、油机 13 个字段、RRCR 4 档馈网百分比、离网带载控制(u8_cutoff_soc/u8_wakeup_soc)、UPS 预留 SOC 使能、储能机电网侧空开规格、电网功率限制、weekday_charge_discahrge_en(bit0 强充 / bit1 允放)、逆变视在功率限制、电池时间段馈网使能、并/离网低 SOC、预充使能、UK_G100_TABLE_T t_g100_info、u8_epo_config_en(bit0 使能 / bit4 保护)、u8_ups_connect_load_flag、14a EnWG 使能、SOC_CALIBRATION_TABLE_T、削峰填谷(峰值/谷值/回差 + 2 段峰 + 2 段谷 + 放电截止 SOC)、NPE 使能、预付费电表、功率支撑、maxfeedin 优先/偏置标志、智能化控制、奥地利 u8_kng_wlv_config_en、u8_reserved[83]、u16_crc_code |
LOGIC_TIME_CONTROL_TAB_T | 结构体(logic.h:399) | 单个充/放时间段条目(16 字节定长,含 u8_reserved[2]):周标记、起止分钟、截止 SOC、功率 |
LOGIC_TIME_BAT_FEEDIN_CONTROL_TAB_T | 结构体(logic.h:418) | 单个强制电池馈网时间段条目(22 字节定长,含 u8_reserved[10]) |
TIME_CONTROL_RUN_TAB_T | 结构体(logic.h:430) | EXTEND1 + EXTEND2 的运行期合并视图(u8 + 14 + 14 条),logic.c 未直接使用 |
LOGIC_CONFIG_EXTEND1_TAB_T | 结构体(logic.h:437) | 新版时间段表:u16_head + 14 条 LOGIC_TIME_CONTROL_TAB_T(充电段)+ u16_crc_code |
LOGIC_CONFIG_EXTEND2_TAB_T | 结构体(logic.h:446) | 同 EXTEND2 结构,存放另外 14 条充/放电时间段 |
LOGIC_CONFIG_EXTEND3_TAB_T | 结构体(logic.h:455) | u16_head + 6 条 LOGIC_TIME_BAT_FEEDIN_CONTROL_TAB_T + u8_reserved[144] + u16_crc_code |
SELF_TEST_RESULT_U | 联合体 + 位域(logic.h:466) | u16_all 与位域 bit 共用:grid 电表 L1/L2/L3 失联与接反、PV 电表 L1/L2/L3 位置错误、u8_other_reason、bit10–bit15(注释把低位组标为 Bit0、高位组标为 Bit1,实为同一 u16 的 16 位) |
LOGIC_TABLE_T | 结构体(logic.h:494) | 顶层数据总线(g_t_logic_info 的类型),各字段见 4.2 |
2.4 导出的全局变量
| 名称 | 类型 | 说明 |
|---|---|---|
g_t_logic_info | LOGIC_TABLE_T(logic.h:646,定义于 logic.c:34) | 逻辑模块唯一全局数据总线,全工程核心变量 |
para_tables[LOGIC_CTROL_SPECIAL_MAX_COUNT] | LOGIC_CONTROL_SPECIAL_HANDLE_T[2](logic.h:647,定义于 logic.c:52) | 特殊机型调节速度参数表 |
3. 函数清单
本文件只包含函数原型声明,共 49 条(logic.h:649–708)。表中「定义位置」列标注该函数在本工程中的实际实现文件。
| 函数名 | 作用域 | 说明(定义位置) |
|---|---|---|
task_system_logic_control | 全局 | uCOS-II 逻辑控制任务体(logic.c:2902),由 user/main.c:211 创建 |
logic_charge_dischg_power_limit | 全局 | 充放电功率限制总入口,内部按 INV_DC_CTRL/INV_AC_CTRL 分发(logic.c:1742) |
bat_force_charge | 全局 | 强充模式功率计算(logic.c:1761) |
bat_force_discharge | 全局 | 强放模式功率计算(logic.c:1782) |
bat_power_control | 全局 | 指令功率控制模式计算(logic.c:1803) |
self_use_funtion | 全局 | 自发自用模式计算(logic.c:1823) |
calculate_gc_chgpower | 全局 | 油机充电功率计算,由 midware/inverter/inverter.c 在逆变器任务内调用(logic.c:2083) |
no_bat_logic_control | 全局 | 无电池模式计算(logic.c:2023) |
logic_read_sequencecontrol_mode | 全局 | 读当前序列控制模式(logic.c:2975) |
logic_set_sequencecontrol_mode | 全局 | 外部强制覆盖序列控制模式(logic.c:2987) |
logic_read_mppt_percentage | 全局 | 读 MPPT 百分比,AC 控下可被 SunSpec WSet 覆盖(logic.c:2999) |
logic_read_max_feedin_power | 全局 | 读系统最大允许馈网功率(logic.c:3017) |
logic_read_gc_charger_cut_soc | 全局 | 读油机充电截止 SOC(logic.c:3029) |
logic_read_user_charger_cut_soc | 全局 | 读用户自定义强充截止 SOC(logic.c:3041) |
logic_read_charger_cut_soc | 全局 | 读时间段强充截止 SOC(logic.c:3053) |
logic_read_feedin_cut_soc | 全局 | 读强制电池馈网截止 SOC(logic.c:3065) |
logic_read_ups_reserve_soc | 全局 | 读 UPS 预留 SOC(logic.c:3089) |
logic_read_ups_reserve_flag | 全局 | 读 UPS 预留 SOC 使能标志(logic.c:3112) |
logic_read_allow_discharge_cut_soc | 全局 | 读允放截止 SOC(logic.c:3101) |
logic_read_peakshving_discharge_cut_soc | 全局 | 读削峰填谷放电截止 SOC(logic.c:3077) |
logic_read_dc_total_set_bat_power | 全局 | 读 DC 侧电池设定功率(DNSP ramp 生效时返回 ramp 值,logic.c:3124) |
logic_read_dc_total_set_inv_power | 全局 | 读 DC 侧逆变设定功率(同上,logic.c:3140) |
logic_read_dc_total_set_grid_power | 全局 | 读 DC 侧馈网设定功率(同上,logic.c:3156) |
logic_read_dc_three_phase_set_bat_power | 全局 | 读 DC 三相不均衡电池设定功率(logic.c:3172) |
logic_read_dc_three_phase_set_inv_power | 全局 | 按相索引读 DC 三相不均衡逆变设定功率(logic.c:3184) |
logic_read_ac_total_set_inv_power | 全局 | 读 AC 侧逆变设定功率(ramp 分流,logic.c:3216) |
logic_read_ac_total_set_bat_charge_limit_power | 全局 | 读 AC 侧电池充电限值(ramp 分流,logic.c:3232) |
logic_read_ac_total_set_bat_dischg_limit_power | 全局 | 读 AC 侧电池放电限值(ramp 分流,logic.c:3248) |
logic_read_ac_total_set_bat_forced_charge_en | 全局 | 读 AC 侧总功率强充使能(logic.c:3264) |
logic_read_ac_three_phase_set_inv_power | 全局 | 按相索引读 AC 三相不均衡逆变设定功率(logic.c:3276) |
logic_read_ac_three_phase_set_bat_charge_limit_power | 全局 | 读 AC 三相不均衡电池充电限值(logic.c:3308) |
logic_read_ac_three_phase_set_bat_dischg_limit_power | 全局 | 读 AC 三相不均衡电池放电限值(logic.c:3320) |
logic_read_ac_three_phase_set_bat_forced_charge_en | 全局 | 读 AC 三相不均衡强充使能(logic.c:3332) |
epo_set_config_enable | 全局 | 写 EPO 使能位,保护激活时拒绝(logic.c:3356,调用方 net/server.c:4966) |
epo_read_config_enable | 全局 | 读 EPO 使能位(logic.c:3379) |
epo_set_protect_enable | 全局 | 写 EPO 保护位 bit4(logic.c:3391) |
epo_read_protect_enable | 全局 | 读 EPO 保护位 bit4(logic.c:3411) |
epo_set_signal_status | 全局 | 设置 EPO 外接短路信号状态(logic.c:3423) |
epo_read_signal_status | 全局 | 读 EPO 外接短路信号状态(logic.c:3435) |
sys_get_soc_calibration_flag | 全局 | SOC 校准阶段查询(0 空闲 / 1 充电 / 2 放电,logic.c:1233) |
uk_g100_state_change | 全局 | 全工程无定义,属死声明(logic.h:698) |
system_self_test | 全局 | 系统自检驱动(logic/self_test.c:240,被 logic.c:2306 调用) |
enwg_device_limit_power | 全局 | 德国 §14a 受控设备总功率上限公式(logic.c:123) |
deu_14a_enwg_handle | 全局 | 德国 §14a EnWG 主处理(logic.c:160) |
get_enwg_bat_charge_limit | 全局 | §14a 电池买电限值读取(logic.c:3446) |
get_enwg_evc_power_limit | 全局 | §14a 充电桩限值读取(logic.c:3457,调用方 midware/evc/evc.c:891、evc_ii.c:1647/1823) |
logic_read_time_force_chg_flag | 全局 | 读时间段强充标志(logic.c:3469,调用方 midware/bms/bms.c:2230) |
logic_comparing_time | 全局 | 判断是否处于 05:00–18:00(logic.c:3481) |
sys_limited_by_csip_judge | 全局 | 判断是否处于 CSIP 调度受限态(logic.c:3499) |
get_maxfeedin_priority_flag | 全局 | 判断是否 maxfeedin 优先(logic.c:3515) |
4. 核心逻辑解析
本文件不含可执行语句,其「逻辑」体现为对 logic.c 行为的契约约束。
4.1 内存布局契约:#pragma pack(1) + STATIC_ASSERT
整个结构体集合被 #pragma pack(1)(logic.h:137)与 #pragma pack()(logic.h:644)包裹,即所有配置结构体都是紧凑无填充布局。这是 Flash 落盘的硬性要求:4 张配置表要按固定字节偏移写入 LOGIC_CONFIG_PAGE(4072)、LOGIC_CONFIG_PAGE2/3/4(4091/4092/4093,定义于 data/system_config/system_config.h:24/43/44/45)。
4 处编译期断言强制各表大小能整除 Flash 扇区(logic.h:397、444、453、464):
STATIC_ASSERT(ASSERT_FLASH_SECTOR_SIZE % sizeof(LOGIC_CONFIG_TAB_T) == 0);
STATIC_ASSERT 定义于 midware/debug/debug.h:16,展开为 typedef char static_assertion_##__COUNTER__[(condition) ? 1 : -1]。也就是说,只要有人给这 4 张表加字段导致大小不再是扇区整除关系,编译会立刻报错;这是本文件最关键的自保护机制。给 u8_reserved[] 留出的空间(主表 83 字节、EXTEND3 144 字节、时间段条目 2 / 10 字节)正是为满足该对齐要求而预留的填充。
4.2 顶层聚合 LOGIC_TABLE_T 的分层
LOGIC_TABLE_T(logic.h:494–643)把模块状态拆成 5 层:
- 4 张落盘配置表:
t_config_data(主表,LOGIC_CONFIG_TAB_T)、t_config_extend1_data/t_config_extend2_data(新版时间段)、t_config_extend3_data(强制电池馈网时间段)。这四张是从 Flash 加载、可被 HMI/云端改写并回写 Flash 的部分,各自带u16_head与u16_crc_code(主表只有u16_crc_code)。 - 运行参数镜像:
t_logic_control_parameter(LOGIC_CONTROL_PARAMETER_T),每周期由logic_sys_running_info_handle()全量重写,掉电不保留,是唯一的实时采样快照。 - 派生运行态标志与限值:
u8_sequencecontrol_mode、u8_drm_mode、u16_drm_state、RRCR/EZA/DEU/WLV 馈网百分比、指令功率控制(u8_bat_power_control_flag、s16_bat_control_power、s16_inv_control_power)、G100 恢复指令(u8_uk_G100_SystemState/_StateReason/_RebootState/_tmpva)、各类时间段结果标志(time_force_charge_flag/time_forbid_dischg_flag/time_allow_discharge_flag/time_force_bat_feedin_flag/u8_time_peak_clip_flag/u8_time_valley_fill_flag)。 - CSIP-AUS v1.2 DER 控制参数:
u8_dercontrol、u8_opmodenergize、u8_opmodconnect、4 个s32_opmod*limw及其 default 版本、u16_ramptms、u16_setgradw/u16_default_setgradw、u16_setsoftgradw、u32_durationtime(logic.h:543–559)。 - DC/AC 设定功率输出区:DC 总功率 3 个(电池/逆变/馈网)、DC 三相不均衡 4 个、AC 总功率 4 个(逆变 + 充/放限值 + 强充使能)、AC 三相不均衡 6 个、油机 2 个、PV 百分比、EPO 信号、自检使能、14a EnWG 使能与额度、削峰填谷 4 个、SOC 校准 4 个、电池自适应 2 个,以及 DNSP 旧值与 ramp 值 12 个(
logic.h:628–640,s32_*_old与s32_*_ramp成对出现)加u8_dnsp_maxfeedin_priority_flag。
这一分层的含义:t_config_data 系是「持久配置」,t_logic_control_parameter 是「实时输入」,其余是「本模块计算出的中间量与最终输出」。
4.3 SEQUENCE_CONTROL_MODE_E 与优先级链的对应
logic.c 的 ongrid_logic_handle() 用一个 if-else 链按固定优先级给 u8_sequencecontrol_mode 赋值,链上出现的枚举成员及其次序为:
GC_CECONTROL → NO_BAT_CECONTROL → SELF_TEST_CHARGE_MODE → SOC_CALIBRATIONG_MODE → CMD_FORCE_CHARGE_MODE → SYS_FORCE_CHARGE_MODE → USER_FORCE_CHARGE_MODE → BAT_FORCE_CHARGE_MODE → DISPATCH_BAT_MODE → DISPATCH_FREQ_MODE → DISPATCH_MODE → SMART_CONTROL_MODE → (FORCE_BAT_FEEDIN_MODE / TIME_PEAK_SHAVING_MODE / TIME_FORCE_CHARGE_MODE / TIME_FORBID_DISCHG_MODE / TIME_ALLOW_DISCHG_MODE / SELFUSE_MODE)。
枚举成员 TIME_PRECHARGE_MODE 在本文件中声明但 logic.c 从未赋值或比较,属预留值。NOT_SEQUEN_CECONTROL 只在非并网路径由 other_logic_handle() 写入。
4.4 字节复用与位域
u8_epo_config_en(LOGIC_CONFIG_TAB_T,logic.h:362):注释明确「bit0:enable,bit4:protect flag」,一个字节承载两位独立语义。对应的读写接口成对出现:epo_set/read_config_enable操作低半字节、epo_set/read_protect_enable操作 bit4。SELF_TEST_RESULT_U(logic.h:466):u16_all联合体视图与位域视图共存,使同一u16既能整字写入 Flash / 上报,也能按位查询具体故障。位域用两个u8段声明(8 + 8 位),注意位域跨字节的分配顺序依赖编译器实现。weekday_charge_discahrge_en(logic.h:348):bit0 表示新版强充时间段、bit1 表示新版允放时间段,logic.c:1579/logic.c:1664用& 0x01/& 0x02分别判断。- 时间段周标记(
LOGIC_TIME_CONTROL_TAB_T.time_charge_week_day等):bit0~bit6 对应周日~周六,bit7 未使用(logic.c中传0xFF表示每天有效,判定时先与0x7F屏蔽)。
4.5 读取接口族的四类语义
logic.h:660–688 与 logic.h:705–708 的读取接口有四种不同语义,调用时不能当成纯粹 getter:
- 恒等映射(直接返回
g_t_logic_info某字段):logic_read_sequencecontrol_mode、logic_read_gc_charger_cut_soc、logic_read_user_charger_cut_soc、logic_read_peakshving_discharge_cut_soc等。 - 条件分流(
logic_read_dc_total_set_*/logic_read_ac_total_set_*):在csip_aus_get_ramp_enable() && sys_limited_by_csip_judge()成立时返回*_ramp字段,否则返回原始设定字段。这正是LOGIC_TABLE_T中 12 个_old/_ramp字段存在的理由——它们只通过接口层暴露,外部模块不需要知道渐进限幅的存在。 - 按相索引:
logic_read_dc_three_phase_set_inv_power(phase)、logic_read_ac_three_phase_set_inv_power(phase),用PHASE_L1/L2/L3取 A/B/C 相,未知相返回 0。 - 派生计算:
logic_read_mppt_percentage(AC 控 + SunSpecWSet使能时可返回 SunSpec 值)、logic_read_gc_charger_cut_soc(油机 SOC 模式返回GCSOCEnd否则 100)、logic_read_max_feedin_power(返回u32而源字段为s32)。
4.6 与 uCOS-II 的接口约定
FAST_DISPATCH_FLAG_E(logic.h:121)是「逻辑任务 ↔ 逆变器任务」生产者-消费者链的位名定义,实际标志组 g_t_fast_dispatch_flag 在 user/main.c:62/126 创建、user/main.h:62 声明。时序为:net/server.c:838 置 POST_PEND_FAST_ENABLE → 逻辑任务(logic.c:2912)取走并置 POST_LOGIC_CALCULATE_DONE(logic.c:2953)→ 逆变器任务(inverter.c:1054)等 PEND_LOGIC_CALCULATE_DONE、完成后置 POST_INV_CALCULATE_DONE(inverter.c:1185)→ 逆变器任务再等 PEND_INV_CALCULATE_DONE(inverter.c:1207,带 OS_FLAG_CONSUME 消费)。本文件只提供位名,不提供任何同步原语;g_t_logic_info 的读写没有互斥保护。
5. 对外接口
5.1 本文件导出的接口
- 全局变量(2 个):
g_t_logic_info(extern LOGIC_TABLE_T,logic.h:646)、para_tables[](extern LOGIC_CONTROL_SPECIAL_HANDLE_T[2],logic.h:647)。这两者是本模块被引用最广的符号。 - 函数原型(49 条):调度入口 8 条(
task_system_logic_control、logic_charge_dischg_power_limit、bat_force_charge、bat_force_discharge、bat_power_control、self_use_funtion、calculate_gc_chgpower、no_bat_logic_control);模式读写 2 条(logic_read/set_sequencecontrol_mode);SOC/标志读取 14 条;DC/AC 设定功率读取 13 条;EPO 6 条;§14a EnWG 4 条(enwg_device_limit_power、deu_14a_enwg_handle、get_enwg_bat_charge_limit、get_enwg_evc_power_limit);其他 4 条(system_self_test、logic_read_time_force_chg_flag、logic_comparing_time、sys_limited_by_csip_judge、get_maxfeedin_priority_flag)。 - 类型定义:11 个枚举、15 个结构体/联合体,供全工程复用(如
midware/inverter/parallel.h、net/ems.h中引用SEQUENCE_CONTROL_MODE_E的取值)。
5.2 本文件依赖的外部符号
仅 include 两个头:includes.h(logic.h:13)与 debug.h(logic.h:14)。includes.h 提供 u8/u16/u32/s16/s32/STATIC_ASSERT 所在的基础类型体系与 uCOS-II 环境;debug.h 提供 STATIC_ASSERT 与 ASSERT_FLASH_SECTOR_SIZE(后者又依赖 flash.h 的 FLASH_SECTOR_SIZE)。本文件不含任何函数调用与变量引用,因此无运行时依赖。
6. 依赖关系
6.1 依赖
includes.h(聚合了 chip.h、uCOS-II、app_cfg.h 等)、debug.h → chip.h + flash.h。
6.2 被依赖
全工程共 40+ 个 .c / .h 直接 #include "logic.h",按模块分组:
logic/:logic.c、ac_control.c、dc_control.c、dispatch.c、generator.c、handle_priority.c、csip_aus.c、self_test.c。data/:resume_data/flash/flash_data_store.c、system_config/system_config.c。hmi/:key.c、led.c、led/app_led.c、ui/ui_main.c、ui/ui_factory_mode.c、ui/ui_setting_user_func_grid_power_limit.c、ui/ui_setting_user_func_grid_pq_mode_export_ctrl.c、ui/ui_setting_user_func_work_mode_select.c、ui/ui_setting_user_fun_grid_force_charge.c。midware/:auxiliary/system_aux.c、bms/bms.c、evc/evc.c、evc/evc_ii.c、interface/interface.c、interface/drm/drm.c、interface/dry_node/dry_node.c、interface/modbus/modbus.c与modbus.h、interface/modbus/sunspec_business.c、interface/modbus/sunspec_modbus.c、inverter/inverter.c、inverter/parallel.c、inverter/parallel_comm/parallel_sci.c,以及各厂商协议文件inverter/alphaess/alphaess_comm_can.c/alphaess_comm_usart.c、inverter/ginlong/ginlong_comm_can.c/ginlong_comm_usart.c、inverter/goodwe/goodwe_comm.c、inverter/inovance/inovance_comm_can.c/inovance_comm_usart.c、inverter/kelong/kelong_comm.c。net/:ems.c、server.c。user/:main.c(通过main.h的事件标志组与TASK_LOGIC_CONTROL_PRIO协作)。
7. 备注与风险点
uk_g100_state_change是死声明(logic.h:698):全工程检索无任何定义,也无调用者。G100 状态迁移实际由logic.c内部的uk_g100_handle直接写t_config_data.t_g100_info完成,该原型应删除或补齐实现。TIME_PRECHARGE_MODE未被使用(logic.h:57):枚举中定义但logic.c既不赋值也不比较,属预留/遗留值。同理PEAKSHVING_STATE_E、EPO_STATUS_E、RESERVE_SOC_EN_E、LOGIC_CONTROL_SPECIAL_INV_TYPE_E在本文件声明后,全工程未见以这些类型名声明变量。STATIC_ASSERT的__COUNTER__拼接依赖编译器行为(debug.h:17):static_assertion_##__COUNTER__中##会阻止__COUNTER__做宏展开,导致 4 处断言产生同名的typedef。由于断言成立时数组长度恒为1、类型完全相同(C11 允许同类型重复 typedef),当前可编译;但一旦条件不成立,报错信息会是「重复 typedef」而非直观的断言失败,排查体验较差。u8_epo_config_en的多位复用缺少注释约束(logic.h:362):注释只写了 bit0 与 bit4,epo_set_protect_enable用&= 0xEF清 bit4,隐含要求 bit1–bit3、bit5–bit7 保持为 0;若将来复用其他位,&= 0xEF的写法需要同步审查(& 0x0F == TRUE的判读方式也会误判 bit1–bit3 被置位的情况)。SELF_TEST_RESULT_U位域跨字节(logic.h:466–492):位域用两个u8段声明共 16 位,注释中//Bit0与//Bit1实际指第 0 字节与第 1 字节而非位号,容易误读。位域在pack(1)下的分配顺序依赖编译器,若换工具链需重新核对u16_all与位域的对应关系。LOGIC_CONFIG_TAB_T的u8_reserved[83]紧邻u16_crc_code(logic.h:393–394):u16_crc_code位于结构体末尾且pack(1)生效,因此其字节偏移 =sizeof(LOGIC_CONFIG_TAB_T) - 2,CRC 计算范围需与写入侧(data/system_config)严格一致;任何字段增删都会同时改变 CRC 覆盖区与扇区对齐,必须靠 4 处STATIC_ASSERT兜住。LOGIC_TIME_CONTROL_TAB_T的 16 字节定长存在隐式填充(logic.h:399–416):字段按「1+2+2+1+2 + 2 + 2+1+1+2+2」排布,在pack(1)下恰好为 16 字节,看似有u8_reserved[2]做显式填充,但实际只用于预留,不参与对齐保证;改动字段顺序会直接改变 EXTEND1/2 的落盘布局。- 返回值类型与源字段不一致:
logic_read_max_feedin_power()返回u32而源字段是s32(logic.h:663);logic_read_peakshving_discharge_cut_soc()与logic_read_allow_discharge_cut_soc()返回u16而源字段分别是u8与u8。上游模块若把结果用于有符号比较,需自行注意符号语义。 - 头文件暴露了内部实现细节:
LOGIC_TABLE_T中的 CSIP-AUS 字段、DNSP_old/_ramp字段、u8_get_soc_calibration_flag/u8_soc_calibration_charge_flag等,本质是logic.c的内部状态,却全部公开。它们可被任意模块直接写(例如midware/interface/modbus/modbus.c:6327与net/server.c:5142直接写g_t_logic_info.u8_dercontrol),绕过了logic_set_sequencecontrol_mode这类受控接口,破坏了模块封装。 g_t_logic_info无并发保护:作为全工程最热的结构体,它由逻辑任务写、被逆变器/并机/网络/HMI 任务读,本文件只声明extern,不提供任何访问宏或原子性约定;4.6 节的事件标志链只保证计算先后顺序,不保证结构体读到的是完整一致快照。LOGIC_CONFIG_TAB_T内嵌了其他模块的结构体:UK_G100_TABLE_T(logic.h:361)与SOC_CALIBRATION_TABLE_T(logic.h:366)被直接内嵌进主配置表,因此这两个子结构体的大小变化会连带影响主表大小、CRC 覆盖面与 Flash 页对齐,存在跨模块的隐式耦合。