qrailway 0.9

Kapitel 4.b. Serielle Kommunikation

Die Kommunikation zwischen Eisenbahnanlage und PC findet über eine Zweidrahtleitung mittels RS485 statt. Dazu werden sowohl PC als auch alle Mikrocontroller auf einen Bus aufgeschaltet. Die standardmäßig (noch) bei einigen PCs vorgesehene serielle Schnittstelle muss dazu mit einem geeignete Adapter versehen werden.

Hardware zur Kommunikation

Mit dem RS485 Bus wird eine Single Master/Multi Slave Umgebung realisiert. Der Single Master ist der PC, der über die serielle (RS232) Schnittstelle mit dem RS485 Bus verbunden wird. Die (Multi) Slaves stellen die Regler-, Weichen- und Signalkarten dar. Das System ist als Halbduplex (2 Drähte) realisiert, wobei der Master (PC) Befehle aussendet, die anschließend von dem Slave, der den Befehl empfangen hat, mit einer Statusmeldung quittiert werden. Die Slaves werden dabei parallel geschaltet und die Leitung mit einem Abschlusswiderstand terminiert.

Die folgende Darstellung zeigt die Umwandelung von RS232 (25-poliger serieller Stecker) auf RS485. Dazu wird ein MAX232 und - wie auf den einzelnen Karten - ein SN75176 Chip genutzt.

pcschnittstelle.png
SerielleVerbindung.jpg

Die serielle Verbindung ist anfällig für Übertragungsfehler, die beispielsweise durch lange Leitungen ohne entsprechende Terminierung oder Störungen durch laufende Loks verursacht werden. Bei der Fehlersuche hilft ein Oszilloskop, die Debugkarte (die den zuletzt empfangenen Befehl anzeigt) und das Fenster cFensterCheckHardware, bei dem gezielt Befehle an einzelne Karten abgesetzt werden können.

Software zur Kommunikation

Damit zwei Kontroller nicht zur gleichen Zeit senden, erfolgt die Kommunikation im Master-Slave-Verfahren. Dabei ist der PC der Master und schickt Befehle an die mit unterschiedlichen Adressen versehenen Mikrocontroller. Diese schicken im folgenden als Statusmeldungen bezeichnete Botschaften zurück an den PC. Jeder Befehl wird mit einer Antwort quittiert, damit der PC weiß, ob die Botschaft empfangen wurde. Im folgenden wird der Befehls- und Statusmeldungsaufbau beschrieben.

Der Versand und Empfang einzelner Nachrichten erfolgt über die Klasse cSeriell. Das Management der Statusmeldungen und damit der einzelnen Karten-Status sowie der noch zu sendenen Befehle wird in der Klasse cHardware erledigt.

Im folgenden wird jedes Byte naturgemäß in 8 Bit unterteilt. Das niederwertigste Bit wird als Bit 0 bezeichnet, das höchstwertige Bit als Bit 7.

Meldungen vom Mikrocontroller an den PC

Eine Statusmeldung vom Mikocontroller an den PC besteht aus 8 Byte. Das erste Byte beinhaltet die Adresse des PCs $FFh=255d$. Das zweite Byte beinhaltet die Adresse der Karte, von der die Botschaft stammt, vermindert um $80h=128d$. Das dritte Byte gibt die Meldungstypnummer an (auch dieses Byte hat einen Wert $<128d$). Das letzte Byte (Byte 8) ist die Checksumme der Bytes 2-7. Sie wird ermittelt durch

\[ \mbox{Byte 8}=\mbox{Byte 2}\quad\mbox{XOR}\quad\ldots\quad\mbox{XOR}\quad\mbox{Byte 7}. \]

Die Bytes 2 bis 7 nutzen nicht das 7.Bit (d.h. alle Werte sind $<128d$), so dass auch die Checksumme $<128d$ ist und somit lediglich das Adressenbyte des PCs $>=128d$ ist.

ByteBit(s)Bedeutung
10-7Zieladresse: $255d(=\mbox{FF}h)$
20-6Quelladresse vermindert um $80h(=128d)$
30-6Nummer der Statusmeldung
80-6Checksumme aus den Bytes 2-7

Statusmeldungen von Fahrregler-Karten

Statusmeldungen, die nur von Fahrregler-Karten kommen können:

