107 lines
4.4 KiB
Python
107 lines
4.4 KiB
Python
"""气体流量闭环控制的集中配置。
|
||
|
||
首次连接真实设备前,请重点核对: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 = 0
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 控制目标和控制周期
|
||
# ---------------------------------------------------------------------------
|
||
|
||
TARGET_FLOW_MIN_SLM = 0.0
|
||
TARGET_FLOW_MAX_SLM = 300.0
|
||
ZERO_FLOW_THRESHOLD_SLM = 0.5
|
||
|
||
CONTROL_PERIOD_S = 0.1 # 100 ms,10 Hz
|
||
MAX_CONTROL_DT_S = 0.3 # 超过此值视为控制循环严重超时
|
||
STATUS_PRINT_PERIOD_S = 1.0
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# PID:输出统一定义为阀门开度百分比
|
||
# ---------------------------------------------------------------------------
|
||
|
||
# 第一版建议先按 PI 使用(KD=0),然后通过阶跃实验重新整定。
|
||
PID_KP = 0.5
|
||
PID_KI = 0.1
|
||
PID_KD = 0.0
|
||
|
||
OPENING_MIN_PCT = 0.0
|
||
OPENING_MAX_PCT = 100.0
|
||
MAX_OPENING_RATE_PCT_S = 20.0 # 每秒最多改变 20% 开度
|
||
|
||
# ---------------------------------------------------------------------------
|
||
# 阀门执行机构
|
||
# ---------------------------------------------------------------------------
|
||
|
||
# 电机行程越大,阀门开度越小。
|
||
# opening=0% -> MOTOR_CLOSED_POSITION(完全关闭)
|
||
# opening=100% -> MOTOR_OPEN_POSITION(打开端/机械死区边界)
|
||
MOTOR_CLOSED_POSITION = 1000.0
|
||
MOTOR_OPEN_POSITION = 240.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 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")
|