diff --git a/config.py b/config.py index b6f7074..bf0bc26 100644 --- a/config.py +++ b/config.py @@ -54,6 +54,8 @@ STEADY_STATE_WINDOW_S = 2.0 # 滑动时间窗口长度 STEADY_STATE_BAND_PCT = 2.0 # 滑窗均值相对目标的允许误差带(±2%) STEADY_STATE_STD_PCT = 2.0 # 滑窗标准差阈值(相对目标百分比) +AUTO_STOP_ON_STEADY = True # 达到稳态后是否自动停止控制(False 则持续控制) + # --------------------------------------------------------------------------- # 阀门执行机构 # --------------------------------------------------------------------------- diff --git a/main.py b/main.py index e0212a6..f9baed6 100644 --- a/main.py +++ b/main.py @@ -189,6 +189,10 @@ def run(target_flow_slm): recorder.record(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": logger.info(format_status(result)) next_status_time = now + config.STATUS_PRINT_PERIOD_S diff --git a/performance_reporter.py b/performance_reporter.py index 4e0f765..3076c85 100644 --- a/performance_reporter.py +++ b/performance_reporter.py @@ -43,6 +43,9 @@ class PerformanceReporter: self.target_flow_slm = None self.settling_time_s = None + self.steady_mean = None + self.steady_std = None + self.steady_error_slm = None self._first_timestamp = None self._peak_flow_slm = None self._min_flow_slm = None @@ -94,6 +97,9 @@ class PerformanceReporter: if abs(mean - target) <= band and std <= std_threshold: self._reached = True self.settling_time_s = elapsed_s + self.steady_mean = mean + self.steady_std = std + self.steady_error_slm = target - mean self._report() def finalize(self): @@ -101,6 +107,11 @@ class PerformanceReporter: if not self._reached and self.target_flow_slm is not None: self._log("info", "本次运行未达到稳态,未生成控制性能报告") + @property + def steady_reached(self): + """是否已判定达到稳态(供主循环决定是否自动停止)。""" + return self._reached + def _report(self): target = self.target_flow_slm initial = self.initial_flow_slm @@ -134,6 +145,12 @@ class PerformanceReporter: f"{self.flow_range_max_slm:.3f} SLM" ), 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"超调量: {extremum_text},{direction} "