Eisenbahnanlage und Programmierschnittstelle PMfE
Dokumentation der Programmierschnittstelle
Fahren auf der Anlage
Terminal Ein-/Ausgaben
Gleisbild
FAQ / Troubleshooting
Die Programmierschnittstelle
Zum Bedienen der Eisenbahnanlage stehen folgende Programmbibliotheken zur Verfügung:
- Bahn_Defs, enthält die Definition aller benötigten Datentypen
- Eisenbahn_IO, enthält die Funktionen zur Steuerung Anlage
- Terminal_IO, enthält die Funktionen zur Ausgabe auf dem Terminal
Bibliothek Bahn_Defs
Typdefinitionen
with Machine_Types; use Machine_Types;
package Bahn_Defs is
subtype T_Lok_Nr is Byte range 1..80;
Loknummern von 1 bis 80 sind möglich.
type T_Geschwindigkeit is 0..14;
0 -> Halt
1 -> langsam
.
.
14 -> schnell
type T_Weiche is (Links_Oben, Links_Unten, Kreuzung, Rechts_Oben, Rechts_Unten);
Die Weichen sind so bezeichnet, wie sie von einem Betrachter vor der Anlage
gesehen werden.
type T_Richtung is (Gerade, Rund);
Jede Weiche hat zwei mögliche Stellungen:
Gerade -> Nicht abbiegen bzw. Kreuzung überqueren
Rund -> Abbiegen bzw. Kreuzung nicht überqueren
type T_Kontakt is (K1, K2, K3, K4, K5, K6, K7, K8, K9, K10, K11, K12, K13, K14, K15, K16);
Entspricht den auf der Anlage angegebenen Kontaktbezeichnungen.
type T_Kontaktfeld is array (T_Kontakt) of Boolean;
for T_Kontaktfeld'Size use 16;
Jedes Kontaktfeld ist 2 Bytes groß (1 Bit/Kontakt = 2 Bytes)
end Bahn_Defs;
Bibliothek Eisenbahn_IO
Prozeduren
with Bahn_Defs; use Bahn_Defs;
with Calendar; use Calendar;
with Machine_Types; use Machine_Types;
package Eisenbahn_IO is
procedure Initialisieren(Lok1, Lok2: in T_Lok_Nr);
Initialisiert die Eisenbahnanlage. Die Fahrtgeschwindigkeiten der angegebenen Loks
werden auf Null (Halt) gesetzt und alle Weichen werden gerade gestellt.
Mögliche Werte für Lok1: 1 - 80
Mögliche Werte für Lok2: 1 - 80
procedure Initialisieren;
Initialisiert das Steuergerät und setzt alle 80 möglichen
Lokgeschwindigkeiten auf Null, sowie alle Weichen auf gerade.
Dauert ca. 10 Sekunden!
procedure Nothalt;
Stoppt mit sofortiger Wirkung alle Züge; Wiederaufnahme des Fahrbetriebs ist nur durch
erneutes Initialisieren möglich.
procedure Lok_Steuern (Lok: in T_Lok_Nr; Geschwindigkeit: in T_Geschwindigkeit);
Setzt die Fahrtgeschwindigkeit der angegebenen Lok.
Mögliche Werte für Lok: 1 - 80
Mögliche Werte für Geschwindigkeit: 0 (Halt), 1 (langsam) - 14 (schnell)
procedure Weiche_Schalten (Nr: in T_Weiche; Richtung: in T_Richtung);
Schaltet eine Weiche in die angegebene Richtung.
Mögliche Werte für Nr: Links_Oben, Links_Unten,
Kreuzung,
Rechts_Oben, Rechts_Unten
Mögliche Werte für Richtung: Gerade, Rund
procedure Kontaktstatus_abfragen (Aktiv : in Boolean;
Kontakte: out T_Kontaktfeld;
Empfangen: out Boolean);
Liefert die seit dem letzten Auslesen überfahrenen Kontakte zurück.
Mit Aktiv auf "true" wird der Auslesevorgang initiiert, danach blockiert die Funktion solange,
bis Kontaktdaten empfangen wurden. Empfangen ist danach immer "true".
Mit Aktiv auf "false" wird nichtblockierend auf den ankommenden Kontaktstatus
gewartet. Empfangen gibt dabei an, ob Kontaktdaten gelesen wurden.
Der passive Rechner muss die Funktion mit Aktiv auf "false" aufrufen.
Es muss immer ein Rechner die Funktion mit Aktiv=True aufrufen, da sonst
das Auslesen der Kontaktinformationen vom Märklin-Steuergerät nicht initiiert wird.
Mögliche Werte für Aktiv: true, false
procedure Zeit_holen(Zeit : out Time);
Gibt die aktuelle Systemzeit zurück.
procedure Schreiben (B :in Byte);
Sendet ein Byte an den anderen Echtzeitrechner.
procedure Lesen (B : out Byte; Empfangen : out Boolean);
Liest ein Byte nichtblockierend vom anderen Echtzeitrechner.
Empfangen gibt dabei an, ob ein Byte gelesen wurden.
end Eisenbahn_IO;
Bibliothek Terminal_IO
Prozeduren
with Bahn_Defs; use Bahn_Defs;
package Terminal_Io is
procedure Anhalten (Lok: T_Lok_Nr; Kontakt: T_Kontakt);
Stellt eine angehaltene Lok auf dem gegebenen Kontakt dar.
Mögliche Werte für Lok: 1 - 80
Mögliche Werte für Kontakt: K1 - K16
procedure Fahren (Lok: T_Lok_Nr; Kontakt: T_Kontakt);
Stellt eine fahrende Lok auf dem gegebenen Kontakt dar.
Mögliche Werte für Lok: 1 - 80
Mögliche Werte für Kontakt: K1 - K16
procedure Stellen (Nr: T_Weiche; Richtung: T_Richtung);
Stellt die Richtung einer Weiche dar.
Mögliche Werte für Nr: Links_Oben, Links_Unten,
Kreuzung,
Rechts_Oben, Rechts_Unten
Mögliche Werte für Richtung: Gerade, Rund
procedure Ein_Zeichen_Einlesen (Zeichen: in out CHARACTER);
Gibt Prompt "Eingabe:" aus und liest ein Zeichen von der Tastatur.
procedure Ein_Zeichen_Nichtblockierend_Einlesen (Zeichen: in out CHARACTER; Empfangen : Boolean);
Liest ein Zeichen nichtblockierend von der Tastatur. Wenn ein Zeichen gelesen wurde,
liefert Empfangen true zurück.
procedure Lok_Nr_Einlesen(Prompt: String; Lok: out T_Lok_Nr);
Gibt Prompt aus und liest die Lok-Nr. von der Tastatur
procedure Fehler (Text: String);
Gibt "Fehler:" gefolgt von Text aus
procedure Anzeigen (Text: String);
Gibt übergebenen Text aus.
procedure Init_Grafik(L1, L2 : T_Lok_Nr);
Initialisiert den Bildschirm und zeichnet einen Gleisplan.
Mögliche Werte für L1: 1 - 80
Mögliche Werte für L2: 1 - 80
end Terminal_Io;
Fahren auf der Anlage
Zu Beginn jeder Fahrt mit der Eisenbahn muß die Anlage in den Startzustand versetzt werden. Das
bedeutet im einzelnen:
- Die Loks werden in den Geschwindikkeitszustand stehen versetzt.
- Die Weichen werden alle in Stellung gerade geschaltet.
- Der Anlagenstrom wird eingeschaltet.
Dies ist notwendig, denn es können noch unterschiedliche Geschwindigkeiten in den Loks gespeichert sein
und die Weichen besitzen keinen definierten Ausgangszustand.
Terminal Ein-/Ausgaben
Nach dem Initialisieren des Terminals (Init_Grafik) ist der obige Ausgabeschirm zu sehen. Die Weichen stehen alle in Stellung gerade und es ist noch keine Lok auf der Strecke zu sehen.
Sobald der Fahrbetrieb gestartet wurde, können mit den Prozeduren aus Terminal_IO die Stellung der Weichen und die Position der Loks sowie deren Bewegungszustand dargestellt werden.
Der untere Bildschirmbereich ist für Ein-/Ausgabe reserviert.
Gleisbild
FAQ / Troubleshooting
- Beim Übersetzen mit ada ... kommt die Meldung ada.lib has wrong format
- Lösche alle alten Einstellungen aus EES bzw. schalte
korrekt zwischen Robotik und PMfE um!
- Mein Programm wurde gelinkt, aber wird nicht auf den Echtzeitrechner geladen.
- Ist der Rechner auch eingeschaltet? Wenn nicht, schalte ihn ein und starte Dein Programm nach ca. einer Minute neu.
- Meistens hilft Warten, das Netz ist oft überlastet.
- Mein Programm wurde laut Anzeige auf der SUN geladen, auf dem Terminal tut sich aber nichts.
- Ist das Terminal eingeschaltet? Wenn nicht, schalte es ein. Es muss beim Einschalten piepsen, ansonsten Stromversorgung checken.
- Zeigt das Terminal die Kopfzeile an? Wenn nicht, die beiden Regler auf der rechten Seite ganz nach vorne drehen.
- Steckt das mit dem Rechnernamen gekennzeichnete Kabel in der entsprechend gekennzeichneten Schnittstelle?
- Steht in der Kopfzeile als erstes Wort LINE? Falls dort LOCL steht, drücke F4, dann steht wieder LINE da.
- Steht in der Kopfzeile als zweites Wort HOLD? Wenn ja, drücke F1 und es verschwindet.
- Mein Programm bricht nach dem Laden mit der Meldung a.run_etdm : unexpected target signal: processor exception number 128 at ... ab.
Starte Dein Programm neu.
- Mein Programm läuft, aber ich kann keine Weichen schalten, Loks steuern oder Initialisieren.
- Leuchtet die grüne Lampe an Deiner Anlage? Wenn nicht, Stromversorgung checken.
- Ist der Not-Aus Schalter gedrückt? Wenn ja, dann drehen, dass er herausspringt.
- Ist ein Kurzschluss auf Deiner Anlage (z.B. Lok falsch aufgesetzt)? Entferne ihn und resette die Anlage.
- Steckt das mit Eisenbahn gekennzeichnete Kabel in der entsprechend gekennzeichneten Schnittstelle?
- Hast Du in Deinem Programm die richtigen Loknummern verwendet?
- Meine Loks fahren, aber einige Kontakte werden nicht ausgelöst.
Sieh nach, ob die Kontakte eingeschaltet sind (rote Kippschalter mit weißem Punkt nach unten schalten).
- Die beiden Echtzeitrechner kommunizieren nicht.
Stecken die mit X-OVER gekennzeichneten Kabel in der entsprechend gekennzeichneten Schnittstelle jedes Rechners?
- Die Loks fahren bei gleicher Fahrstufe unterschiedlich schnell.
Das ist verschleißbedingt, also normal.
- Daten der seriellen Schnittstelle zwischen den Rechnern kommen
verspätet an oder ähnliches.
Die Schnittstellenbausteine haben einen kleinen Puffer auf der Empfangsseite
(einige Bytes), so dass bei langsamem Auslesen noch alte Daten vorliegen.
Wenn der Puffer voll ist, gehen Daten verloren.
- Auf den Terminals ist nur seltsames Zeug zu sehen.
Jemand hat die Kommunikationskonfiguration des Terminals verstellt;
bitte Betreuer holen und korrigieren lassen.
- Die Anlage verhält sich unsinnig, wenn der aktive Rechner ein Reset bekommt.
Man muss den Rechner ausschalten beim Testen der letzten Aufgabe,
beim Booten (nach Reset) werden Meldungen über die serielle Schnittstelle
geschickt, die an das Märklin-Interface angeschlossen ist. Dann funktioniert
nichts mehr. Nach dem Ende der Aufgabe bitte Rechner wieder einschalten
und vor der Ausführung der nächsten Aufgabe den schwarzen Märklin-Reset-Knopf
drücken, damit alles zurückgesetzt wird.
- Die Loks fahren nicht, aber ich kann Weichen schalten.
- Hast Du in Deinem Programm die richtigen Loknummern verwendet?
- Brummen die Loks bei höchster Fahrstufe nur und laufen nicht, dann schreibe eine Mail (s. letzter FAQ-Punkt)
-
Meine Lok fährt nur rückwärts, was kann ich
tun?
Starte dieses Programm (Lok_umschalten) auf einem
Echtzeitrechner, stell die Lok aufs Gleis
und gib die entsprechende Lok-Nr. ein.
Letzte Aktualisierung: 20.5.2002, Frank