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

logic.h

源文件路径: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_infoLOGIC_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 层:

  1. 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)。
  2. 运行参数镜像:t_logic_control_parameter(LOGIC_CONTROL_PARAMETER_T),每周期由 logic_sys_running_info_handle() 全量重写,掉电不保留,是唯一的实时采样快照。
  3. 派生运行态标志与限值: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)。
  4. 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)。
  5. 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 字节复用与位域

4.5 读取接口族的四类语义

logic.h:660–688 与 logic.h:705–708 的读取接口有四种不同语义,调用时不能当成纯粹 getter:

  1. 恒等映射(直接返回 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 等。
  2. 条件分流(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 字段存在的理由——它们只通过接口层暴露,外部模块不需要知道渐进限幅的存在。
  3. 按相索引: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。
  4. 派生计算:logic_read_mppt_percentage(AC 控 + SunSpec WSet 使能时可返回 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 本文件导出的接口

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",按模块分组:

7. 备注与风险点

  1. uk_g100_state_change 是死声明(logic.h:698):全工程检索无任何定义,也无调用者。G100 状态迁移实际由 logic.c 内部的 uk_g100_handle 直接写 t_config_data.t_g100_info 完成,该原型应删除或补齐实现。
  2. TIME_PRECHARGE_MODE 未被使用(logic.h:57):枚举中定义但 logic.c 既不赋值也不比较,属预留/遗留值。同理 PEAKSHVING_STATE_E、EPO_STATUS_E、RESERVE_SOC_EN_E、LOGIC_CONTROL_SPECIAL_INV_TYPE_E 在本文件声明后,全工程未见以这些类型名声明变量。
  3. STATIC_ASSERT 的 __COUNTER__ 拼接依赖编译器行为(debug.h:17):static_assertion_##__COUNTER__ 中 ## 会阻止 __COUNTER__ 做宏展开,导致 4 处断言产生同名的 typedef。由于断言成立时数组长度恒为 1、类型完全相同(C11 允许同类型重复 typedef),当前可编译;但一旦条件不成立,报错信息会是「重复 typedef」而非直观的断言失败,排查体验较差。
  4. 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 被置位的情况)。
  5. SELF_TEST_RESULT_U 位域跨字节(logic.h:466–492):位域用两个 u8 段声明共 16 位,注释中 //Bit0 与 //Bit1 实际指第 0 字节与第 1 字节而非位号,容易误读。位域在 pack(1) 下的分配顺序依赖编译器,若换工具链需重新核对 u16_all 与位域的对应关系。
  6. 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 兜住。
  7. 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 的落盘布局。
  8. 返回值类型与源字段不一致: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。上游模块若把结果用于有符号比较,需自行注意符号语义。
  9. 头文件暴露了内部实现细节: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 这类受控接口,破坏了模块封装。
  10. g_t_logic_info 无并发保护:作为全工程最热的结构体,它由逻辑任务写、被逆变器/并机/网络/HMI 任务读,本文件只声明 extern,不提供任何访问宏或原子性约定;4.6 节的事件标志链只保证计算先后顺序,不保证结构体读到的是完整一致快照。
  11. LOGIC_CONFIG_TAB_T 内嵌了其他模块的结构体:UK_G100_TABLE_T(logic.h:361)与 SOC_CALIBRATION_TABLE_T(logic.h:366)被直接内嵌进主配置表,因此这两个子结构体的大小变化会连带影响主表大小、CRC 覆盖面与 Flash 页对齐,存在跨模块的隐式耦合。