增加两档PID控制,针对流量误差大和小的情况分别控制,在误差大时快速调节,误差小时慢慢调节以减少震荡和稳态误差。
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user