bertram.hafner@t-online.de Informatik 11 Seite 25 6. Zustandsorientierte Modellierung Im Alltag benutzen wir vielfältige Automaten: denke an Getränkeautomat, Ampelanlage, Kaffeeautomat, Waschmaschine, Aufzug, CD-Spieler und so weiter. Diese Geräte vollziehen vordefinierte zeitliche Abläufe. Um diese Abläufe zu strukturieren, zerlegt man sie in Zustände, die der Automat annehmen kann. Von den Objekten wissen wir schon, dass ein Zustand festgelegt ist durch die Attributwerte des Objekts (siehe Karol oder siehe ein Objekt der Klasse TKonto). Zustandsübergänge werden bei Objekten durch Algorithmen realisiert. Karol (Zustand1) PositionX = 2 PositionY = 4 Richtung = O maxsprunghöhe = 1 Schritt() Karol (Zustand2) PositionX = 5 PositionY = 4 Richtung = S maxsprunghöhe = 1 Schritt() Konto1(Zustand1) Nummer = 1234 Inhaber = Huber Stand = 270,34 Einzahlen() Auszahlen() Überweisen() Konto1(Zustand2) Nummer = 1234 Inhaber = Huber Stand = 120,34 Einzahlen() Auszahlen() Überweisen() Auch bei Automaten werden die Zustände durch die Werte bestimmter Attribute (=Variablen) festgelegt. Bestimmte Ereignisse (Eingaben) lösen dann Zustandsübergänge aus, die man wieder als Algorithmen formulieren kann. Einen sehr einfachen Automaten stellt ein Stromkreis mit einem Wippschalter (Taster) dar. Dieser Automat kennt nur zwei Zustände und ein Ereignis: Zustand Z1: Zustand Z2: Ereignis T: Schalter offen, Lampe brennt nicht Schalter geschlossen, Lampe brennt Taste wird gedrückt Der Automat lässt sich durch folgendes Zustandsdiagramm beschreiben: Z1 T T Z2 Der Pfeil kennzeichnet den Start-Zustand, dieser ist hier gleichzeitig der End-Zustand (fett markiert). Das Ereignis T löst Zustandsübergange aus. Für Z1 ist der Folgezustand Z2, für Z2 ist der Folgezustand Z1. Um Automaten in den Griff zu bekommen benutzt man ein weiteres wichtiges Hilfsmittel: die Zustandstabelle: Zustand Schalter geschlossen Lampe Folgezustand bei T 1 nein aus 2 2 ja an 1 Der Zustand dieses Automaten ist allein festgelegt durch die Stellung des Schalters: geschlossen (ja/ nein).
bertram.hafner@t-online.de Informatik 11 Seite 26 Simulation in einem Delphi-Programm: Zur visuellen Umsetzung benutzen wir folgende Objekte: Taste: TButton Schalter, SchalterOffen: TImage Lampe, LampeGrau: TShape In Zustand 2 ist Lampe sichtbar, LampeGrau liegt dahinter. Ebenso ist Schalter (mit dem geschlossenen Schaltersymbol) sichtbar und überdeckt SchalterOffen. Die Schaltersymbole wurden im Bildeditor als Bitmap erstellt und in ein TImage-Objekt geladen. Das Ein- und Ausschalten der Lampe realisieren wir, indem wir die Eigenschaft Lampe.Visible auf true oder false setzen, entsprechend die Eigenschaft Schalter.Visible. Dieser einfache Sachverhalt ließe sich jetzt durch eine einfache Anweisung in der ButtonClick-Methode steu- ern: Da wir aber dieses Musterbeispiel auf komplexere Automaten übertragen wollen, packen wir die Aufgabe etwas Grund legender an: In der Zustandstabelle haben wir die benötigten Variablen und ihre Werte schon aufgelistet. Ich schlage vor, die Variablenwerte (=Daten) eines Zustands in einem Record zusammenzufassen. Deswegen deklarieren wir folgenden Record-Typ: TZustand = record S, L: boolean; fz: integer; end; Die gesamte Tabelle kommt dann in ein konstantes Array[1..2] of TZustand: const Tabelle: array[1..2] of TZustand = ((S: false; L: false; fz: 2), (S: true; L: true; fz: 1)); Der Automat muss natürlich jederzeit wissen, in welchem Zustand er sich befindet. Dazu erhält er die Integer-Variable z. Und den Zustandsübergang geben wir nicht wie oben in die Hand eines Button, sondern deklarieren eine Methode GeheInZustand(nr: integer), die beim Ereignis T (Tastendruck) aufgerufen wird. (Später bei anderen Automaten kann sie dann bei Eintritt eines beliebigen Ereignisses aufgerufen werden). Beim Programmstart (in der oncreate-methode von Form1) versetzen wir das System in den Start-Zustand: GeheInZustand(1). Beim Drücken der Taste lesen wir die Nummer des Folgezustands aus der Tabelle heraus: Tabelle[z].fz, wobei z die Nummer des Aktuellen Zustands enthält. Die gesamte Anweisung zum Wechsel in den nächsten Zustand lautet dann: GeheInZustand(Tabelle[z].fz).
bertram.hafner@t-online.de Informatik 11 Seite 27
bertram.hafner@t-online.de Informatik 11 Seite 28 Parallelschaltung mit zwei Schaltern Folgende Schaltung soll als Zustandsautomat simuliert werden: Jeder Druck auf eine Taste ändert den Zustand des zugehörigen Schalters und damit der ganzen Schaltung. Der Automat kennt zwei Ereignisse: T1, T2 (Druck auf Taste 1 / 2). Der Zustand der Schaltung hängt von zwei Variablen ab: Stellung von Schalter 1 und Schalter 2. Damit ergeben sich vier mögliche Zustände. Vervollständige folgende Zustandstabelle: Zustand Schalter 1 Schalter 2 Lampe 1 Lampe 2 1 offen offen aus aus 2 3 4 Folgezustand bei T1 bei T2 Zeichne ein Zustandsdiagramm: Aufgaben: 1. Programmiere die vorbereitete Delphi-Anwendung. Sie enthält alle Bauteile, aber noch keine Zeile Code. 2. Gib der Schaltung noch einen dritten Schalter im zweiten Zweig. Erweitere dazu deine Zustandstabelle.
bertram.hafner@t-online.de Informatik 11 Seite 29 Automat Ein endlicher, deterministischer Automat - hat eine feste Anzahl verschiedener Zustände. - Ein Zustand ist Startzustand, - (mind.) ein Zustand ist Endzustand. - Er kennt eine Menge von möglichen Eingaben (Ereignisse). - Eine Eingabe kann einen Zustandsübergang auslösen, - dabei werden bestimmte Aktionen ausgeführt. Beispiel: einfacher Getränke-Automat: Dieser nimmt nur 1Euro- und 50Cent-Münzen. Cola/Fanta kosten 1,50. Wenn 1,50 eingeworfen sind, nimmt er keine Münze mehr an und gibt auf Tastendruck das gewünschte Getränk aus. Zustandsübergangsdiagramm Eingabe / Aktion Einwurf 1 / Anzeige 1,00 hat 0 Einwurf 50 / Anzeige 0,50 Einwurf 50 / Anzeige 1,00 hat 0,5 hat 1 Taste Cola / Auswurf Cola, Anzeige 0,00 Taste Fanta / Auswurf Fanta, Anzeige 0,00 Einwurf 1 / Anzeige 1,50 hat 1,5 Einwurf 50 / Anzeige 1,50 Zustandsübergangstabelle Aktueller Zustand hat 0 hat 0,5 Eingabe (Ereignis) Einwurf 50 Einwurf 1 Einwurf 50 Einwurf 1 Anzeige 0,50 Anzeige 1,00 Anzeige 1,00 Anzeige 1,50 Aktion Folgezustand hat 0,5 hat 1 hat 1,0 hat 1,5 hat 1 Einwurf 50 Anzeige 1,50 hat 1,5 hat 1,5 Taste Cola Taste Fanta Auswurf Cola, Anzeige 0,00 Auswurf Fanta, Anzeige 0,00 hat 0 Diese Seite ist sinngemäß übernommen aus einer ppt-datei von U. Freiberger.
bertram.hafner@t-online.de Informatik 11 Seite 30 Die folgenden vorbereiteten Delphi-Beispiele liegen in einer S-Version und einer L-Version vor. Die Schüler-Version enthält eine klare Formulierung des Sachverhalts mit Aufgabenstellung. Die Delphi-Oberfläche mit allen nötigen Objekten ist bereits fertig vorgegeben, allerdings ohne jeglichen Programm-Code. Die Lehrer-Version ist eine fertige Delphi-Anwendung. Sie enthält aber außer dem Code: - Sachverhalt und Aufgabenstellung wie in der Schülerversion - die Lösung der gestellten Aufgabe in Form von Tabellen und Diagrammen. Der geschriebene Code hält sich sehr genau an diese Lösung. Diese L-Version ist im Unterricht sehr flexibel einsetzbar: - Zum kompletten Durchsprechen eines Beispiels von der Aufgabenstellung bis zum fertigen Programm. - Teilschritt als Aufgabe stellen, den Rest vorführen (z.b. nur Zustandsdiagramm erstellen lassen, nur Zustandstabelle erstellen lassen) - Beim Umsetzen in Programm-Code kann der Lehrer bestimmte Teile einfach zeigen oder auch abschreiben lassen. - Fertige Anwendung vorführen als Zielvorgabe für eine Projektarbeit. Fußgänger-Bedarfsampel
bertram.hafner@t-online.de Informatik 11 Seite 31 Getränkeautomat Dieses Beispiel ist aus mehreren Gründen schwieriger als die bisherigen: - Bisher hatten unsere Automaten nur eine einzige Variable z. Da dieser Automat viele Münzbeträge annimmt, sind die Zustände kaum mehr überschaubar, wenn wir alle denkbaren Beträge auflisten. Deswegen unterscheiden wir nur zwischen Geld reicht / Geld reicht nicht. Dann brauchen wir aber eine Variable a, in der sich der Automat den aktuellen Betrag merkt. - Die Aktionen, die durch die Ereignisse ausgelöst werden, sind umfangreicher. Wenn etwa eine Wahltaste gedrückt wird, muss das richtige Getränk ausgegeben werden, der Betrag um 1,50 vermindert werden, das Restgeld zurückgegeben werden, der Betrag auf Null gesetzt und die Anzeige aktualisiert werden. - Das Ereignis M (Münzwurf) in Zustand 1 führt nicht immer zum Folgezustand 2 sondern nur, wenn die Bedingung a+m 1,50 erfüllt ist. Lege dir in einer Zustandsübergangs-Tabelle (Ereignis-Tabelle) zurecht, bei welchem Ereignis welche Aktionen auszuführen sind. Da es vier Zustände gibt und vier Ereignisse, musst du dir 16 verschiedene Fälle durchdenken! Weil die Aktionen hier komplexer sind als bei der Ampel, genügt es nicht mehr, einfach zu schreiben geheinzustand(...) und dabei die Attribut-Werte aus einer Tabelle zu lesen. Deswegen brauchst du die Zustandsübergangs-Tabelle dann beim Programmieren der Ereignis-Methoden MuenzeClick(), RückgabeTasteClick(), WahlCClick(),... Zeichne das Zustandsdiagramm. Erstelle anschließend eine Zustandstabelle, in der du dir die Zustandswerte der verschiedenen Objekte zurecht legst: Ausgabefach (leer/voll), Wahltasten (aktiv/nicht aktiv) usw.
bertram.hafner@t-online.de Informatik 11 Seite 32 Aufzugsteuerung Wolf-Ziege-Kohl Stoppuhr