Statusmeldung 1 (Kurzschluss, Notaus, Besetzt, Richtung)

Dies ist die Standard-Statusmeldung für alle Befehle an Fahrregler.

ByteBit(s)Bedeutung
40-5Kurschluss-Byte (1 bedeutet "Kurzschluss")
50-5Notaus-Byte (1 bedeutet "Notaus")
60-5Besetzt-Byte (1 bedeutet "Besetzt")
70-5aktuelles Richtungsbyte der Fahrregler

Statusmeldung 2 (Reedkontakt-Trigger)

Diese Statusmeldung gibt dem PC die Möglichkeit das Überfahren von Reedkontakten zu registrieren. Abgearbeitete Reedkontaktaktionen, die hier vor der Überfahrt (also vor der Ausführung) mit 0 gekennzeichnet waren, sind danach wieder auf 1 zurückgesetzt.

ByteBit(s)Bedeutung
40-6$0=$ Reedkontakt 1-7 Trigger aktiv
50-6$0=$ Reedkontakt 9-15 Trigger aktiv
60-6$0=$ Reedkontakt 17-23 Trigger aktiv
70$0=$ Reedkontakt 24 Trigger aktiv
71$0=$ Reedkontakt 16 Trigger aktiv
72$0=$ Reedkontakt 8 Trigger aktiv

Statusmeldung 20 (Kartenidentifikation)

Diese Statusmeldung wird durch den Befehl $20d$ angefordert. Sie gibt Aufschluss über den Typ der Karte, sowie die verwendete Firmware-Version.

ByteBit(s)Bedeutung
40-6$18d=$ Fahrreglerkarte, $25d=$ Signalkarte, $23d$ Weichenkarte
50-6Hauptversion der Firmware z.B. 1(.)
60-6Unterversion der Firmware z.B. (.)96
70I2C-Bus: 0 = Taster funktioniert
71I2C-Bus: 0 = Besetztmelder funktioniert.
72I2C-Bus: 0 = Reedkontakte (1) funktionieren
73I2C-Bus: 0 = Reedkontakte (2) funktionieren
74I2C-Bus: 0 = Reedkontakte (3) funktionieren

Statusmeldungen von Weichen-Karten

Statusmeldungen, die nur von Weichen-Karten kommen können:

Statusmeldung 11 (Weichenstatus)

Dies ist die Standard-Statusmeldung für alle Befehle an Weichen.

ByteBit(s)Bedeutung
40-6Ist Weiche 1-7 links? ("0" bedeutet "Links")
50-6Ist Weiche 1-7 rechts? ("0" bedeutet "Rechts")
60Ist Weiche 8 links? ("0" bedeutet "Links")
61Ist Weiche 9 links? ("0" bedeutet "Links")
62Ist Weiche 10 links? ("0" bedeutet "Links")
70Ist Weiche 8 rechts? ("0" bedeutet "Rechts")
71Ist Weiche 9 rechts? ("0" bedeutet "Rechts")
72Ist Weiche 10 rechts? ("0" bedeutet "Rechts")

Statusmeldung 20 (Kartenidentifikation)

Diese Statusmeldung wird durch den Befehl $20d$ angefordert. Sie gibt Aufschluss über den Typ der Karte, sowie die verwendete Firmware-Version.

ByteBit(s)Bedeutung
40-6$18d=$ Fahrreglerkarte, $25d=$ Signalkarte, $23d$ Weichenkarte
50-6Hauptversion der Firmware z.B. 1(.)
60-6Unterversion der Firmware z.B. (.)96
70I2C-Bus: 0 = Taster funktioniert
71I2C-Bus: 0 = Weiche 9/10 Indikator ok.
72I2C-Bus: 0 = Weiche 1-8 Links-Indikator ok.
73I2C-Bus: 0 = Weiche 1-8 Rechts-Indikator ok.

Statusmeldungen von Signal-Karten

Statusmeldungen, die nur von Signal-Karten kommen können:

Statusmeldung 20 (Kartenidentifikation)

Dies ist die Statusmeldung für alle Befehle an Signalkarten. Diese Statusmeldung wird u.a. durch den Befehl $20d$ angefordert. Sie gibt Aufschluss über den Typ der Karte, sowie die verwendete Firmware-Version.

