Uhlenbrock Intellibox IR und P50X

Dieser Artikel beschreibt, wie man das P50X Protokol nutzen kann um von einem PC mit der Uhlenbrock Intellibox IR zu sprechen. Das Augenmerk liegt auf der Programmierung einer Software, die Befehle aus dem P50X Protokol bildet und dann an die Intellibox schickt.

Vor- und Nachteile

Es gibt folgende Vor- und Nachteile. Die Nachteile sind, dass man die Software selber schreiben muss, wenn man nicht WinDigipet, den TrainController, RocRail oder JMRI verwenden möchte. Ein weiterer Nachteil ist, dass man nur mit Hardware sprechen kann, die das P50X Protokoll spricht. Die Uhlenbrock Intellibox IR ist eine solche Hardware und dieser Artikel konzentriert sich auf die Intellibox IR.

Vorteile sind, dass man selbst versteht, was die Software tut und Spaß an der Entwicklung haben kann. Ein weiterer Vorteil ist, dass das P50X Protokoll nicht zu kompliziert und auch gut dokumentiert ist. Man hat eine realistische Chance ein funktionierende Software zu erstellen.

Beispiel Quellcode

Die Software zu diesem Artikel ist unter https://github.com/Thewbi/EasyTrain verfügbar. Es handelt sich um eine Java Program, welches mit Maven übersetzt wird und Java 13 sowie JavaFX als grafische Bibliothek verwendet.

Funktionsumfang

Die Software befindet sich noch mitten in der Entwicklung. Sie besitzt momtentan folgende Funktionalitäten:

  • Elementares Layouting der Anlage (Geraden und Weichen)
  • Schalten der Weichen über ihre digitale Adressen
  • Steuern von Lokomotiven über deren Adressen
  • Auslesen von S88 Kontaktmelderzuständen

Das Ziel der Software soll es sein folgende zusätzliche Funktionen zu erfüllen:

  • Automatikbetrieb, die Software soll bis zu drei Züge über die Anlage bewegen können. Der Benutzer hat keinen Einfluss auf die Routen, die Routen werden von der Software gewählt.
  • Um den Automatikbetrieb wie oben beschrieben zu erreichen muss die Software Routen auf der Anlage berechnen können und Weichen auf den Routen schalten um die Route freizuschalten.
  • Kollisionsvermeidung von Zügen. Ein Block darf nur von einem Zuge belegt werden. Ein belegter Block darf nicht von einem anderen Zuge befahren werden.
Das P50X Protokoll

Märklin hat das P50 Protokoll entworfen. Dieses P50 Protokoll wurde um Befehle erweitert und die erweiterte Variante wird P50X genannt. Gute Beschreibungen gibt es hier und hier.

Befehle können in zwei Formen formuliert werden. Die P50XA Variante, wobei A für ASCII steht, notiert die Befehle mit Hilfe von menschenlesbaren ASCII Zeichen.

Die P50XB Variante, wobei das b für Binär steht, formuliert die Befehle durch Bytes. Die Bytes sind für Menschen schwerer zu entziffern allerdings ist die Programmierung einfacher, weshalb der Beispiellquellcode P50XB Befehle sendet.

Ein P50X Befehl besitzt eine Anfrage an die Intellibox worauf die Intellibox mit einer Antwort reagiert. Es ist also ein Request-Response Muster. Die Programmierung kann also gut strukturiert erfolgen.

Es gibt eine relativ lange Liste an P50X Befehlen. Das Gute ist, dass man nicht alle Befehle implementieren muss um erste Erfolge zu erzielen. Es reicht beispielsweiße aus, den XLok Befehl zu implementieren um eine Lokomotive fahren zu lassen.

Das P50X Protokoll ist zustandslos. Man muss sich nicht einloggen um Sicherheitsvorkehrungen zu erfüllen oder eine Session erstellen um Befehle zu senden. Jeder Befehl steht für sich selber ohne Kontext zu anderen Befehlen.

