完善流量控制前馈、稳态判定与阀门标定流程

- 前馈冻结改用可配置的 3 秒流量绝对误差滑窗,修复采样抖动造成的重复解冻,并保留下游扰动后的自动更新
- 支持非单调阀特性反解、最小可测面积以下直接全关,以及闭阀端精细扫点与辨识开关
- 调整双压力判稳、最长等待时间、在线入口全开收尾和闭环四联图
- 更新配置、README、阀模型及离线测试,归档本轮实验数据与诊断产物
This commit is contained in:
2026-09-02 16:14:42 +08:00
parent 5888b4ccce
commit cfeedcf887
80 changed files with 40473 additions and 171 deletions
+59
View File
@@ -0,0 +1,59 @@
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