ByteBit(s)Bedeutung
40-6$18d=$ Fahrreglerkarte, $25d=$ Signalkarte, $23d$ Weichenkarte
50-6Hauptversion der Firmware z.B. 1(.)
60-6Unterversion der Firmware z.B. (.)96
70I2C-Bus: 0 = Taster funktioniert

Befehle vom PC an den Mikrocontroller

Ein Befehl vom PC an den Mikrocontroller besteht aus 8 Byte. Das erste Byte ist die Zieladresse des Befehls, also die Kartennummer der Karte, die den Befehl empfangen soll. Das zweite Byte gibt die Nummer des Befehls an (an Hand dieser Nummer entscheidet der Mikrokontroller, wie die folgenden Datenbytes ausgewertet werden). Die Bytes 3-7 beinhalten die Befehlsdaten. Das 8. Byte ist eine Checksumme aus den Bytes 1-7. Sie wird ermittelt durch

\[ \mbox{Byte 8}=(\mbox{Byte 1}\quad\mbox{AND}\quad 80h)\quad\mbox{XOR}\quad\mbox{Byte 2}\quad\ldots\quad\mbox{XOR}\quad\mbox{Byte 7}. \]

Die Bytes 2 bis 7 nutzen nicht das 7.Bit (d.h. alle Werte sind $<128d$), so dass auch die Checksumme $<128d$ ist und somit lediglich das Adressenbyte des Mikrocontrollers $>=128d$ ist (das 1. Byte wird durch das AND zurechgestutzt). Stimmt die Checksumme nicht mit dem empfangenen Datenpaket überein, so wird keine Fehlermeldung gesendet, damit nicht Antworten von anderen Karten gestört werden.

ByteBit(s)Bedeutung
10-7Zieladresse: $>=128d$
20-6Nummer des Befehls
80-6Checksumme aus den Bytes 1-7

Allgemeine Befehle

Befehle, die sowohl von Fahrregler- als auch Weichenkarten verstanden werden. Auch zukünftige Kartenentwicklungen sollten diesen Befehl verstehen und das zugehörige Format der Antwort einhalten.

Befehl 20 (Kartentyp anfordern)

Dieser Befehl hat keinen Datenteil. Lediglich die Befehlsnummer (Byte 2) muss auf $20d$ gesetzt sein. Er liefert die Statusmeldung $20d$ zurück und gibt somit Aufschluss über die angschlossene Karte mit dieser Adresse.

Befehle an Fahrregler-Karten

Befehle, die nur von Fahrregler-Karten ausgeführt werden:

Befehl 30 (Controller-Notaus)

Die Befehlsnummer (Byte 2) muss auf $30d$ gesetzt sein. Das erste Datenbyte wird in das Notaus-Byte übertragen. Es wird Statusmeldung $1d$ zurückgeliefert.

ByteBit(s)Bedeutung
30-5Notaus-Status für Regler 1 bis 6, 1 bedeutet "Notaus", 0 bedeutet "Ein".

Befehl 31 (Statusmeldung 1)

Dieser Befehl hat keinen Datenteil. Lediglich die Befehlsnummer (Byte 2) muss auf $31d$ gesetzt sein. Er liefert die Statusmeldung $1d$ zurück.

Befehl 32 (Statusmeldung 2)

Dieser Befehl hat keinen Datenteil. Lediglich die Befehlsnummer (Byte 2) muss auf $32d$ gesetzt sein. Er liefert die Statusmeldung $2d$ zurück.

Befehl 35 (Fahrregler setzen)

Dieser Befehl setzt die Geschwindigkeit, Richtung, Beschleunigung, Mindestgeschwindigkeit und das Notaus-Bit für einen Fahrregler. Er liefert die Statusmeldung $1d$ zurück.

ByteBit(s)Bedeutung
30-2Nummer des Reglers ( $1d\leq\cdot\leq 6d$)
33Richtung
34Notaus
40-6Geschwindigkeit ( $0d\leq\cdot\leq 64d$)
50-6Beschleunigung ( $0d\leq\cdot\leq 127d$)
60-6Mindestgeschwindigkeit ( $0d\leq\cdot\leq 64d$)

Befehl 36 (Trigger setzen)

Dieser Befehl definiert einen Trigger, d.h. einen Befehl der bei Überfahrt eines Reedkontakts ausgelöst wird. Man kann den Reedkontakt angeben, die Geschwindigkeit, Richtung und die Beschleunigung. Er liefert die Statusmeldung $1d$ zurück.

