- 前馈冻结改用可配置的 3 秒流量绝对误差滑窗,修复采样抖动造成的重复解冻,并保留下游扰动后的自动更新 - 支持非单调阀特性反解、最小可测面积以下直接全关,以及闭阀端精细扫点与辨识开关 - 调整双压力判稳、最长等待时间、在线入口全开收尾和闭环四联图 - 更新配置、README、阀模型及离线测试,归档本轮实验数据与诊断产物
60 lines
1.6 KiB
Python
60 lines
1.6 KiB
Python
from types import SimpleNamespace
|
|
|
|
from performance_reporter import PerformanceReporter
|
|
|
|
|
|
class _Pid:
|
|
kp = 1.0
|
|
ki = 0.1
|
|
kd = 0.0
|
|
|
|
|
|
def _result(timestamp, flow, pressure_before, pressure_after, target=100.0):
|
|
return SimpleNamespace(
|
|
status="OK",
|
|
timestamp=timestamp,
|
|
measured_flow_slm=flow,
|
|
target_flow_slm=target,
|
|
pressure_before_kpa=pressure_before,
|
|
pressure_kpa=pressure_after,
|
|
)
|
|
|
|
|
|
def _reporter():
|
|
return PerformanceReporter(
|
|
_Pid(),
|
|
window_s=0.2,
|
|
sample_period_s=0.1,
|
|
band_pct=1.0,
|
|
pressure_band_kpa=1.0,
|
|
flow_range_min_slm=0.0,
|
|
flow_range_max_slm=300.0,
|
|
)
|
|
|
|
|
|
def test_steady_uses_pressure_band_instead_of_flow_std():
|
|
reporter = _reporter()
|
|
# 流量标准差很大,但窗口均值为目标值;压力均在各自均值 ±1 kPa 内。
|
|
reporter.observe(_result(0.0, 50.0, 200.0, 100.0))
|
|
reporter.observe(_result(0.1, 150.0, 201.0, 99.0))
|
|
|
|
assert reporter.steady_reached
|
|
assert reporter.steady_mean == 100.0
|
|
assert reporter.steady_std == 50.0
|
|
|
|
|
|
def test_pressure_outside_mean_band_prevents_steady_state():
|
|
reporter = _reporter()
|
|
reporter.observe(_result(0.0, 100.0, 200.0, 100.0))
|
|
reporter.observe(_result(0.1, 100.0, 203.0, 100.0))
|
|
|
|
assert not reporter.steady_reached
|
|
|
|
|
|
def test_missing_pressure_sample_is_not_used_for_steady_state():
|
|
reporter = _reporter()
|
|
reporter.observe(_result(0.0, 100.0, None, 100.0))
|
|
reporter.observe(_result(0.1, 100.0, 200.0, 100.0))
|
|
|
|
assert not reporter.steady_reached
|