DDorf 1981 - IBIS-Wagenbus (Für Entwickler)

  • In diesem Artikel wird die Funktionsweise des IBIS-Wagenbusses für Fahrzeuge aus dem Addon "Düsseldorf 1981" beschrieben.

    Achtung: Dieser Artikel beschreibt das Addon "Düsseldorf 1981". Die beschriebenen Funktionen sind ggf. noch nicht verfügbar, bitte die Patchnotes beachten!

    1 Der IBIS-Wagenbus

    Zusammen mit dem N-/M-Wagen erhält der neu konzeptionierte IBIS-Wagenbus nach und nach Einzug in die Fahrzeuge unseres Addons. Dabei wird diesmal der N-/M-Wagen der Vorreiter sein.

    Der IBIS-Wagenbus dient dazu, alle an ihm angeschlossenen Geräte mit Informationen zu versorgen und deren Zustand zu überwachen. Das System kann sowohl in Bussen als auch in Bahnen genutzt werden, wobei es in der Bahn naturgemäßer etwas aufwendiger ausfällt.

    1.1 Aktivierung

    Die Funktionalität des Wagenbusses muss vom Fahrzeug aus aktiviert werden, indem es den Modulen mitteilt welche IBIS-Adresse sie erhalten und vorallem (und hauptsächlich!) in welchem Fahrzeug im Zugverband Sie sich befinden. Die Module registrieren sich nicht selbsttätig am Wagenbus um besondere Abweichungen bei der Nummerierung von Adressen berücksichtigen zu können - unabhängig von belegten oder freien Slots.


    Folgende Messages werden dem Modul einmalig nach Initialisierung oder Änderung explizit geschickt:

    Code: Fahrzeug sendet
    1. // Zuglänge mitteilen:
    2. SendMessageToChildInteger(self, ((int)IBIS-A-Modulslot), 'ZUGLAENGE', ((int)Zuglaenge));
    3. // Wagenbus initialisieren
    4. if (GetModuleSet(self, ((int)Modulslot))) then
    5. begin
    6. SendMessageToChildInteger(self, ((int)Modulslot), 'WAGEN_ID', WagenPosInZug);
    7. SendMessageToChildInteger(self, ((int)Modulslot), 'SLOT_ID', 1);
    8. end
    9. ;

    Dabei ist es ausdrücklich NICHT notwendig, dem Gerät mitzuteilen ob es ein Entwerter oder eine Anzeige ist - das weiß das entsprechende Modul schon selber. Was aber notwendig ist, ist die Slotnummerierung pro Gerätetyp neu zu beginnen (falls gewünscht), was aber Anhand der Spezialisierung von Modulslots problemlos möglich sein sollte. Üblicherweise kommt ja kein Ticketdrucker in den Slot einer Frontanzeige.


    Wichtig: Sowohl "WAGEN_ID" als auch "SLOT_ID" sind 1-basierend gezählt, sowohl im IBIS als auch in den Modulen! Bei der Initialisierung des Zuges kann beispielsweise einfach die Variable "InitPosInTrain" um 1 erhöt genutzt werden. Später bei Richtungsänderung oder Zuglängenänderung muss dann durch das Fahrzeug selber "durchgezählt" werden. Dazu später mehr.


    War die Aktivierung erfolgreich, lautet die Wagenbus-Adresse des dritten Entwerters im zweiten Fahrzeug dann ENTWERTER_2:03 - die Adresse des ersten Entwerters im ersten Wagen analog dazu ENTWERTER_1:01. Andernfalls ist die Wagenbus-Adresse "UNKNOWN", das teilt das Gerät (in diesem Fall der Entwerter) auch einmal per Broadcast mit (Zwecks debugging).


    WICHTIG: Nach Änderung der Zuglänge darf die neue Anmeldung nur mit einer Zeitverzögerung erfolgen, da das IBIS die erste Anmeldung erst löscht und es hier sonst ggf. zu Überschneidungen kommen kann!

    1.2 Anmeldung

    Hat unser sich unser Gerät, wir bleiben mal bei dem Entwerter, erfolgreich eine eigene Adresse generiert (die nicht doppelt vorhanden ist!), so teilt es diese Adresse wie folgt mit:

    Code: Gerät sendet
    1. SendBroadcastString(self, 'IBIS_WAGENBUS', 'DEVICES', ResponseAddress);
    2. // ResponseAddress z.B. = 'ENTWERTER_1:01' (string!)


    Diese Mitteilung erfolgt immer nach Änderung der eigenen Adresse, zum Beispiel wenn sich die Nummerierung des Fahrzeugs ändert. So kann aus Entwerter "1:01" jederzeit Entwerter "n:01" werden, auf die Änderung der eigentlichen Adresse sollte aber dringend verzichtet werden! (auch wenn es möglich ist!!). Die Adresse muss stets zweistellig angegeben werden, ansonsten passt die Displaydarstellung nicht!


    Das Düsseldorfer IBIS-Gerät empfängt unter dem Broadcast "IBIS_WAGENBUS" und der ID "DEVICES" die entsprechende Geräteanmeldung und speichert das Gerät in einer Liste. Bei Änderung der Zuglänge wird diese Liste geleert und neu angelegt, so entfällt aufwendiger Verkehr zwischen zwei oder mehr IBIS-Geräten.


    Wichtig: Geräte die sich beim IBIS nicht anmelden werden auch niemals als "Defekt" gemeldet werden!

    1.3 Statusmeldung

    Das IBIS fragt alle angemeldeten Geräte einmalig nach der Anmeldung nach ihrem Zustand über den Wagenbus ab. Im Falle eines Entwerters sähe das wie folgt aus:

    Code: IBIS sendet
    1. SendBroadcastInteger(self, 'IBIS_WAGENBUS', 'ENTWERTER_1:01', 0);

    Wir stellen fest, dass zwar unsere busId noch immer "IBIS_WAGENBUS" ist, die Message-ID aber nun den Namen des Entwerters trägt. Das dient dazu, konkret immer nur ein Gerät anzusprechen, z.B. um diesem Gerät später explizit strings schicken zu können (sollte das mal notwendig werden). In der oben abgebildeten Message muss als value die "0" übergeben werden, damit das Gerät reagiert. Die "1" ist für spätere Verwendung reserviert.


    Der Entwerter würde dann folgendes Antworten:


    Kurzum: Auf dem Broadcast "IBIS_WAGENBUS" unter der eigenen Adresse ("ENTWERTER_1:01") wird eine Antwort als String versendet, die entweder "OK" oder "DEF" lautet. Hier sind auch andere Messages vorgesehen, bspw. Meldungen vom Haltestellenansagegerät, vom Vorverkaufsgerät oder aus der Zugsicherung. Dazu später mehr.


    Die oben genannte Nachricht

    Code
    1. SendBroadcastString(self, 'IBIS_WAGENBUS', ResponseAddress, ZustandAlsString(Defekt));

    wird dann gesendet, wenn das IBIS danach fragt. Um aber nun, anders als im echten Wagenbus, keinen ständigen Datenverkehr auf dem Bus zu haben sind unsere Geräte noch klug genug um ihren Ausfall selber kund zu tun :) Heißt also, fällt ein Gerät warum auch immer aus, sollte das per o.g. Message auch dem IBIS Gerät mitgeteilt werden. Das ist flexibler, als alle paar Sekunden nach Zuständen zu fragen und spart obendrein Ressourcen.

    1.4 Sonstige Wagenbus-Nachrichten

    Natürlich läuft nicht nur die Registrierung der Geräte über den Wagenbus, auch andere relevante Nachrichten werden übermittelt, die ich hier kurz darstellen möchte:


    Broadcast ID Datentyp Inhalt
    IBIS_WAGENBUS WABE string Aktuelle Wabe (1 - 998). Bei 0 oder 999 sperren sich z.B. die Entwerter und Ticketautomaten (Razziafunktion)
    IBIS_WAGENBUS KURZSTRECKE string Aktuelle Kurzstrecke (1 - 998). Bei 0 oder 999 sperren sich z.B. die Entwerter und Ticketautomaten (Razziafunktion)
    IBIS_WAGENBUS JAHR
    string Aktuelles Jahr (was im IBIS eingestellt ist!)
    IBIS_WAGENBUS MONAT
    string Aktueller Monat (welcher im IBIS eingestellt ist!)
    IBIS_WAGENBUS TAG string Aktueller Tag (welcher im IBIS eingestellt ist!)
    IBIS_WAGENBUS STUNDE string "00" bis "23", aktuelle Stunde.
    IBIS_WAGENBUS MINUTE string "00" bis "59", aktuelle Minute.
    IBIS_WAGENBUS LINIE_KURS string "00000" bis "99999" - Durch das IBIS verarbeitete Linien/Kurs Kombination.
    IBIS_WAGENBUS LINIE string "000" bis "999" - eingegebene Linie
    IBIS_WAGENBUS KURS string "00" bis "99" - eingegebener Kurs
    IBIS_WAGENBUS ZIEL
    string "000" bis "999" - eingegebener Zielcode
    IBIS_WAGENBUS ROUTE string "00" bis "99" - eingegebene Route
    IBIS_WAGENBUS BEIWAGEN integer Aktiviert (1) die Abfrage nach der Beiwagennummer, muss der Beiwagen senden. Die Beiwagennummer wird gelöscht, sobald Beiwagen "0" geschickt wird.


    Bei allen Messages gilt, dass diese nur bei Änderungen geschickt werden!

    1.5 Funktionsweise im Zugverband

    Um auch im Zugverband zu funktionieren, muss der Wagenbus über die Kupplung gekuppelt werden:


    CoupleBroadcastBus(self, 'IBIS_WAGENBUS', Kupplungsindex);

    CoupleBroadcastBus(self, 'PIS', Kupplungsindex);


    Wird der Zugverband getrennt ist analog dazu der Bus wieder zu entkuppeln:


    UncoupleBroadcastBus(self, 'IBIS_WAGENBUS', Kupplungsindex);

    UncoupleBroadcastBus(self, 'PIS', Kupplungsindex);


    Hat das gekuppelte Fahrzeug ebenfalls ein eigenes IBIS-Gerät ist zusätzlich der Broadcast "IBIS_INTERN" zu kuppeln bzw. zu entkuppeln.

    1.6 Position im Zugverband

    Neben der Zuglänge ist die Position im Zugverband ausschlaggebend für die Korrekte Funktion des Wagenbusses. In der Regel gilt, dass das aufgerüstete Fahrzeug immer die "1" ist und alle Fahrzeuge die dahinter folgen eine um 1 erhöhte Adresse aufweisen. Beispielsweise:


    1-2-3-4 (4-Wagen-Zug mit Fahrtrichtung "links")

    3-2-1 (3-Wagen-Zug mit Fahrtrichtung "rechts")

    1-2 (2-Wagen-Zug mit Fahrtrichtung "links")

    2-1 (2-Wagen-Zug mit Fahrtrichtung "rechts")

    1.7 Gerätenamen

    Zur eindeutigen Geräteidentifizierung tragen die Geräte präfixe. Derzeit sind folgende Gerätetypen vorgesehen:

    • TERMINAL_ (ist das nicht genutzte IBIS-Gerät bei Zweirichtungsfahrzeugen)
    • ZUGSICHERUNG_ (Zugsicherung im Fahrzeug)
    • EXT-ANZEIGE_ (Außenanzeige)
    • INT-ANZEIGE_ (Innenanzeige (auch Verlaufsmonitore etc.))
    • VVG_ (Vorverkaufsgerät (Ticketautomat für Fahrgäste))
    • DRUCKER_ (Ticketdrucker des Fahrers)
    • ENTWERTER_ (Entwerter im Fahrgastraum)
    • ANSAGE_ (Haltestellenansagegerät)
    • IRIS_ (Infrarot-Anforderungsbake)
    • VIDEO_ (Überwachungskameras)

    2 Sonderfälle

    2.1 Zwei Adressen pro Gerät

    Ist ein Modul eine kombinierte Anzeige (z.B. Ziel- UND Linienrollband), die separat kaputt gehen kann, ist es auch ohne weiteres möglich, dass dieses Modul zwei oder mehr Adressen erhält. Dies muss dann aber in der Adressierung der übrigen Geräte berücksichtigt werden! Dieses Gerät erhält nacheinander die Nachrichten WAGEN_ID sowie SLOT_ID durch das Fahrzeug, die Trennung dieser Nachrichten muss in der Anzeige intern erfolgen.

    2.2 Explizite Nachricht senden

    Für Geräte folgender Klassen besteht die Möglichkeit, an das IBIS explizite Nachrichten zu senden, die dann als Fehlermeldung auf dem Display angezeigt werden, wenn keine höher priorisierte Abfrage erfolgt:

    • ZUGSICHERUNG
    • VVG
    • DRUCKER
    • ANSAGE

    Dabei schickt das Gerät unter dem Broadcast IBIS_WAGENBUS und seiner eigenen Adresse als id (z.B. ZUGSICHERUNG_1:01) eine string-Nachricht mit bis zu 16 Zeichen. Zum Beispiel:


    SendBroadcastString(Self, 'IBIS_WAGENBUS', 'ZUGSICHERUNG_1:01', 'LZB FEHLER 44   ');


    Die Länge der Meldung ist dabei auf 16 Zeichen begrenzt. Es gibt keinen Eingangspuffer, sondern es wird immer nur die zuletzt erhaltene Nachricht angezeigt, bis diese quittiert wird. Nachrichten die gesendet werden solange eine andere Nachricht unquittiert ist, werden ignoriert.

    2.3 Gerätenummern im Beiwagen

    Da Beiwagen üblicherweise nicht über eigene IBIS-Zentralgeräte verfügen, melden sich die Geräte direkt am Zentralgerät des Triebwagens an. Dies führt dann dazu, dass diese Gerätenummern ebenfalls mit "1" beginnen. Bei dem Düsseldorfer Beiwagen ist dies der Fall, seine Wagen_ID ist immer "1"! Das bedeutet, dass bei der Nummerierung des Beiwagens darauf geachtet werden muss, dass die SLOT_ID der Module nicht schon im Triebwagen vergeben ist.


    Natürlich ist es auch möglich, die Module so zu konfigurieren, dass die Wagen-ID korrekt übermittelt wird. Dies ist dem Content-Ersteller überlassen.


    Angehangen habe ich ein Pseudoscript mit der Wagenbus-Kommunikation unserer Rollbänder. Ich habe es nicht kompiliert, dafür aber möglichst ausführlich geschrieben (viele begin, end und Klammern), damit es auch Anfänger möglichst gut verstehen können.