# elmLib API-Referenz

**Datei:** `elmlib_API.md`
**Stand:** 2026-08-02
**Zielgruppe:** Entwickler, die elmLib-Bloecke verwenden, ohne Zugriff auf die *.js-Quelldateien zu haben.

---

## Inhaltsverzeichnis

1. [Architektur-Ueberblick](#1-architektur-ueberblick)
2. [Konventionen](#2-konventionen)
3. [Hilfsbibliotheken](#3-hilfsbibliotheken)
4. [Passive Grundelemente – RLCD.js](#4-passive-grundelemente--rlcdjs)
5. [Quellen – Source.js](#5-quellen--sourcejs)
6. [Filter – LCFilter.js](#6-filter--lcfilterjs)
7. [Transformatoren und Drosseln – Trafo.js](#7-transformatoren-und-drosseln--trafojs)
8. [Halbbruecken – HalfBridge.js](#8-halbbruecken--halfbridgejs)
9. [Dreiphasige Bruecken – Bridge3AC.js](#9-dreiphasige-bruecken--bridge3acjs)
10. [Dreipunktumrichter – Bridge3p.js](#10-dreipunktumrichter--bridge3pjs)
11. [Dual Active Bridge – DualActiveBridge.js](#11-dual-active-bridge--dualactivebridgejs)
12. [Mehrfach-DAB (ISOP) – MultiDAB.js](#12-mehrfach-dab-isop--multidabjs)
13. [Modularer Multilevel-Umrichter (MMC) – MMC.js](#13-modularer-multilevel-umrichter-mmc--mmcjs)
14. [Elektrische Maschinen – Motors.js](#14-elektrische-maschinen--motorsjs)
15. [Messung – Measurement.js](#15-messung--measurementjs)
16. [Regelung: Berechnungsbausteine – ControlCalc.js](#16-regelung-berechnungsbausteine--controlcalcjs)
17. [Regelung: Einzelbausteine – ControlSingle.js](#17-regelung-einzelbausteine--controlsinglejs)
18. [Regelung: Koordinatentransformation – ControlVectorTF.js](#18-regelung-koordinatentransformation--controlvectortfjs)
19. [Regelung: PLL – ControlPLL.js](#19-regelung-pll--controlplljs)
20. [Regelung: Symmetrische Komponenten – ControlSYM.js](#20-regelung-symmetrische-komponenten--controlsymjs)
21. [Regelung: Maschinenbeobachter – ControlMotor.js](#21-regelung-maschinenbeobachter--controlmotorjs)
22. [Regelung: Leistungselektronik – ControlControl.js](#22-regelung-leistungselektronik--controlcontroljs)

---

## 1. Architektur-Ueberblick

### KPA-Solver-Ablauf pro Zeitschritt

```
fuer jeden Block:
    KPA_start(opt)               -- Parameter aufloesen, Arbeitspunkt berechnen
                                     t_state/t_szs vorberechnen (nicht setzen!)

iterativ bis Konvergenz:
    KPA_solve(opt)               -- Strom-/Spannungsberechnung, StromSum aktualisieren
                                     (Koeffizientenmatrix A bleibt konstant!)
    wenn KPA_stateChangeAnnounced(opt):
        KPA_makeStateChange(opt) -- s_state/s_szs uebernehmen

fuer jeden Block:
    KPA_finished(opt)            -- Zustandsgroessen (s_*) fortschreiben

einmal pro Regelschritt (langsamer Takt):
    CTRL_step(opt)               -- Regler, Messwertverarbeitung
```

`opt`-Felder: `opt.t0`, `opt.t1`, `opt.dt`, `opt.BlocksA` (alle Bloecke als Dictionary).

### Connector-Zugriff in KPA_solve

```js
this.Connectors[n].Knoten.Spannung   // Knotenspannung [V]
this.Connectors[n].Knoten.StromSum   // Knotenstromsumme [A] (wird addiert)
```

---

## 2. Konventionen

### Parameter-Praefixe

| Praefix | Typ             | Bedeutung                                                                 |
|---------|-----------------|---------------------------------------------------------------------------|
| `p_`    | Konfiguration   | Wird von `resolveParam` aufgeloest. Kann Zahl, JS-Ausdruck oder Pfad sein (z.B. `"Blocks.MyBlock.val"`). |
| `s_`    | Zustand (state) | Wird in `KPA_finished` fortgeschrieben. Muss Zahlenwert (oder Array/Objekt daraus) sein. Wird ins Schematic-JSON exportiert. |
| `t_`    | Temporaer       | Wird in `KPA_stateChangeAnnounced` berechnet, in `KPA_makeStateChange` uebernommen. Nicht exportiert. |

### resolveParam-Regel

Nach `ElmUtils.resolveParam(this, "p_XR", opt)` gilt:
- `this.XR` enthaelt den aufgeloesten Wert.
- `this.p_XR` bleibt unveraendert (kann String sein).
- Niemals `this.p_XR` fuer Rechnungen verwenden – nur `this.XR`.
- Ist der Parameterwert ein String-Ausdruck, stehen darin `Blocks` (= `opt.BlocksA`), `t` (= `opt.t1`, Kurzform), `opt` (vollstaendige KPA-Optionen) und `this` (das Block-Objekt selbst) zur Verfuegung, z.B. `"Blocks.Ctrl1.val"`, `"Math.sin(2*Math.PI*50*t)"`, `"this.s_n_pu * 0.7"`.

### `list_<Name>`-Konvention (Auswahllisten)

Ein Parameter `p_<Name>` mit einer begrenzten Anzahl gueltiger String-Werte bekommt zusaetzlich ein Feld `list_<Name>` (Array der erlaubten Werte). Die Eigenschaften-Tabelle im GUI rendert daraus ein `<select>` statt eines Freitextfelds. Beispiele: `ControlPI.list_version = ["sumLim", "iLim"]`, `MMCMultiCell.list_cellType = ["HB", "FB"]`, `ControlVDp.list_dir = ["pos", "neg"]`.

### `p_var1..p_var5`-Konvention (Parametervariation zwischen Teilinstanzen)

Bloecke, die intern mehrere gleichartige Teilinstanzen verwalten (z.B. `MultiDAB`/`MultiCellDAB`: N DABs in Reihe), bieten bis zu fuenf Felder `p_var1..p_var5` mit je einem JavaScript-Statement. Diese werden **einmalig** bei der (Neu-)Anlage der internen Arrays/Instanzen per `eval()` im `this`-Kontext des Blocks ausgefuehrt (Muster wie `ControlSetRef.p_cmd1..5`), z.B. `"this.dabs[1].p_cLeft *= 1.2"`. `null`/leer bedeutet: nicht ausgefuehrt.

### `s_chState`-Konvention (Checkpoint fuer Filter-/Integratorobjekte)

Bloecke, die intern Filter- oder RMS-Objekte aus `LeSimLibCtrl.js` (`PT2`, `PT2_ab`, `RMS`) unter dynamisch gebildeten Property-Namen ablegen (kein direktes `s_`-Feld), sichern deren internen Zustand zusaetzlich in einem Feld `s_chState` (Objekt). Grund: `getSchematicJson()` exportiert nur Felder, die bereits in der Blockdefinition mit `undefined !== ...` existieren – dynamisch angelegte Properties ohne `s_`-Praefix wuerden beim Speichern/Neuladen sonst verworfen. Die Filterobjekte bringen dafuer selbst `dumpState()`/`loadState()` mit (siehe `LeSimLibCtrl.js`); der Block ruft diese in `KPA_start`/`CTRL_step`/`KPA_finished` auf und schreibt das Ergebnis nach `this.s_chState`. Verwendet u.a. in `ControlCalcPow`, `ControlCalcTHD`, `ControlCalcPow123`, `ControlCalcRMS` (siehe Abschnitt 16).

### Ausgaben: L123-Objekte (dreiphasig)

Dreiphasige Ausgaben folgen der `libCTRL.L123`-Struktur:

| Feld   | Inhalt                         |
|--------|--------------------------------|
| `.a`   | L1-Stranggroesse               |
| `.b`   | L2-Stranggroesse               |
| `.c`   | L3-Stranggroesse               |
| `.ab`  | L12 verkettete Groesse         |
| `.bc`  | L23 verkettete Groesse         |
| `.ca`  | L31 verkettete Groesse         |

`.ab/.bc/.ca` werden in `KPA_finished` via `chgL122331` ergaenzt.

### Connector-Typen (Endpoints.js)

| Funktion               | Richtung          | Verbindungstyp | Farbe       |
|------------------------|-------------------|----------------|-------------|
| `makeStdEndpoint`      | bidirektional     | currentConn    | blau        |
| `makeStdOutEndpoint`   | nur Quelle        | controlConn    | rot         |
| `makeStdInEndpoint`    | nur Ziel          | controlConn    | gelb        |
| `makeHiddenEndpoint`   | intern (kein GUI) | currentConn    | unsichtbar  |

---

## 3. Hilfsbibliotheken

### ElmUtils.js

**Quelldatei:** https://lesim.de/sys/elmLib/ElmUtils.js

Keine externen Abhaengigkeiten.

#### `ElmUtils.resolveParam(obj, pNamStr, opt)`

Loest einen `p_`-Parameter auf und schreibt das Ergebnis ohne Praefix in das Objekt.

| Argument  | Typ    | Beschreibung                                   |
|-----------|--------|------------------------------------------------|
| `obj`     | object | Block-Objekt (`this`)                          |
| `pNamStr` | string | Parametername mit `p_`-Praefix, z.B. `"p_ri"` |
| `opt`     | object | KPA-Optionen (`opt.BlocksA`, `opt.t1`, `opt.dt`) |

Ergebnis: `obj["ri"]` = aufgeloester Wert.

Unterstuetzte Parametertypen:
- **Zahl** – direkte Zuweisung, kein Overhead, kein Cache
- **String** – wird einmalig als JavaScript-Funktion kompiliert und gecacht (`fun1_p_xxx`/`fun2_p_xxx`, Cache-Invalidierung ueber `fun1._pStr`). Im Ausdruck stehen `Blocks` (= `opt.BlocksA`), `t` (= `opt.t1`), `opt` und `this` zur Verfuegung.
- **Objekt** – wird via `Object.assign` in das Zielfeld gemergt

Fehler: `throw new Error` bei undefined-Parameter oder Auswertungsfehler.

#### `ElmUtils.resolveConnection(obj, connectionNmb, pNamStr, opt)`

Loest eine Signalverbindung ueber Connector `connectionNmb` auf.
Wenn ein Element verbunden ist: Wert aus `elm1[pNamStr]` (per Pfadausdruck, ebenfalls gecacht als `fun3_p_xxx`). Sonst Fallback auf `resolveParam`.

| Argument        | Typ    | Beschreibung                       |
|-----------------|--------|------------------------------------|
| `obj`           | object | Block-Objekt                       |
| `connectionNmb` | number | Connector-Index (`Connectors[n]`)  |
| `pNamStr`       | string | Parametername mit `p_`-Praefix     |
| `opt`           | object | KPA-Optionen                       |

#### `ElmUtils.WorkingPointLinearisation(newX, dat)`

Lineare Arbeitspunktfunktion aus einer Kennlinie `[[x0,y0],[x1,y1],...]`.

| Argument | Typ    | Beschreibung                             |
|----------|--------|------------------------------------------|
| `newX`   | number | Aktueller x-Wert (Arbeitspunkt)          |
| `dat`    | Array  | Kennlinie `[[x,y],...]`, aufsteigend sortiert |

Rueckgabe: `{ fun(x), m, n, xmin, xmax }`
- `fun(x)` – lineare Funktion y = m·x + n
- `m` – Steigung im Arbeitspunkt
- `n` – Y-Achsenabschnitt
- `xmin/xmax` – Gueltigkeitsgrenzen (-1e9 / +1e9 an den Raendern)

Verwendung: Saettigungskennlinien in `Trafo3AC_Saturation` und `ASMOpen1Sys`.

### Endpoints.js

**Quelldatei:** https://lesim.de/sys/elmLib/Endpoints.js

**Keine externen Abhaengigkeiten mehr.** Seit der jsPlumb-Ablösung ist ein Connector ein reines Plain-Object (kein jsPlumb-Endpoint), Layer 1 (elektrisches Modell) benoetigt weder jQuery noch jsPlumb. `anchor`/`anchor_orig` behalten weiterhin die Form `{x, y, orientation:[dx,dy]}` bei, da `rotateConnectors`/`flipXConnectors` in `LeSimSchematic.js` (Layer 2/3, noch nicht abgeloest) diese Felder direkt mutieren.

Positionsangabe (`position`): `[x, y, dx, dy]`-Array (Koordinaten 0..1 von oben links, Richtungsvektor dx/dy) oder einer der Namens-Strings `TopCenter`, `BottomCenter`, `LeftMiddle`, `RightMiddle`, `Center` (`NAMED_ANCHORS`).

#### `Endpoints.makeStdEndpoint(connectors, htmlobj, position)`
Erzeugt bidirektionalen KPA-Connector (currentConn, blau). `position` als `[x, y, dx, dy]` oder jsPlumb-artiger Namens-String.

#### `Endpoints.makeStdEndpoint_3AC(connectors, htmlobj)`
Drei rechtsseitige Connectoren fuer L1/L2/L3 (y = 0.25/0.5/0.75).

#### `Endpoints.makeStdEndpoint_3ACNull(connectors, htmlobj)`
Vier Connectoren: Null links (0, 0.75) + L1/L2/L3 rechts.

#### `Endpoints.makeStdEndpoint_3AC_6pol(connectors, htmlobj)`
Sechs Connectoren: L1/L2/L3 oben (Eingang) + L1/L2/L3 unten (Ausgang).

#### `Endpoints.makeStdEndpoint_Zweipol(connectors, htmlobj)`
Zwei Connectoren: TopCenter / BottomCenter.

#### `Endpoints.makeStdOutEndpoint(connectors, htmlobj, position)`
Ausgangs-Connector (controlConn, rot). Nur Quelle, max. 5 Verbindungen.

#### `Endpoints.makeStdInEndpoint(connectors, htmlobj, position)`
Eingangs-Connector (controlConn, gelb). Nur Ziel, max. 1 Verbindung.

#### `Endpoints.makeHiddenEndpoint(connectors, htmlobj)`
Versteckter Hilfsknoten ohne GUI-Darstellung (weder Quelle noch Ziel, `maxConnections=0`). Nur fuer den KPA-Solver sichtbar. Typische Verwendungszwecke:
1. **T-Punkte in Trafomodellen** (`Trafo.js`, `LCFilter.js`) – verbindet Primaer-, Sekundaerseite und Hauptinduktivitaet, z.B. `Trafo1AC` Connector[4], `Trafo3AC` Connector[6..7].
2. **Schattenknoten fuer Fluss-Integratoren** in Maschinenmodellen (`Motors.js`) – je Fluss zwei Schattenknoten (d/q), z.B. `SYMStar1Sys` Connector[5..11], `ASMOpen1Sys` Connector[6..11].
3. **Interne Verbindungsknoten** in Brueckenschaltungen (`Bridge3p.js`, `DualActiveBridge.js`) und bei der primaerseitigen Reihenschaltung mehrerer DABs (`MultiDAB.js`, N-1 versteckte Zwischenknoten) – z.B. `HalfBridge_3p_flyingCap` Connector[3..4], `DAB_Thy` Connector[4..5].

#### Weitere Hilfsfunktionen
- `Endpoints.connectorsToString(connectors)` – Debug-String aller Connectoren eines Blocks.
- `Endpoints.printToString(obj)` – gibt die Connector-Liste eines Blocks auf der Konsole aus.

---

## 4. Passive Grundelemente – RLCD.js

**Quelldatei:** https://lesim.de/sys/elmLib/RLCD.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`

Alle Zweipole: Connector[0] = oben/Plus, Connector[1] = unten/Minus.
Positiver Strom fliesst von Connector[0] nach Connector[1].

---

### Basic_R

Ohmscher Widerstand.

| Parameter | Einheit | Default | Beschreibung          |
|-----------|---------|---------|-----------------------|
| `p_rx`    | Ohm     | 10      | Widerstandswert       |

---

### Basic_C

Kondensator mit optionalem Serienwiderstand (ESR).

| Parameter | Einheit | Default | Beschreibung                                    |
|-----------|---------|---------|--------------------------------------------------|
| `p_cx`    | F       | 100e-6  | Kapazitaet                                      |
| `p_rx`    | Ohm     | 1e-6    | Serienwiderstand / ESR. 0 = idealer Kondensator |
| `s_vC`    | V       | 0       | Kondensatorspannung (Zustandsgroesse)            |

---

### Basic_RL

Serienschaltung Widerstand + Induktivitaet.

| Parameter | Einheit | Default | Beschreibung             |
|-----------|---------|---------|--------------------------|
| `p_lx`    | H       | 0.10    | Induktivitaet            |
| `p_rx`    | Ohm     | 10e-6   | Serienwiderstand         |
| `s_i`     | A       | 0       | Induktivitaetsstrom      |

---

### Basic_Varistor

Spannungsabhaengiger bidirektionaler Begrenzer.

| Parameter | Einheit | Default | Beschreibung                       |
|-----------|---------|---------|------------------------------------|
| `p_vT`    | V       | 400     | Schwellenspannung                  |
| `p_rxOn`  | Ohm     | 1e-3    | Einschaltwiderstand                |
| `p_rxOff` | Ohm     | 100e3   | Sperrwiderstand                    |
| `s_state` | –       | 0       | Zustand (0/1/2), wird fortgeschrieben |

---

### Basic_Diode

Unidirektionaler Schalter mit Schwellenspannung.

| Parameter | Einheit | Default | Beschreibung                              |
|-----------|---------|---------|--------------------------------------------|
| `p_vT`    | V       | 0.7     | Schwellenspannung                         |
| `p_rxOn`  | Ohm     | 1e-3    | Einschaltwiderstand                       |
| `p_rxOff` | Ohm     | 100e3   | Sperrwiderstand                           |
| `s_state` | –       | 0       | 0 = gesperrt, 1 = leitend                 |

Wird u.a. als Unterblock-Prototyp in `MultiCellDAB` verwendet (eine echte `Basic_Diode`-Instanz je Zelle mit lokalen, nicht am globalen Solver registrierten Knoten, siehe Abschnitt 12) – dort `p_vT` hartcodiert auf 0 gesetzt (naeher am idealen Klemmverhalten als der obige Default).

---

### Basic_Triac

Bidirektionaler Schalter (Triac / Thyristor) mit Zuendimpuls.

| Parameter | Einheit | Default | Beschreibung                                    |
|-----------|---------|---------|--------------------------------------------------|
| `p_vT`    | V       | 0.7     | Schwellenspannung                               |
| `p_rxOn`  | Ohm     | 1e-3    | Einschaltwiderstand                             |
| `p_rxOff` | Ohm     | 100e3   | Sperrwiderstand                                 |
| `p_zi`    | –       | –       | Externer Zuendimpuls (wird von aussen gesetzt)  |
| `s_state` | –       | 0       | 0 / +1 / -1, wird fortgeschrieben              |

---

### Basic_IGBT

IGBT mit antiparalleler Freilaufdiode.

| Parameter | Einheit | Default | Beschreibung                                       |
|-----------|---------|---------|----------------------------------------------------|
| `p_vT`    | V       | 0.7     | Schwellenspannung                                  |
| `p_rxOn`  | Ohm     | 1e-3    | Einschaltwiderstand                                |
| `p_rxOff` | Ohm     | 100e3   | Sperrwiderstand                                    |
| `p_zi`    | –       | –       | Externer Zuendimpuls / Steuersignal                |
| `s_state` | –       | 0       | 0/1/2, wird fortgeschrieben                        |

---

### Basic_SSCB

Solid-State Circuit Breaker (antiserieller Schalter mit Varistor).

| Parameter | Einheit | Default | Beschreibung                                        |
|-----------|---------|---------|-----------------------------------------------------|
| `p_vT`    | V       | 400     | Varistor-Schwellenspannung                          |
| `p_rxOn`  | Ohm     | 1e-3    | Einschaltwiderstand                                 |
| `p_rxOff` | Ohm     | 100e3   | Sperrwiderstand                                     |
| `p_zi_A`  | –       | –       | Zuendimpuls vorwaerts (Blockpfad oder 0/1)          |
| `p_zi_B`  | –       | –       | Zuendimpuls rueckwaerts (Blockpfad oder 0/1)        |
| `s_state` | –       | 0       | Zustand 0–4, wird fortgeschrieben                   |

---

## 5. Quellen – Source.js

**Quelldatei:** https://lesim.de/sys/elmLib/Source.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Quellen verwenden das **Erzeugerpfeilsystem**: Strom fliesst aus Connector[0] heraus.

---

### Source1Voltage

Ideale DC-Spannungsquelle mit Innenwiderstand.
Zweipol: Connector[0] = Plus, Connector[1] = Minus.

| Parameter | Einheit | Default | Beschreibung                     |
|-----------|---------|---------|----------------------------------|
| `p_emk`   | V       | 4.123   | EMK / Leerlaufspannung           |
| `p_ri`    | Ohm     | 10e-3   | Innenwiderstand                  |

---

### Source1Current

Ideale DC-Stromquelle.
Zweipol: Connector[0] = Plus, Connector[1] = Minus.

| Parameter | Einheit | Default | Beschreibung            |
|-----------|---------|---------|-------------------------|
| `p_ix`    | A       | -10     | Eingepraegter Strom     |

---

### Source1ACVoltage

Einphasige AC-Spannungsquelle mit Netzimpedanz (RL, impliziter Euler).
Zweipol: Connector[0] = Sternpunkt/Null, Connector[1] = Phase L.

Impedanzberechnung: `Xn = Un^2/Sk`, `Ln = Xn/(2*pi*fn)`, `Rn = Xn/XR`.

| Parameter  | Einheit | Default | Beschreibung                              |
|------------|---------|---------|---------------------------------------------|
| `p_fn`     | Hz      | 50      | Nennfrequenz                              |
| `p_Un`     | V eff   | 230.1   | Nennspannung                              |
| `p_Sk`     | VA      | 100e3   | Kurzschlussleistung                       |
| `p_XR`     | –       | 10      | X/R-Verhaeltnis der Netzimpedanz          |
| `p_fx_pu`  | –       | 1       | Frequenzaussteuerung normiert (1 = fn)    |
| `p_vx_pu`  | –       | 1       | Spannungsaussteuerung normiert (1 = Un)   |
| `s_phi`    | rad     | 0       | Phasenlage, wird fortgeschrieben          |
| `s_iL`     | A       | 0       | Induktivitaetsstrom, wird fortgeschrieben |

---

### Source3ACVoltage

Dreiphasige AC-Spannungsquelle mit Mit- und Gegensystem sowie Netzimpedanz.
Connector[0] = Sternpunkt/Null, Connector[1..3] = L1/L2/L3.

| Parameter       | Einheit | Default | Beschreibung                                         |
|-----------------|---------|---------|--------------------------------------------------------|
| `p_fn`          | Hz      | 50      | Nennfrequenz                                         |
| `p_Un`          | V eff   | 400.1   | Nennspannung (verkettet)                             |
| `p_Sk`          | VA      | 100e3   | Kurzschlussleistung                                  |
| `p_XR`          | –       | 10      | X/R-Verhaeltnis                                      |
| `p_fx_pu`       | –       | 1       | Frequenzaussteuerung normiert                        |
| `p_vpos_pu`     | –       | 1       | Mitsystem-Amplitude normiert                         |
| `p_vneg_pu`     | –       | 0       | Gegensystem-Amplitude normiert                       |
| `p_phi_zus`     | rad     | 0       | Zusaetzlicher Phasenversatz                          |
| `p_emk_extern`  | L123    | null    | Externe EMK-Vorgabe (libCTRL.L123) oder null         |
| `s_phi`         | rad     | 0       | Phasenlage, wird fortgeschrieben                     |
| `p_i0`          | A       | –       | Induktivitaetsstroeme Startwert {a,b,c}              |

---

## 6. Filter – LCFilter.js

**Quelldatei:** https://lesim.de/sys/elmLib/LCFilter.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Integratoren verwenden den impliziten Euler. Zustandsgroessen werden in `KPA_finished` fortgeschrieben.

---

### FilterLC1AC

Einphasiges LC-Filter (T-Schaltung: zwei Induktivitaeten + Kondensator).
Connector[0]/[1] = Eingang, Connector[2]/[3] = Ausgang.

| Parameter  | Einheit | Default | Beschreibung                               |
|------------|---------|---------|-----------------------------------------------|
| `p_fn`     | Hz      | 50      | Nennfrequenz                               |
| `p_Sn`     | VA      | 10e3    | Nennleistung                               |
| `p_Un`     | V eff   | 230.1   | Nennspannung                               |
| `p_xL_pu`  | –       | 0.06    | Serieninduktivitaet normiert. L = p_xL_pu × Z_n / (2π·fn). |
| `p_rL_pu`  | –       | 0.01    | Serieninduktivitaet Widerstand normiert    |
| `p_xC_pu`  | –       | 10      | Parallelkondensator normiert. Groesserer Wert = kleinere Kapazitaet (X_C = p_xC_pu × Z_n, C = 1/(2π·fn·X_C)). Typischer Absolutbereich: 2 µF … 100 mF. Werte > 10 reduzieren kapazitive Blindleistung und erhoehen die Resonanzfrequenz (f_res = 1/(2π·√(L·C))). |
| `p_rC_pu`  | –       | 0.2     | Kondensator-ESR normiert                   |
| `s_iLA`    | A       | 0       | Induktivitaetsstrom oberer Zweig           |
| `s_iLB`    | A       | 0       | Induktivitaetsstrom unterer Zweig          |
| `s_vC`     | V       | 0       | Kondensatorspannung                        |

---

### FilterL3AC

Dreiphasige Drossel (RL-Glied je Phase, normiert).
Connector[0..2] = Eingang L1/L2/L3, Connector[3..5] = Ausgang L1/L2/L3.

Ausgaenge ab `KPA_solve`: `this.v` (L123 Spannung), `this.i` (L123 Strom).

| Parameter  | Einheit | Default | Beschreibung                          |
|------------|---------|---------|-----------------------------------------|
| `p_fn`     | Hz      | 50      | Nennfrequenz                          |
| `p_Sn`     | VA      | 100e3   | Nennleistung                          |
| `p_Un`     | V eff   | 400.1   | Nennspannung (verkettet)              |
| `p_x_pu`   | –       | 0.06    | Reaktanz normiert                     |
| `p_r_pu`   | –       | 0.01    | Widerstand normiert                   |
| `s_i`      | A       | 0       | Stromstartwert {a,b,c}                |

---

### FilterRC3AC

Dreiphasiges RC-Filter (Sternschaltung, RC je Phase).
Connector[0..2] = L1/L2/L3 Eingang, Connector[3] = Sternpunkt.

Ausgaenge ab `KPA_solve`: `this.v` (L123 Spannung), `this.i` (L123 Strom).

| Parameter  | Einheit | Default | Beschreibung                        |
|------------|---------|---------|-----------------------------------------|
| `p_fn`     | Hz      | 50      | Nennfrequenz                        |
| `p_Sn`     | VA      | 100e3   | Nennleistung                        |
| `p_Un`     | V eff   | 400     | Nennspannung (verkettet)            |
| `p_c_pu`   | –       | 9       | Kapazitaet normiert                 |
| `p_r_pu`   | –       | 0.12    | Serienwiderstand normiert           |
| `s_vC`     | V       | 0       | Kondensatorspannungen {a,b,c}       |

---

## 7. Transformatoren und Drosseln – Trafo.js

**Quelldatei:** https://lesim.de/sys/elmLib/Trafo.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Trafos verwenden ein T-Ersatzschaltbild mit verstecktem T-Knoten (`makeHiddenEndpoint`).
Bezugsgroessen: `U_bez = Un * sqrt(2/3)`, `I_bez = Sn/Un * sqrt(2/3)`.

---

### Trafo1AC

Einphasiger Trafo mit T-Ersatzschaltbild.
Connector[0..1] = Primaer, Connector[2..3] = Sekundaer, Connector[4] = T-Knoten (hidden).

| Parameter    | Einheit | Default  | Beschreibung                            |
|--------------|---------|----------|--------------------------------------------|
| `p_fn`       | Hz      | 50       | Nennfrequenz                            |
| `p_Sn`       | VA      | 100e3    | Nennleistung                            |
| `p_Un_pri`   | V eff   | 1030.1   | Primaerspannung                         |
| `p_Un_sec`   | V eff   | 230.1    | Sekundaerspannung                       |
| `p_x1_pu`    | –       | 0.06     | Streureaktanz normiert                  |
| `p_r1_pu`    | –       | 0.01     | Streuwiderstand normiert                |
| `p_xh_pu`    | –       | 100      | Hauptreaktanz normiert                  |
| `p_rh_pu`    | –       | 100      | Eisenverlustwiderstand normiert         |
| `s_iSec_pu`  | A       | 0        | Sekundaerstrom normiert                 |
| `s_iPri_pu`  | A       | 0        | Primaerstrom normiert                   |
| `s_iLh_pu`   | A       | 0        | Hauptinduktivitaetsstrom normiert       |

---

### Trafo3AC

Dreiphasiger Trafo ohne Nullleiter, mit Schaltgruppe.
Connector[0..2] = Primaer L1/L2/L3, Connector[3..5] = Sekundaer L1/L2/L3,
Connector[6..7] = T-Knoten (hidden).

Ausgaenge: `this.v` (L123 Primaer), `this.vSec` (L123 Sekundaer), `this.i`, `this.iSec`.

| Parameter   | Einheit | Default | Beschreibung                                            |
|-------------|---------|---------|------------------------------------------------------------|
| `p_fn`      | Hz      | 50      | Nennfrequenz                                            |
| `p_Sn`      | VA      | 100e3   | Nennleistung                                            |
| `p_Un1`     | V eff   | 400.1   | Primaerspannung (verkettet)                             |
| `p_Un2`     | V eff   | 400.1   | Sekundaerspannung (verkettet)                           |
| `p_x1_pu`   | –       | 0.06    | Streureaktanz normiert                                  |
| `p_r1_pu`   | –       | 0.01    | Streuwiderstand normiert                                |
| `p_xh_pu`   | –       | 100     | Hauptreaktanz normiert                                  |
| `p_rh_pu`   | –       | 100     | Eisenverlustwiderstand normiert                         |
| `p_group`   | –       | 1       | Schaltgruppe: 0=Yy0, 1=Yd1, 5=Yd5, 11=Yd11             |
| `s_iSec`    | A       | 0       | Sekundaerstrom {a,b}                                    |
| `s_iPri`    | A       | 0       | Primaerstrom {a,b}                                      |
| `s_iLh`     | A       | 0       | Hauptinduktivitaetsstrom {a,b}                          |

---

### Trafo3AC_Saturation

Dreiphasiger Trafo mit Saettigungskennlinie. Gleiche Connectoren wie Trafo3AC.
Arbeitspunktlinearisierung wird in `KPA_start` aktualisiert (einmal pro Zeitschritt).

Zusaetzliche Parameter gegenueber Trafo3AC:

| Parameter   | Einheit | Default | Beschreibung                             |
|-------------|---------|---------|-------------------------------------------|
| `p_kf`      | –       | 0.85    | Saettigungskurve Streckung in B          |
| `p_kh`      | –       | 0.95    | Saettigungskurve Streckung in H          |
| `s_iSec_pu` | A       | 0       | Sekundaerstrom normiert {a,b,c}          |
| `s_iPri_pu` | A       | 0       | Primaerstrom normiert {a,b,c}            |
| `s_psiH_pu` | –       | 0       | Hauptfluss normiert {a,b,c}              |

---

### Trafo3ACopenSec

Dreiphasiger Trafo mit offenem Sekundaerkreis (kein Sekundaer-Connector).
Connector[0..2] = Primaer L1/L2/L3.

| Parameter   | Einheit | Default | Beschreibung                       |
|-------------|---------|---------|---------------------------------------|
| `p_fn`      | Hz      | 50      | Nennfrequenz                        |
| `p_Sn`      | VA      | 100e3   | Nennleistung                        |
| `p_Un1`     | V eff   | 400.1   | Primaerspannung (verkettet)         |
| `p_Un2`     | V eff   | 400.1   | Sekundaerspannung (verkettet)       |
| `p_x1_pu`   | –       | 0.06    | Streureaktanz normiert              |
| `p_r1_pu`   | –       | 0.01    | Streuwiderstand normiert            |
| `p_group`   | –       | 1       | Schaltgruppe (0/1/5/11)             |
| `s_iSec_pu` | A       | 0       | Sekundaerstrom normiert {a,b,c}     |
| `s_iPri_pu` | A       | 0       | Primaerstrom normiert {a,b,c}       |

---

### Inductance3Phase

Dreiphasige Drossel mit drei unabhaengigen Wicklungen und gemeinsamer Hauptinduktivitaet.
Connector[0..2] = Wicklung 1 (L1/L2/L3), Connector[3..5] = Wicklung 2, Connector[6..8] = Wicklung 3.

| Parameter | Einheit | Default | Beschreibung                  |
|-----------|---------|---------|--------------------------------|
| `p_R1`    | Ohm     | 0.01    | Wicklungswiderstand 1         |
| `p_Ls1`   | H       | 0.11e-3 | Streuinduktivitaet 1          |
| `p_Lh1`   | H       | 10      | Hauptinduktivitaet 1          |
| `p_R2`    | Ohm     | 0.01    | Wicklungswiderstand 2         |
| `p_Ls2`   | H       | 1e-3    | Streuinduktivitaet 2          |
| `p_Lh2`   | H       | 2       | Hauptinduktivitaet 2          |
| `p_R3`    | Ohm     | 0.01    | Wicklungswiderstand 3         |
| `p_Ls3`   | H       | 1e-3    | Streuinduktivitaet 3          |
| `p_Lh3`   | H       | 2       | Hauptinduktivitaet 3          |
| `s_iL1`   | A       | 0       | Strom Wicklung 1              |
| `s_iL2`   | A       | 0       | Strom Wicklung 2              |
| `s_iL3`   | A       | 0       | Strom Wicklung 3              |
| `s_ih`    | A       | 0       | Hauptinduktivitaetsstrom      |

---

## 8. Halbbruecken – HalfBridge.js

**Quelldatei:** https://lesim.de/sys/elmLib/HalfBridge.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`, `RLCD.js`

Knotenkonvention (alle Bloecke): Connector[0] = Plus (oben), Connector[1] = Minus (unten), Connector[2] = Ausgang.

Schaltzustand `s_szs`: 1 = oberer Schalter, 0 = unterer Schalter (Freilaufdiode).

---

### HalfBridge_Basic

Einphasige Halbbruecke mit Zwischenkreiskondensator und PWM-Steuerung.

| Parameter  | Einheit | Default | Beschreibung                                        |
|------------|---------|---------|---------------------------------------------------------|
| `p_ri`     | Ohm     | 1e-3    | Innenwiderstand Schalter                            |
| `p_ausst`  | –       | 0.5     | Aussteuerung [-1..+1]                               |
| `p_fs`     | Hz      | 2000    | Schaltfrequenz. fs > 1 = PWM, fs = 0 = Mittelwert  |
| `p_phase`  | rad     | 0       | Phasenversatz Dreiecktraeger                        |
| `p_cZk`    | F       | 100e-6  | Zwischenkreiskapazitaet                             |
| `s_vDc`    | V       | –       | Zwischenkreisspannung, wird fortgeschrieben         |
| `s_szs`    | –       | –       | Schaltzustand (0/1), wird fortgeschrieben           |

---

### HalfBridge_Resonant

Resonante Halbbruecke mit ZCS-Frequenzregler (automatische Schaltfrequenzanpassung).

| Parameter  | Einheit | Default | Beschreibung                                    |
|------------|---------|---------|------------------------------------------------------|
| `p_ri`     | Ohm     | 1e-3    | Innenwiderstand Schalter                        |
| `p_cx`     | F       | 88e-6   | Resonanzkondensator                             |
| `p_vDc`    | V       | 100     | Zwischenkreisspannung Startwert                 |
| `p_fsMax`  | Hz      | 8000    | Maximale Schaltfrequenz                         |
| `p_fsMin`  | Hz      | 1300    | Minimale Schaltfrequenz                         |
| `p_iMax`   | A       | 4000    | Maximalstrom Schutz                             |
| `p_iMin`   | A       | 2       | Minimaler Strom fuer ZCS-Erkennung              |
| `p_debug`  | –       | 0       | Debug-Ausgaben aktivieren (0/1)                 |

---

## 9. Dreiphasige Bruecken – Bridge3AC.js

**Quelldatei:** https://lesim.de/sys/elmLib/Bridge3AC.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `RLCD.js`, `HalfBridge.js`

**Knotenkonvention alle Bruecken:**
Connector[0] = Minus (unten), Connector[1] = L1, Connector[2] = L2, Connector[3] = L3, Connector[4] = Plus (oben).

**Schalterbelegung B6:**
S1/D1: Plus-L1, S3/D3: Plus-L2, S5/D5: Plus-L3 (obere Gruppe);
S4/D4: L1-Minus, S6/D6: L2-Minus, S2/D2: L3-Minus (untere Gruppe).

---

### Bridge3AC_Diode

B6-Diodenbruecke (6 Dioden, ungesteuert). Keine Eingangsparameter.

---

### Bridge3AC_12Thyristor

B26C-Bruecke (6 Triacs / 12 Thyristoren, gesteuert).

| Parameter | Einheit | Default | Beschreibung                    |
|-----------|---------|---------|-------------------------------------|
| `zi1`     | –       | –       | Zuendimpuls Triac D1 (L1-Plus)  |
| `zi2`     | –       | –       | Zuendimpuls Triac D2 (Minus-L3) |
| `zi3`     | –       | –       | Zuendimpuls Triac D3 (L2-Plus)  |
| `zi4`     | –       | –       | Zuendimpuls Triac D4 (Minus-L1) |
| `zi5`     | –       | –       | Zuendimpuls Triac D5 (L3-Plus)  |
| `zi6`     | –       | –       | Zuendimpuls Triac D6 (Minus-L2) |

---

### Bridge3AC_IWR

B6-Wechselrichter mit Dreieckkondensatoren und Zweigpaarzuendung.

| Parameter       | Einheit | Default                    | Beschreibung                    |
|-----------------|---------|----------------------------|-------------------------------------|
| `p_zi_135`      | –       | `"Blocks.SSIWR_1.zi_135"`  | Blockpfad Zuendimpuls obere Gruppe |
| `p_zi_462`      | –       | `"Blocks.SSIWR_1.zi_462"`  | Blockpfad Zuendimpuls untere Gruppe |
| `p_rxOn`        | Ohm     | 1e-3                       | Einschaltwiderstand             |
| `p_rxOff`       | Ohm     | 10e3                       | Sperrwiderstand                 |
| `p_cx`          | F       | 1000e-6                    | Dreieckkondensator              |
| `s_state_135`   | –       | –                          | Zustand obere Gruppe            |
| `s_state_462`   | –       | –                          | Zustand untere Gruppe           |
| `s_C12_v0`      | V       | –                          | Kondensatorspannung C12         |
| `s_C23_v0`      | V       | –                          | Kondensatorspannung C23         |
| `s_C31_v0`      | V       | –                          | Kondensatorspannung C31         |

---

### Bridge3AC_2Level

Dreiphasige Zweipunkt-IGBT-Bruecke (3 Halbbruecken + Freilaufdiode).

| Parameter    | Einheit | Default | Beschreibung                         |
|--------------|---------|---------|--------------------------------------|
| `p_ri`       | Ohm     | 1e-3    | Innenwiderstand je Phase             |
| `p_fs`       | Hz      | 2000    | Schaltfrequenz                       |
| `p_phase`    | rad     | 0       | Phasenversatz Dreiecktraeger         |
| `p_cZk`      | F       | 100e-6  | Zwischenkreiskapazitaet              |
| `p_ausstL1`  | –       | 0.4     | Aussteuerung L1 [-1..+1]             |
| `p_ausstL2`  | –       | 0.5     | Aussteuerung L2 [-1..+1]             |
| `p_ausstL3`  | –       | 0.6     | Aussteuerung L3 [-1..+1]             |
| `s_vDc`      | V       | –       | Zwischenkreisspannung, wird fortgeschrieben |

---

### Bridge3AC_IGBT_single

Dreiphasige IGBT-Bruecke mit Einzelansteuerung der IGBTs (zi1..zi6).

| Parameter  | Einheit | Default | Beschreibung                                          |
|------------|---------|---------|-------------------------------------------------------|
| `p_zi`     | –       | null    | Blockpfad zum Steuerblock oder null (dann zi1..zi6)   |
| `p_enable` | –       | 1       | Freigabe (0/1)                                        |
| `p_czk`    | F       | 0.1e-3  | Zwischenkreiskapazitaet                               |
| `s_v0`     | V       | –       | Kondensatorspannung Startwert                         |

---

### Bridge3AC_resonant

Dreiphasige resonante Bruecke (3x HalfBridge_Resonant).

| Parameter  | Einheit | Default | Beschreibung                           |
|------------|---------|---------|--------------------------------------------|
| `p_ri`     | Ohm     | 1e-3    | Innenwiderstand je Phase               |
| `p_fsMax`  | Hz      | 100000  | Maximale Schaltfrequenz                |
| `p_fsMin`  | Hz      | 5000    | Minimale Schaltfrequenz                |
| `p_cZk`    | F       | 100e-6  | Gesamtkapazitaet Resonanzkondensatoren |
| `p_vDc`    | V       | 100     | Zwischenkreisspannung Startwert        |
| `p_iMax`   | A       | 3000    | Maximalstrom Schutz                    |
| `p_iMin`   | A       | 5       | Minimaler Strom fuer ZCS-Erkennung     |

---

## 10. Dreipunktumrichter – Bridge3p.js

**Quelldatei:** https://lesim.de/sys/elmLib/Bridge3p.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `RLCD.js`

**Knotenkonvention NPC:**
Connector[0] = Minus, Connector[1] = Plus, Connector[2] = Ausgang, Connector[3] = Mittelpunkt.

**Dreipunkt-Schaltzustand `s_szs`:**
+1 = Ausgang an Plus, 0 = Ausgang an Mittelpunkt, -1 = Ausgang an Minus.

---

### Bridge3p_onePhase

Einphasige Dreipunkt-NPC-Bruecke (2 Kondensatoren).

| Parameter  | Einheit | Default | Beschreibung                      |
|------------|---------|---------|---------------------------------------|
| `p_ri`     | Ohm     | 1e-3    | Innenwiderstand Schalter          |
| `p_ausst`  | –       | 0.5     | Aussteuerung [-1..+1]             |
| `p_fs`     | Hz      | 2000    | Schaltfrequenz                    |
| `p_phase`  | rad     | 0       | Phasenversatz Dreiecktraeger      |
| `p_cZk1`   | F       | 100e-6  | Oberer Zwischenkreiskondensator   |
| `p_cZk2`   | F       | 100e-6  | Unterer Zwischenkreiskondensator  |
| `s_vDc1`   | V       | –       | Obere Zwischenkreisspannung       |
| `s_vDc2`   | V       | –       | Untere Zwischenkreisspannung      |

---

### Bridge3p_threePhase

Dreiphasige Dreipunkt-NPC-Bruecke (3x OnePhase3p).
Connector[0] = Minus, Connector[1..3] = L1/L2/L3, Connector[4] = Plus, Connector[5] = Mittelpunkt.

| Parameter    | Einheit | Default | Beschreibung                   |
|--------------|---------|---------|------------------------------------|
| `p_ri`       | Ohm     | 1e-3    | Innenwiderstand je Phase       |
| `p_ausstL1`  | –       | 0.5     | Aussteuerung L1 [-1..+1]       |
| `p_ausstL2`  | –       | -0.5    | Aussteuerung L2 [-1..+1]       |
| `p_ausstL3`  | –       | 0.1     | Aussteuerung L3 [-1..+1]       |
| `p_fs`       | Hz      | 2000    | Schaltfrequenz                 |
| `p_phase`    | rad     | 0       | Phasenversatz Dreiecktraeger   |
| `p_cZk1`     | F       | 100e-6  | Oberer Zwischenkreiskondensator |
| `p_cZk2`     | F       | 100e-6  | Unterer Zwischenkreiskondensator |
| `s_vDc1`     | V       | –       | Obere Zwischenkreisspannung    |
| `s_vDc2`     | V       | –       | Untere Zwischenkreisspannung   |

---

### HalfBridge_3p_flyingCap

Einphasige Dreipunkt-Halbbruecke mit Flying-Capacitor (4 IGBTs, 2 Kondensatoren).
Connector[0] = Plus, Connector[1] = Minus, Connector[2] = Ausgang.
Connector[3..4] = interne Verbindungsknoten (hidden).

| Parameter   | Einheit | Default | Beschreibung                         |
|-------------|---------|---------|--------------------------------------------|
| `p_ri`      | Ohm     | 1e-3    | Innenwiderstand je IGBT              |
| `p_ausst`   | –       | 0.6     | Aussteuerung [-1..+1]                |
| `p_fs`      | Hz      | 2000    | Schaltfrequenz                       |
| `p_phase`   | rad     | 0       | Phasenversatz Dreiecktraeger         |
| `p_cx1`     | F       | 100e-6  | Zwischenkreiskapazitaet              |
| `p_cx2`     | F       | 1500e-6 | Flying-Capacitor-Kapazitaet          |
| `p_vC1`     | V       | 100     | Zwischenkreisspannung Startwert      |
| `p_vC2`     | V       | 100     | Flying-Capacitor-Spannung Startwert  |
| `p_szsNul`  | –       | –       | Nullzeiger-Typ (+1 oder -1)          |
| `s_szs`     | –       | –       | Schaltzustand (+1/0/-1)              |

---

## 11. Dual Active Bridge – DualActiveBridge.js

**Quelldatei:** https://lesim.de/sys/elmLib/DualActiveBridge.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `RLCD.js` (nur `DAB_Thy`)

Trafo-Modell: T-Ersatzschaltbild mit Streuinduktivitaet `Ls` (symmetrisch aufgeteilt) und Hauptinduktivitaet `Lh` am Mittelknoten (impliziter Solver-Schritt via `stepRL_exact`, exakte Loesung der skalaren RL-DGL innerhalb eines Zeitschritts). Alle Impedanzen auf die linke Seite bezogen.

Bezugsgroessen: `vAcLeft_nom = vDcLeft_nom * sqrt(0.8)`, `x1 = vAcLeft_nom^2 / p1_nom`, `T_ue = vDcLeft_nom / vDcRight_nom` (Uebersetzungsverhaeltnis, auch von `MultiDAB`/`MultiCellDAB` gelesen).

`iLs` (Wirkstrom) und `iLh` (Magnetisierungsstrom, Differenzstrom i1-i2') sind entkoppelte, exakt loesbare skalare RL-DGLs; `iLh` verteilt sich haelftig auf beide Seiten (`iAcLeft = iLs + iLh/2`, `iAcRight = (-iLs + iLh/2) * T_ue`) und wird optional ueber `p_tauLhDC` DC-gedaempft (Flux-Walking-Schutz, `<=0` deaktiviert die Daempfung).

**Hinweis zur s_-Migration:** Die Integratorzustaende liegen konzeptuell als `s_`-Parameter vor, sind aber weiterhin im `p_0`-Objekt zusammengefasst (`p_0.iLs`, `p_0.iLh`, `p_0.vDcLeft`, `p_0.vDcRight`, `p_0.ziLeft`, `p_0.ziRight`, `p_0.state`) – eine vollstaendige Migration zu einzelnen `s_`-Feldern ist noch nicht durchgefuehrt.

WICHTIG – Linearitaetsanforderung des KPA-Solvers: `ziLeft`/`ziRight` duerfen in `KPA_solve` nicht geaendert werden, nur in `KPA_makeStateChange`.

---

### DAB1PhaseA

Einphasige DAB, beide Seiten H-Bruecken (IGBT). Wird **wiederverwendet** von `MultiDAB` (N echte Instanzen in Reihe, siehe Abschnitt 12).
Connector[0..1] = DC links, Connector[2..3] = DC rechts.

| Parameter          | Einheit | Default | Beschreibung                           |
|--------------------|---------|---------|----------------------------------------|
| `p_vDcLeft_nom`    | V       | 1000    | DC-Nennspannung linke Seite            |
| `p_vDcRight_nom`   | V       | 700     | DC-Nennspannung rechte Seite           |
| `p_p1_nom`         | W       | 200e3   | Nennleistung                           |
| `p_r1_pu`          | –       | 0.005   | Ersatzwiderstand normiert              |
| `p_xs_pu`          | –       | 0.4     | Streuinduktivitaet normiert            |
| `p_xh_pu`          | –       | 20      | Hauptinduktivitaet normiert            |
| `p_f1_nom`         | Hz      | 20e3    | Trafofrequenz                          |
| `p_f1_pu`          | –       | 1       | Frequenzaussteuerung normiert          |
| `p_tauLhDC`        | s       | 3e-3    | Zeitkonstante DC-Daempfung iLh (`<=0` = aus) |
| `p_cLeft`          | F       | 500e-6  | Zwischenkreiskondensator links         |
| `p_cRight`         | F       | 700e-6  | Zwischenkreiskondensator rechts        |
| `p_aLeft`          | –       | 0.8     | Aussteuerung links [0..1]              |
| `p_aRight`         | –       | 0.7     | Aussteuerung rechts [0..1]             |
| `p_phiLeft_grad`   | Grad    | 0       | Phasenlage Schaltmuster links          |
| `p_phiRight_grad`  | Grad    | 0       | Phasenlage Schaltmuster rechts         |
| `p_diodeClampLeft` | –       | 0       | 1 = optionale Klemmdiode primaerseitig aktiv (verhindert `vDcLeft < 0`, z.B. Schwarzstart bei Reihenschaltung, siehe `MultiDAB.js`); 0 = aus (Default) |
| `p_diodeClampRight`| –       | 0       | 1 = optionale Klemmdiode sekundaerseitig aktiv, sonst analog zu `p_diodeClampLeft` |
| `p_iEigenLeft`     | A       | 0.1     | Eigenstromverbrauch primaerseitig      |
| `p_iEigenRight`    | A       | 0.1     | Eigenstromverbrauch sekundaerseitig    |
| `p_0`              | object  | –       | Integratorzustaende: `{iLs, iLh, vDcLeft, vDcRight, ziLeft, ziRight}` |

@par Ausgaenge (nach `KPA_finished`)
- `this.powLeft` / `this.powRight` – Wirkleistung linke/rechte Seite [W]
- `this.vDcLeft_pu` / `this.vDcRight_pu` – DC-Spannung normiert, Periodenmittelwert (cUF-Mittelwertbildung, Trigger: `txLeft`-Ueberlauf)
- `this.pAct_pu` – Wirkleistung normiert, Mittelwert
- `this.iDcTrafo_pu` – Trafostrom normiert, Mittelwert
- `this.ziLeft` / `this.ziRight` – aktueller Zuendimpuls (-1/0/+1)

@par Typische Auslegungsparameter (aus Praxisbeispielen)

| Projekt    | vDcLeft | vDcRight | T_ue  | Ls [uH] | f1 [kHz] | P [kW] |
|------------|---------|----------|-------|---------|----------|--------|
| DAB_SEM    | 1450 V  | 1350 V   | 1.0   | 5       | 20       | 1008   |
| DAB335kW   | 1000 V  |  930 V   | 1.1   | 16      |  5       |  335   |
| DAB220kW   | 1000 V  |  700 V   | 1.447 | 12.5    | 20       |  220   |
| DAB125kW   |  713 V  |  640 V   | 1.07  | 11      | 20       |  125   |
| DAB48V     |   53 V  |  350 V   | 0.15  |  7      | 20       |    1   |

---

### DAB_Thy

Einphasige DAB, linke Seite IGBT, rechte Seite Thyristorbruecke.
Connector[0..1] = DC links, Connector[2..3] = DC rechts, Connector[4..5] = AC-Knoten (hidden).

| Parameter         | Einheit | Default | Beschreibung                                  |
|-------------------|---------|---------|-----------------------------------------------|
| `p_vDcLeft_nom`   | V       | 1000    | DC-Nennspannung linke Seite                   |
| `p_vDcRight_nom`  | V       | 700     | DC-Nennspannung rechte Seite                  |
| `p_p1_nom`        | W       | 200e3   | Nennleistung                                  |
| `p_r1_pu`         | –       | 0.005   | Ersatzwiderstand normiert                     |
| `p_xs_pu`         | –       | 0.4     | Streuinduktivitaet normiert                   |
| `p_xh_pu`         | –       | 20      | Hauptinduktivitaet normiert                   |
| `p_f1_nom`        | Hz      | 2e3     | Trafofrequenz                                 |
| `p_f1_pu`         | –       | 1       | Frequenzaussteuerung normiert                 |
| `p_cLeft`         | F       | 500e-6  | Zwischenkreiskondensator links                |
| `p_aLeft`         | –       | 0.8     | Aussteuerung links [0..1]                     |
| `p_curDir`        | –       | 1       | Stromrichtung (+1 oder -1)                    |
| `p_phiLeft_grad`  | Grad    | 0       | Phasenlage Schaltmuster links                 |
| `p_THY_tq`        | s       | 30e-6   | Thyristor-Freiwerdezeit                       |
| `p_0`             | object  | –       | Integratorzustaende: `{iLs, iLh, vDcLeft, state, ziLeft, ziRight}` |

---

## 12. Mehrfach-DAB (ISOP) – MultiDAB.js

**Quelldatei:** https://lesim.de/sys/elmLib/MultiDAB.js
**Quelldatei:** https://lesim.de/sys/elmLib/MultiCellDAB.js (obsoleter Stub, Inhalt jetzt in MultiDAB.js)

Abhaengigkeiten: `Endpoints.js`, `DualActiveBridge.js` (`DAB1PhaseA`, wiederverwendet), `ElmUtils.js`, `RLCD.js` (`Basic_Diode`, nur `MultiCellDAB`)

Enthaelt drei Bloecke fuer **ISOP** (Input-Series-Output-Parallel) Mehrfach-DAB-Anwendungen:

| Block                | Funktion                                                                 |
|-----------------------|---------------------------------------------------------------------------|
| `MultiDAB`            | Leistungselektronik – N ECHTE `DAB1PhaseA`-Instanzen (`this.dabs[]`), ueber versteckte Zwischenknoten primaerseitig in Reihe verdrahtet, GMRES (globaler KPA-Solver) loest die Kopplung. |
| `MultiCellDAB`        | Leistungselektronik – geschlossene O(N)-Reihenstromloesung (Arrays direkt am Block, keine echten Sub-Instanzen, kein globaler Solver-Mehraufwand). Ehemals eigene Datei `MultiCellDAB.js` (jetzt nur noch ein leerer Kompatibilitaets-Stub, siehe unten), Inhalt hierher gemergt. |
| `MultiDAB_Modulator`  | Steuerung – **einziger** Modulator-Blocktyp fuer BEIDE Leistungselektronik-Varianten (`MultiCellDAB_Modulator` wurde ersatzlos gestrichen). Eigener Block ohne elektrischen Anschluss. |

**`MultiCellDAB.js` (Datei) ist obsolet:** Sie exportiert nur noch ein leeres Objekt. Schematics, die den Blocktyp `"MultiCellDAB"` referenzieren, funktionieren unveraendert (Typname identisch geblieben, nur der Dateiort hat sich geaendert – die Definition steckt jetzt in `MultiDAB.js`). Schematics, die den frueheren `"MultiCellDAB_Modulator"` referenzieren, muessen auf `"MultiDAB_Modulator"` umgestellt werden.

**Architekturentscheidung (MultiDAB):** Statt einer eigenen, handgeschriebenen Physik nutzt `MultiDAB` N echte `DAB1PhaseA`-Instanzen (`Object.assign({}, DAB1PhaseA)`, Muster wie `Bridge3p_threePhase`/`OnePhase3p`) – ein Performance-Vergleich ergab, dass die fruehere geschlossene Loesung nur ca. 13 % schneller war, was die zusaetzliche Komplexitaet/Fehleranfaelligkeit nicht rechtfertigte. `MultiCellDAB` bleibt als schnellere Alternative mit geschlossener Loesung erhalten (kein GMRES-Mehraufwand fuer die Zellkopplung).

**Fassade statt Verzweigung:** `MultiDAB_Modulator.CTRL_step` ist fuer beide Leistungselektronik-Varianten UNVERAENDERT identisch. `MultiCellDAB` baut dazu in `helper_ensureArrays` ein eigenes `this.dabs[]`-Array aus schlanken Objekten mit denselben Getter/Setter-Properties, die `DAB1PhaseA` an dieser Stelle bietet (`p_0.vDcLeft`/`p_0.vDcRight`/`T_ue`/`vDcLeft_nom` als reine Getter; `p_aLeft`/`p_aRight`/`p_phiLeft_grad`/`p_phiRight_grad` als Getter+Setter, die transparent in die echten Arrays `this.aLeft[k]`/... durchschreiben). Der Modulator muss dadurch nicht wissen, gegen welchen Leistungselektronik-Blocktyp er laeuft.

---

### MultiDAB

N primaerseitig in Reihe geschaltete, sekundaerseitig parallel geschaltete echte `DAB1PhaseA`-Instanzen (`this.dabs[]`).

Anschlusskonvention: Connector[0]=Primaer_oben, Connector[1]=Primaer_unten, Connector[2]=Sekundaerbus_oben, Connector[3]=Sekundaerbus_unten, Connector[4..4+N-2]=versteckte Reihen-Zwischenknoten (nur fuer den KPA-Solver).

| Parameter           | Einheit | Default | Beschreibung                                        |
|---------------------|---------|---------|-------------------------------------------------------|
| `p_N`               | –       | 3       | Anzahl in Reihe geschalteter DABs. **Muss eine Zahl sein, kein Ausdruck** – ein N-Wechsel braucht ein Neuladen des Schematics (`setEndpointsDef` legt die versteckten Connectoren nur beim Laden an). |
| `p_vDcLeft_nom`     | V       | 1000    | DC-Nennspannung primaer JE DAB (Ausdruck erlaubt)   |
| `p_vDcRight_nom`    | V       | 700     | DC-Nennspannung sekundaer (Ausdruck erlaubt)        |
| `p_p1_nom`          | W       | 200e3   | Nennleistung JE DAB (Ausdruck erlaubt)              |
| `p_f1_nom`          | Hz      | 20e3    | Trafofrequenz (Ausdruck erlaubt)                    |
| `p_f1_pu`           | –       | 1       | Frequenzaussteuerung normiert (Ausdruck erlaubt)    |
| `p_xs_pu`           | –       | 0.4     | Streuinduktivitaet normiert, JE DAB. **Muss Zahl sein** – Variation zwischen DABs nur ueber `p_var1..p_var5`. |
| `p_xh_pu`           | –       | 20      | Hauptinduktivitaet normiert, JE DAB (nur Zahl)      |
| `p_r1_pu`           | –       | 0.005   | Ersatzwiderstand normiert, JE DAB (nur Zahl)        |
| `p_tauLhDC`         | s       | 3e-3    | Zeitkonstante DC-Daempfung iLh, JE DAB (nur Zahl)   |
| `p_cLeft`           | F       | 500e-6  | Zwischenkreiskondensator JE DAB, primaer (nur Zahl) |
| `p_cRight`          | F       | 700e-6  | Zwischenkreiskondensator JE DAB, sekundaer (Ausdruck erlaubt) – Wert EINER DAB; da alle N DABs parallel auf denselben Sekundaerbus-Knoten wirken, summieren sich die Kondensatorstroeme automatisch (KPA-Solver-Aggregation) |
| `p_iEigenLeft`      | A       | 0.1     | Eigenverbrauch primaerseitig                        |
| `p_iEigenRight`     | A       | 0.1     | Eigenverbrauch sekundaerseitig                      |
| `p_aLeft`/`p_aRight`| –       | 0.8/0.7 | Aussteuerung links/rechts, Startwert vor dem ersten Modulator-Update |
| `p_phiLeft_grad`/`p_phiRight_grad` | Grad | 0/0 | Phasenlage links/rechts, Startwert          |
| `p_var1..p_var5`    | string  | null    | Bis zu 5 JS-Statements, einmalig bei `this.dabs`-Neuanlage ausgefuehrt, z.B. `"this.dabs[1].p_cLeft *= 1.2"` |
| `s_vDcLeft`         | Array   | []      | Gespeicherte Zwischenkreisspannungen JE DAB (Speichern/Neuladen) |
| `s_vDcRight`        | V       | 0       | Gespeicherte Sekundaerbus-Spannung (fuer alle DABs identisch) |

**Schwarzstart-Faehigkeit:** Jede DAB bekommt intern `p_diodeClampLeft=1` gesetzt (verhindert negative `vDcLeft_k` je DAB).

**Modulator-Schreibzugriff:** Der Modulator schreibt in `this.dabs[k].p_aLeft`/`p_aRight`/`p_phiRight_grad` – die Perioden-Synchronisation (Wirksamwerden erst zur naechsten Schaltperiode) bringt `DAB1PhaseA` selbst mit (`helper_resolveParams` laeuft dort nur bei Periodenwechsel).

@par Ausgaenge (nach `KPA_finished`)
- `this.dabs[k]` – Direkter Zugriff auf jede einzelne `DAB1PhaseA`-Instanz, ALLE Felder aus `DualActiveBridge.js` direkt verfuegbar (keine Kopien), z.B. Plot-Kanal `MultiDAB1.dabs[0].vDcLeft`. Sekundaerseitige Groessen (`vDcRight`, `vDcRight_pu`) sind fuer alle DABs gleich (gemeinsamer Bus).
- `this.iTerminalRight` / `this.iTerminalRight_pu` – Sekundaerseitiger Summenstrom (Summe aller `dabs[k].iDcRight`, echtes Aggregat)
- `this.iTerminalLeft` / `this.iTerminalLeft_pu` – Primaerseitiger Reihenstrom (= `dabs[0].iDcLeft`, KCL-bedingt fuer alle DABs identisch)
- `this.vDcLeft_total_pu` / `min_pu` / `max_pu` / `mean_pu` – Aggregate der Zwischenkreisspannungen ueber alle DABs (zeigt Spannungsspreizung/Balancing)

@see https://lesim.de/sim/DAB_multi1/ (ISOP-Demo, Schwarzstart), https://lesim.de/sim/DAB_multi3/ (Performance-Vergleichsaufbau)

---

### MultiCellDAB

N primaerseitig in Reihe geschaltete DAB-Zellen mit geschlossener O(N)-Reihenstromloesung (keine echten Sub-Instanzen, kein globaler Solver-Mehraufwand fuer die Zellkopplung).

Anschlusskonvention: Connector[0]=Primaer_oben, Connector[1]=Primaer_unten, Connector[2]=Sekundaerbus_oben, Connector[3]=Sekundaerbus_unten.

Stromflusskonvention (`this.iTerminalLeft`/`this.iTerminalRight`): **Lastkonvention** – positiv bedeutet, der Strom fliesst von aussen in die DAB hinein (anders als das Erzeugerpfeilsystem bei `Source1Voltage`).

| Parameter           | Einheit | Default | Beschreibung                                        |
|---------------------|---------|---------|---------------------------------------------------------|
| `p_N`               | –       | 30      | Anzahl Reihenzellen. Laufend aenderbar (wie `MMC.js`), N-Wechsel legt alle Zell-Arrays neu an (Zustand geht verloren). |
| `p_vDcLeft_nom`     | V       | 1000    | Block-weite DC-Nennspannung primaer (kein Zellwert)  |
| `p_vDcRight_nom`    | V       | 700     | Block-weite DC-Nennspannung sekundaer                |
| `p_p1_nom`          | W       | 200e3   | Block-weite Nennleistung je Zelle                    |
| `p_f1_nom`          | Hz      | 20e3    | Trafofrequenz                                        |
| `p_f1_pu`           | –       | 1       | Frequenzaussteuerung normiert                        |
| `p_xs_pu`           | –       | 0.4     | Streuinduktivitaet normiert, Nennwert (nur Zahl, Variation ueber `p_var1..5`) |
| `p_xh_pu`           | –       | 20      | Hauptinduktivitaet normiert, Nennwert (nur Zahl)     |
| `p_r1_pu`           | –       | 0.005   | Ersatzwiderstand normiert, Nennwert (nur Zahl)       |
| `p_tauLhDC`         | s       | 3e-3    | Zeitkonstante DC-Daempfung iLh, Nennwert (nur Zahl)  |
| `p_cLeft`           | F       | 500e-6  | Zwischenkreiskondensator je Zelle, Nennwert (nur Zahl) |
| `p_cRight`          | F       | 500e-6  | Sekundaerer Bus-Kondensator, Wert EINER Zelle/DAB – wirksame Gesamtkapazitaet am Bus = N × `p_cRight` |
| `p_iEigenLeft`      | A       | 0.1     | Eigenverbrauch primaerseitig je Zelle (Array, ueber `p_var` variierbar) |
| `p_iEigenRight`     | A       | 0.1     | Eigenverbrauch sekundaerseitig – **EIN blockweiter Skalar** (kein Array), als gemeinsame Stromquelle `N * p_iEigenRight` am Sekundaerbus verrechnet |
| `p_var1..p_var5`    | string  | null    | Bis zu 5 JS-Statements, einmalig bei Array-Neuanlage ausgefuehrt |
| `s_iLs`/`s_iLh`/`s_vDcLeft` | Array | [] | Integratorzustaende je Zelle [A]/[A]/[V]         |
| `s_ziLeft`/`s_ziRight`      | Array | [] | Letzte Zuendimpulse je Zelle                     |
| `s_diodeState`              | Array | [] | Zustand der Klemmdiode je Zelle (0=gesperrt, 1=leitend) |
| `s_vDcRight`                | V     | 0  | Sekundaerbus-Spannung (Skalar, gemeinsamer Bus)  |

**Klemmdiode je Zelle:** Eine echte `Basic_Diode`-Instanz pro Zelle mit lokalen, NICHT am globalen Solver registrierten Knoten (haelt die Aussenwirkung bei O(1) globalen Anschluessen, bringt aber die fertige, getestete Dioden-Zustandslogik samt Hysterese mit). `p_vT` ist fuer diese Dioden hartcodiert auf 0 (naeher am idealen Klemmverhalten als `Basic_Diode`s eigener Default 0.7).

**`this.dabs[]`-Fassade:** Macht `MultiCellDAB` fuer `MultiDAB_Modulator` ununterscheidbar von echten `DAB1PhaseA`-Instanzen (siehe Abschnittseinleitung).

@par Ausgaenge (nach `KPA_finished`)
- `this.iTerminalRight`/`_pu`, `this.iTerminalLeft`/`_pu` – wie bei `MultiDAB`
- `this.vDcLeft_total_pu`/`min_pu`/`max_pu`/`mean_pu` – Aggregate der Zellspannungen
- Debug-Zaehler (kumulativ ueber die gesamte Laufzeit): `cnt_stateChangeAnnounced`, `cnt_ziLeft`, `cnt_ziRight`, `cnt_pulsverschlucktLeft`, `cnt_pulsverschlucktRight`, `cnt_diode`

---

### MultiDAB_Modulator

Modulator fuer `MultiDAB`/`MultiCellDAB` – Aussteuerung `aLeft`/`aRight` ueber Nullzeit + Spannungsflaechen ("Loesung 2"), PLUS N unabhaengige PI-Spannungsregler (einer je DAB) fuer den Phasenwinkel. Eigener, unabhaengiger Block ohne elektrischen Anschluss, referenziert die Zielinstanz per `p_targetId` und schreibt direkt in deren `this.dabs[k].p_aLeft`/`p_aRight`/`p_phiLeft_grad`/`p_phiRight_grad`.

**Einziger Modulator-Blocktyp fuer beide Leistungselektronik-Varianten** (`MultiCellDAB_Modulator` entfaellt ersatzlos).

| Parameter               | Einheit | Default | Beschreibung                                        |
|--------------------------|---------|---------|---------------------------------------------------------|
| `p_targetId`             | –       | `""`    | Block-ID der `MultiDAB`- oder `MultiCellDAB`-Instanz, z.B. `"MDAB1"` |
| `p_tNullRef_pu`          | –       | 0.02    | Soll-Nullschaltzeit normiert                        |
| `p_vDcLeftTarget_pu`     | –       | 1.0     | Globaler Soll-Zwischenkreisspannungswert, bezogen auf `vDcLeft_nom` |
| `p_rampLimit_pu`         | –       | 0.05    | Max. Abweichung soll_wirksam vom Mittel-Istwert (= 5 %) |
| `p_kP`                   | –       | 2       | P-Anteil je DAB-PI [pu/pu]                          |
| `p_kI`                   | –       | 200     | I-Anteil je DAB-PI [pu/(pu·s)]                       |
| `p_phaseShiftMax`        | Grad    | 30      | Denormierungsfaktor fuer den PI-Ausgang             |
| `p_aMin`                 | –       | 0.4     | Untere Aussteuergrenze                              |
| `p_aMax`                 | –       | 0.99    | Obere Aussteuergrenze                               |
| `s_integral_k`           | Array   | []      | I-Anteil je DAB (Zustandsgroesse, wird bei Bedarf angelegt) |

**Ablauf pro `CTRL_step`:** Sollwertrampe (gemeinsam, istwertbasiert) → N unabhaengige PI-Regler (Balancing entsteht von selbst) → Summenlimitierung mit Anti-Windup (Rueckrechnung `I_neu = Summe_begrenzt - P`) → Denormierung mit `p_phaseShiftMax` → Aussteuerung aus Nullzeit + Flaechengleichheit (wie `ControlDAB1`, Abschnitt 22).

@par Ausgaenge (nach `CTRL_step`)
- `this.phiRight_min_grad`/`mean_grad`/`max_grad` – Sollwinkel-Aggregat ueber alle N DABs [Grad]
- `this.sollWirksam_pu` – limitierter/gerampter Sollwert, gemeinsam fuer alle N PI-Regler
- `this.reglerSum_min_pu`/`mean_pu`/`max_pu` – geclampter PI-Gesamtausgang (-1..+1) ueber alle N DABs
- `this.reglerI_min_pu`/`mean_pu`/`max_pu` – I-Anteil VOR der Anti-Windup-Rueckrechnung (zeigt Windup/Saettigung)

@see https://olli2.de/Antriebstechnik/Stromrichter/DAB/dualActiveBridge.html (Herleitung "Loesung 2")

---

## 13. Modularer Multilevel-Umrichter (MMC) – MMC.js

**Quelldatei:** https://lesim.de/sys/elmLib/MMC.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Enthaelt den Block `MMCMultiCell`: ein MMC-Arm als Zweipol (oben/unten), Reihenschaltung von `p_N` Zellen (Halbbruecke oder Vollbruecke, gemeinsamer Kapazitaets-Nennwert). Arm-interner Schwellwertkontroller fuer den Armstrom, ueberlagert einer Vorsteuerung.

Anschlusskonvention: Connector[0] = oben, Connector[1] = unten. Positiver Armstrom `this.i` fliesst von oben nach unten. Zellspannung: oben plus / unten minus.

**Steuerungsstruktur:** `n_ff = round(p_pre * N)` (Vorsteuerung), `n_ist = Summe s_szs[k]` (Ist-Levelzahl). Korrekturband `[n_ff - p_nCorrMax, n_ff + p_nCorrMax]`. Ein Schwellwertkontroller (`this.i` vs. `p_iRef`) verschiebt `n_ist` innerhalb des Bandes; pro `p_tSperr`-Intervall darf genau eine Zelle schalten (arm-weiter Sperrzeit-Zeitstempel), zusaetzlich muss diese Zelle selbst mindestens `p_tSperrCell` seit ihrem letzten Schaltvorgang geruht haben.

**Zellauswahl (Balancing):** Bei Richtungswechsel wird zuerst eine vorhandene Zelle der Gegenpolaritaet in Bypass zurueckgefahren; sonst wird aus dem Bypass-Pool die Zelle gewaehlt, deren Zuschalten am besten zur Spannungsbalance beitraegt (niedrigste/hoechste `s_vC`, abhaengig von Stromrichtung und Zielpolaritaet).

| Parameter       | Einheit | Default | Beschreibung                                        |
|------------------|---------|---------|---------------------------------------------------------|
| `p_N`           | –       | 6       | Anzahl Zellen pro Arm. Laufend aenderbar – bei Aenderung werden `s_vC`/`s_szs`/... vollstaendig neu angelegt (alle Zellen auf `p_vCNom`/Bypass, kein Uebernehmen des alten Zustands). |
| `p_cellType`    | –       | `"FB"`  | `"HB"` (Halbbruecke) oder `"FB"` (Vollbruecke), laufend aenderbar. Wechsel FB→HB: vorhandene Rueckwaerts-Zellen (-1) werden sofort in Bypass zurueckgefahren. |
| `p_cx`          | F       | 10e-3   | Zellkapazitaet, gemeinsamer Nennwert, laufend aenderbar |
| `p_ri`          | Ohm     | 1e-3    | Durchlasswiderstand der Zellschalter (Platzhalter), laufend aenderbar |
| `p_tSperr`      | s       | 10e-6   | Sperrzeit zwischen zwei Zellschaltvorgaengen, arm-weit |
| `p_tSperrCell`  | s       | 100e-6  | Zusaetzliche Mindestruhezeit PRO ZELLE (thermisch relevant, kann faellige Flips verzoegern) |
| `p_pre`         | –       | 0       | Vorsteuerung, normiert. HB: 0..1, FB: -1..+1        |
| `p_iRef`        | pu      | 0       | Soll-Armstrom fuer den Schwellwertkontroller, normiert auf `p_iNom` |
| `p_kStatik`     | pu/Level| 0.05    | Statik-Faktor: `iRefStatik = iRef + kStatik*(n_ist-n_ff)`, daempft Relais-Schwingen ohne Totband |
| `p_iHyst`       | pu      | 0.15    | Totband-Halbbreite um `iRefStatik`. 0 schaltet das Totband ab. Default (0.05/0.15 mit `p_kStatik`) stammt aus einem 21×21-Parameter-Sweep gegen Schaltfrequenz und RMS-Regelabweichung. |
| `p_nCorrMax`    | Zellen  | 2       | Max. Abweichung der Schwellwertkorrektur von der Vorsteuerung |
| `p_vCNom`       | V       | 1000    | Nennwert Einzelzellspannung, nur zur Normierung von `vCavg_pu` |
| `p_iNom`        | A       | 1000    | Nennstrom, nur zur Normierung von `p_iRef`/`this.i_pu` |
| `p_tauTh`       | s       | 200e-6  | Thermische Zeitkonstante der Sperrschicht – Fensterlaenge fuer die gleitende Mittelung der Schaltfrequenzen |
| `s_vC`          | Array   | []      | Kondensatorspannung je Zelle [V]. Fehlt sie oder passt die Laenge nicht, wird sie beim naechsten `KPA_start` automatisch mit `p_vCNom` je Zelle neu angelegt. |
| `s_szs`         | Array   | []      | Schaltzustand je Zelle (0/+1/-1)                    |

@par Ausgaenge (nach `KPA_solve`)
- `this.v` – Klemmenspannung, oben - unten [V]
- `this.i` – Armstrom [A]
- `this.n_ist` – Netto-Einfuegezahl (Summe `s_szs[k]`, Diagnose/Plot)
- `this.n_ff` – aktuelle Vorsteuerungs-Levelzahl (Diagnose/Plot)

@par Ausgaenge (nach `KPA_finished`)
- `this.vCavg`/`vCavg_pu` – mittlere Zellspannung [V] / normiert auf `p_vCNom` (die fuer eine externe Energiebalance-Regelung relevante Groesse)
- `this.vCmin_pu`/`vCmax_pu` – minimale/maximale Zellspannung, normiert
- `this.vC1..vCN` – Einzelzellspannungen [V], flache, durchnummerierte Kanaele (Array-Indizes wie `s_vC[0]` sind wegen der Kanal-Parsing-Logik als Plot-Kanal nicht direkt nutzbar)
- `this.vOut1..vOutN` – Zellausgangsspannungen `s_szs[k]*s_vC[k]` [V], flache Kanaele
- `this.fs1..fsN` – gemessene Schaltfrequenz je Zelle [Hz] (analog `HalfBridge_Resonant.fs`)
- `this.fsTh1..fsThN` – zaehlende gleitende Mittelung von `fs1..fsN` ueber ein Fenster der Laenge `p_tauTh` (thermisch relevante Groesse, robust gegen kurze Schalt-Bursts, im Gegensatz zu einer Tiefpassfilterung des Momentanwerts)
- `this.fsAvg` – Mittelwert von `fs1..fsN` ueber alle Zellen [Hz]
- `this.fsArm`/`this.fsArmTh`/`this.fsArmMax` – arm-weite Summenschaltfrequenz, deren gleitende Mittelung und der Vergleichswert `1/p_tSperr` (Kontrollgroesse: darf `fsArmMax` nie ueberschreiten)

**Energiebalance (Gleichanteil von `p_iRef`):** Der Arm regelt seine mittlere Zellspannung NICHT selbst – `p_iRef` ist reine Fuehrungsgroesse von aussen. Die Energiebalance gehoert in den Schaltplan: ein separater `ControlPI`-Block (Abschnitt 22, mit Anti-Windup) liest `Blocks.<ArmId>.vCavg_pu` gegen den Sollwert 1.0 (pu) und speist seinen (ebenfalls pu-skalierten) Ausgang additiv in `p_iRef` ein, z.B. `p_iRef = "<Wechselanteil-Ausdruck, p.u.> + Blocks.<PI-Id>.ctrl"`.

@see https://lesim.de/sim/MMC_basic/ – Beispiel: ein Arm an Spannungsquelle + Arminduktivitaet

---

## 14. Elektrische Maschinen – Motors.js

**Quelldatei:** https://lesim.de/sys/elmLib/Motors.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Maschinen rechnen im rotorfesten dq-Koordinatensystem.
Connector-Layout: L1/L2/L3 oben + Schattenknoten (hidden) fuer Fluss-Integratoren.

Drehmoment: `m_el_pu = psih_dq.a * i1_dq.b - psih_dq.b * i1_dq.a`
Mechanik: `s_n_pu += (m_el_pu - mLoad_pu) / tauJ * dt`

---

### SYMStar1Sys

Synchronmaschine, Drehstrom Stern (vollstaendiges Modell mit Erregung und Daempferwicklungen d+q).
Connector[0..2] = L1/L2/L3. Connector[3..10] = Schattenknoten (hidden).

Ausgaenge ab `KPA_solve`: `this.v` (L123 [V]), `this.i` (L123 [A]), `this.n_pu` (Drehzahl normiert).

| Parameter      | Einheit | Default              | Beschreibung                              |
|----------------|---------|-------------------------|------------------------------------------------|
| `p_fn`         | Hz      | 50                   | Nennfrequenz                              |
| `p_Sn`         | VA      | 100e3                | Nennleistung                              |
| `p_Un`         | V eff   | 400.1                | Nennspannung (verkettet)                  |
| `p_Ierrn`      | A       | 20                   | Nennstrom Erregung                        |
| `p_x1_pu`      | –       | 0.1                  | Staenderstreureaktanz                     |
| `p_r1_pu`      | –       | 0.023                | Staenderwiderstand                        |
| `p_x2d_pu`     | –       | 0.14                 | Erregerwicklungs-Streureaktanz (d)        |
| `p_r2d_pu`     | –       | 0.009                | Erregerwicklungswiderstand (d)            |
| `p_x3d_pu`     | –       | 0.1                  | Daempferwicklungs-Streureaktanz (d)       |
| `p_r3d_pu`     | –       | 0.05                 | Daempferwicklungswiderstand (d)           |
| `p_x3q_pu`     | –       | 0.1                  | Daempferwicklungs-Streureaktanz (q)       |
| `p_r3q_pu`     | –       | 0.05                 | Daempferwicklungswiderstand (q)           |
| `p_xhd_pu`     | –       | 2.2                  | Hauptreaktanz d-Achse                     |
| `p_xhq_pu`     | –       | 2.0                  | Hauptreaktanz q-Achse                     |
| `p_tauJ`       | s       | 0.5                  | Massentraegheitskonstante                 |
| `p_mLoad_pu`   | –       | `"this.s_n_pu*0.7"`  | Lastmoment normiert (Ausdruck oder Zahl)  |
| `s_phi`        | rad     | 0                    | Rotorlagewinkel                           |
| `s_n_pu`       | –       | 0                    | Drehzahl normiert                         |
| `s_psi1_dq_pu` | –       | {0,0}                | Staenderfluss {a,b} normiert              |
| `s_psih_dq_pu` | –       | {0,0}                | Hauptfluss {a,b} normiert                 |

---

### ASMStar1Sys

Asynchronmaschine, Drehstrom Stern – Invers-Gamma-Modell.
Gleiche Connector-Belegung wie SYMStar1Sys (ohne Erreger-Anschluss).

| Parameter      | Einheit | Default             | Beschreibung                    |
|----------------|---------|----------------------|--------------------------------------|
| `p_fn`         | Hz      | 50                  | Nennfrequenz                    |
| `p_Sn`         | VA      | 100e3               | Nennleistung                    |
| `p_Un`         | V eff   | 400.1               | Nennspannung (verkettet)        |
| `p_x1_pu`      | –       | 0.07                | Staenderstreureaktanz           |
| `p_r1_pu`      | –       | 0.03                | Staenderwiderstand              |
| `p_r3_pu`      | –       | 0.04                | Laeuferwiderstand               |
| `p_xh_pu`      | –       | 2.2                 | Hauptreaktanz                   |
| `p_tauJ`       | s       | 0.5                 | Massentraegheitskonstante       |
| `p_mLoad_pu`   | –       | `"this.s_n_pu*0.7"` | Lastmoment normiert             |
| `s_phi`        | rad     | 0                   | Rotorlagewinkel                 |
| `s_n_pu`       | –       | 0                   | Drehzahl normiert               |
| `s_psi1_dq_pu` | –       | {0,0}               | Staenderfluss {a,b} normiert    |
| `s_psih_dq_pu` | –       | {0,0}               | Hauptfluss {a,b} normiert       |

---

### ASMOpen1Sys

Asynchronmaschine, Drehstrom, offene Wicklungen (6 Klemmen) mit optionaler Saettigungskennlinie.
Connector[0..2] = L1/L2/L3 Seite 1, Connector[3..5] = L1/L2/L3 Seite 2.

Zusaetzliche Ausgaenge: `this.v0` (Nullsystemspannung), `this.i0` (Nullsystemstrom).

Gegenueber ASMStar1Sys zusaetzliche Parameter:

| Parameter      | Einheit | Default | Beschreibung                               |
|----------------|---------|---------|--------------------------------------------|
| `p_x3_pu`      | –       | 0.07    | Laeuferstreureaktanz                       |
| `p_saturation` | –       | 0       | Saettigungskennlinie (0=aus, 1=ein)        |
| `s_psi3_dq_pu` | –       | {0,0}   | Laeuferfluss {a,b} normiert               |
| `s_i1_dq_pu_n` | –       | 0       | Nullstrom normiert                         |

---

## 15. Messung – Measurement.js

**Quelldatei:** https://lesim.de/sys/elmLib/Measurement.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Bloecke verwenden zweistufige Mittelwertbildung:
1. `KPA_finished`: Messwert aufsummieren (`measIntegral += La * dt`)
2. `CTRL_step`: Mittelwert = `measIntegral / txIntegral`, danach Reset

---

### Measurement1AC

Einphasige Wechselgroessenmessung mit PLL-gestuetzter dq-Transformation und PT2-Filter.
Connector[0] = Signal-Eingang (Ausgangs-Endpoint, rot).

Ausgaenge (ab `CTRL_step`): `this.val_pu` (normiert), `this.ab_pu` (dq-Raumzeiger {a,b}).

| Parameter   | Einheit | Default                | Beschreibung                           |
|-------------|---------|----------------------------|---------------------------------------------|
| `p_nom`     | V/A     | 230                    | Nennwert (Strangwert)                  |
| `p_La`      | –       | `"Blocks.V1002.V"`     | Blockpfad zum Messsignal               |
| `p_tau`     | s       | 0.02                   | Tiefpass-Zeitkonstante                 |
| `p_tv`      | –       | `"Blocks.pll1.tv"`     | Blockpfad zum PLL-Transformationsvektor |
| `p_f1_Hz`   | Hz      | 0                      | Netzfrequenz fuer PT2-Phasenverschiebung |
| `s_A_PT1`   | –       | 0                      | PT2-Zustandsgroesse                    |

---

### Measurement3AC

Dreiphasige Wechselgroessenmessung (L1/L2/L3) mit Raumzeiger, dq-Transformation und PT1-Filter.
Connector[0..2] = Signal-Eingaenge L1/L2/L3.

Ausgaenge: `this.L` (L123), `this.ab` (alpha/beta-Raumzeiger), `this.ab_pu` (normiert dq).

| Parameter  | Einheit | Default                  | Beschreibung                            |
|------------|---------|------------------------------|----------------------------------------------|
| `p_nom`    | V/A     | 200                      | Nennwert (Strangwert)                   |
| `p_La`     | –       | `"Blocks.V1001.V.a"`     | Blockpfad Messsignal L1                 |
| `p_Lb`     | –       | `"Blocks.V1001.V.b"`     | Blockpfad Messsignal L2                 |
| `p_Lc`     | –       | `"Blocks.V1001.V.c"`     | Blockpfad Messsignal L3                 |
| `p_tv`     | –       | `[]`                     | Blockpfad zum Transformationsvektor     |
| `p_tau`    | s       | 50e-3                    | Tiefpass-Zeitkonstante                  |

---

### Measurement1DC

DC-Messung mit Mittelwertbildung und PT2-Filter.
Connector[0] = Signal-Eingang.

Ausgaenge: `this.val_pu` (normiert, Skalar).

| Parameter      | Einheit | Default                  | Beschreibung                          |
|----------------|---------|------------------------------|--------------------------------------------|
| `p_nom`        | V/A     | 200                      | Nennwert                              |
| `p_tau`        | s       | 0.01                     | Tiefpass-Zeitkonstante                |
| `p_La`         | –       | `"Blocks.V1001.V.a"`     | Blockpfad zum Messsignal              |
| `s_val_pu_lp`  | –       | 0                        | Tiefpassausgang normiert              |

---

## 16. Regelung: Berechnungsbausteine – ControlCalc.js

**Quelldatei:** https://lesim.de/sys/elmLib/ControlCalc.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle vier Bloecke sichern den Zustand ihrer internen Filter-/RMS-Objekte (`PT2`, `PT2_ab`, `RMS` aus `LeSimLibCtrl.js`) in einem Feld `s_chState` (siehe `s_chState`-Konvention, Abschnitt 2). Die Filterobjekte bringen dafuer eigene `dumpState()`/`loadState()`-Methoden mit; ohne diesen Checkpoint ginge der Filterzustand bei jedem Speichern/Neuladen verloren (Neu-Einschwingen).

---

### ControlCalcPow

Wirkleistung und Blindleistung aus dq-Raumzeiger (`ab_pu`). Laeuft in `CTRL_step`. Zweifache PT2-Kaskade zur Glaettung.

| Parameter | Einheit | Default | Beschreibung                                        |
|-----------|---------|---------|-----------------------------------------------------|
| `p_vol`   | –       | `""`    | Blockpfad zum Spannungsobjekt (muss `.ab_pu` haben) |
| `p_cur`   | –       | `""`    | Blockpfad zum Stromobjekt (muss `.ab_pu` haben)     |
| `p_tau`   | s       | 4e-3    | PT2-Zeitkonstante                                   |
| `s_chState` | object | {}    | Checkpoint-Objekt (Filterzustand `pu_lp1`/`pu_lp`), automatisch gesichert/wiederhergestellt |

Ausgaenge (nach `CTRL_step`): `this.activePower_pu`, `this.reactivePower_pu`, `this.phi` (Phasenwinkel Spannung/Strom [rad]), `this.cosPhi`.

---

### ControlCalcTHD

Klirrfaktor (THD) fuer bis zu 9 Signale. Laeuft in `KPA_finished`.

Algorithmus je Signal: Eingang × `tv` (Reindrehen mit Grundfrequenz `f1`) → dreifache PT2-Tiefpassfilterung (Grundschwingungsextraktion) → Ruecktransformation → Harmonische = Eingang − Grundschwingung → THD = RMS(Harmonische)/RMS(Grundschwingung).

| Parameter      | Einheit | Default | Beschreibung                                      |
|----------------|---------|---------|-----------------------------------------------------|
| `p_f1`         | Hz      | 50      | Grundfrequenz                                     |
| `p_fCutOff`    | Hz      | 30      | Grenzfrequenz der PT2-Filter                      |
| `p_in1..p_in9` | –       | –       | Blockpfade zu den Eingangssignalen (Skalar). Leer gelassene Eintraege werden ignoriert. |
| `s_chState`    | object  | {}      | Checkpoint-Objekt (Filterzustand je Kanal, Key = abgeleiteter Kanalname), automatisch gesichert/wiederhergestellt |

Ausgaenge je Signal (Kanalname `nam2` aus Blockpfad abgeleitet): `this[nam2].y1` (Grundschwingung), `.y1_rms`, `.thd` (absolut), `.thd_pu` (normiert, begrenzt 0..5), `.betrag` (Amplitude Grundschwingung).

---

### ControlCalcPow123

Wirkleistung und Blindleistung aus dreiphasigen L123-Groessen. Laeuft in `KPA_finished`. Formeln nach DIN IEC 61000-4-7.

| Parameter   | Einheit | Default                | Beschreibung                           |
|-------------|---------|----------------------------|--------------------------------------------|
| `p_f1`      | Hz      | 50                     | Grundfrequenz (reserviert)             |
| `p_fCutOff` | Hz      | 50                     | PT2-Grenzfrequenz                      |
| `p_v`       | –       | `"Blocks.FC1001.v"`    | Blockpfad zum Spannungs-L123-Objekt    |
| `p_i`       | –       | `"Blocks.FC1001.i"`    | Blockpfad zum Strom-L123-Objekt        |
| `s_chState` | object  | {}                     | Checkpoint-Objekt (Filterzustand `pow_lp`), automatisch gesichert/wiederhergestellt |

Ausgaenge: `this.pow_lp.a` (Wirkleistung gefiltert [W]), `this.pow_lp.b` (Blindleistung gefiltert [var]).

---

### ControlCalcRMS

Effektivwert (RMS) fuer bis zu 100 Signale. Laeuft in `KPA_finished`.

| Parameter  | Einheit | Default | Beschreibung                              |
|------------|---------|---------|-----------------------------------------------|
| `p_tau`    | s       | 0.02    | Tiefpass-Zeitkonstante fuer RMS-Glaettung |
| `p_src_0`  | –       | `""`    | Blockpfad zum ersten Eingangssignal       |
| `p_src_1`  | –       | `""`    | Blockpfad zum zweiten Eingangssignal      |
| `p_src_2`  | –       | `""`    | Blockpfad zum dritten Eingangssignal      |
| `s_chState`| object  | {}      | Checkpoint-Objekt (Zustand je Signal, Key = abgeleiteter Signalname), automatisch gesichert/wiederhergestellt |

Ausgang je Signal: `this[nam]` (RMS-Wert, `nam` aus Blockpfad abgeleitet). Bis zu 100 Eingaenge moeglich (`p_src_0`...`p_src_99`), auch wenn nur die ersten drei einen p_-Parameter mit eigenem Default besitzen.

---

## 17. Regelung: Einzelbausteine – ControlSingle.js

**Quelldatei:** https://lesim.de/sys/elmLib/ControlSingle.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Bloecke laufen im `CTRL_step` (ausser `ControlSetRef`: `KPA_finished`).

---

### ControlSetRef

Ausgangssetter: kopiert Werte in andere Bloecke via `eval()`. Laeuft in `KPA_finished` (jeder KPA-Schritt).

| Parameter  | Einheit | Default | Beschreibung                                    |
|------------|---------|---------|-------------------------------------------------|
| `p_src`    | –       | `""`    | Blockpfad zum Eingangssignal                    |
| `p_cmd1`   | –       | null    | JS-Ausdruck 1 (null = nicht ausgefuehrt)        |
| `p_cmd2`   | –       | null    | JS-Ausdruck 2                                   |
| `p_cmd3`   | –       | null    | JS-Ausdruck 3                                   |
| `p_cmd4`   | –       | null    | JS-Ausdruck 4                                   |
| `p_cmd5`   | –       | null    | JS-Ausdruck 5                                   |

Beispiel fuer `p_cmd1`: `"Blocks.HB_01.p_ausst = src * 0.9"`. `src` enthaelt den aufgeloesten Wert von `p_src`.

---

### ControlPT1

PT1-Glied (Tiefpassfilter erster Ordnung). Uebertragungsverhalten: G(s) = 1/(1+tau·s).
Ausgang: `this.outVal` (gefilterter Wert).

| Parameter | Einheit | Default | Beschreibung                     |
|-----------|---------|---------|--------------------------------------|
| `p_tau`   | s       | 0.1     | Zeitkonstante                    |
| `p_src`   | –       | 0.1     | Blockpfad oder Zahlenwert        |

---

### ControlModulator

Raumzeiger-Modulator (MinMax / Mod3 / OneToOne).
Ausgang: `this.L123` (Aussteuerungsgroessen {a,b,c}).

| Parameter | Einheit | Default       | Beschreibung                                     |
|-----------|---------|---------------|--------------------------------------------------------|
| `p_mod`   | –       | `"OneToOne"`  | Modulationsverfahren: `"MinMax"`, `"Mod3"`, `"OneToOne"` |
| `p_src`   | –       | `"L123"`      | Blockpfad zum Eingangs-Raumzeiger           |

---

### ControlPWM

PWM-Komparator mit Dreiecktraeger.
Ausgang: `this.zi` (Schaltzustand 0/1, aktuell nach `KPA_makeStateChange`).

| Parameter  | Einheit | Default | Beschreibung              |
|------------|---------|---------|---------------------------|
| `p_ausst`  | –       | 0.4     | Aussteuerung [0..1]       |
| `p_fs`     | Hz      | 2000    | Schaltfrequenz            |

WICHTIG – Linearitaetsanforderung des KPA-Solvers: `zi` wird in `KPA_start` als `t_zi` vorberechnet und erst in `KPA_makeStateChange` uebernommen.

---

## 18. Regelung: Koordinatentransformation – ControlVectorTF.js

**Quelldatei:** https://lesim.de/sys/elmLib/ControlVectorTF.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Bloecke laufen im `CTRL_step`.

Drehrichtung `p_dir`: `"pos"` = Mitsystem (vorwaerts, `setMul(src, tv, +1)`), `"neg"` = Gegensystem (rueckwaerts, `setMul(src, tv, -1)`).

---

### ControlVDp

Vektordreher: dq -> alpha/beta (Park-Ruecktransformation).
Connector[0] = Ausgang, Connector[1] = d-Eingang, Connector[2] = q-Eingang.
Ausgang: `this.ab` (libCTRL.Vector, alpha/beta), zusaetzlich `this.a`/`this.b` (Einzelkomponenten).

| Parameter   | Einheit | Default              | Beschreibung                     |
|-------------|---------|----------------------|----------------------------------------|
| `p_dir`     | –       | `"pos"`              | Drehrichtung                     |
| `p_src.a`   | –       | `"a"`                | Blockpfad d-Komponente           |
| `p_src.b`   | –       | `"b"`                | Blockpfad q-Komponente           |
| `p_tv`      | –       | `"Blocks.PLL_Un.tv"` | Blockpfad Transformationsvektor  |

---

### Control23

2/3-Wandler: alpha/beta -> L1/L2/L3 (Clarke-Ruecktransformation, `libCTRL.wand23`).
Ausgang: `this.a`/`this.b`/`this.c` (Phase L1/L2/L3, keine gemeinsame L123-Struktur).

| Parameter | Einheit | Default | Beschreibung                                   |
|-----------|---------|---------|------------------------------------------------------|
| `p_src`   | –       | `""`    | Blockpfad zum alpha/beta-Raumzeiger (libCTRL.Vector) |

---

### ControlVDp23

Vektordreher + 2/3-Wandler kombiniert: dq -> L1/L2/L3.
Ausgaenge: `this.ab` (Raumzeiger alpha/beta), `this.L123` (Phasengroessen L1/L2/L3).

| Parameter  | Einheit | Default              | Beschreibung                     |
|------------|---------|----------------------|----------------------------------------|
| `p_dir`    | –       | `"pos"`              | Drehrichtung                     |
| `p_src.a`  | –       | `"a"`                | Blockpfad d-Komponente           |
| `p_src.b`  | –       | `"b"`                | Blockpfad q-Komponente           |
| `p_tv`     | –       | `"Blocks.PLL_Un.tv"` | Blockpfad Transformationsvektor (via Connector 3) |

---

### Control1PhVDp

Einphasige Ruecktransformation: dq -> Skalar (a-Komponente). Berechnung: `ab = setMul(src, tv, +1)`, `val = ab.a * nom`.
Ausgang: `this.val` (physikalischer, einphasiger Sollwert).

| Parameter  | Einheit | Default              | Beschreibung                    |
|------------|---------|----------------------|--------------------------------------|
| `p_src.a`  | –       | `"ctrl"`             | Blockpfad d-Komponente          |
| `p_src.b`  | –       | `"ctrl"`             | Blockpfad q-Komponente          |
| `p_tv`     | –       | `"Blocks.PLL_01.tv"` | Blockpfad Transformationsvektor |
| `p_nom`    | –       | 0.81                 | Nennwert (Denormierung)         |

---

## 19. Regelung: PLL – ControlPLL.js

**Quelldatei:** https://lesim.de/sys/elmLib/ControlPLL.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

### ControlPLL

Phase-Locked Loop zur Phasen- und Frequenzsynchronisation.
Laeuft in `CTRL_step`. Connector[0] = Ausgang tv (rot), Connector[1] = Eingang (gelb).

Ausgang `this.tv`: `{phi, om, a=cos(phi), b=sin(phi)}`.
Zusaetzlich: `this.freq`/`this.freq_pu` (Momentanfrequenz), `this.freq_lp` (geglaettete Frequenz [Hz], feste Zeitkonstante 10 ms), `this.diff_pu` (Frequenzabweichung normiert, nach Begrenzung).

Regelkreis: Eingang (b-Achse, Phasenfehler) -> PT2-Filter (`x = src*kp`) -> Begrenzer auf Frequenzband -> Frequenz = Regelabweichung + Vorsteuerung -> Winkelintegration -> tv.

**PT2-Initialisierung:** In `KPA_start` wird der PT2-Filter mit `s_freq_pu_lp - p_f_center_pu` initialisiert, damit beim Laden eines gespeicherten Zustands keine Sprungantwort entsteht.

| Parameter      | Einheit | Default | Beschreibung                             |
|----------------|---------|---------|------------------------------------------------|
| `p_src`        | –       | `"dq_pu.b"` | Blockpfad zum Eingangssignal (dq-Querkomponente) |
| `p_f_nom`      | Hz      | 50      | Nennfrequenz                             |
| `p_f_center_pu`| –       | 1       | Vorsteuerung (Startfrequenz normiert)    |
| `p_kp`         | –       | 0.3     | Regler-Verstaerkung                      |
| `p_tau`        | s       | 4e-3    | PT2-Zeitkonstante                        |
| `p_limit_min`  | –       | 0.5     | Untere Frequenzgrenze normiert           |
| `p_limit_max`  | –       | 1.5     | Obere Frequenzgrenze normiert            |
| `s_phi`        | rad     | 0       | Phasenwinkel, wird fortgeschrieben       |
| `s_freq_pu_lp` | –       | 0       | Geglaettete Frequenz normiert            |

@see https://lesim.de/sim/B6C/index.html – B6-Gleichrichter mit PLL

---

## 20. Regelung: Symmetrische Komponenten – ControlSYM.js

**Quelldatei:** https://lesim.de/sys/elmLib/ControlSYM.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

### ControlSYM

Mit- und Gegensystem-Extraktion aus einem dreiphasigen alpha/beta-Raumzeiger.
Laeuft in `CTRL_step`. Connector[0] = Eingang, Connector[1] = tv-Eingang.

Ausgaenge: `this.posSeq` (Mitsystem, libCTRL.Vector {a,b}), `this.negSeq` (Gegensystem).

Algorithmus: Zwei parallele Integratoren mit vorgeschalteter PT2-Filterung.
- Mitsystem: dreht mit +omega
- Gegensystem: dreht mit -omega

| Parameter      | Einheit | Default                | Beschreibung                         |
|----------------|---------|------------------------|--------------------------------------|
| `p_src`        | –       | `"Blocks.AC3_Un..."`   | Blockpfad Eingangs-Raumzeiger (alpha/beta) |
| `p_tv`         | –       | `"Blocks.PLL_Un.tv"`   | Blockpfad Transformationsvektor (PLL) |
| `p_tauPt2`     | s       | 3e-3                   | PT2-Zeitkonstante                    |
| `p_tauInteg`   | s       | 7e-3                   | Integrator-Zeitkonstante             |
| `s_posSeqInt`  | –       | {0,0}                  | Mitsystem-Integratorzustand {a,b}    |
| `s_negSeqInt`  | –       | {0,0}                  | Gegensystem-Integratorzustand {a,b}  |

---

## 21. Regelung: Maschinenbeobachter – ControlMotor.js

**Quelldatei:** https://lesim.de/sys/elmLib/ControlMotor.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

### FO_Rot

Feldorientierter Maschinenbeobachter fuer ASM (FOC). Laeuft in `CTRL_step`.
Schaltet automatisch zwischen Spannungsmodell (hohe Drehzahl) und Strommodell (niedrige Drehzahl).

Ausgaenge: `this.tv` (Transformationsvektor fuer Park-Transformation), `this.psih_pu` (Hauptfluss normiert).

**Modellumschaltung:**
- `n_pu < n_uiMod * 0.99`: Strommodell aktiv (`s_uModIsUsed = 0`)
- `n_pu > n_uiMod * 1.01`: Spannungsmodell aktiv (`s_uModIsUsed = 1`)

| Parameter      | Einheit | Default | Beschreibung                                      |
|----------------|---------|---------|---------------------------------------------------|
| `p_fn`         | Hz      | 50      | Nennfrequenz                                      |
| `p_n_uiMod`    | –       | 0.7     | Drehzahlschwellwert Modellumschaltung normiert     |
| `p_xh_pu`      | –       | 2.2     | Hauptreaktanz (fuer Strommodell)                  |
| `p_x1_pu`      | –       | 0.08    | Staenderstreureaktanz (fuer Spannungsmodell)       |
| `p_r1_pu`      | –       | 0.01    | Staenderwiderstand (fuer Spannungsmodell)          |
| `p_r3_pu`      | –       | 0.015   | Laeuferwiderstand (fuer Strommodell)              |
| `p_nMot`       | –       | `""`    | Blockpfad Drehzahlmessung (`.val_pu`)             |
| `p_iMot`       | –       | `""`    | Blockpfad Strommessung (`.ab_pu`)                 |
| `p_vMot`       | –       | `""`    | Blockpfad Spannungsmessung (`.ab_pu`)             |
| `s_uModIsUsed` | –       | –       | Aktives Modell (0=Strommodell, 1=Spannungsmodell)  |

---

## 22. Regelung: Leistungselektronik – ControlControl.js

**Quelldatei:** https://lesim.de/sys/elmLib/ControlControl.js

Abhaengigkeiten: `Endpoints.js`, `ElmUtils.js`, `LeSimLibCtrl.js`

Alle Bloecke laufen primaer im `CTRL_step`. Hybridblock-Ausnahmen sind vermerkt.

**Hybrid-Bloecke** (zusaetzlich KPA-Funktionen): `ControlSSB26C` und `ControlSSIWR` sichern Netzwinkel/Aussteuerung in `CTRL_step` (langsamer Takt) und setzen die eigentlichen Zuendimpulse in `KPA_start` (schneller Takt) – noetig, weil Thyristoren/gepulste IWR exakter geschaltet werden muessen, als der CTRL-Takt erlaubt.

---

### ControlSSB26C

Thyristorstromrichter-Regler (B26C). **Hybridblock:** `KPA_start` extrapoliert den Netzwinkel und setzt Thyristorzuendimpulse exakt zum Nulldurchgang.

Kommunikation: Holt B26C-Instanz via `Blocks.get(p_idB26C)` und schreibt Zuendimpulse ueber `libCTRL.calc_ThyristorZi_B26C` direkt in die Instanz.

**Stromrichtungswechsel (Nullpause):** Bei Vorzeichenwechsel von `p_iRef` wird zunaechst auf 180° (`ausst1 = -1`) gefahren; sobald `B26C.isLocked` (kein Strom mehr fliesst), wechselt `z_B26Plus_act` auf die antiparallele Bruecke.

| Parameter      | Einheit | Default   | Beschreibung                              |
|----------------|---------|-----------|-------------------------------------------|
| `p_idB26C`     | –       | `"B26C_01"` | ID der zu steuernden B26C-Instanz       |
| `p_tv`         | –       | –         | Blockpfad zum PLL-Block                   |
| `p_iRef`       | A       | 100       | Stromreferenz (Vorzeichen = Stromrichtung) |
| `p_ausst`      | –       | 0         | Aussteuerung [-1..+1] (Zuendwinkel alpha) |
| `p_trafoGroup` | –       | 0         | Trafoschaltsgruppe (je Gruppe 30 Grad)    |
| `p_ziLen`      | Grad    | 110       | Laenge der Zuendimpulse                   |

---

### ControlB6IGBT_block

Zuendimpulsgenerator fuer B6-IGBT-Bruecke (Vollblock, 180-Grad-Bloecke).

| Parameter      | Einheit | Default | Beschreibung                          |
|----------------|---------|---------|---------------------------------------|
| `p_tv`         | –       | –       | Blockpfad zum PLL-Block               |
| `p_phi`        | rad     | 0       | Steuerwinkel                          |
| `p_trafoGroup` | –       | 0       | Trafoschaltsgruppe (je Gruppe 30 Grad) |
| `p_ziLenGrad`  | Grad    | 180     | Laenge der Zuendimpulse               |

---

### ControlSSIWR

Zuendimpulsgenerator fuer dreiphasigen gepulsten Stromrichter (I-WR). **Hybridblock** wie ControlSSB26C.

| Parameter        | Einheit | Default | Beschreibung                   |
|------------------|---------|---------|--------------------------------|
| `p_fs`           | Hz      | 5e3     | Schaltfrequenz                 |
| `p_ausst_wirk`   | –       | 0       | Wirkaussteuerung [-1..+1]      |
| `p_ausst_blind`  | –       | 0       | Blindaussteuerung [-1..+1]     |
| `p_trafoGroup`   | –       | 0       | Trafoschaltsgruppe (0 = kein Versatz) |
| `p_tv`           | –       | 0       | Netzspannungsvektor (Blockpfad zum PLL) |

---

### ControlPI

PI-Regler (allgemeiner Regler-Baustein) mit Anti-Windup.

| Parameter       | Einheit | Default    | Beschreibung                                        |
|-----------------|---------|------------|-----------------------------------------------------|
| `p_act`         | –       | `"Val"`    | Istwert (Blockpfad oder Zahl)                       |
| `p_ref`         | –       | `"Val"`    | Sollwert (Blockpfad oder Zahl)                      |
| `p_pre`         | –       | `"0"`      | Vorsteuerung (Blockpfad oder Zahl)                  |
| `p_kp`          | –       | 2          | Proportionalverstaerkung                            |
| `p_ki`          | –       | 10         | Integralverstaerkung (0 = I-Anteil deaktiviert)     |
| `p_version`     | –       | `"sumLim"` | Begrenzungsstrategie: `"sumLim"` (Begrenzung auf Gesamtsumme, implizites Anti-Windup) oder `"iLim"` (nur I-Anteil begrenzt) |
| `p_limit_lower` | –       | 0.5        | Untere Ausgangsgrenze                               |
| `p_limit_upper` | –       | 2          | Obere Ausgangsgrenze                                |
| `s_ctrlI`       | –       | 0          | Gespeicherter I-Anteil (Zustandsgroesse)            |

Bei `p_version = "sumLim"` wird der P-Anteil zusaetzlich symmetrisch auf die halbe Ausgangsbandbreite begrenzt, damit `s_ctrlI` nach einer kurzen Stoerung nicht "verhungert".

---

### ControlDAB1

Controller fuer eine einzelne Dual-Active-Bridge (`DAB1PhaseA`). Schreibt `p_aLeft`, `p_aRight`, `p_phiRight_grad` direkt in die referenzierte DAB-Instanz (per `p_DABid`).

**Ablauf pro `CTRL_step`:**
1. Droop-Regelung: normierte Spannungsdifferenz `(vL-vR)/droop + pRef_pu` → `pRef1_pu`
2. Verkettete Begrenzerkette (Stufen 2..5), jede Stufe engt die Grenzen der vorherigen ein:
   - Stufe 2: Unterspannungsschutz (< 85 % Nennspannung, 5 % Uebergangsbereich)
   - Stufe 3: Ueberspannungsschutz (> 115 % Nennspannung, 5 % Uebergangsbereich)
   - Stufe 4: Strombegrenzung auf ±`p_iMax_pu` (skaliert mit `min(vL,vR)`)
   - Stufe 5: Endlimitierung auf [-1, +1]
3. Phasenlage: `phaseShiftDeg = phaseShiftDegNom * pRef5_pu`
4. Aussteuerung `aLeft`/`aRight` aus Nullzeit und Flaechengleichheit (gleiche Formel wie `MultiDAB_Modulator`, Abschnitt 12)
5. Uebergabe an die DAB-Instanz: `p_aLeft`, `p_aRight`, `p_phiRight_grad`

| Parameter            | Einheit | Default | Beschreibung                        |
|-----------------------|---------|---------|-------------------------------------|
| `p_DABid`            | –       | `"DAB1"`| ID der zu steuernden DAB-Instanz    |
| `p_droop`            | pu/pu   | 0.1     | Droop-Koeffizient                   |
| `p_pRef_pu`          | –       | 0       | Externe Leistungsreferenz normiert  |
| `p_phaseShiftDegNom` | Grad    | 30      | Nenn-Phasenlage                     |
| `p_tNullRef_pu`      | –       | 0.02    | Normierte Nullzeit-Referenz         |
| `p_aMax`             | –       | 0.8     | Maximale Aussteuerung               |
| `p_iMax_pu`          | pu      | 1.05    | Maximaler Strom fuer die Strombegrenzung (Stufe 4) |

---

*Ende der elmlib API-Referenz*