Request/Response-Block

Ein grundlegender Block ist für die Abstraktion der Bahnhardware zuständig. Er kommuniziert über die serielle Schnittstelle des Powernodes und den Portextender mit drei angeschlossenen Leistungselektroniken. Nach dem Herstellen der seriellen Verbindung wird in jedem Schritt des Modells ein CMDGLOBAL-Befehl an die Platinen gesendet. Die Argumente werden aus den Eingängen des Blocks zusammengestellt, seine Ausgänge fassen die Antworten der Hardware geeignet zusammen. Eine in C geschriebene S-function führt die Kommunikation durch.


Request/Response Block

Bei der Programmierung ist zu beachten, daß die Ausführung des Blocks 35 Millisekunden dauert. Diese Tatsache muß bei der Definition der Schrittgrößen und Samplingzeiten des Modells berücksichtigt werden. Während der Simulation liefert der Block keine sinnvollen Daten.

Eingänge

Die verschiedenen Eingänge des Blocks nehmen Arrays entgegen, die an die jeweiligen Aktoren weitergeleitet werden. Da der Block drei Leistungselektroniken entspricht, ist immer ein Drittel des Arrays einer Platine zugeordnet. Bei insgesamt 12 Werten gehen die ersten vier an die erste Leistungselektronik, die nächsten vier an die zweite und die letzten vier an die dritte.

  • signal (12 x uint8)
    • Jeder der 12 Werte entspricht genau einem Signal der Modellbahn. Die Werte sind binär codiert, das Bit 0 entspricht Rot, 1 Gelb und 2 Grün. Nicht in jedem Signal sind auch alle Farben vorhanden, die Blocksignale verfügen nur über Rot und Grün, am Bahnübergang gibt es nur Rot und Gelb.
  • point (12 x boolean)
    • Die Werte geben die Einstellungen der Weichenantriebe an, 0 schaltet das Hauptgleis frei, 1 läßt den Zug auf das Nebengleis abbiegen.
  • speedcontroller (6 x boolean)
    • Wird einer der Werte auf 1 gesetzt, aktiviert dies den Geschwindigkeitsregler für den jeweiligen Gleisabschnitt. Null erlaubt die Steuerung über eine feste PWM.
  • motormode (6 x uint8)
    • Jeder Eintrag setzt den Modus für einen der Gleistreiber. Mögliche Werte sind 0 (aus), 1 (vorwärts), 2 (rückwärts) und 3 (bremsen).
  • speed_in (6 x uint8)
    • Über diesen Wert kann die Geschwindigkeit des Zuges auf einem Block eingestellt werden. Wenn der dazugehörende Regler nicht aktiv ist, entspricht dieser Wert dem Tastverhältnis der PWM. Anderenfalls gibt der Wert die Geschwindigkeit an, die der Regler erreichen soll. In beiden Fällen sind Werte von 0 bis 127 erlaubt, je größer die Zahl desto höher das Tempo.

Ausgänge

Die Ausgänge entsprechen nach dem selben Schema den Antworten der Leistungselektroniken.

  • channel (3 x int8)
    • Dieser Wert gibt den Status der seriellen Verbindungen zu den drei Platinen an. Ein negativer Wert bedeutet, daß durch einen Fehler keine Verbindung hergestellt werden konnte oder sie verloren gegangen ist. Anderenfalls liegt die Zahl zwischen 0 und 3 und entspricht dem aktiven Kanal der Leistungselektronik.
  • contact (12 x uint8)
    • Jeder Wert enthält das letzte Ereignis, das von dem jeweiligen Kontakt registriert wurde. Bei einem Wert von 0 wurde der Sensor noch nicht ausgelöst, 1 entspricht einem vorwärts fahrenden Zug, 2 rückwärts und bei 3 wurde der Kontakt ausgelöst, ohne daß eine Richtung feststellbar war.
  • contact_seq (12 x uint8)
    • Dieses Array enthält für jeden Kontakt den entsprechenden Sequence Counter mit einer Breite von zwei Bit. Bei jedem Ereignis wird der Zähler inkrementiert, der Benutzer kann so sehen, ob neue Daten von dem Kontakt vorliegen.
  • track_occupied (6 x boolean)
    • Das System kann feststellen, ob ein Triebwagen auf den angeschlossenen Gleisen steht. Der Wert 0 bedeutet, daß das betreffende Gleis frei ist oder daß nur Waggons darauf stehen, anderenfalls wird 1 zurückgegeben.
  • track_shutdown (6 x boolean)
    • Jeder Eintrag des Arrays signalisiert, daß der Fahrstrom in einem Block abgeschaltet werden mußte. Ursache dafür ist in der Regel ein Kurzschluß.
  • speed_newdata (6 x boolean)
    • Die Geschwindigkeit der Züge und die Belegung der Gleise werden nur in gewissen Intervallen gemessen. Wenn der dazugehörende Treiber auf Fahrt oder auf Bremsen geschaltet ist, erfolgt eine Messung alle 0,2 Sekunden, sonst beträgt die Länge der Intervalle 1,0 Sekunden. Ein Wert des Arrays wird immer dann negiert, wenn die aktuell anliegenden Daten neu gemessen wurden. Dadurch kann eine Anwendung auf frische Meßwerte reagieren.
  • speed_out (6 x uint8)
    • Diese Werte entsprechen den Beträgen der zuletzt gemessenen Geschwindigkeiten auf allen Gleisen. Der mögliche Wertebereich erstreckt sich von 0 bis 127, typischerweise werden Geschwindigkeiten bis 45 erreicht.