Die Befehle werden über eine serielle RS232 Verbindung gesendet. Diese Verbindung ist lediglich ein Medium und spielt nur eine untergeordnete Rolle. Im Grunde muss die Software Byte-Arrays erstellen und senden sowie empfangen können verarbeiten können.

Beispiel: XLok Befehl

Wir untersuchen das P50XB Protokol am Beispiel des XLok Befehls. Als erstes kann man sich die Dokumentation dieses Befehls durchlesen (XLok 080h).

Danach kann man unter Windows 7 einen Mitschnitt einer existierenden Software (WinDigipet oder TrainController) durchführen. Dazu verwendet man am besten die AccessPort Software von http://sudt.com/en/ap/download.htm. Diese Software kann alle Bytes abfangen und in einer Datei dokumentieren, die über die serielle Schnittstelle an die Intellibox gesendet werden und ebenfalls alles Bytes die die Intellibox an den PC zurücksendet.

Man startet zunächst AccessPort, wählt den COM-Port aus, der mitgeschnitten werden soll und startet dann die Protokollierung. Danach startet man Windigipet oder TrainController und lässt eine Lokomotive fahren.

Es entsteht beispielsweiße folgender Mittschnitt:

37	10:53:09.828	0.00005529	RailTCB32.exe	IRP_MJ_WRITE                        	COM6	SUCCESS	Length: 6, Data: 78 80 02 00 00 60 	
38	10:53:09.863	0.00000894	RailTCB32.exe	IRP_MJ_READ                         	COM6	SUCCESS	Length: 1, Data: 00 

Man kann sehen, das über die serielle Schnittstelle, die Windows als COM6 listet kommuniziert wird. Man kann auch sehen, dass ein WRITE Vorgang und ein READ Vorgang stattfindet. Der PC schreibt also Bytes und liest dann Bytes aus COM6.

Es werden 6 Bytes geschrieben: 78 80 02 00 00 60

Es wird 1 Byte empfangen 00

Die Bedeutung der Bytes kann aus der Beschreibung des XLok Befehls entnommen werden.

78 – Dieses Bytes leitet eine Befehl ein und muss vor jedem Befehl gesendet werden.

80 – Dieses Byte enthält die ID des XLok Befehls (0x80h). Der XLok Befehl hat die ID 80 Hex.

Die Bytes, die jetzt folgen sind Parameter des XLok Befehls und sagen der Intellibox welche Effekte mit dem XLok Befehl erzeugt werden sollen.

02 00 – Die ersten zwei Byte beschreiben die Adresse der Lok, die gesteuert werden soll. In diesem Fall wird die Lok 2 gesteuert.

00 – Das dritte Byte beschreibt die gewünschte Geschwindigkeit, die die Lok annehmen soll. In diesem Fall Geschwindigkeit 0.

60 – Dieses Byte enthält eine detailierte Beschreibung. Das Byte 0x60 entspricht der Bit-Maske 0110 0000. Es sind also die Bits 7 und 6 gesetzt. Bit 7 steht für Force, der Benutzer übernimmt also die manuelle Kontrolle über die Lokomotive. Das Bit 6 steht für die Richtung. Wenn Bit 6 auf den Wert 1 gesetzt ist, fährt die Lok in Vorwärtsrichtung, der Wert 0 führt dazu, dass die Lok Rückwärts fährt, also bei einer Dampflok mit dem Tender zuerst.

Die Antwort der Intellibox lautet 00. 00 ist als Antwort-Code für den XLok Befehl als OK, also eine fehlerfreie Ausführung des Befehls dokumentiert. Lautet die Antwort nicht 00, steht die Antwort für einen Fehlercode und kann zur Fehlersuche verwendet werden. Beispielsweiße wenn eine Adresse angegeben wird, die die Intellibox nicht kennt oder sonstige Fehler.

Wenn man eine Software schreiben möchte, die den XLok Befehl ausführen soll, dann muss man diesen Vorgang einfach umkehren. Man muss einfach selbst einen Array aus 6 Bytes bauen, die Daten einfügen, die man zum Erreichen der eigenen Ziele braucht und diese Daten an die Intellibox schicken.

