Das lernst du heute
- Integralanteil aufsummieren
- Anti-Windup mit clamp
- Zeitbasis pro Takt
Der P-Regler von gestern hält den Puffertank bei 1800 kPa statt bei 2000. Die Pumpe bräuchte dauerhaft Setting 4, und das gibt der P-Regler nur her, solange 200 kPa fehlen. Mehr Verstärkung macht ihn unruhig. Die Lösung ist ein zweiter Anteil, der sich merkt, wie lange schon etwas fehlt.
Der Integralanteil
Der I-Anteil i ist ein Register, das jeden Takt ein Stück der Abweichung dazubekommt:
i = i + KI · e und u = KP · e + i
mul tmp e KI
add i i tmp # i waechst, solange e > 0
mul u e KP
add u u i # P-Anteil plus I-Anteil
clamp u u 0 MAXPUMPE
Fehlen 200 kPa, wächst i Takt für Takt, die Pumpe fördert mehr, der Druck steigt. Bei 2000 kPa ist e = 0: Der P-Anteil ist null, aber i bleibt stehen – genau auf dem Wert, den die Pumpe für den Verbrauch braucht. Die bleibende Abweichung ist weg.
Damit das klappt, setzt du i nur einmal auf 0, vor dem Start-Label. Steht move i 0 in der Schleife, vergisst der Regler jeden Takt alles.
Zeitbasis pro Takt
Ein Takt dauert 0,5 s. Hat deine Schleife genau ein yield, rechnet der Chip zweimal pro Sekunde, und KI gilt pro Takt. Mit KI = 0,001 und 200 kPa Abweichung wächst i um 0,2 pro Takt, also um 0,4 pro Sekunde.
Baust du die Schleife um, etwa mit sleep 1 statt yield, rechnet der Chip nur noch einmal pro Sekunde. Dann wächst i halb so schnell, obwohl im Code sonst nichts anders ist. Wer in Sekunden denken will, nimmt die Durchlaufzeit dazu:
define KI_S 0.002 # I-Anteil je kPa und Sekunde
define DT 0.5 # Sekunden pro Durchlauf
mul tmp e KI_S
mul tmp tmp DT # ergibt KI pro Durchlauf
Rechne KI pro Takt selbst aus und schreib die fertige Zahl ins define. define KI KI_S mit einem anderen define als Wert ergibt NaN – ohne Fehlermeldung.
Anti-Windup mit clamp
Mars-Morgen, der Tank ist nach einer Reparatur leer. Die Pumpe läuft am Anschlag, mehr als Setting 10 geht nicht. Der I-Anteil weiß davon nichts: Bei 2000 kPa Abweichung wächst er um 2 pro Takt und steht nach einer Minute bei 240. Ist der Tank endlich voll, muss dieser Berg erst wieder abgebaut werden. So lange läuft die Pumpe weiter voll und drückt den Tank weit über das Soll. Das nennt man Windup.
Die Abhilfe ist eine Zeile: Begrenze i auf den Bereich, den das Stellglied wirklich hat.
add i i tmp
clamp i i 0 MAXPUMPE # Anti-Windup: i nie mehr, als die Pumpe kann
NaN vergiftet den Integralanteil
Fällt der Analysator aus, ist druck NaN, damit auch e und tmp. Ein einziges add i i tmp macht i zu NaN – und NaN plus irgendwas bleibt NaN. Auch clamp rettet das nicht. Prüfe deshalb vor dem Aufsummieren und spring in einen sicheren Zweig, der i nicht anfasst:
lbn druck ANALYSATOR HASH("Puffer") Pressure Average
bnan druck stoerung # vor jeder Rechnung mit e
Ein NaN im I-Anteil bleibt für immer. Selbst wenn du den Analysator neu baust, rechnet der Regler mit NaN weiter und schreibt Unsinn an die Pumpe. Erst ein Neustart des Chips, der wieder durch move i 0 läuft, setzt i zurück.
Übung
Aufgabe
Der P-Regler für den Puffertank ist schon da. Bau den I-Anteil ein:
i(r2) wächst jeden Takt um KI · e- Anti-Windup:
ibleibt zwischen 0 und MAXPUMPE - Setting = KP · e + i, begrenzt auf 0 bis 10
- Analysator weg: Pumpe aus,
ibleibt unverändert (kein NaN)
Hinweise
Hinweis 1
mul tmp e KI, dann add i i tmp.
Hinweis 2
Direkt danach clamp i i 0 MAXPUMPE – das ist das Anti-Windup.
Hinweis 3
Zum P-Anteil add u u i, bevor du u begrenzt. Der Sprung nach stoerung steht schon vor der Rechnung, so bleibt i bei NaN unberührt.
Quiz
5 Fragen. Ab 60 % ist das Quiz bestanden – die Auswertung macht der Server.
Tag abschließen
- Übung im Simulator bestanden
- Quiz mit mindestens 60 % bestanden
Ohne Konto wird der Fortschritt nur in diesem Browser gespeichert.
Fehler in dieser Lektion melden
Zum Melden bitte anmelden. Anmelden