新增输出稳态时滑动窗口流量均值和标准差,以及稳态误差(判稳成功时目标流量减去当时流量)。

目前逻辑是「一直控制 + 每秒状态照常输出 + 稳态时额外多打印一次性能报告」。
新增一个可选的自动停止功能--config开关,「达到稳态后自动停止控制」,让 reporter 通知主循环退出。
This commit is contained in:
2026-08-20 09:24:58 +08:00
parent adfb5623b3
commit 1d065d81d3
3 changed files with 23 additions and 0 deletions
+2
View File
@@ -54,6 +54,8 @@ STEADY_STATE_WINDOW_S = 2.0 # 滑动时间窗口长度
STEADY_STATE_BAND_PCT = 2.0 # 滑窗均值相对目标的允许误差带(±2%) STEADY_STATE_BAND_PCT = 2.0 # 滑窗均值相对目标的允许误差带(±2%)
STEADY_STATE_STD_PCT = 2.0 # 滑窗标准差阈值(相对目标百分比) STEADY_STATE_STD_PCT = 2.0 # 滑窗标准差阈值(相对目标百分比)
AUTO_STOP_ON_STEADY = True # 达到稳态后是否自动停止控制(False 则持续控制)
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
# 阀门执行机构 # 阀门执行机构
# --------------------------------------------------------------------------- # ---------------------------------------------------------------------------
+4
View File
@@ -189,6 +189,10 @@ def run(target_flow_slm):
recorder.record(result) recorder.record(result)
reporter.observe(result) reporter.observe(result)
if config.AUTO_STOP_ON_STEADY and reporter.steady_reached:
logger.info("已达到稳态,自动停止控制")
break
if now >= next_status_time or result.status != "OK": if now >= next_status_time or result.status != "OK":
logger.info(format_status(result)) logger.info(format_status(result))
next_status_time = now + config.STATUS_PRINT_PERIOD_S next_status_time = now + config.STATUS_PRINT_PERIOD_S
+17
View File
@@ -43,6 +43,9 @@ class PerformanceReporter:
self.target_flow_slm = None self.target_flow_slm = None
self.settling_time_s = None self.settling_time_s = None
self.steady_mean = None
self.steady_std = None
self.steady_error_slm = None
self._first_timestamp = None self._first_timestamp = None
self._peak_flow_slm = None self._peak_flow_slm = None
self._min_flow_slm = None self._min_flow_slm = None
@@ -94,6 +97,9 @@ class PerformanceReporter:
if abs(mean - target) <= band and std <= std_threshold: if abs(mean - target) <= band and std <= std_threshold:
self._reached = True self._reached = True
self.settling_time_s = elapsed_s self.settling_time_s = elapsed_s
self.steady_mean = mean
self.steady_std = std
self.steady_error_slm = target - mean
self._report() self._report()
def finalize(self): def finalize(self):
@@ -101,6 +107,11 @@ class PerformanceReporter:
if not self._reached and self.target_flow_slm is not None: if not self._reached and self.target_flow_slm is not None:
self._log("info", "本次运行未达到稳态,未生成控制性能报告") self._log("info", "本次运行未达到稳态,未生成控制性能报告")
@property
def steady_reached(self):
"""是否已判定达到稳态(供主循环决定是否自动停止)。"""
return self._reached
def _report(self): def _report(self):
target = self.target_flow_slm target = self.target_flow_slm
initial = self.initial_flow_slm initial = self.initial_flow_slm
@@ -134,6 +145,12 @@ class PerformanceReporter:
f"{self.flow_range_max_slm:.3f} SLM" f"{self.flow_range_max_slm:.3f} SLM"
), ),
f"调节时间(至稳态): {self.settling_time_s:.3f} s", f"调节时间(至稳态): {self.settling_time_s:.3f} s",
f"稳态流量(窗口均值): {self.steady_mean:.3f} SLM",
f"稳态标准差(窗口): {self.steady_std:.3f} SLM",
(
f"稳态误差: {self.steady_error_slm:+.3f} SLM "
f"(目标 - 稳态均值)"
),
f"初始流量: {initial:.3f} SLM", f"初始流量: {initial:.3f} SLM",
( (
f"超调量: {extremum_text}{direction} " f"超调量: {extremum_text}{direction} "