qrailway 0.9
|
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.
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.
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.
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.
Eine Statusmeldung vom Mikocontroller an den PC besteht aus 8 Byte. Das erste Byte beinhaltet die Adresse des PCs . Das zweite Byte beinhaltet die Adresse der Karte, von der die Botschaft stammt, vermindert um
. Das dritte Byte gibt die Meldungstypnummer an (auch dieses Byte hat einen Wert
). Das letzte Byte (Byte 8) ist die Checksumme der Bytes 2-7. Sie wird ermittelt durch
Die Bytes 2 bis 7 nutzen nicht das 7.Bit (d.h. alle Werte sind ), so dass auch die Checksumme
ist und somit lediglich das Adressenbyte des PCs
ist.
Byte | Bit(s) | Bedeutung |
1 | 0-7 | Zieladresse: ![]() |
2 | 0-6 | Quelladresse vermindert um ![]() |
3 | 0-6 | Nummer der Statusmeldung |
8 | 0-6 | Checksumme aus den Bytes 2-7 |
Statusmeldungen, die nur von Fahrregler-Karten kommen können:
Dies ist die Standard-Statusmeldung für alle Befehle an Fahrregler.
Byte | Bit(s) | Bedeutung |
4 | 0-5 | Kurschluss-Byte (1 bedeutet "Kurzschluss") |
5 | 0-5 | Notaus-Byte (1 bedeutet "Notaus") |
6 | 0-5 | Besetzt-Byte (1 bedeutet "Besetzt") |
7 | 0-5 | aktuelles Richtungsbyte der Fahrregler |
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.
Byte | Bit(s) | Bedeutung |
4 | 0-6 | ![]() |
5 | 0-6 | ![]() |
6 | 0-6 | ![]() |
7 | 0 | ![]() |
7 | 1 | ![]() |
7 | 2 | ![]() |
Diese Statusmeldung wird durch den Befehl angefordert. Sie gibt Aufschluss über den Typ der Karte, sowie die verwendete Firmware-Version.
Byte | Bit(s) | Bedeutung |
4 | 0-6 | ![]() ![]() ![]() |
5 | 0-6 | Hauptversion der Firmware z.B. 1(.) |
6 | 0-6 | Unterversion der Firmware z.B. (.)96 |
7 | 0 | I2C-Bus: 0 = Taster funktioniert |
7 | 1 | I2C-Bus: 0 = Besetztmelder funktioniert. |
7 | 2 | I2C-Bus: 0 = Reedkontakte (1) funktionieren |
7 | 3 | I2C-Bus: 0 = Reedkontakte (2) funktionieren |
7 | 4 | I2C-Bus: 0 = Reedkontakte (3) funktionieren |
Statusmeldungen, die nur von Weichen-Karten kommen können:
Dies ist die Standard-Statusmeldung für alle Befehle an Weichen.
Byte | Bit(s) | Bedeutung |
4 | 0-6 | Ist Weiche 1-7 links? ("0" bedeutet "Links") |
5 | 0-6 | Ist Weiche 1-7 rechts? ("0" bedeutet "Rechts") |
6 | 0 | Ist Weiche 8 links? ("0" bedeutet "Links") |
6 | 1 | Ist Weiche 9 links? ("0" bedeutet "Links") |
6 | 2 | Ist Weiche 10 links? ("0" bedeutet "Links") |
7 | 0 | Ist Weiche 8 rechts? ("0" bedeutet "Rechts") |
7 | 1 | Ist Weiche 9 rechts? ("0" bedeutet "Rechts") |
7 | 2 | Ist Weiche 10 rechts? ("0" bedeutet "Rechts") |
Diese Statusmeldung wird durch den Befehl angefordert. Sie gibt Aufschluss über den Typ der Karte, sowie die verwendete Firmware-Version.
Byte | Bit(s) | Bedeutung |
4 | 0-6 | ![]() ![]() ![]() |
5 | 0-6 | Hauptversion der Firmware z.B. 1(.) |
6 | 0-6 | Unterversion der Firmware z.B. (.)96 |
7 | 0 | I2C-Bus: 0 = Taster funktioniert |
7 | 1 | I2C-Bus: 0 = Weiche 9/10 Indikator ok. |
7 | 2 | I2C-Bus: 0 = Weiche 1-8 Links-Indikator ok. |
7 | 3 | I2C-Bus: 0 = Weiche 1-8 Rechts-Indikator ok. |
Statusmeldungen, die nur von Signal-Karten kommen können:
Dies ist die Statusmeldung für alle Befehle an Signalkarten. Diese Statusmeldung wird u.a. durch den Befehl angefordert. Sie gibt Aufschluss über den Typ der Karte, sowie die verwendete Firmware-Version.
Byte | Bit(s) | Bedeutung |
4 | 0-6 | ![]() ![]() ![]() |
5 | 0-6 | Hauptversion der Firmware z.B. 1(.) |
6 | 0-6 | Unterversion der Firmware z.B. (.)96 |
7 | 0 | I2C-Bus: 0 = Taster funktioniert |
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
Die Bytes 2 bis 7 nutzen nicht das 7.Bit (d.h. alle Werte sind ), so dass auch die Checksumme
ist und somit lediglich das Adressenbyte des Mikrocontrollers
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.
Byte | Bit(s) | Bedeutung |
1 | 0-7 | Zieladresse: ![]() |
2 | 0-6 | Nummer des Befehls |
8 | 0-6 | Checksumme aus den Bytes 1-7 |
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.
Dieser Befehl hat keinen Datenteil. Lediglich die Befehlsnummer (Byte 2) muss auf gesetzt sein. Er liefert die Statusmeldung
zurück und gibt somit Aufschluss über die angschlossene Karte mit dieser Adresse.
Befehle, die nur von Fahrregler-Karten ausgeführt werden:
Die Befehlsnummer (Byte 2) muss auf gesetzt sein. Das erste Datenbyte wird in das Notaus-Byte übertragen. Es wird Statusmeldung
zurückgeliefert.
Byte | Bit(s) | Bedeutung |
3 | 0-5 | Notaus-Status für Regler 1 bis 6, 1 bedeutet "Notaus", 0 bedeutet "Ein". |
Dieser Befehl hat keinen Datenteil. Lediglich die Befehlsnummer (Byte 2) muss auf gesetzt sein. Er liefert die Statusmeldung
zurück.
Dieser Befehl hat keinen Datenteil. Lediglich die Befehlsnummer (Byte 2) muss auf gesetzt sein. Er liefert die Statusmeldung
zurück.
Dieser Befehl setzt die Geschwindigkeit, Richtung, Beschleunigung, Mindestgeschwindigkeit und das Notaus-Bit für einen Fahrregler. Er liefert die Statusmeldung zurück.
Byte | Bit(s) | Bedeutung |
3 | 0-2 | Nummer des Reglers ( ![]() |
3 | 3 | Richtung |
3 | 4 | Notaus |
4 | 0-6 | Geschwindigkeit ( ![]() |
5 | 0-6 | Beschleunigung ( ![]() |
6 | 0-6 | Mindestgeschwindigkeit ( ![]() |
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 zurück.
Byte | Bit(s) | Bedeutung |
3 | 0-6 | Nummer des Reedkontakts ( ![]() |
4 | 0-6 | Regler ( ![]() |
5 | 0-6 | Geschwindigkeit ( ![]() |
6 | 0-6 | Beschleunigung ( ![]() |
7 | 0 | Trigger aktivieren (0= Aktiv) |
7 | 1 | Richtung |
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 zurück.
Byte | Bit(s) | Bedeutung |
3 | 0-6 | Nummer des Reedkontakts ( ![]() |
4 | 0-6 | Regler ( ![]() |
5 | 0-6 | Geschwindigkeit ( ![]() |
6 | 0-6 | Beschleunigung ( ![]() |
7 | 0 | Trigger aktivieren (0= Aktiv) |
7 | 1 | Richtung |
Befehle, die nur von Weichen-Karten ausgeführt werden:
Stellt eine oder zwei Weichen. Ist die angegebene Weichennummer , so wird die zweite bzw. keine Weiche mehr gestellt. Es wird Statusmeldung
zurückgeliefert.
Byte | Bit(s) | Bedeutung |
3 | 0-6 | Erste zu schaltende Weichennr. ( ![]() |
4 | 0 | Richtung für erste Weiche, (0 bedeutet "Links", 1 "Rechts") |
5 | 0-6 | Zweite zu schaltende Weichennr. ( ![]() |
6 | 0 | Richtung für zweite Weiche, (0 bedeutet "Links", 1 "Rechts") |
Stellt eine oder zwei Weichen. Der Datenteil entspricht dem von Befehl . Zusätzlich wird der Fehlerzähler für die angesprochenen Weichen auf
gesetzt, so dass, selbst wenn mehr als weichenmaxfehlversuche (standardmäßig auf
gesetzt) Fehler beim Stellen der Weiche aufgetreten sind, es trotzdem wieder möglich ist, die Weiche zu schalten. Es wird Statusmeldung
zurückgeliefert.
Befehle, die nur von Signal-Karten ausgeführt werden:
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 zurückgeliefert.
Byte | Bit(s) | Bedeutung |
3 | 0-6 | Stecker ( ![]() ![]() |
4 | 0-5 | Status der Signale 1-6 des Steckers ("1" = ein) |
5 | 0-5 | Status der Signale 9-14 des Steckers ("1" = ein) |
6 | 0-5 | Status der Signale 17-22 des Steckers ("1" = ein) |
7 | 0 | Status des Signals 7 des Steckers ("1" = ein) |
7 | 1 | Status des Signals 8 des Steckers ("1" = ein) |
7 | 2 | Status des Signals 15 des Steckers ("1" = ein) |
7 | 3 | Status des Signals 16 des Steckers ("1" = ein) |
7 | 4 | Status des Signals 23 des Steckers ("1" = ein) |
7 | 5 | Status des Signals 24 des Steckers ("1" = ein) |