# flowctrl 模块说明 > 路径:`app/flowctrl/` > 返回主说明:[README](../../README.md) ## 1. 模块职责 - 实现充电流程控制主逻辑与状态机; - 提供流程对外数据接口与控制接口; - 处理流程关键保护与异常停机条件。 ## 2. 关键文件 - `flowctrl_task.c/h` - `flow_interface.c/h` - `insulation_ctrl.c/h` - `mdu_swh_ctrl.c/h` ## 3. 功能说明 - 管理充电开始、运行、停止、故障等流程状态切换; - 对接故障模块、BMS、计量模块及外部控制命令; - 对外提供流程运行数据和控制入口,供 UI/TCP 等模块调用。 ## 4. 调度与对外接口 该模块由 FreeRTOS 任务 `FlowCtrl` 周期运行(单位:ms),周期来自 `app/app_init/app_init.c`: - `FlowCtrl`:`20ms`(任务入口:`v_flowctrl_task(void *arg)`) 对外接口(来自 `flowctrl_task.h`): - `void v_flowctrl_task_init(void)`:初始化流程状态机/内部缓存 - `void v_flowctrl_task(void *arg)`:流程控制任务入口 - `U8_T u8_flowctrl_get_gun_num(void)`:返回枪数量(供上层界面/通信使用) ## 5. 维护建议 - 流程状态跳转新增分支时需同步检查故障与恢复路径; - 对外接口字段建议统一经 `flow_interface` 暴露,减少模块耦合。 ## 6. 绝缘检查步骤(详细) 绝缘检查主流程由 `flowctrl_task.c` 状态机调度,核心计算在 `insulation_ctrl.c`: - 状态入口:`E_FLOW_INSUL_BEFORE`(`v_flow_ctrl_insul_before`) - 条件:模块进入工作态,且绝缘电压到位(或欧标 15s 跳过电压到位检查); - 动作:切到 `E_FLOW_INSUL_RUNING`,调用 `v_flow_gun_insulation_data_ctrl(gun,0)` 开始绝缘检测资源控制; - 典型日志:`INS V ok...` 或 `15s skip V chk...`。 - 检测执行:`E_FLOW_INSUL_RUNING`(`v_flow_ctrl_insul_runing`) - 调用:`s8_flow_gun_insulation()` -> `s8_insulation_action()` -> `v_insulation_Calculate()`; - 返回:`-1` 检测中,`0` 失败,`1` 正常,`2` 告警; - 完成后记录 `u32_insul_Rx/Ry` 与 `u8_insul_ret`,并切到 `E_FLOW_INSUL_OK`; - 典型日志:`INS res=%d(0F,1OK,2WARN), R+=..., R-=...`。 - 结果收尾:`E_FLOW_INSUL_OK`(`v_flow_ctrl_insul_ok`) - 先等待模块停机/母线下降并执行泄放; - 再根据 `u8_insul_ret` 判定: - `0`:失败,停机故障 `E_FAULT_13042`(绝缘检测失败); - `2`:告警,置 `E_FAULT_13043`(绝缘告警)后允许继续; - `1`:通过,进入后续预充/充电流程。 `insulation_ctrl.c` 内部两阶段计算要点: - 阶段1(大地继电器闭合后): - 采样 `U+gnd` 与 `U-gnd`; - 计算单侧绝缘电阻粗判,若小于阈值直接失败(结果码2); - 阈值规则:`R_min = 100 * (U+gnd + U-gnd)`,`R_max = 500 * (U+gnd + U-gnd)`。 - 阶段2(光耦继电器闭合后): - 二次采样并按公式计算 `R+gnd`、`R-gnd`; - 判定规则: - 任一 `< R_min` => 失败(结果码3); - 任一 `<= R_max` => 告警(结果码4); - 否则 => 正常(结果码5)。 调试建议(结合日志): - 先看 `Th: min/max` 是否与当时 `U+gnd + U-gnd` 一致; - 再看 `R+gnd/R-gnd` 是否显著低于 `R_min`(会触发 `13042`); - 若经常走 `15s skip V chk`,优先排查模块电压到位与采样链路。 ## 7. 关联文档 - 主索引:[README](../../README.md)