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.

Train Controller Bronze AutoTrain

The AutoTrain Feature

The Train Controller Bronze Modelling package allows you to control trains via the Uhlenbrock Intellibox IR.

One way to control a train is to use the AutoTrain feature. The AutoTrain feature allows you to move a train between two blocks. Train Controller will automatically search a route between the two blocks, turn all switches accordingly and drive the train from the start to the finish.

AutoTrain takes away your freedom to specify the route in detail. It is a convenient way to move locomotives if you only care about start and the target of a route but not which blocks are passed in between the start and the end.

First put a train on a block. Click on the block and choose the option “Assign Train”. A list of locomotive opens, select one of the locos and also select one of the orientation boxes. The ‘OK’ button is only activated if a loco and a orientation is selected.

Once a loco is on a block, click on the AutoTrain symbol (‘A’ Symbol) or select AutoTrain from the context menu.

AutoTrain now opens a small dialog window. This window is used to configure what role the blocks have in the route. One block has to be given the start role, the same or another block has to be given the target role.

On the layout select the block you want to start from. This is the block that you put the loco on in the prior step. In the AutoTrain dialog, use the green arrows to assign the start role to the block. There are two arrows which define the direction that the loco will drive when starting the route. Once you clicked the arrow button, the block will be marked green at the direction that the train will start from.

Now you need to assign the target role to a block. The target block can be the same block as the start block. If you assign the start and end role to the same block, Train Controller Bronze will find a circular route. The train will leave and arrive at the same block.

You can also assign the target role to another block. Train Controller will then drive the loco from the start block to the target block. Train Controller will automtically choose a route.

In order to assign the target role, use the orange buttons in the AutoTrain dialog. The target block will also be marked orange in the layout view. The orientation matters. If you want a train to enter the target block from the left, you have to select the target button that puts the orange marker on the right side of the target block. The orange marker marks the end of the route.

After the start role and the target role have been assigned, click the ‘A’ button in the AutoTrain dialog to start the route. The loco will move over the layout and AutoTrain will control all switches to open the automatically choosen route.

Debugging

What if nothing happens? What if the route does not work?

  1. Verify that one of your locomotives is working correctly. Put that loco onto your layout. Use the Intellibox to manually control that loco. Now you know that the Intellibox can send commands to the loco.
  2. Check that the PC is connected to the Intellibox. Use the device manager to find the COM port (on windows) that the intellibox is connected to.
  3. In TrainController, edit the settings of the Intellibox. Use the correct COM Port. Control a switch manually in order to verify that Train Controller can talk to the Intellibox and the Intellibox sends commands to the layout correctly.
  4. In Train Controller, control a locomotive manually, that is without AutoTrain. I do not know how that works but you should be able to have a manually controlled throttle for your locomotive and the locomotive should accelerate and brake correctly.
  5. Try out AutoTrain after all steps above did work correctly.

Sometimes a locomotive does not run correctly. Try to put oil into the locomotive and try to push the locomotive over the layout manually in order to help it gain speed until it is able to run itself. A case was observed where TrainController and the Intellibox were working 100% correctly but the loco just was stuck on the rail and would not start the route!

You should test with your most trustworthy locomotive. Use a locomotive that never fails. Basically you want to exclude all sources of errors to narrow down the real issue.

Connecting to the Uhlenbrock Intellibox I using a USB Serial Cable

The Cable I used is the one from CableCreation (link). It is a 2 meter cable with nice golden contacts and a FTDI chipset which supposedly are the most capable manufacturers of Serial equipment.

The cable is detected as a 2xx chipset and so I downloaded the 2xx windows driver for the cable from their drivers page. I did install the 64bit version of the 2.12.28 version of the windows driver.

After installing the drivers, use the windows device manager and unfold the COM port section of the device tree to check which COM port is created when plugging in the cable.

