新增输出稳态时滑动窗口流量均值和标准差,以及稳态误差(判稳成功时目标流量减去当时流量)。
目前逻辑是「一直控制 + 每秒状态照常输出 + 稳态时额外多打印一次性能报告」。 新增一个可选的自动停止功能--config开关,「达到稳态后自动停止控制」,让 reporter 通知主循环退出。
This commit is contained in:
@@ -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 则持续控制)
|
||||||
|
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
# 阀门执行机构
|
# 阀门执行机构
|
||||||
# ---------------------------------------------------------------------------
|
# ---------------------------------------------------------------------------
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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} "
|
||||||
|
|||||||
Reference in New Issue
Block a user