Files
VX4-DiaphragmPump_WeiDaL/压力调节算法迁移.md
2026-08-25 10:37:57 +08:00

3.7 KiB
Raw Permalink Blame History

压力调节算法迁移方案

概要

将 latest 目录中更新后的 InkJetPrinter 的压力调节算法(包括改进的 PID/闭环逻辑、软启动、滑动平均与限速保护等)迁移到当前工作分支的 InkJetPrinter.cpp,保持行为一致并减少对现有模块的破坏。

迁移范围

  • 源:latest/InkJetPrinter.cpp 中的以下实现段
    • 新的/改进的 pressureAdj() 实现
    • PID_realize2()(若存在)与 PID_realize() 的改进版本
    • 相关静态/成员变量(滑动平均缓冲、状态标志、计数器等)
  • 目标:当前工作区的 InkJetPrinter.cpp / InkJetPrinter.h

详细迁移步骤

  1. 分析对比
    • 在 latest 与当前文件中逐段对比 pressureAdj()、PID 函数及相关变量,记录差异点(参数边界、默认值、节拍周期、限幅等)。
  2. 提取实现
    • 从 latest/InkJetPrinter.cpp 中拷贝完整的 pressureAdj() 函数体与所依赖的辅助函数(例如 PID_realize2()、改进版 PID_realize()),并保留原始注释以便审查。
  3. 更新头文件
    • 比对 InkJetPrinter.h,若 latest 新实现引入了新的成员变量(如滑动平均缓冲 m_pressureBuf、m_bufIdx、m_bufValidCount、m_rampDone、m_adjSkip、m_lastAvgPressure 等),将这些成员同步到当前 InkJetPrinter.h(注意初始化与默认值)。
  4. 备份与集成
    • 在修改目标文件前,先创建 InkJetPrinter.cpp.bak(或使用 VCS 提交快照)。
    • 将提取的实现合并入当前 InkJetPrinter.cpp:
      • 保持现有函数签名不变
      • 用条件编译或注释标注替换点,便于回滚
  5. 修正依赖与宏
    • 确认 #ifdef/#define 宏一致(例如 __DAC_ADJ_FUNCTION__、SYS_LINUX 等),修正配置差异或添加兼容分支。
  6. 编译与静态检查
    • 在本地构建项目(或运行 make/IDE 编译),修复因函数声明/类型或命名冲突导致的编译错误。
  7. 功能验证
    • 在测试环境下运行(或使用连接到硬件的板子)验证:
      • 软启动流程(m_rampDone 行为)
      • 压力超限的硬保护与限速
      • 回收泵模式下限速与 maxValue 行为
      • 滑动平均对短期噪声的耐受性
    • 记录测试数据(压力曲线、gearPumpValue 变化)以便对照。
  8. 记录与回滚
    • 将变更写入变更日志并提交到分支。
    • 若出现问题,使用备份或 VCS 回滚,并记录原因与修复建议。

关键代码位置(建议)

  • 源文件(最新实现参考):latest/InkJetPrinter.cpp (检查 pressureAdj、PID 相关实现)
  • 目标文件:InkJetPrinter.cpp、InkJetPrinter.h

验证要点

  • 功能:压力能稳定在目标值附近(±0.5 至 ±5,基于阈值)
  • 稳定性:避免震荡与超调(观察步长、delta 限幅 maxDelta)
  • 安全:在速度报警或 gearPumpRunStopFlag 时,必须能把 gearPumpValue 置 0
  • 性能:软启动和闭环节拍(800ms / 200ms)符合预期

风险与缓解

  • 风险:新版算法可能依赖 sysPara 中的字段初始化或外部状态变化导致行为差异。
    • 缓解:逐步合并并在每步运行单元测试或人工观测点(打印日志)
  • 风险:硬件差异导致限速参数不合适
    • 缓解:在 InkJetPrinter.h 中保留可调参数并提供运行时调整入口

预估时间

  • 分析对比:1–2 小时
  • 代码合并与头文件更新:1–3 小时
  • 编译修复:0.5–2 小时(视错误数量)
  • 测试与验证:2–4 小时(含硬件运行)

如需,我可以:

  • 立即开始第 1 步(分析差异并生成差异清单);
  • 或直接把 latest 中的 pressureAdj() 与相关函数合并到当前 InkJetPrinter.cpp(我会在修改前备份)。