Das lernst du heute
- Zustände über Labels verteilen
- Vergleichskette
- Zustand prüfen statt raten
Der Tankfüller von gestern hat drei Zustände und zwölf Zeilen Übergänge. Jeder Takt rechnet alle Übergänge durch, auch die von Zuständen, in denen der Automat gar nicht ist. Mit fünf oder sechs Zuständen wird daraus eine lange Kette, in der niemand mehr sieht, welche Zeile zu welchem Zustand gehört.
Besser: Der Chip springt direkt in den Block des aktuellen Zustands und rechnet nur dort.
Die Vergleichskette
beq zustand BEREIT z_bereit
beq zustand FUELLEN z_fuellen
beq zustand VOLL z_voll
beq zustand STOERUNG z_stoerung
move neu STOERUNG # Fang: unbekannter Zustand
j ausgabe
Jede Zeile vergleicht den Zustand mit einer Nummer und springt bei Gleichheit zum Label. beq ist hier richtig: Der Zustand ist eine ganze Zahl, die nur dein Code setzt – kein Messwert, bei dem ein exakter Vergleich scheitern könnte.
Ein Block pro Zustand
Jeder Block kümmert sich nur um seine Übergänge und springt dann zur gemeinsamen Ausgabe:
z_fuellen:
sge tmp druck ZIEL
select neu tmp VOLL neu
j ausgabe
Die Ausgabe am Ende schreibt Pumpe und Anzeige für alle Zustände an einer Stelle. So steht jede Regel genau einmal im Code, und ein neuer Zustand braucht nur eine Zeile in der Kette und einen Block.
Zustand prüfen statt raten
Die vorletzte Zeile der Kette ist der Fang-Zweig. Er erwischt jede Zahl, für die es keinen Block gibt – etwa weil du beim Umbauen einen Zustand gelöscht hast oder ein Register versehentlich überschrieben wird. Ohne Fang läuft der Chip einfach in den ersten Block unter der Kette und macht dort weiter, als wäre alles in Ordnung. Mit Fang landet er in der Störung: Pumpe aus, Anzeige 3, und du siehst sofort, dass etwas nicht stimmt.
Manche Programme springen mit j auf eine berechnete Zeilennummer, etwa add tmp zustand 20 und dann j tmp. Das spart ein paar Zeilen, bricht aber bei jeder Änderung: Jede neue Kommentarzeile und jedes neue define verschiebt alle Zeilennummern, und der Sprung landet mitten in einem fremden Block – ohne Fehlermeldung. Nimm Labels und die Vergleichskette.
Variante: Zustand als Unterprogramm
Mit beqal wird jeder Block ein Unterprogramm, das mit j ra statt j ausgabe zurückkehrt:
beqal zustand BEREIT z_bereit
beqal zustand FUELLEN z_fuellen
beqal zustand VOLL z_voll
Das funktioniert nur, weil die Blöcke neu setzen und die Kette zustand prüft. Würde ein Block zustand direkt ändern, träfe die nächste beqal-Zeile im selben Takt gleich den nächsten Block. Den Fang brauchst du hier extra: Prüf nach der Kette, ob der Zustand im erlaubten Bereich liegt.
Schaubild
Übung
Aufgabe
Der Tankfüller bekommt eine Sprungtabelle und einen vierten Zustand Störung (3):
- Bereit (0) → Füllen (1) bei Tastendruck
- Füllen → Voll (2) ab 3000 kPa
- Voll → Bereit unter 1000 kPa
- Störung → Bereit bei Tastendruck, aber nur, wenn der Analysator Werte liefert
- Ohne Analysator und bei jedem unbekannten Zustand: Störung
Die Blöcke für Bereit und Störung und die Ausgabe sind fertig. Schreib die Vergleichskette mit Fang-Zweig und die Blöcke für Füllen und Voll.
Hinweise
Hinweis 1
Vier Zeilen beq zustand ZUSTAND label, eine für jeden Zustand.
Hinweis 2
Danach der Fang: move neu STOERUNG und j ausgabe.
Hinweis 3
Füllen: sge tmp druck ZIEL, select neu tmp VOLL neu, j ausgabe. Voll genauso mit slt und NACHFUELLEN.
Quiz
4 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