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:

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: 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

  1. 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!
  2. 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.

  3. 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.

  4. 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.


  5. 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?

  6. 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).


  7. Die beiden Echtzeitrechner kommunizieren nicht.
    Stecken die mit X-OVER gekennzeichneten Kabel in der entsprechend gekennzeichneten Schnittstelle jedes Rechners?


  8. Die Loks fahren bei gleicher Fahrstufe unterschiedlich schnell.
    Das ist verschleißbedingt, also normal.


  9. 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.


  10. Auf den Terminals ist nur seltsames Zeug zu sehen.
    Jemand hat die Kommunikationskonfiguration des Terminals verstellt; bitte Betreuer holen und korrigieren lassen.


  11. 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.


  12. 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)

  13. 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.



  14. Letzte Aktualisierung: 20.5.2002, Frank