Lernziele
- Fehlertolerante Steuerung
- Zeitüberwachung
- Zugbetrieb mit zwei Loks
Unterlagen
- Beschreibung der Ada-Umgebung
- Ada Language Reference Manual
- Beschreibung der Modelleisenbahn und Ansteuerung
- In Aufgabe 2 entwickelte Steuerstrategie
Aufgabenstellung
Es soll ein Steuerungssystem für zwei Lokomotiven auf unserer Teststrecke entwickelt werden, das einen automatischen und störungsfreien Zugverkehr anhand eines Fahrplans erlaubt, ohne dass ein Eingreifen durch eine Person zur Steuerung notwendig ist. Es darf auch im Störungsfall, z.B. bei falsch gestellten oder gestörten Weichen, Fehlkontakten oder Verspätungen der Loks nicht zu einem Zusammenstoß kommen. Sollte die Steuerung in einen Zustand kommen, bei dem der sichere Fahrbetrieb nicht mehr gewährleistet ist, muss der Betrieb eingestellt werden. Es sind in diesem Falle Ausgaben vorzusehen, warum der Betrieb eingestellt werden musste.
Fahrplan und Startpositionen der zwei Loks wurden bereits in Aufgabe 2 vorgegeben. Entwickeln Sie nun ein Programm, dass die Loks entsprechend steuert, und realisieren Sie dabei Ihre in Aufgabe 2 am Modell entwickelte Steuerstrategie.
Hinweise zur Aufgabe
- Die Kreuzweiche kann zu Beginn des Fahrbetriebs einmal in die richtige Stellung - Kreuzung - gebracht und anschließend nicht mehr verstellt werden.
- Lassen Sie die beiden Loks in verschiedenen, konstanten sinnvollen Geschwindigkeitsstufen fahren.
- Implementieren Sie die Fahrpläne und Gleisstrecke möglichst in übersichtlichen Datenstrukturen, so dass das eigentliche Programm nur relativ unkompliziert und allgemein gehalten ist. Vermeiden Sie damit, viele Sonderfälle in Programmcode auszuprogrammieren.
- Das Betriebssystem der Echtzeitrechner führt einen präemptiven
Prozesswechsel nur ca. alle 2 Sekunden durch. Um die zwei Loksteuerungen
als eigenständige Prozesse zu realisieren (schöne Lösung), achten Sie
daher darauf, Prozesswechsel explizit durch Einfügen des Befehls
delay 0.0;
zu gestatten. - Die Nummern der Loks sollten von Hand zu Programmbeginn eingebbar sein.
- Erkannte ausgebliebene oder fehlerhaft auftretende Kontakte werden auf dem Bildschirm ausgegeben. Prellende Kontakte werden vom Programm erkannt und ignoriert.
- Treten zwei Fehler nacheinander auf, ohne dass dazwischen wieder ein korrekter Zustand erkannt wurde, soll das Programm abbrechen und eine entsprechende Fehlermeldung ausgeben.
- Implementieren Sie auf jeden Fall eine Zeitüberwachung für die erwarteten Kontakte. Sonst ist es unmöglich, ausgebliebene Kontakte zu erkennen und entsprechend zu reagieren. Eine mögliche elegante Lösung ist dafür, für jede Lok die letzte Fahrtzeit jedes Streckenabschnittes zu speichern. Für die Anfangsinitialisierung können z.B. Messwerte aus Aufgabe 1 verwendet werden. Fährt nun eine Lok in einen Abschnitt ein, wird der Ausgangskontakt spätestens nach der dafür gespeicherten Zeit plus einen Sicherheitswert erwartet. Wird der Kontakt vorher ausgelöst, kann die Fahrtzeit aktualisiert werden und die Lok fährt normal weiter. Ist jedoch nach der berechneten Zeit kein Kontakt ausgelöst worden, muss von einem defekten Kontakt ausgegangen werden. Das Programm weiss dann trotz ausbleibendem Kontakt, dass die Lok bereits in den Folgeabschnitt fährt, und kann entsprechend reagieren (Abschnitt belegen, Lok stoppen etc).
- Der Zustand des gesamten Systems und die aktuellen Maßnahmen zur Steuerung müssen anhand von Ausgaben an den Terminals nachvollzogen werden können. Beim Starten der Steuerung sollen die Loks an den in den Bildern angegebenen Positionen stehen. Die Bezeichnung der Loks ist dabei zu beachten, da sie andernfalls in die falsche Richtung fahren.
- Es hat sich als hilfreich erwiesen, einen eigenen Prozess zu realisieren, der ausschließlich mit dem Eisenbahn-Steuergerät kommuniziert. Also, die API-Zugriffe in einem Prozess zu kapseln.