2.1 KiB
2.1 KiB
title, created, updated, status, tags, sources
| title | created | updated | status | tags | sources | ||||
|---|---|---|---|---|---|---|---|---|---|
| Group Optimization Architecture | 2026-04-07 | 2026-04-07 | proven |
|
|
machineGroupControl Optimization
Algorithm: BEP-Gravitation + Marginal-Cost Refinement
Step 1 — Pressure Equalization
Sets all non-operational pumps to the group's max downstream / min upstream pressure. Ensures fair curve evaluation across combinations.
Step 2 — Combination Enumeration
Generates all 2^n pump subsets (n = number of machines). Filters by:
- Machine state (excludes off, cooling, stopping, emergency)
- Mode compatibility (
execsequenceallowed in auto) - Flow bounds:
sumMinFlow ≤ Qd ≤ sumMaxFlow - Optional power cap
Step 3 — BEP-Gravitation Distribution (per combination)
- BEP seed:
estimatedBEP = minFlow + span * NCogper pump - Slope estimation: samples dP/dQ at BEP ± delta (directional: slopeLeft, slopeRight)
- Slope redistribution: iteratively shifts flow from steep to flat curves (weight = 1/slope)
- Marginal-cost refinement: after slope redistribution, shifts flow from highest actual dP/dQ to lowest using real
inputFlowCalcPowerevaluations. Converges regardless of curve convexity. Max 50 iterations, typically 5-15.
Step 4 — Best Selection
Pick combination with lowest total power. Tiebreak by deviation from BEP.
Step 5 — Execution
Start/stop pumps as needed, send flowmovement commands in output units via _canonicalToOutputFlow().
Three Control Modes
| Mode | Distribution | Combination Selection |
|---|---|---|
| optimalControl | BEP-Gravitation + refinement | exhaustive 2^n |
| priorityControl | equal split, priority-ordered | sequential add/remove |
| priorityPercentageControl | percentage-based, normalized | count-based |
Key Design Decision
The flowmovement command sends flow in the machine's output units (m3/h), not canonical (m3/s). The _canonicalToOutputFlow() helper converts before sending. Without this conversion, every pump stays at minimum flow (the critical bug fixed on 2026-04-07).