实现流量控制前馈 + 增益调度(MFC 结构)

按 plan.md 新增三个交付物,全部默认关闭以保持与纯 PID 的 A/B 兼容:

- valve_model.py:阀特性模型 Q_ss = A_eff(x)·P1_abs·F(r),含 ISO 6358
  椭圆 F(r)、行程/面积互逆插值、单调性校验、JSON 存取。
- identify_valve.py:从 open_loop.py 扫点 CSV 拟合 A_eff 表并输出 JSON。
- 控制器集成:config/flow_control/main/data_logger 新增阀前压读取
  (channel 2)、前馈打底 + PI 修残差、按 P1 增益调度,并记录/绘制前馈项。

新增配置 FEEDFORWARD_ENABLED / GAIN_SCHEDULE_ENABLED 默认 False,
VALVE_MODEL_PATH 默认空,未加载模型时行为与原先纯 PID 完全一致。
This commit is contained in:
2026-08-27 16:00:51 +08:00
parent d7e712ede7
commit a03735387c
7 changed files with 958 additions and 20 deletions
+36
View File
@@ -83,6 +83,27 @@ MOTOR_OPEN_POSITION = 800.0
# 控制启动时的阀门初始开度;增量 PID 从该开度开始累加 Δu。
INITIAL_OPENING_PCT = 100.0
# ---------------------------------------------------------------------------
# 前馈 + 增益调度(默认关闭,便于与纯 PID 做 A/B 对比;接线确认后再开启)
# ---------------------------------------------------------------------------
# 阀前压力 P1(前馈缩放 / 判阻塞 / 增益调度用),按实际接线确认。
PRESSURE_BEFORE_CHANNEL = 2
# 阀特性表 JSONidentify_valve.py 产出)。空字符串表示关闭前馈。
VALVE_MODEL_PATH = ""
# 前馈反解打底 + PI 修残差(市面 MFC 结构)。
FEEDFORWARD_ENABLED = False
# 前馈开启时,PI 输出是“围绕前馈的修正量”,限幅为对称小范围(±%)。
FEEDFORWARD_CORRECTION_BAND_PCT = 20.0
# PI 增益按阀前压力 P1 缩放(摊平 K_x ∝ P1 的非线性)。
GAIN_SCHEDULE_ENABLED = False
GAIN_SCHEDULE_REF_ABS_KPA = 501.325 # 400 + 101.325,满压时调好的基准增益对应压力
GAIN_SCHEDULE_FLOOR_ABS_KPA = 60.0 # 绝对压力下限,防止 P1 很低时增益爆炸
GAIN_SCHEDULE_SCALE_CHANGE_THRESHOLD = 0.05 # scale 相对变化超过此值才重算增益
# ---------------------------------------------------------------------------
# 安全阈值
# ---------------------------------------------------------------------------
@@ -162,3 +183,18 @@ def validate_config():
raise ValueError("MAX_CONSECUTIVE_FLOW_FAILURES 必须至少为 1")
if PRESSURE_INPUT_CHANNEL is not None and MAX_PRESSURE_KPA is None:
raise ValueError("启用压力通道时必须配置 MAX_PRESSURE_KPA")
if PRESSURE_BEFORE_CHANNEL is not None:
if not isinstance(PRESSURE_BEFORE_CHANNEL, int):
raise ValueError("PRESSURE_BEFORE_CHANNEL 必须为整数通道号或 None")
if PRESSURE_BEFORE_CHANNEL < 0:
raise ValueError("PRESSURE_BEFORE_CHANNEL 不得为负数")
if MAX_PRESSURE_KPA is None:
raise ValueError("启用阀前压力通道时必须配置 MAX_PRESSURE_KPA")
if GAIN_SCHEDULE_REF_ABS_KPA <= 0:
raise ValueError("GAIN_SCHEDULE_REF_ABS_KPA 必须大于 0")
if GAIN_SCHEDULE_FLOOR_ABS_KPA <= 0:
raise ValueError("GAIN_SCHEDULE_FLOOR_ABS_KPA 必须大于 0")
if not 0 < FEEDFORWARD_CORRECTION_BAND_PCT <= 100:
raise ValueError("FEEDFORWARD_CORRECTION_BAND_PCT 必须位于 0~100")
if GAIN_SCHEDULE_SCALE_CHANGE_THRESHOLD <= 0:
raise ValueError("GAIN_SCHEDULE_SCALE_CHANGE_THRESHOLD 必须大于 0")