In your ModelTrain-Software Package, when adding the Uhlenbrock Intellibox I, use that COM port as a connection option. Your PC should now be able to send commands via the ModelTrain-Software throught the USB – Serial Cable to the Uhlenbrock Intellibox I.

My first test was to control some of the switches and to control one of the engines. It worked just fine. As model trains tend to have hundreds of options to control, it is hard to say if every last option will work as planned for you but the first test looked promising at least.

“–Kurzschluss Booster–“

The Intellibox I from Uhlenbrock shows “–Kurzschluss Booster–“, What to do?

Before you hunt for short circuits on your layout, first disconnect the boosters and the Intellibox I from your layout and connect them to a very small system that only connects the boosters to the Intellibox I but nothing else. No trains, signals, rails, rolling stock or anything else. If this small subsystem still shows the error, you know that there is no short circuit caused by your layout or anything on it but the settings in either the boosters or the Intellibox are incorrect.

If the small subsystem still shows the error, try the solution outlined here. For me the solution option A did the trick. It tells you to set the Sonderoption (custom option) 25 to the Value 1 and the Sonderoption 907 to the Value 5.

The peculiar thing is the the error is described as the Intellibox I sending DCC commands to a Märklin Booster 6017 which will signal a short circuit back to the Intellibox because it cannot correctly process the DCC signals. My dad swears that he used the system in Motorla / DCC co-operation for two years and the problem never occured. I do not know what to think about all this, but Solution A solved it at least for now.

The following text is taken from the Uhlenbrock FAQ and is not mine! I did copy it in case the Uhlenbrock FAQ goes away. The Uhlenbrock FAQ is awesome and spot on and it would be a shame if it is lost one day.

Problem/Frage:
Wenn die Intellibox mit einem Märklin 6017 Booster betrieben wird, erscheint nach dem einschalten der Anlage die Fehlermeldung:
  "--Kurzschluss Booster--".
Hinweis:
Fall A - Sie benutzen nur Motorola-Decoder

es ist wahrscheinlich, dass Sie, obwohl Sie nur Motorola-Decoder benutzen, doch zumindest einmal eine DCC-Lok "zum ausprobieren" aufgerufen haben.

Dies hat zur Folge, dass die Intellibox automatisch die Sonderoption 25 auf den Wert 1 und die Sonderoption 907 auf dem Wert 5 gestellt hat. Das bedeutet, dass beim Anschalten der Anlage ab jetzt auch ein DCC-Signal mit ausgesendet wird, welches vom Booster 6017 als Kurzschluß interpretiert wird.
Lösung:
  Bitte Sonderoption 25 zurücksetzen auf Wert = 0
  Bitte Sonderoption 907 zurücksetzen auf Wert = 1

Falls trotzt dieser Änderung immer noch eine Kurzschluss- Fehlermeldung entsteht, verändern Sie bitte auch den Wert der Sonderoption 36 auf einen größeren Wert als die Werkseinstellung von 20 z.B. auf den Wert 100.
Hinweis:
Fall B - Sie fahren auch im Mischbetrieb mit DCC-Decodern.
Lösung:
die Sonderoption 901 ist wahrscheinlich nicht - laut Intellibox Handbuch - erhöht worden. Die Sonderoption 901 sollte auf den Wert 3 bis 5 gesetzt werden.

Falls trotzt dieser Änderung immer noch eine Kurzschluss- Fehlermeldung entsteht, verändern Sie bitte auch den Wert der Sonderoption 36 auf einen größeren Wert als die Werkseinstellung von 20 z.B. auf den Wert 100 .

Ebenso am Märklin Booster die DIP-Schalter 1 und 2 auf "on" stellen.

Kurzanleitung: Zurücksetzen einer Sonderoption auf die Werkseinstellung

Sonderoption anwählen, den Cursor auf die rechte Seite setzen und die "C" Taste so lange betätigen bis die Werkseinstellung der Sonderoption wieder im Display erscheint. Danach die [enter] Taste betätigen.