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