Die Intellibox führt den Befehl dann aus und schickt die Spannungssignale auf das Gleis um den Decoder in der Lokomotive anzusteuern.

Auslesen der Rückmeldemodule S88

Märklin hat den S88 Standard entwickelt um elektronische Rückmeldungen für belegte Streckenabschnitte zu ermöglichen. Wenn ein Streckenabschnitt durch einen Zug belegt ist, wird dies elektronisch von einem S88 kompatiblen System erfasst. Das System weiß nicht, welche Lok den Abschnitt belegt, es weiß nur, das ein Abschnitt belegt ist.

Die S88 Module werden an die Intellibox angeschloßen. Dabei werden die S88 Rückmeldemodule in Reihe geschaltet. Das erste S88 Modul wird direkt an die Intellibox angeschlossen und enthält dadurch implizit die ID 1. Das zweite S88 Modul wird in Reihe an das erste Modul angeschlossen und enthält dadurch implizit die ID 2. Das dritte Modul wird an das zweite Modul angeschlossen und enthält die ID 3 usw.

Jedes S88 Modul hat 16 Eingänge. Die Intellibox speichert den Zustand jedes S88 Moduls und kann dann per P50X zu jeder Zeit nach den Zuständen der Module gefragt werden.

Eine alternative ist es die Intellibox nach Änderungen der S88 Module zu fragen. Es ist dadurch einfacher den Überblick zu behalten, da man nicht immer alle Module abfragen muss, sondern nur eine Liste der Änderungen erhält.

Wenn man einen Mitschnitt der Windigipet Software analysiert sieht man, dass Windigipet alle 100 Millisekunden einen XEvent (0xC8) sendet. Wenn dieser Befehl zurückmeldet, dass eine Änderung vorliegt, wird Windigipet einen XEvtSen (0xCB) nachsenden um die Liste der Änderungen aus der Intellibox abzufragen.

Die Antwort zum XEvtSen Befehl ist eine Liste aus Bytes. Die Liste enhält einen Eintrag für jedes S88 Modul, in dem sich Änderungen ergeben haben. Jedes Element ist drei Byte lang. Das erste Byte enthält die ID eines der S88 Module, in dem sich Änderungen ergeben haben gefolgt vom neuen Zustand der 16 Anschlüsse dieses S88 Moduls. Die 16 Anschlusszustände sind über 16 Bit also zwei Byte verteilt.

Wenn viele Züge auf der Anlage fahren, werden sich viele S88 Module ändern und die Liste wird mehrere Einträge für alle geänderten S88 Module enthalten.

Eine Steuersoftware hat normalerweiße eine Ansicht des Gleisbildes. In dieses Gleisbild werden die Belegtmelder eingetragen. Pro S88 Modul gibt es 16 Belegmelder. Das erste S88 Modul besitzt die Belegmelder 1 bis 16. Das zweite S88 Modul die Belegtmelder 17 bis 32 usw.

Es ist einfacher den Vorgang anhand eines Beispiels zu erklären.

Wenn XEvtSen mit den Bytes 03 38 1E antwortet, dann hat sich das S88 Modul 3 geändert, da das erste Byte die ID des Moduls angibt und im Beispiel 3 ist.

Das folgende Byte (38) beschreibt die Anschlüsse 9 bis 16 am Modul 3. Das darauf folgende Byte (1E) beschreibt die Anschlüsse 1 bis 8 am Modul 3.

38 entspricht der Bitmaske 0011 1000. D.h. die Eingänge 11, 12, 13 sind belegt. Diese Wert müssen zu (3 – 1) * 16 addiert werden. Es sind also die Blöcke 43, 44, 45 belegt.

1E entspricht der Bitmaske 0001 1110. D.h. die Eingänge 4, 5, 6 und 7 am S88 Modul der ID 3 sind belegt. Die Ids der Belegtmelder errechen sich aus (3 – 1) * 16 + 4 = 36, (3 – 1) * 16 + 5 = 37, (3 – 1) * 16 + 6 = 38 und (3 – 1) * 16 + 7 = 39.

Insgesamt sind also die Gleisabschnitte 36, 37, 38, 39, 43, 44, 45 belegt.

