Redraw basin + control-zone diagrams

Basin model: replaced the three-column geometry/elevation/control
grid with a side-view tank cross-section — walls visible, inlet/outlet
pipes poke through at their real heights, water ≈≈ vs dead-volume ░░
separate the zones at a glance, control thresholds cut across as dotted
horizontal lines with the safety annotations on the right.

Control logic: replaced the ●-stack with a single vertical level axis
thermometer — elevation markers in the middle, control/safety
annotations fanning out to the right. Narrower, less visual noise,
easier to scan top-to-bottom.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
znetsixe
2026-04-22 11:55:55 +02:00
parent b6e6c728dd
commit e654a04d86

@@ -170,25 +170,27 @@ Line-protocol payload for the `telemetry` bucket. Tags stay low-cardinality (sta
The basin is modelled as a rectangular prism with constant cross-section. Everything derives from `volume = level × surfaceArea`.
```
GEOMETRY ELEVATION CONTROL (levelbased)
═════════════ ◄─ heightBasin ──── maxVol ≡ volume
(freeboard)
─ ─ ─ ─ ─ ─ ─ ◄─ heightOverflow ──── maxVolOverflow ◄── overfill safety
╌╌╌╌╌╌╌╌╌╌╌╌╌ ──── ◄── maxFlowLevel (100% demand)
LINEAR SCALING
RANGE
──●── INFLOW ◄─ heightInlet ──── minVolIn
╌╌╌╌╌╌╌╌╌╌╌╌╌ ──── ◄─ startLevel (0% demand)
SEWAGE BUFFER
┄┄┄┄┄┄┄┄┄┄┄┄┄ ──── ◄── stopLevel (unconditional stop)
DEAD ZONE ↑ hysteresis band
──●── OUTFLOW ◄─ heightOutlet ──── minVolOut ◄── dry-run threshold
DEAD VOLUME
═════════════ 0 (floor)
┌─────────────────┐ ◄─ heightBasin (rim)
│ │
│ freeboard │
├─ ─ ─ ─ ─ ─ ─ ─ ─┤ ◄─ heightOverflow ═══► overfill trip
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ (upstream stops)
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
├╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌┤ ◄─ maxFlowLevel ═══► 100 % demand
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
│≈≈≈≈≈ RUN ≈≈≈≈≈≈≈│ │ ramp
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ │ linearly
INFLOW ═══════►╣≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ ◄─ heightInlet
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
├╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌┤ ◄─ startLevel ═══► 0 % demand
│≈≈ DEAD ZONE ≈≈≈≈│ ─── hysteresis
│≈≈ (keep cmd) ≈≈≈│
├╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌ ╌┤ ◄─ stopLevel ═══► unconditional STOP
│≈≈≈≈≈ BUFFER ≈≈≈≈│
│≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│
OUTFLOW ◄══════╣≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈≈│ ◄─ heightOutlet ═══► dry-run trip
│░░░ DEAD VOLUME ░│ (downstream stops)
└─────────────────┘ ◄─ 0 (floor)
```
**Typical ordering** (bottom → top): `stopLevel < startLevel = minFlowLevel ≤ heightInlet < maxFlowLevel ≈ heightOverflow`.
@@ -241,23 +243,30 @@ flowPositions = { inflow: ['in', 'upstream'], outflow: ['out', 'downstream'] }
### `levelbased` mode — three zones
```
demand
─────
maxFlowLevel ──●─── 100 % ─┐
level
┼── heightOverflow ═══ overfill trip ─► upstream STOP
│ ┐
│ │ RUN
(linear scaling)
│ linear 0 → 100 %
│ │
startLevel ──●─── 0 % ─┘
┼── maxFlowLevel ═══ ┴ 100 % demand
┼── heightInlet ─── inflow pipe
┼── startLevel ═══ 0 % demand (ramp starts)
│ ┐
│ │ DEAD ZONE
(hysteresis: keep last command)
│ hysteresis keep last cmd
│ │
stopLevel ──●─── stop ─┘
│ ┐
│ │ STOP
│ │ (unconditional MGC shutdown)
floor ──● ┘
┼── stopLevel ═══ ┴ unconditional STOP
┼── heightOutlet ─── outflow pipe
═══ dry-run trip ─► downstream STOP
┴── 0 (floor)
```
- **STOP.** Below `stopLevel` every machine group receives `turnOffAllMachines()` and `percControl` is reset to `0`.