实现流量控制前馈 + 增益调度(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:
@@ -83,6 +83,27 @@ MOTOR_OPEN_POSITION = 800.0
|
||||
# 控制启动时的阀门初始开度;增量 PID 从该开度开始累加 Δu。
|
||||
INITIAL_OPENING_PCT = 100.0
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# 前馈 + 增益调度(默认关闭,便于与纯 PID 做 A/B 对比;接线确认后再开启)
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
# 阀前压力 P1(前馈缩放 / 判阻塞 / 增益调度用),按实际接线确认。
|
||||
PRESSURE_BEFORE_CHANNEL = 2
|
||||
|
||||
# 阀特性表 JSON(identify_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")
|
||||
|
||||
Reference in New Issue
Block a user