Wenn man die Ids der Belegtmelder aus der Antwort des XEvtSen berechnet hat und diese Ids in das Gleisbild eingetragen worden sind, könnte man das Gleisbild nun z.B. auf den belegten Abschnitten rot malen um anzuzeigen welche Abschnitte belegt sind.

Die Abbildung der S88 Anschlüsse auf Ids sind durch eine mathematische Formel definiert wie oben gezeigt. Welche Anschlüsse wo an die Gleise angeschlossen sind, kann die Intellibox nicht wissen. Diese Information wird daher auch nicht über das P50X Protokoll übertragen.

Nur der Gleisplaner und Anlagenbauer weiß welche Kontakte wo im Gleisbild liegen. Diese Information muss in den Planungsdaten dokumentiert werden, damit andere Menschen eine Chance haben die Anlage zu verstehen. Kein Computerprogramm kann diese Information berechnen, sie muss durch die Eingabe des Gleisbilds in die Software in den Computer eingegeben werden.

Modellierung der Gleise

Gleise werden mit zwei Knoten pro Gleis modelliert. Es gibt pro Durchfahrtsrichtung einen Knoten. Diese Modellierung erlaubt es Fahrtrichtungen in der Pfadfindung zu berücksichtigen. Die Pfadfindung kann nun zwischen einem Richtungswechsel und einer Route zwischen zwei Knoten unterscheiden, die keinen Richtungswechsel benötigt.

Routen ohne Richtungswechsel sind wichtig für Überlandfahrten wichtig. Auf der Modeleisenbahn soll die Wirklichkeit modelliert werden. In der Wirklichkeit wird ein Zug während einer Überlandfahrt, z.B. zwischen zwei Städten, keinen Richtungswechsel durchführen. Richtungswechsel sind nur während Rangierfahrten in einem Bahnhof akzeptabel.

Die Routenfindung soll Routen berechnen, die keinen Richtungswechsel enthalten. Die Art, wie die Routenfindung in dieses Verhalten gezwungen wird erfolgt durch die Modelierung der zwei Durchfahrtsrichtungen in getrennten Graphen. Daher hat jedes Gleis einen Konten pro Durchfahrtsrichtung.

Das folgende Bild zeigt einen Rundkurs mit zwei Weichen und die darin enthaltenen Knoten in den Richtungsgraphen.

Das folgende Bild zeigt die Modellierung von Weichen.

Eine Weiche wird durch zwei Knoten und drei Kanten in drei Himmelsrichtungen modelliert. Kanten dienen dazu Gleise einfach miteinander Verbindung zu können und dabei die Knoten korrekt miteinander zu verbinden. Es darf nicht passieren, das Knoten unterschiedlicher Richtungsgraphen miteinander verbunden werden. Die Graphen sollen getrennt bleiben.

Weichen, gerade und gebogene Gleise sind Sonderfälle des allgemeinen Gleis-Modells. Das allgemeine Gleismodel besitzt zwei Knoten mit denen es an zwei Richtungsgraphen teilnimmt. Das allgemeine Gleismodel besitzt bis zu vier Kanten. Eine Kante pro Himmelsrichtung, in der das Gleis eine Verbindung ausbilden kann. Gerade und gebogene Gleise verwenden zwei Kanten. Weichen verwenden drei der vier möglichen Kanten. Eine Gleisausprägung, die alle vier Kanten verwendet gibt es momentan nicht. Ein Prellbock verwendet nur eine Kante und kann daher nicht durchfahren werden.

Das allgemeine Gleismodell ist prinzipiel als ein quadratisches Feld auf einem zweidimensionalen Feld aus Gleisen modelliert. Gleise können nur in den vier Himmelsrichtungen miteinander verbunden werden. Eine 90 Grad Kurve wird also durch ein einziges Feld modelliert und kann nicht aus beispielsweiße drei Gleisstücken kombiniert werden. Die Gleisestücke auf der Modelleisenbahn und die modellierten Gleise in der Software sind nicht 1:1 aufeinander abgebildet.