csip_aus.h
#pragma pack(1) 的作用与风险4.3 四类限制的双缓冲设计4.4 事件枚举与状态转移矩阵4.5 定时与本文件相关的时间常量5. 对外接口6. 依赖关系7. 备注与风险点源文件路径:
logic/csip_aus.h所属模块:logic(能量调度核心 —— 澳大利亚 CSIP-AUS v1.2 DER 控制) 代码行数:188
1. 文件职责
本文件是 logic/csip_aus.c 的对外契约,定义澳大利亚 CSIP-AUS v1.2 标准下 DER(分布式能源)远程控制的全部数据结构与接口:DER 控制参数表 CSIP_AUS_DER_CONTROL_T、斜坡运行数据 CSIP_AUS_RUN_DATA_T、四态状态机枚举 CSIP_AUS_STATE_E、八类事件枚举 CSIP_AUS_EVENT_E,以及 18 个公开函数原型(csip_aus.h:155-186)与 3 个全局变量。DER 控制的作用是把电网运营商通过 SunSpec/CSIP 下发的四类功率限制(馈网 Export、发电 Gen、输入 Import、负载 Load)落地到 EMS 的输出限制上,并按标准要求的斜坡速率(ramp rate)平滑过渡,在通信超时或电网丢失时回落到安全默认值。它处在调度链的最外层:logic/logic.c:1035 在 dnsp_ramp_control_handle() 中每控制周期调用 csip_aus_der_control_process(),其输出的限制值再被 logic.c:1054-1100、logic/logic.c:757/865-871/1094-1095、midware/inverter/inverter.c:2312/2387 读取以约束充放电。注意:csip_aus.c 里的 14 个 static 函数由该 .c 自己的前置声明块(csip_aus.c:33-45)登记,本头文件不涉及。
2. 关键数据结构与宏
| 名称 | 类型 | 说明 |
|---|---|---|
__CSIP_AUS_H__ | 宏 | include guard |
UNUSED(x) | 宏 | (void)(x),标记未使用参数以消警告;本文件及 .c 中均无使用点 |
CSIP_AUS_VERSION_MAJOR / CSIP_AUS_VERSION_MINOR | 宏 | 1 / 2,标准版本号;代码中无引用点,仅作标识 |
CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR | 宏 | 12。注释写"最大超时倍数:1.2倍",实际用法是 estimated * 12 / 10 |
CSIP_AUS_RAMP_MIN_TIMEOUT_MS | 宏 | 5000,斜坡超时下限 5 秒 |
CSIP_AUS_RAMP_MAX_TIMEOUT_MS | 宏 | 400000,斜坡超时上限 400 秒 |
CSIP_AUS_DER_CONTROL_DISABLE / CSIP_AUS_DER_CONTROL_ENABLE | 宏 | 0 / 1,DER 控制使能取值;代码中无引用点(u8_der_control_enable 直接赋 TRUE/FALSE) |
CSIP_AUS_DER_MODE_NORMAL / _CONTROL / _DEFAULT | 宏 | 0 / 1 / 2,三种 DER 控制模式。注意与 logic.h 的 DER_NORMAL=0/DER_CONTROL=1/DER_CONTROL_DEFAULT=2 数值一致但名字不同,两套枚举在 logic.c 与 csip_aus.c 之间互相赋值 |
CSIP_AUS_ENERGIZE_NORMAL / _STOP / _FORCE_STOP | 宏 | 0 / 1 / 2,OpModEnergize 启停语义;代码中仅 u8_der_energize 字段存在,无赋值/判读点(只被 csip_aus_print_status() 打印) |
CSIP_AUS_STATE_E | 枚举 | DER 控制状态机:CSIP_AUS_STATE_IDLE(0)、CSIP_AUS_STATE_CONTROL(1)、CSIP_AUS_STATE_DEFAULT(2)、CSIP_AUS_STATE_TRANSITION(3) |
CSIP_AUS_EVENT_E | 枚举 | 事件类型:CSIP_AUS_EVENT_NORMAL(0)、_DEFAULT_ENTER(1)、_DEFAULT_EXIT(2)、_CONTROL_ENTER(3)、_CONTROL_EXIT(4)、_TIMEOUT(5)、_GRID_LOSS(6)、_GRID_RESTORE(7)。其中 _DEFAULT_EXIT、_CONTROL_EXIT、_GRID_RESTORE 从未被触发或处理 |
CSIP_AUS_DER_CONTROL_T | 结构体(#pragma pack(1)) | DER 控制主参数表,字段分解见下 |
CSIP_AUS_RUN_DATA_T | 结构体(#pragma pack(1)) | 斜坡运行数据:s32_ramp_target、s32_ramp_current、u8_ramp_active、u8_ramp_enable。四个字段中只有 u8_ramp_enable / u8_ramp_active 被真正使用,两个功率字段无任何读写点 |
g_t_csip_aus_der_control | 全局变量(extern) | CSIP_AUS_DER_CONTROL_T 实例,定义于 csip_aus.c:23 |
g_t_csip_aus_run_data | 全局变量(extern) | CSIP_AUS_RUN_DATA_T 实例,定义于 csip_aus.c:24 |
g_u8_csip_aus_ramp_rate_calculated | 全局变量(extern) | 斜坡速率已计算标志,定义于 csip_aus.c:25(初值 FALSE);用于避免同一周期重复计算 |
CSIP_AUS_DER_CONTROL_T 字段分解(按用途分组):
| 分组 | 字段 | 类型 | 说明 |
|---|---|---|---|
| 基本参数 | u8_der_control_enable | u8 | DER 控制使能,初值由 inverter_der_enable() 按逆变器型号判定 |
u8_der_control_mode | u8 | 当前模式,取值 CSIP_AUS_DER_MODE_* | |
u8_der_energize | u8 | OpModEnergize 启停;无赋值与判读点 | |
u8_opmodconnect | u8 | OpModConnect 并网许可;无赋值与判读点 | |
| 四类限制(当前值 + 默认值) | s32_opmod_explimw / s32_default_opmod_explimw | s32 | 馈网输出限制(W 或 %) |
s32_opmod_genlimw / s32_default_opmod_genlimw | s32 | 逆变输出限制 | |
s32_opmod_implimw / s32_default_opmod_implimw | s32 | 输入(取电)限制,负值表示从电网取电 | |
s32_opmod_loadlimw / s32_default_opmod_loadlimw | s32 | 负载功率限制 | |
| 斜坡速率 | u16_setgradw | u16 | 默认斜坡速率(0.01%/s),来自 logic.h 的 u16_setgradw |
u16_setsoftgradw | u16 | 软启动斜坡速率(0.01%/s) | |
u8_setsoftgradw_set_flag | u8 | 软启动速率更新标志,置 TRUE 后由主循环下发一次给逆变器 | |
u16_ramptms | u16 | 过渡时间(1/100 秒),CSIP-AUS v1.2 新增 | |
| 状态记录 | u8_current_state | u8 | 当前状态,取值 CSIP_AUS_STATE_* |
u8_previous_state | u8 | 上一状态,仅由 csip_aus_der_control_mode_to_state() 写入 | |
u32_state_enter_tick | u32 | 状态进入时间戳(ms) | |
u32_last_update_tick | u32 | 无任何读写点 | |
| 斜坡控制 | s32_ramp_rate_w_per_sec | s32 | 计算出的斜坡速率(W/s) |
u32_ramp_timeout_ms | u32 | 斜坡超时时间(ms) | |
| 旧值快照 | s32_old_opmod_explimw / _genlimw / _implimw / _loadlimw | s32 | 过渡前生效值,用于算变化量与斜坡速率 |
| 超时控制 | u32_control_remaining | u32 | CONTROL 模式剩余时间(秒) |
u32_durationtime | u32 | 控制总持续时长(秒),来自 logic.h | |
| 电网状态 | u8_grid_connected | u8 | 电网连接(0 断开 / 1 连接) |
u8_grid_status_change | u8 | 状态变化标记;置 TRUE 后从不被清零 | |
| 过渡保护 | u8_just_transitioned | u8 | 刚完成转换标志,2 秒内禁止重新触发 |
u32_transition_tick | u32 | 转换时间戳 | |
| 斜坡使能延时 | u8_ramp_enable_pending | u8 | 斜坡使能等待标志 |
u32_ramp_enable_set_tick | u32 | 使能设置时间戳 | |
u8_pending_transition_type | u8 | 0 无 / 1 等切 CONTROL / 2 等切 DEFAULT |
3. 函数清单
本文件为声明文件,共 18 个公开函数原型(csip_aus.h:155-186),全部对应 csip_aus.c 中的定义——除了 csip_aus_set_soft_ramp_rate,它在全工程没有定义。
| 函数名 | 作用域 | 说明 |
|---|---|---|
csip_aus_der_control_process | 全局(原型,csip_aus.h:155) | DER 控制主处理入口(定义于 csip_aus.c:365) |
csip_aus_state_machine_handle | 全局(原型,:156) | 事件驱动的状态机分派(csip_aus.c:474) |
csip_aus_transition_to_default | 全局(原型,:159) | 过渡到 DEFAULT 安全态(csip_aus.c:736) |
csip_aus_transition_to_control | 全局(原型,:160) | 过渡到 CONTROL 远程控制态(csip_aus.c:811) |
csip_aus_transition_to_normal | 全局(原型,:161) | 回到 NORMAL/IDLE(csip_aus.c:864) |
csip_aus_set_soft_ramp_rate | 全局(原型,:164) | 无实现,全工程无调用点(grep 只命中本行) |
csip_aus_get_ramp_enable | 全局(原型,:167) | 读 g_t_csip_aus_run_data.u8_ramp_enable(csip_aus.c:1311) |
csip_aus_get_ramp_rate | 全局(原型,:168) | 读 s32_ramp_rate_w_per_sec(csip_aus.c:1316) |
csip_aus_get_exp_limit | 全局(原型,:169) | 读馈网限制(DEFAULT 模式下取默认值)(csip_aus.c:1321) |
csip_aus_get_imp_limit | 全局(原型,:170) | 读输入限制,下限钳到 10,单相系统 ×3(csip_aus.c:1330) |
csip_aus_get_gen_limit | 全局(原型,:171) | 读发电限制(csip_aus.c:1345) |
csip_aus_get_load_limit | 全局(原型,:172) | 读负载限制,下限钳到 10(csip_aus.c:1354) |
csip_aus_check_ramp_complete | 全局(原型,:175) | 斜坡完成/超时检查(csip_aus.c:970) |
csip_aus_handle_grid_status_change | 全局(原型,:178) | 处理电网连接状态变化(csip_aus.c:1088) |
csip_aus_handle_control_timeout | 全局(原型,:179) | 控制超时处理(csip_aus.c:1116) |
csip_aus_update_grid_status | 全局(原型,:182) | 从 g_t_logic_info 刷新电网状态(csip_aus.c:1135) |
csip_aus_print_status | 全局(原型,:185) | 打印状态(内容被 #if (CSIP_AUS_DEBUG) 门控)(csip_aus.c:1147) |
csip_aus_print_run_data | 全局(原型,:186) | 无实现,全工程无调用点 |
共 18 个原型,无 static 声明、无函数指针类型、无回调。
另有 14 个 static 函数不在本头文件内,它们的前置声明位于 csip_aus.c:33-45(12 个)或直接定义在文件顶部故无需声明(2 个):
| 函数名 | 声明位置 | 定义位置 |
|---|---|---|
csip_aus_state_idle_handle | csip_aus.c:33 | csip_aus.c:570 |
csip_aus_state_default_handle | csip_aus.c:34 | csip_aus.c:601 |
csip_aus_state_control_handle | csip_aus.c:35 | csip_aus.c:641 |
csip_aus_state_transition_handle | csip_aus.c:36 | csip_aus.c:681 |
csip_aus_calculate_ramp_rate | csip_aus.c:38 | csip_aus.c:885 |
csip_aus_data_sync | csip_aus.c:39 | csip_aus.c:154 |
csip_aus_check_and_trigger_events | csip_aus.c:40 | csip_aus.c:510 |
csip_aus_update_control_timeout | csip_aus.c:41 | csip_aus.c:1037 |
csip_aus_handle_mode_change | csip_aus.c:42 | csip_aus.c:119 |
csip_aus_der_control_mode_to_state | csip_aus.c:43 | csip_aus.c:1292 |
csip_aus_common_transition_setup | csip_aus.c:44 | csip_aus.c:1247 |
csip_aus_calculate_ramp_timeout | csip_aus.c:45 | csip_aus.c:1191 |
inverter_set_softgradw | 无(定义在最前) | csip_aus.c:58 |
inverter_der_enable | 无(定义在最前) | csip_aus.c:91 |
因此 csip_aus.c 一共 30 个函数定义(14 个 static + 16 个全局),这 16 个全局函数全部在本头文件登记;头文件另有 2 个声明没有对应实现(csip_aus_set_soft_ramp_rate、csip_aus_print_run_data),故头文件共 18 个原型。
4. 核心逻辑解析
本文件不含可执行逻辑,但以下设计要点是与实现强耦合的契约。
4.1 两套 DER 模式枚举的数值对齐(隐式契约)
本文件定义 CSIP_AUS_DER_MODE_NORMAL/CONTROL/DEFAULT = 0/1/2,logic/logic.h:73-75 另有一套 DER_NORMAL=0、DER_CONTROL=1、DER_CONTROL_DEFAULT=2。二者在代码里互相直接赋值:
csip_aus.c:188、:219读g_t_logic_info.u8_dercontrol(logic.h的枚举语义)赋给g_t_csip_aus_der_control.u8_der_control_mode(csip_aus.h的枚举语义)。csip_aus.c:424、:661、:707、:866反向赋值。
因为数值恰好相同,功能正确;但这个对齐关系只体现在数值上,任何一个枚举插入新成员都会静默破坏映射。头文件里没有任何注释提示这一约束。
同时 CSIP_AUS_DER_MODE_CONTROL 的头文件注释(csip_aus.h:35)写"使用远程下发的当前值作为限制",而 csip_aus.h:36 写 CSIP_AUS_DER_MODE_DEFAULT 为"使用 default 配置值作为安全限制",csip_aus.h:34 写 NORMAL 为"无远程控制限制"——但 csip_aus.h:71 又写 u8_der_control_mode 是 (0:Normal, 1:Default, 2:Control),与 :35/:36 的取值顺序相反(1 到底是 Default 还是 Control)。:71 的注释是错的。
4.2 #pragma pack(1) 的作用与风险
两个结构体都用 #pragma pack(1) 包裹(csip_aus.h:66、:134)。这会取消对齐填充:
- 好处:字段布局与上位机/SunSpec 的点表逐字节对应,便于协议镜像。
- 代价:
s32、u32字段将落在非 4 字节对齐地址上。Cortex-M4 对非对齐访问在单字加载/存储指令上支持有限(LDR/STR可处理非对齐,但LDRD/STRD/多寄存器装载不行),编译器若生成"双字"访问就会触发UsageFault。当前工程里g_t_csip_aus_der_control是全局对象、本身 4 字节对齐,且所有访问都是普通成员读写,实测安全;但没有任何静态断言(STATIC_ASSERT)校验结构体尺寸,一旦插入字段导致某个s32偏移变成 4k+1/2/3 就会埋下隐患。对比logic.h里对配置结构体用了STATIC_ASSERT(ASSERT_FLASH_SECTOR_SIZE % sizeof(...) == 0),本文件缺少同类保护。 - 另外这两个结构体不参与 Flash 持久化(未出现在
data/resume_data相关结构里),所以pack(1)带来的"便于存储"收益在此处很小,主要是为了对齐 SunSpec 点表语义。
4.3 四类限制的双缓冲设计
s32_opmod_*limw(当前生效值)与 s32_default_opmod_*limw(安全默认值)成对存在,加上 s32_old_opmod_*limw(过渡前快照)共三组。这是实现"远程控制超时 → 回落默认值"与"计算斜坡变化量"两个需求的必要设计:
- 超时/离网 → 用
default_*作目标,old_*作起点,算斜坡。 - 收到新限制 →
old_*被刷成旧的opmod_*,新值写入opmod_*,再算斜坡。
三组值必须同时维护,遗漏任何一组都会导致斜坡速率算错(变化量取成 0 → 退化为 inv_rated_output_power / 100)。
4.4 事件枚举与状态转移矩阵
CSIP_AUS_EVENT_E 定义 8 个事件,实际被触发/处理的只有 5 个:
| 事件 | 触发点 | 被哪些状态处理 |
|---|---|---|
CSIP_AUS_EVENT_NORMAL | csip_aus.c:132(模式变更)、:536(NORMAL 模式但状态非 IDLE) | state_default_handle(csip_aus.c:613) |
CSIP_AUS_EVENT_DEFAULT_ENTER | csip_aus.c:136(模式变更)、:544 | state_idle_handle、state_control_handle、state_transition_handle |
CSIP_AUS_EVENT_CONTROL_ENTER | csip_aus.c:140(模式变更)、:558 | state_idle_handle、state_default_handle、state_control_handle、state_transition_handle |
CSIP_AUS_EVENT_TIMEOUT | csip_aus.c:552(剩余时间为 0)、:1126(csip_aus_handle_control_timeout) | state_default_handle、state_control_handle、state_transition_handle |
CSIP_AUS_EVENT_GRID_LOSS | csip_aus.c:1100(csip_aus_handle_grid_status_change) | state_idle_handle(空实现)、state_default_handle、state_control_handle、state_transition_handle |
CSIP_AUS_EVENT_DEFAULT_EXIT | 无触发点 | 无处理分支 |
CSIP_AUS_EVENT_CONTROL_EXIT | 无触发点 | 无处理分支 |
CSIP_AUS_EVENT_GRID_RESTORE | csip_aus.c:1105(电网恢复时发出) | 无处理分支(见 csip_aus.c.md 备注) |
因此 _DEFAULT_EXIT、_CONTROL_EXIT、_GRID_RESTORE 是声明了但未接线的死枚举,而 _GRID_RESTORE 会被发出却无人处理。
4.5 定时与本文件相关的时间常量
| 常量 | 值 | 位置 | 含义 |
|---|---|---|---|
CSIP_AUS_RAMP_MIN_TIMEOUT_MS | 5000 | csip_aus.h:26 | 斜坡超时下限 |
CSIP_AUS_RAMP_MAX_TIMEOUT_MS | 400000 | csip_aus.h:27 | 斜坡超时上限 |
CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR | 12 | csip_aus.h:25 | 斜坡超时放大 1.2 倍。该宏在两处被用于不同单位基准:csip_aus.c:1231 输入已是毫秒,用 × 12 / 10;csip_aus.c:1272 输入是 1/100 秒,用 × 12(因为 1/100 秒 × 12 = 毫秒 × 1.2)。两处结果都以毫秒表示 1.2 倍斜坡时长,是一致的,但基准不同且无注释 |
对应实现里的三处时间使用:u16_ramptms 单位为 1/100 秒(csip_aus.c:939 用 (power_diff * 100) / ramp_tms 反推 W/s,与之一致);u32_durationtime、u32_control_remaining 单位为秒;u32_ramp_timeout_ms、u32_state_enter_tick、u32_transition_tick、u32_ramp_enable_set_tick 单位为毫秒(OSTimeGet(),OS_TICKS_PER_SEC = 1000)。
5. 对外接口
导出(供外部使用):
| 名称 | 类型 | 主要使用方 |
|---|---|---|
g_t_csip_aus_der_control | 全局变量 | 定义在 csip_aus.c:23;外部无直接访问,均通过 csip_aus_get_*() 间接读取 |
g_t_csip_aus_run_data | 全局变量 | 定义在 csip_aus.c:24;外部同样只经 csip_aus_get_ramp_enable() 读取 |
g_u8_csip_aus_ramp_rate_calculated | 全局变量 | 仅 csip_aus.c 内部使用 |
csip_aus_der_control_process | 函数 | logic/logic.c:1035(dnsp_ramp_control_handle() 内) |
csip_aus_get_ramp_enable | 函数 | logic/logic.c:757/871/924/1084/1086/2781/3126/3142/3158/3218/3234/3250、midware/inverter/inverter.c:2312/2387 |
csip_aus_get_exp_limit | 函数 | logic/logic.c:1065 |
csip_aus_get_gen_limit | 函数 | logic/logic.c:1070/1072 |
csip_aus_get_load_limit | 函数 | logic/logic.c:865/866 |
csip_aus_get_imp_limit | 函数 | logic/logic.c:1094/1095 |
csip_aus_get_ramp_rate | 函数 | logic/logic.c:1078/1080 |
其余 csip_aus_* 函数(transition_to_*、state_machine_handle、check_ramp_complete、handle_grid_status_change、handle_control_timeout、update_grid_status、print_status) | 函数 | 仅 csip_aus.c 内部调用;外部无调用方 |
CSIP_AUS_STATE_E / CSIP_AUS_EVENT_E / CSIP_AUS_DER_CONTROL_T / CSIP_AUS_RUN_DATA_T | 类型 | 仅 csip_aus.c 使用;无其他文件 include 本头文件 |
UNUSED / CSIP_AUS_VERSION_* / CSIP_AUS_DER_CONTROL_ENABLE 等宏 | 宏 | 无使用点 |
被调用(本文件引用的符号):仅 #include "includes.h"(csip_aus.h:14)。
6. 依赖关系
依赖:includes.h(提供 u8/u16/u32/s32、TRUE/FALSE)。
被依赖(全部 include 点):
logic/csip_aus.c:13logic/logic.c:26midware/inverter/inverter.c:35
值得注意的是:本文件虽只被 3 个文件 include,但 csip_aus.c 又 include 了 dispatch.h,因此 csip_aus 的编译单元同时依赖 logic.h、data.h、inverter.h、ems.h、ac_control.h 五层模块。
7. 备注与风险点
- 两个函数声明没有实现:
csip_aus_set_soft_ramp_rate(csip_aus.h:164)与csip_aus_print_run_data(csip_aus.h:186)在csip_aus.c中都不存在定义,工程内也无调用点(grep只命中头文件那一行)。这是"声明了未实现、也没人用"的死接口——只要有人开始调用就会链接失败。 csip_aus_set_soft_ramp_rate的功能实际由另一条路径承担:软启动斜坡速率是通过u8_setsoftgradw_set_flag标志 + 主循环里调inverter_set_softgradw()下发的(csip_aus.c:428-432、:1259…),并没有走这个 setter。头文件保留这个声明具有误导性。u8_der_control_mode的取值注释自相矛盾:csip_aus.h:71写(0:Normal, 1:Default, 2:Control),而同文件:34-36与:76-85的宏定义和注释明确是1=CONTROL、2=DEFAULT。:71的注释把 1 和 2 写反了。这是最容易导致按注释写代码出错的点。UNUSED(x)宏定义了但从未使用:csip_aus.h:17。属遗留工具宏。CSIP_AUS_VERSION_MAJOR/MINOR定义了但无人使用:没有版本上报或校验点。作为"标准版本标识"不参与任何逻辑,一旦协议版本升级(v1.2 → v1.3)这两个宏不会触发任何行为变化。CSIP_AUS_DER_CONTROL_ENABLE/DISABLE与 energize 三宏都未被使用:u8_der_control_enable直接赋TRUE/FALSE;u8_der_energize与u8_opmodconnect两个OpModEnergize/OpModConnect字段只在csip_aus_print_status()(被#if CSIP_AUS_DEBUG关掉)里被打印,没有任何赋值点——也就是说这两个字段永远是初值(g_t_csip_aus_der_control是未初始化的全局对象,按 C 标准为 0)。CSIP-AUS 规范的OpModConnect并网许可与OpModEnergize启停控制并未真正实现,只是占了字段位置。CSIP_AUS_EVENT_GRID_RESTORE发得出但没人接:csip_aus.c:1105会在电网恢复时发出该事件,但四个state_*_handle的switch都没有对应case,全部落到default。电网恢复后状态机不会自动离开 DEFAULT 态——只有等下一轮check_and_trigger_events()按u8_der_control_mode触发CONTROL_ENTER才能真正回 CONTROL。这使"电网恢复"的事件语义形同虚设。u8_grid_status_change置位后从不清零:csip_aus.c:1095置TRUE,全文件无任何清零点。因为它没有消费者,功能上无害,但它是一个"永远为真"的状态位,后续维护者若基于它做判断会得到错误结论。u32_last_update_tick与s32_ramp_target/s32_ramp_current三字段无任何读写点:CSIP_AUS_RUN_DATA_T里的s32_ramp_target、s32_ramp_current属于"设计时打算由 EMS 自己算斜坡曲线"的遗留——实际实现改为把斜坡速率下发给逆变器,由逆变器内部执行斜率(inverter_set_softgradw/inverter_set_dnsp_regulation_rate),因此这两个字段被废弃但没删。u32_last_update_tick同理。#pragma pack(1)缺少尺寸静态断言:见 4.2。同工程的logic.h对配置结构体用了STATIC_ASSERT,本文件应补一个STATIC_ASSERT(sizeof(CSIP_AUS_DER_CONTROL_T) == N)。u16_ramptms是同名双义字段,读代码时极易误判:csip_aus.h:95注释写"过渡时间 (1/100 秒)",csip_aus.c:939按(power_diff * 100) / ramp_tms反推速率(与 1/100 秒一致,正确),而csip_aus.c:1272的ramp_tms_value * CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR表面看是"把 1/100 秒当毫秒乘 12"——实际上因为1/100 秒 × 12 = 毫秒 × 1.2,它也正确。问题在于同一个字段既被当 1/100 秒用、又被当"毫秒的 1/12"用,两处都没有单位转换注释。更麻烦的是csip_aus_common_transition_setup()在切到 DEFAULT 时会把本字段清 0(csip_aus.c:1263、:792),下一个周期csip_aus_data_sync()又从g_t_logic_info.u16_ramptms同步回来,两个方向来回覆盖,详见csip_aus.c.md备注 7。CSIP_AUS_RAMP_MAX_TIMEOUT_FACTOR的用法基准不统一:同一宏在csip_aus.c:1231是estimated_ms * 12 / 10(输入已是毫秒,表达 1.2 倍),在csip_aus.c:1272是ramp_tms_value * 12(输入是 1/100 秒,×12同时完成单位换算与 1.2 倍)。结果一致但形式不同,宏名..._FACTOR与注释"最大超时倍数:1.2倍"只覆盖了前一种用法,后一种用法需要读者自行推导单位。建议拆成"单位换算"与"倍率"两个宏,或加注释。- 头文件缺少
u8_previous_state的消费者说明:该字段只被写、从不被读,属于为调试/上报预留的位置,但头文件没有标注"仅保留"。 - 文件头信息较完整(
@file/@author/@version/@date/@brief都填了,@date :2026-02-25),是全工程里少数填写规范的文件;但@date是未来日期,可能是预计交付日的占位。