增加两档PID控制,针对流量误差大和小的情况分别控制,在误差大时快速调节,误差小时慢慢调节以减少震荡和稳态误差。

This commit is contained in:
2026-08-21 17:25:30 +08:00
parent c56858ab0f
commit 26d4cbc316
21 changed files with 14662 additions and 14 deletions
+47 -7
View File
@@ -38,14 +38,27 @@ STATUS_PRINT_PERIOD_S = 1.0
# PID:输出统一定义为阀门开度百分比
# ---------------------------------------------------------------------------
# 第一版建议先按 PI 使用(KD=0),然后通过阶跃实验重新整定
PID_KP = 0.5
PID_KI = 0.5
PID_KD = 0.0
# 大误差时使用 FAR 参数快速接近目标;小误差时使用 NEAR 参数抑制振荡
# 两档之间采用带滞回的状态切换,不会逐周期连续改变 PID 参数。
PID_FAR_KP = 0.5
PID_FAR_KI = 0.5
PID_FAR_KD = 0.0
PID_NEAR_KP = 0.05
PID_NEAR_KI = 0.01
PID_NEAR_KD = 0.0
OPENING_MIN_PCT = 0.0
OPENING_MAX_PCT = 100.0
MAX_OPENING_RATE_PCT_S = 20.0 # 每秒最多改变 20% 开度
MAX_OPENING_RATE_FAR_PCT_S = 20.0
MAX_OPENING_RATE_NEAR_PCT_S = 2.0
# FAR -> NEAR:绝对误差连续满足 near 阈值指定周期数后切换。
# NEAR -> FAR:绝对误差连续达到 far 阈值指定周期数后切换。
PID_NEAR_ERROR_MIN_SLM = 3.0
PID_NEAR_ERROR_TARGET_RATIO = 0.05
PID_FAR_ERROR_MIN_SLM = 12.0
PID_FAR_ERROR_TARGET_RATIO = 0.20
PID_MODE_SWITCH_CONFIRM_CYCLES = 3
# ---------------------------------------------------------------------------
# 稳态判定(用于控制性能报告)
@@ -116,8 +129,35 @@ def validate_config():
raise ValueError("本系统行程越大开度越小,因此打开端行程必须小于关闭端行程")
if MOTOR_OPEN_POSITION < 0 or MOTOR_CLOSED_POSITION > 1000:
raise ValueError("电机行程必须位于 MT2AM8Client 当前采用的 0~1000 范围")
if MAX_OPENING_RATE_PCT_S <= 0:
raise ValueError("MAX_OPENING_RATE_PCT_S 必须大于 0")
pid_gains = (
PID_FAR_KP,
PID_FAR_KI,
PID_FAR_KD,
PID_NEAR_KP,
PID_NEAR_KI,
PID_NEAR_KD,
)
if any(value < 0 for value in pid_gains):
raise ValueError("FAR/NEAR PID 参数不得为负数")
if (
MAX_OPENING_RATE_FAR_PCT_S <= 0
or MAX_OPENING_RATE_NEAR_PCT_S <= 0
):
raise ValueError("FAR/NEAR 最大开度变化速度必须大于 0")
if PID_NEAR_ERROR_MIN_SLM < 0 or PID_FAR_ERROR_MIN_SLM < 0:
raise ValueError("PID 模式切换误差下限不得为负数")
if (
PID_NEAR_ERROR_TARGET_RATIO < 0
or PID_FAR_ERROR_TARGET_RATIO < 0
):
raise ValueError("PID 模式切换目标比例不得为负数")
if (
PID_NEAR_ERROR_MIN_SLM >= PID_FAR_ERROR_MIN_SLM
or PID_NEAR_ERROR_TARGET_RATIO >= PID_FAR_ERROR_TARGET_RATIO
):
raise ValueError("PID NEAR 阈值必须小于 FAR 阈值")
if PID_MODE_SWITCH_CONFIRM_CYCLES < 1:
raise ValueError("PID_MODE_SWITCH_CONFIRM_CYCLES 必须至少为 1")
if MAX_CONSECUTIVE_FLOW_FAILURES < 1:
raise ValueError("MAX_CONSECUTIVE_FLOW_FAILURES 必须至少为 1")
if PRESSURE_INPUT_CHANNEL is not None and MAX_PRESSURE_KPA is None: