Files
flow_control/config.py
T
louis 292815e907 支持运行中切换目标流量:按 S 进入输入模式,回车生效、Esc 取消
- 输入模式下控制循环照常运行、原目标继续生效,直到回车确认新值
- 输入期间终端输出整体静默(状态行/性能报告均不打印),文件日志与 CSV 照常写入
- 新增 ConsoleGate 过滤器挂到 console_handler,退出路径统一解除静默
- 新增 PerformanceReporter.reset(),切换目标后重新判稳并再次输出性能报告
- 新增 config.TARGET_SWITCH_KEY 配置项,README 同步说明
2026-08-21 03:36:17 +08:00

125 lines
5.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""气体流量闭环控制的集中配置。
首次连接真实设备前,请重点核对:MT2-AM8 地址、AI/AO 通道、压力上限、
阀门打开端行程和关闭端行程。PID 参数是安全起步值,不是最终整定结果。
"""
# ---------------------------------------------------------------------------
# MT2-AM8 通讯与量程
# ---------------------------------------------------------------------------
MT2AM8_HOST = "192.168.1.12"
MT2AM8_PORT = 502
MT2AM8_SLAVE_ID = 1
# MT2AM8Client 用这些量程把模拟量转换成物理量。
PRESSURE_RANGE_KPA = 400.0
FLOW_METER_RANGE_SLM = 300.0
# AI/AO 通道均从 0 开始。AI0 和 AO0 属于不同的寄存器区,可以同时使用。
FLOW_INPUT_CHANNEL = 1
PRESSURE_INPUT_CHANNEL = 0 # 没有压力传感器时改为 None
MOTOR_OUTPUT_CHANNEL = 1
# ---------------------------------------------------------------------------
# 控制目标和控制周期
# ---------------------------------------------------------------------------
TARGET_FLOW_MIN_SLM = 0.0
TARGET_FLOW_MAX_SLM = 300.0
ZERO_FLOW_THRESHOLD_SLM = 0.5
TARGET_SWITCH_KEY = "s" # 运行中按此键进入"输入新目标流量"模式
CONTROL_PERIOD_S = 0.1 # 100 ms10 Hz
MAX_CONTROL_DT_S = 0.3 # 超过此值视为控制循环严重超时
STATUS_PRINT_PERIOD_S = 1.0
# ---------------------------------------------------------------------------
# PID:输出统一定义为阀门开度百分比
# ---------------------------------------------------------------------------
# 第一版建议先按 PI 使用(KD=0),然后通过阶跃实验重新整定。
PID_KP = 0.5
PID_KI = 0.5
PID_KD = 0.0
OPENING_MIN_PCT = 0.0
OPENING_MAX_PCT = 100.0
MAX_OPENING_RATE_PCT_S = 20.0 # 每秒最多改变 20% 开度
# ---------------------------------------------------------------------------
# 稳态判定(用于控制性能报告)
# ---------------------------------------------------------------------------
STEADY_STATE_WINDOW_S = 10.0 # 滑动时间窗口长度
STEADY_STATE_BAND_PCT = 1.0 # 滑窗均值相对目标的允许误差带(±1%)
STEADY_STATE_STD_PCT = 1.0 # 滑窗标准差阈值(相对目标百分比)
AUTO_STOP_ON_STEADY = False # 达到稳态后是否自动停止控制(False 则持续控制)
# ---------------------------------------------------------------------------
# 阀门执行机构
# ---------------------------------------------------------------------------
# 电机行程越大,阀门开度越小。
# opening=0% -> MOTOR_CLOSED_POSITION(完全关闭)
# opening=100% -> MOTOR_OPEN_POSITION(打开端/机械死区边界)
MOTOR_CLOSED_POSITION = 1000.0
MOTOR_OPEN_POSITION = 0.0
# 控制启动时的阀门初始开度;增量 PID 从该开度开始累加 Δu。
INITIAL_OPENING_PCT = 100.0
# ---------------------------------------------------------------------------
# 安全阈值
# ---------------------------------------------------------------------------
# 物理读数允许范围;超过范围立即报故障停机(阀门不被驱动时回到全开)。
FLOW_VALID_MIN_SLM = 0.0
FLOW_VALID_MAX_SLM = 300.0
MAX_PRESSURE_KPA = 400 # 必须按实际管路额定压力确认
# 短暂读取失败时保持上一输出,不下发新位置;连续达到阈值后报故障停机。
MAX_CONSECUTIVE_FLOW_FAILURES = 3
MAX_CONSECUTIVE_PRESSURE_FAILURES = 3
# 日志目录相对于工程目录。
LOG_DIRECTORY = "logs"
LOG_FILE_NAME = "flow_control.log"
# 每次运行的逐周期数据和曲线图保存目录(相对于工程目录)。
DATA_DIRECTORY = "data"
PLOT_DPI = 160
def validate_config():
"""在接触硬件前检查明显的配置错误。"""
if CONTROL_PERIOD_S <= 0:
raise ValueError("CONTROL_PERIOD_S 必须大于 0")
if STEADY_STATE_WINDOW_S <= CONTROL_PERIOD_S:
raise ValueError("STEADY_STATE_WINDOW_S 必须大于 CONTROL_PERIOD_S")
if STEADY_STATE_BAND_PCT < 0 or STEADY_STATE_STD_PCT < 0:
raise ValueError("稳态误差带和标准差阈值不得为负数")
if MAX_CONTROL_DT_S < CONTROL_PERIOD_S:
raise ValueError("MAX_CONTROL_DT_S 不得小于 CONTROL_PERIOD_S")
if TARGET_FLOW_MIN_SLM > TARGET_FLOW_MAX_SLM:
raise ValueError("目标流量上下限配置错误")
if TARGET_FLOW_MAX_SLM > FLOW_METER_RANGE_SLM:
raise ValueError("目标流量上限不得超过流量计量程")
if FLOW_VALID_MIN_SLM > FLOW_VALID_MAX_SLM:
raise ValueError("流量有效范围上下限配置错误")
if FLOW_VALID_MAX_SLM > FLOW_METER_RANGE_SLM:
raise ValueError("流量有效范围上限不得超过流量计量程")
if not 0 <= OPENING_MIN_PCT < OPENING_MAX_PCT <= 100:
raise ValueError("阀门开度范围必须位于 0~100%,且下限小于上限")
if MOTOR_OPEN_POSITION >= MOTOR_CLOSED_POSITION:
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")
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:
raise ValueError("启用压力通道时必须配置 MAX_PRESSURE_KPA")