| 函数 | 行号 | 行数 | 职责 | 调用者 |
|---|---|---|---|---|
| SecondHarBrake_ParamInit | 65-80 | 16 | 初始化制动系数和有效时间 | 系统初始化 |
| SecondHarBrake_faFdStateIsOC | 93-310 | 218 | 判断当前是否在过流状态(制动前提) ⚠️ 含6段重复逻辑 |
faFdBrakeJudge |
| faFdIsBrakeDeal | 320-340 | 21 | 退出制动时复位过流定时器 | 外部 |
| faFdIsBrake | 349-372 | 24 | 核心制动判据: 二次谐波 / 基波 ≥ 比例? | CheckSecondHarmonicBrake |
| ShouldSkipBrake | 375-399 | 25 | 前置条件: 是否跳过制动判断 | faFdBrakeJudge |
| SecondHar_Brake_Enable | 400-418 | 19 | 检查制动功能是否启用 | ShouldSkipBrake |
| UpdateBrakeStatus | 429-444 | 16 | 更新制动状态 + 事件记录 | faFdBrakeJudge |
| CheckSecondHarmonicBrake | 448-461 | 14 | 遍历三相执行制动判据 | faFdBrakeJudge |
| faFdBrakeJudge | 468-578 | 111 | 主状态机: 制动判断 + 去抖 + 超时 | 外部保护逻辑 |
SecondHarBrake_faFdStateIsOC() 中三段式过流检测的相同逻辑(3相循环 + 阈值判断 + 返回比判断 + 启动标志)被完整复制了 6 次:
广州模式×3 段 + 非广州模式×1 + fcous ×1 + vsp5 ×2。每次复制的区别仅在于:读取的阈值的配置来源不同(faFdRunPara.oc_limit vs fcousFdRunPara.oc_limit vs gVspRunPara.value_XJOverFault)
以及启用的 condition 条件不同(region 判断、enable 判断、sect 范围判断)。
这是典型的 Copy-Paste 编程,修改一个地方的阈值逻辑需要同步修改 6 处。
码值²/2(已平方),
代码中的 (QWORD)SecondHar * 100 * 100 和 (QWORD)Fundamental * Ratio * Ratio
公式量纲正确,不需要再次平方。注释中的"平方比较"是对原始码值的描述,
变量已经进行了预计算处理。SecHarOcStartFlag[FA_FD_NUM][SECBRAKENUM][3] 是函数内部 static 3D 数组,
用于跟踪每段过流的启动状态。这意味着:
(1) 单次调用会产生跨周期副作用
(2) 无法进行纯函数测试
(3) 重启后首次调用数组全零,与运行状态的连续性不一致
(4) 与其他保护模块的启动标志(faFdInfo.oc_flag)重复
faFdPara[], faFdRunPara[], faFdInfo[],
faPublicPara[], fcousFaPara[], fcousFdRunPara[],
faSoftYBRunPara, faMemoInfo[], faPtInfo[],
gHarm2Value[][], netproEnable[], vsp5Enable[],
faEnable[], fcousEnable[], gVspRunPara[])。
这些应在统一模块头文件中声明,而非每个 .c 重复写一遍 extern。
inbrake, outbrake,
BrakeJudgeStart, BrakeJudgeEnd, BrakeJudgeCount),
状态转换逻辑与去抖/计时逻辑混在同一个循环里,难以推导状态一致性。
#if 0 包裹的废弃分布式逻辑(wh 20230905 废弃),
包含完整的过流检测代码副本。如果不清理,后续维护者无法判断哪些是有效的。
faFdIsBrake(DWORD Fundamental, DWORD SecondHar, WORD Ratio) 接受 3 个松散参数,
但调用方需要自己从 gaProtYcBuf 和 gHarm2Value 中取出数据。
应改为接受 fd + phase 或结构体指针。
Harm² × 100² > Fundamental² × Ratio²,使用 QWORD(64位)做乘法。
由于 GD32H7 硬件可能未启用硬件 64 位乘法器,编译器会生成软乘法,对性能有影响。
可以优化为浮点比较或分步比较以避免 64 位运算。
isPhaseOverCurrent()checkAllPhasesOverCurrent()#if 0 死代码段0x81 提取为宏 FA_ENABLE_MASKfaFdBrakeJudge 的 3 个 state + 2 个 counter 封装为 BrakeSM 结构体faFdBrakeJudge_Run() 和 faFdBrakeJudge_Reset()BrakeStatefaFdIsBrakeDeal 的调用者也需检查。
重构后文件预计从 579 行 → ~250 行,减少 57%。
重构关键是把 "3 路 for 循环 × 3 相 × 6 种模式 = 54 个条件分支" 的野蛮展开, 抽象为 "配置表 + 统一函数" 的模式。
推荐策略: 立即执行 Phase 1(安全、无风险),Phase 2 结合下次功能迭代一起做,Phase 3 有空再做。