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

Aus LOTUS Wiki DE
Wechseln zu: Navigation, Suche

Vorlage:ArticleMetadata

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 "[1981]". Die beschriebenen Funktionen sind ggf. noch nicht verfügbar, bitte die [[1]] 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. [[2]]// Zuglänge mitteilen:
 2. [[3]]SendMessageToChildInteger(self, ((int)IBIS-A-Modulslot), 'ZUGLAENGE', ((int)Zuglaenge));
 3. [[4]]
 4. [[5]]// Wagenbus initialisieren
 5. [[6]]if (GetModuleSet(self, ((int)Modulslot))) then 
 6. [[7]] begin 
 7. [[8]] SendMessageToChildInteger(self, ((int)Modulslot), 'WAGEN_ID', WagenPosInZug);
 8. [[9]] SendMessageToChildInteger(self, ((int)Modulslot), 'SLOT_ID', 1); 
 9. [[10]] end
 10. [[11]];

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. [[12]]SendBroadcastString(self, 'IBIS_WAGENBUS', 'DEVICES', ResponseAddress);
 2. [[13]]// 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. [[14]]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:

Code: Gerät antwortet:

 1. [[15]]function ZustandAlsString(input: boolean): string;
 2. [[16]]begin
 3. [[17]] if (input) then
 4. [[18]] result := 'DEF'
 5. [[19]] else
 6. [[20]] result := 'OK'
 7. [[21]] ;
 8. [[22]]end; 
 9. [[23]]
 10. [[24]]procedure ReceiveBroadcastInteger(busId: string; id: string; value: integer);
 11. [[25]]begin
 12. [[26]] if (busId = 'IBIS_WAGENBUS') then
 13. [[27]] begin
 14. [[28]] if ((id = ResponseAddress) and (value = 0)) then
 15. [[29]] begin
 16. [[30]] SendBroadcastString(self, 'IBIS_WAGENBUS', ResponseAddress, ZustandAlsString(Defekt));
 17. [[31]] end
 18. [[32]] ; 
 19. [[33]] end
 20. [[34]] ;
 21. [[35]]end; 

Alles anzeigen


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. [[36]]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 ![[37]] 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:


---|---|---|--- 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
Aktuelles Jahr (was im IBIS eingestellt ist!)

IBIS_WAGENBUS | MONAT

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

"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 [[38]]))
    • **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.