ByteBit(s)Bedeutung
30-6Nummer des Reedkontakts ( $1d\leq\cdot\leq 24d$)
40-6Regler ( $1d\leq\cdot\leq 6d$)
50-6Geschwindigkeit ( $0d\leq\cdot\leq 64d$)
60-6Beschleunigung ( $0d\leq\cdot\leq 64d$)
70Trigger aktivieren (0= Aktiv)
71Richtung

Befehl 37 (Trigger ändern)

Dieser Befehl ändert einen Triggerbefehl. Dabei wird geschaut, ob der Reedkontakt bereits überfahren wurde oder nicht. Wurde er noch nicht überfahren, so wird der alte Befehl überschrieben. Wurde der Reedkontakt bereits überfahren und stimmt die aktuelle Ziel-Geschwindigkeit des Fahrregler mit der alten Reedkontakt-Befehl-Geschwindigkeit überein, dann wird der Befehl direkt übernommen, also sofort ausgeführt. Wie bei Befehl 36 kann man den Reedkontakt angeben, die Geschwindigkeit, Richtung und die Beschleunigung. Er liefert die Statusmeldung $1d$ zurück.

ByteBit(s)Bedeutung
30-6Nummer des Reedkontakts ( $1d\leq\cdot\leq 24d$)
40-6Regler ( $1d\leq\cdot\leq 6d$)
50-6Geschwindigkeit ( $0d\leq\cdot\leq 64d$)
60-6Beschleunigung ( $0d\leq\cdot\leq 64d$)
70Trigger aktivieren (0= Aktiv)
71Richtung

Befehle an Weichen-Karten

Befehle, die nur von Weichen-Karten ausgeführt werden:

Befehl 40 (Weichen stellen)

Stellt eine oder zwei Weichen. Ist die angegebene Weichennummer $0$, so wird die zweite bzw. keine Weiche mehr gestellt. Es wird Statusmeldung $11d$ zurückgeliefert.

ByteBit(s)Bedeutung
30-6Erste zu schaltende Weichennr. ( $0d\leq\cdot\leq 10d$)
40Richtung für erste Weiche, (0 bedeutet "Links", 1 "Rechts")
50-6Zweite zu schaltende Weichennr. ( $0d\leq\cdot\leq 10d$)
60Richtung für zweite Weiche, (0 bedeutet "Links", 1 "Rechts")

Befehl 41 (Weichen stellen mit Fehler zurücksetzen)

Stellt eine oder zwei Weichen. Der Datenteil entspricht dem von Befehl $40d$. Zusätzlich wird der Fehlerzähler für die angesprochenen Weichen auf $0$ gesetzt, so dass, selbst wenn mehr als weichenmaxfehlversuche (standardmäßig auf $9$ gesetzt) Fehler beim Stellen der Weiche aufgetreten sind, es trotzdem wieder möglich ist, die Weiche zu schalten. Es wird Statusmeldung $11d$ zurückgeliefert.

Befehle an Signal-Karten

Befehle, die nur von Signal-Karten ausgeführt werden:

Befehl 60 (Signal setzen)

Setzt den Signalkartenstatus (an/aus), Blinkstatus (an/aus) für den angegebenen Stecker einer Signalkarte (von qrailway wird eine Adresse zwischen 176-192 vorgesehen). Je Stecker können 72 Signale angeschlossen werden. Ein Signal entspricht dabei einer 0/1 Information, also einer Lampe. Es wird Statusmeldung $20d$ zurückgeliefert.

ByteBit(s)Bedeutung
30-6Stecker ( $0d\leq\cdot\leq 2d$ für den Kartenstatus, $3d\leq\cdot\leq 5d$ für den Blinkstatus)
40-5Status der Signale 1-6 des Steckers ("1" = ein)
50-5Status der Signale 9-14 des Steckers ("1" = ein)
60-5Status der Signale 17-22 des Steckers ("1" = ein)
70Status des Signals 7 des Steckers ("1" = ein)
71Status des Signals 8 des Steckers ("1" = ein)
72Status des Signals 15 des Steckers ("1" = ein)
73Status des Signals 16 des Steckers ("1" = ein)
74Status des Signals 23 des Steckers ("1" = ein)
75Status des Signals 24 des Steckers ("1" = ein)