Das Protokoll BiDiB dient zur Steuerung einer Modellbahn. Es ermöglicht die Kontrolle und Ansteuerung von Loks, Weichen und Zubehör sowie die sichere Übertragung von Rückmelderinformationen aus der Modellbahnanlage an den steuernden Rechner. BiDiB steht für BiDirektionaler Bus und bietet folgende Vorteile:
Die Graphik illustriert eine typische Anordnung. Das Protokoll ist für verschiedenste Modellbahnsteuerungssysteme von der einfachen Heimanlage bis zur großen Austellungsanlage gleichermaßen geeignet und kann problemlos an die Aufgabenstellung angepasst werden. Hierzu gibt es einen verpflichtenden Satz an Abfrage- und Einstellparametern, die jedes System enthalten muss. Die im folgende verwendeten Bezeichnungen sind im Glossar erläuternd zusammengefasst.
In 2009 stellten die Firmen Lenz und Tams Rückmeldersysteme für BiDi vor, damit war die Auswertung der bidirektionalen Datenübertragung zwischen DCC-Dekodern und Steuereinheiten theoretisch möglich. Entsprechende Rückmeldersysteme waren zwar angekündigt, aber bis Ende 2010 war nur das einfache Tams RC-Talk im Markt verfügbar. Aus der Diskussion über einen zukunftsfähigen Nachfolger ist dieses Protokoll entstanden. Auf Grund der Leistungsfähigkeit und des stabilen Betriebes wurde dieser wurde dann die Grundlage für einen erweiterten Entwurf, welcher auch Zentralen, Zubehör und Bediengeräte (z. B. externe Stellpulte) umfasst.
An dieser Stelle gilt mein Dank den Diskussionspartnern Hrn. Tams, Hrn. Bluecher und Hrn. Herzog für den konstruktiven Disput.
BiDiB® wird von einem Arbeitskreis betreut und (fort-)entwickelt (BiDiB-Implement-Group), diesem gehören neben weiteren Mitgliedern maßgebend die Herren Kersten Tams, Markus Herzog und Wolfgang Kufer an.
Rechtliches: Diese Spezifikation wird bereitgestellt 'wie sie ist', es gibt keine Zusicherung irgendeiner Eignung für irgend einen Anwendungsfall. Damit gibt es auch keine Gewähr oder Zusicherung irgendeiner Funktion oder wirtschaftlichen Verwertbarkeit, jegliche Garantie wird ausgeschlossen. Der Anwender übernimmt die volle Verantwortung bei Verwendung dieser Spezifikation. In keinem Fall kann irgendein Mitglied der BiDiB-Implement-Group für irgendwelche direkten oder indirekten Schäden haftbar gemacht werden. Neben der Möglichkeit des Lizenzentzugs entstehen für den Lizenzgeber keine Haftungsansprüche gegenüber dem Lizenznehmer.
Das Protokoll BiDiB ist für die Verwendung zusammen mit Modellbahnsteuerungssoftware vorgesehen und kann ohne Lizenzkosten sowohl auf der PC-Seite als auch auf der Hardwareseite implementiert werden. Zur Sicherstellung der Kompatibilität sind jedoch folgende Lizenz-Bedingungen einzuhalten.
Dieses Dokument beschreibt Revision 1.29 von BiDiB, Stand 21.07.2023.
In diesem Dokument ist der grundlegenden Nachrichtenaufbau und die Struktur beschrieben. Nachrichten, welche speziell einem Anwendungsfall (also z. B. Schalten, Melden, Fahren, ...) zugeordnet sind, sind in weiteren Dokumenten bzw. Kapiteln beschrieben.
1.29 | 2023-07-21 | hinzu:
|
1.28 | 2020-05-31 | Protokollversion 0.7⇒0.8: Streaming für Features und Accessorys. hinzu: Erweiterungen für DCC-Befehle (F29…F68, DCC-SDF, Analogbefehl), Vorbereitung automatische Anmeldung mit DCCA, Abfrage aktiver Loks, Lasttyp-Konfiguration für Ports, Gobale Adressmeldung, Übermittlung von Debugausgaben, Erläuterung zu lokalen Nachrichten |
1.27 | 2017-04-07 | hinzu: Positionsmeldungen, BiDiB-Systemzeit, Porttyp SWITCHPAIR, Konfigurations-Fingerprints, Accessory-Nothalt, Accessory-Details |
1.26 | 2016-08-15 | hinzu: BIDIB_ACCESSORY_PARA_STARTUP, BIDIB_ACCESSORY_PARA_OPMODE. Generelle Überarbeitung, Detaillierung, Übersetzung verbessert. |
2016-02-25 | Änderung in der Zubehöransteuerung, hinzu MSG_LC_PORT_QUERY_ALL, Protokollversion 0.6⇒0.7 | |
1.25 | 2015-11-28 | Änderung der Byte-Reihenfolge von Portadressen im flachen Modell |
1.24 | 2015-03-22 | hinzu MSG_LC_CONFIGX_GET_ALL, flaches Portmodell (siehe Zubehöransteuerung), Protokollversion 0.5⇒0.6 |
1.23 | 2014-12-04 | hinzu FLAG_QUERY0, Erläuterungen zu Accessory- und Lokadresse |
2014-11-11 | Neue Konfigurationsnachrichten für Ports (CONFIGX*) | |
2014-08-14 | ergänzende Definitionen für POM (Gleisausgabe) | |
2014-07-25 | ergänzende Klarstellungen bei der Lizenz | |
V1.22 | 2014-06-26 | hinzu: BIDIB_MSYS_SERVOMOVE_QUERY, längere Antworten bei Versionsabfragen |
V1.22 | 2014-02-07 | hinzu: MSG_ACCESSORY_NOTIFY, MSG_BM_DYN_STATE, MSG_CS_PROG, MSG_CS_PROG_STATE |
V1.21 | 2013-12-16 | hinzu: MSG_STRING_GET, _SET, MSG_STRING, FEATURE_STRING_SIZE |
V1.20 | 2013-11-18 | hinzu: Erläuterungen für Drehscheiben; Erläuterung für BIDIB_CS_STATE_GO_IGN_WD |
V1.20 | 2013-10-29 | hinzu: MSG_SYS_GET_UNIQUE_ID verpflichtend für Bootloader, die direkt angesprochen werden |
V1.19.1 | 2013-10-21 | Die Übersetzung Speed – DCC28 – DCC14 (in der Gleisausgabe) wurde auf verpflichtend geändert und eine Formel hierfür festgelegt |
V1.19 | 2013-10-04 | Erweiterung MSG_LC_OUTPUT_QUERY und features FEATURE_RELEVANT_PID_BITS, FEATURE_CTRL_PORT_QUERY_AVAILABLE new: BIDIB_MSYS_ACC_OKAY_QIN1, BIDIB_MSYS_ACC_OKAY_QIN0, BIDIB_MSYS_ACC_OKAY_NF |
V1.18 | 2013-07-18 | Erweiterung bei SYS_MAGIC (Support für kleine Bootloader). Einführung SecureSwitch – Quittungen bei Weichenfehlern bzw. Handverstellung (Accessory) |
2013-06-29 | BIDIB_ERR_OVERRUN als Fehlermeldungen hinzu. | |
2013-06-29 | Ergänzungen und Klarstellungen bei den Lizenzbedingungen | |
V1.17 | 2013-06-18 | Einführung eines Watchdogs für DCC-Erzeugung, FEATURE_GEN_WATCHDOG neu dazu |
V1.16 | 2013-06-02 | Erläuterungen bei MSG_SYS_RESET, FEATURE_CTRL_STRETCH_DIMM neu dazu |
V1.15 | 2013-04-20 | Übermittlung von Fehlercodes bei Accessory |
V1.14 | 2013-04-02 | Einheitliche Definition von Accessory Schaltzeit |
V1.13 | 2013-03-25 | MSG_LOCAL_LOGON_REJECTED neu dazu; für Fehlerbehandlung bei zu vielen Teilnehmern |
V1.12 | 2013-02-23 | MSG_BOOST_CURRENT wird durch MSG_BOOST_DIAGNOSTIC ersetzt. |
V1.11 | 2013-01-30 | MSG_BOOST_ON bzw. _OFF mit einem Parameter ergänzt |
V1.10 | 2013-01-23 | MSG_CS_BIN_STATE ergänzt |
V1.09 | 2013-01-17 | FEATURE_BST_INHIBIT_AUTOSTART ergänzt |
V1.09 | 2012-12-21 | Erläuterungen bei MSG_CS_DRIVE_ACK; MSG_BOOST_QUERY ergänzt |
V1.08 | 2012-11-13 | Erläuterungen und finale Kodierung bei MSG_BM_SPEED, FEATURE_BM_ISTSPEED_INTERVAL |
V1.07 | 2012-10-12 | Ergänzung mit der Class Accessory, Parameter bei MSG_STALL; Erläuterungen bei MSG_CS_DRIVE |
V1.06 | 2012-09-26 | Class Zubehör: MSG_LC_WAIT dazu, Rechtschreibkorrekturen. |
V1.05 | 2012-09-24 | Class Belegtmeldung: Zusätzliche Befehle MSG_BM_GET_CONFIDENCE und MSG_BM_CONFIDENCE. |
V1.04 | 2012-07-25 | Zusätzliche Erläuterungen bei MSG_VENDOR*. MSG_SYS_PING / MSG_SYS_PONG haben einen Parameter erhalten Ergänzungen bei Class Schalten: BIDIB_MACRO_RESTORE, BIDIB_MSYS_DELAY_RANDOM, MACRO_PARA jetzt 32 Bit. |
V1.03 | 2012-07-25 | Zusätzliche Erläuterungen bei MSG_VENDOR*. |
V1.02 | 2012-06-06 | Erläuterung bei MSG_NODE_LOST korrigiert. |
V1.01 | 2012-03-19 | MSG_FEATURE_GETALL, MSG_FEATURE_GETNEXT, MSG_NODETAB_GETALL, MSG_NODETAB_GETNEXT, Übertragungsverfahren für Features und Nodes erläutert. |
V0.13 | 2012-02-21 | MSG_BM_ADDRESS mit der Möglichkeit, mehrfache Belegung zu melden. Hinweis bei MSG_BM_SPEED. |
V0.12 | 2011-07-20 | Lokale Befehle für PING und PONG neu dazu; MSG_BM_MIRROR_OCC und _FREE neu dazu. |
V0.11 | 2011-07-20 | Neue feature-Parameter für Booster, Systemzeit, MSG_BOOST_STAT Meldungen erweitert. Stromeinstellung für Booster dazu. |
V0.10 | 2011-04-02 | Vorschläge für Dekoderanmeldung ergänzt, neue Message MSG_BM_BLOCK_CV für das blockweise Lesen von CVs. |
V0.09 | 2011-02-24 | Änderungen bei der NODE_TAB (falls keine Unterknoten), weitere Fehlercodes hinzu. MSG_SYS_GET_ERROR dazu. |
V0.08 | 2010-12-20 | Boosterklasse ergänzt. |
V0.07 | 2010-12-07 | Erläuterungen bei Vendor config, V_VALUE dazu; Fehlermeldung erweitert; MSG_SYS_MAGIC mit index 0;
Enable /Disable mit auto-forward auf Unterknoten. BM_MSG für Accessory dazu. MSG_SYS_IDENTIFY_STATE dazu. |
V0.06 | 2010-12-06 | Erläuterungen bei NODE_CHANGE dazu |
V0.05 | 2010-12-01 | Unique-ID erläutert, PKT_CAPACITY neu dazu, ClassID dazu |
V0.04 | 2010-11-29 | Paketaufbau für Routing optimiert, Feinabgleich. neu dazu: MSG_BM_SET_SIZE, MSG_BM_GET_SIZE |
V0.03 | 2010-11-25 | Erweiterung für Hubs und Sub-Knoten. |
V0.02 | 2010-11-17 | Erweiterung für heterogene Rückmeldermodule, Individualisierung des Featuresets auf einzelne Module |
V0.01 | 2010-11-03 | Initiales Dokument |
BiDiB ist als zustandsloses Protokoll angelegt. Für Nachrichtenverluste existieren diverse Sicherungsmechanismen.
Die wichtigste Eigenschaft, um eine hohe Fehlertoleranz zu erreichen, ist die Idempotenz der Nachrichten. Im Allgemeinen übertragen Nachrichten nur Zustände, keine Kommandos oder Befehle. Ihr Empfang wird vom Knoten üblicherweise mit einer Nachricht selben Inhalts quittiert. Damit kann im Fehlerfall die Übertragung einfach wiederholt werden, ohne bei Mehrfachempfang ungewollte Aktionen auszulösen. Dies gilt insbesondere für die kritischen Modellbahn-Anwendungen Fahren, Schalten und Melden. Auch wird etwa bei sequentieller Übertragung in mehreren Nachrichten stets ein Identifier verwendet, mit dem eine verlorene Information erneut angefordert werden kann.
Kommunikationsfehler hingegen werden nur einfach gemeldet und nicht wiederholt, um die Implementierung zu vereinfachen. Ein Verlust einer Fehlermeldung ist mit dem Ausbleiben der erwarteten Antwort gleichzusetzen. Treten mehrere Fehler zugleich auf, können diese in einer Liste zum Abholen bereit gestellt werden, müssen aber nicht wiederholt werden. Bleibt ein Fehler erhalten, wird er beim nächsten Versuch das Objekt zu benutzen nochmals gemeldet. Die Behebung eines Fehlers wird in der Regel nicht gemeldet. Ausnahmen hiervon bilden Objekte, bei denen Störungen/Fehlerzustände intrinsisch sind (z. B. Booster und Accessorys), für diese kann Speicherung oder Wiederholung vorgeschrieben sein.
Ebenso verfahren wird bei spontanen Ereignissen, die nicht betriebsrelevant sind. Ein Verlust solcher Nachrichten kann nur durch die Überprüfung der Sequenznummern erkannt werden, es existiert aber keine vorgeschriebene Fehlerbehandlung und keine Wiederholmöglichkeit. Für betriebskritische Ereignisse (Belegtmeldungen, Accessory) gibt es mit Secure-ACK und Secure-Switch auch Quittungsverfahren zur Absicherung.
Die Fortentwicklung von BiDiB ist im Protokoll fest verankert. Bei neuen Revisionen der Spezifikation wird streng auf Rückwärtskompatibilität geachtet. Erweiterungen des Funktionsumfangs sind meist leicht möglich, da diese üblicherweise optional sind und ignoriert werden können. Bei nicht rückwärtskompatiblen Änderungen wird die Protokollversion angehoben, welche von jedem Knoten abgefragt werden kann. Dies erlaubt die Unterstützung veralteter Implementierungen und gewährleistet in gewissem Maße auch die Kompatibilität mit noch unbekannten Funktionen.
In diesem Dokument werden folgende Bezeichnungen für die einzelnen Protokollteilnehmer oder Eigenschaften verwendet:
BiDiB: | Der Protokollstandard, also die Art und Weise, wie Nachrichten kodiert sind. |
BiDiBus: | Eine mögliche physikalische Implementierung einer Busebene, speziell für die Verbindung innerhalb einer Modellbahn geeignet. BiDiBus basiert auf RS485 und verwendet RJ45 Kabel. |
Bussystem: | Der gesamte Aufbau, bestehend aus Interface und Knoten (z. B. Meldern) und evtl. notwendiger interner Verbindungen, auch mehrere Ebenen umfassend. |
Class: | Knoten sind hinsichtlich Ihrer prinzipiellen Eigenschaften in Klassen eingeteilt. Es gibt z. B. Belegtmelder, DCC-Erzeuger, Schaltausgabe, Bedienpulte. |
Feature: | Eine bestimmte Eigenschaft eines Knotens (wie z. B. 'Melder kann Lokrichtung erkennen'). Ein Feature kann individuell je Knoten abgefragt oder konfiguriert werden. |
Host: | Der steuernde Computer, i. d. R. ein PC mit entsprechender Software. Aus Sicht des BiDiB-System diejenige Instanz, von welcher das erste Interface seine Befehle erhält. |
Hub: | Ein Knoten auf einer Busebene, welcher zugleich Interface für eine nachgeordnete Ebene ist. |
Interface: | Die Stelle in einer Ebene (Struktur) des Bussystems, welche mit dem Host oder dem übergeordnetem Knoten kommuniziert. |
Knoten: | Ein Teilnehmer im Bussystem, also die (fallweise verteilte) Hardware. Ein Teilnehmer auf einer Ebene kann auch Interface für die nächsttiefere Ebene sein (Hub-Funktion). |
Logon: | Der Versuch eines Teilnehmers, eine logische Verbindung zu einen Interface aufzunehmen. Die Verbindung wird bestätigt und der Host über diesen neuen Knoten benachrichtigt. |
Melder: | Ein Knoten des BiDiB-Systems, welcher die Gleisbelegung erfasst und BiDi-Rückmeldung auswertet. |
Node-Adresse: | Die von Interface nach der automatischen Anmeldung vergebene Nummer (byte), unter welcher der Knoten (auf dieser Ebene) in dieser Sitzung angesprochen wird. (NODE_ADDR) |
Magic: | (System-ID) Eine (an sich bedeutungslose) Nummer, die bei Starten des Interfaces von Host abgefragt werden muss und anhand der z. B. die richtige Baudeinstellung erkannt werden kann. |
Unique-ID: | Die global eineindeutige Kennung eines Knotens. Sie enthält die angemeldeten Klassen, die Herstellerkennung, und eine aus der Hardware-ID abgeleitete herstellerspezifische Nummer. |
Ein mit BiDiB angesprochenes System ist baumartig organisiert: Der Host sieht ein Interface, mit dem er eine Kommunikationsverbindung aufbaut. Das Interface ermöglicht ihm Zugang zu einer (flachen) Anordnung aus Knoten. Jeder dieser Knoten ist in der Regel ein Baustein, der eine oder mehrere bestimmte Funktionen beinhaltet (z. B. ein Melder mit Rückmeldekontakten). Es ist aber auch möglich, dass dieser Baustein selbst auch nur ein Interface ist, hinter dem sich eine weitere Struktur befindet (so wie ein Unterordner). Dadurch erreicht man eine große Flexibilität sowohl in den Verdrahtungsmöglichkeiten als auch in der möglichen Heterogenität der angeschlossenen Busknoten.
BiDiB verfügt über eine automatische Adressvergabe der Knoten. Hierbei ist jedem Knoten herstellerseitig eine eindeutige Nummer einprogrammiert, die Teil der Unique-ID ist. Beim Einschalten des BiDiB-Systems werden vom Interface innerhalb seiner Struktur die vorhandenen Knoten gesucht und ihnen eine lokale Adresse zugewiesen, diese lokale Adresse ist ein Byte lang. Das Interface erstellt dabei eine Liste aus verfügbaren Knoten, ihrer Unique-ID und ihrer lokalen Adresse. Knoten selbst können wieder Interfaces sein, so dass insgesamt eine Baumstruktur entsteht. Jeweils eine Verzweigung hat Kenntnis über die Knoten direkt nach der Verzweigungsstelle. Die maximale Adresslänge innerhalb des Baumes ist 4 Byte.
Diese Zuordnungstabelle ist bei jedem Start unterschiedlich und wird auch automatisch erweitert, wenn ein neuer Knoten auf den Bus aufgesteckt wird. Das Interface schickt in diesem Fall eine entsprechende Nachricht an den Host. Wenn ein Interface aus dem System entfernt wird (z. B. Abstecken eines Hubs), so sind implizit auch alle Knoten hinter diesem Interface nicht mehr erreichbar.
Host-intern sind die Knoten (neben den programm-internen Dingen wie z. B. Bildschirmposition und Knotenname) auch mit ihrer jeweiligen Unique-ID abgelegt. Der Host holt sich nun beim Systemstart die Zuordnungstabelle vom Interface und bekommt daraus die für diese Sitzung gültigen lokalen Adressen, die zu diesen Unique-IDs gehören. Die Zuordnung vom Objekt auf der Bedienoberfläche zur Modellbahn-Hardware erfolgt also letztendlich über die Knotenidentität und ist damit nicht von der aktuellen Adressvergabe abhängig.
Um den Austausch eines Knotens zu ermöglichen, soll in Hostprogrammen darauf geachtet werden, dass die einem Knotenobjekt zugewiesene Unique-ID leicht durch eine andere ersetzt werden kann. Da die Unique-ID einer Baugruppe nicht vom Anwender eingestellt werden kann, kann er den Ersatzknoten nicht auf die "alte Adresse" programmieren um die im Programm konfigurierte Zuordnung weiterzuverwenden; stattdessen ist es erforderlich die Änderung in der Hostsoftware vorzunehmen. Der Tausch der Unique-ID wird etwa nötig beim Ersetzen defekter Baugruppen durch baugleiche Hardware, bei der Erweiterung um mehr Ausgänge durch Verwendung eines überlegenen Produkts, oder beim Aufspielen einer anderen Produktfirmware die mehr Funktionen anbietet.
Das Protokoll BiDiB ist als Protokoll für verschiedene Übertragungsmedien wie z. B. Serielle Verbindung, USB, RS485, Ethernet oder Wireless geeignet (mit dann jeweils angepasstem Framing). Entsprechende Spezifikationen sind den jeweiligen Dokumenten zu entnehmen.
Die jeweilige Übertragungsschicht sorgt für das korrekte Framing und den byteweisen, transparenten Transport von BiDiB-Nachrichtenpaketen. Generell muss die Übertragungsschicht den Transport der Daten mit einer CRC absichern. Die Übertragungsschicht muss mindestens in der Lage sein, Nachrichten mit einer Größe von 64 Bytes zu transportieren.
CRC bezeichnet ein Prüfsummenverfahren. Bei einigen physikalischen Implementierungen wird CRC8 verwendet: Auf der Senderseite wird das gemäß Polynom x8 + x5 + x4 + 1 über das Paket gebildet, beginnend beim ersten Byte des Paketes, Init=0, nicht invertiert. Empfängerseitig wird die CRC mit dem gleichen Polynom über das gesamte Paket inkl. CRC gebildet, das Ergebnis muss 0 sein.
Eine MESSAGE hat folgenden Aufbau:
MESSAGE ::= MSG_LENGTH MSG_ADDR MSG_NUM MSG_TYPE DATA MSG_LENGTH ::= 0x00 | … | 0x7f MSG_ADDR ::= MSG_ADDR_STACK 0x00 MSG_ADDR_STACK ::= ε | NODE_ADDR MSG_ADDR_STACK NODE_ADDR ::= 0x01 | … | 0xff MSG_NUM ::= 0x00 | … | 0xff MSG_TYPE ::= 0x00 | … | 0xff DATA ::= ε | ANY_BYTE DATA ANY_BYTE ::= 0x00 | … | 0xff
Ein Nachricht besteht als aus der Länge, einer Adressenangabe, einer (fortlaufenden) Nachrichtennummer, einer Typangabe und optionale Parameter. Diese Felder sind nachfolgend erläutert:
0x00 | Offset für Downlink Nachrichten |
0x80 | Offset für Uplink Nachrichten |
0x00 | Offset für System Nachrichten |
0x10 | Offset für Feature und User Nachrichten |
0x20 | Offset für Rückmelder Nachrichten |
0x30 | Offset für Booster Nachrichten |
0x38 | Offset für Accessory, Switch, Makro Nachrichten |
0x60 | Offset für DCC-Generator Nachrichten |
0x70 | Offset für lokale Nachrichten (mit besonderen Regeln, s.u.) |
Die Sicherung der Daten gegen Übertragungsfehler ist Sache des jeweiligen Transportmediums (wie z. B. CRC im Fall der seriellen Übertragung). Das Protokoll selber sieht keinen Message-Retransmit vor, kritische Nachrichten werden auf höherer Ebene abgesichert (z. B. mit Secure-ACK oder entsprechender Antwort des Knotens).
Die Nachrichtenlänge (MSG_LENGTH) dient nicht nur der Begrenzung der Nachricht bei mehreren aufeinanderfolgenden, sondern gibt auch an wie viele DATA-Bytes tatsächlich in der Nachricht als Parameter zur Verfügung stehen. Dies können durchaus mehr oder weniger Bytes sein als der Nachrichtentyp vermuten lassen würde. Hiermit lassen sich optionale Parameter realisieren, die bei Nichtvorhandensein mit Vorgabewerten belegt werden. Werden weniger Parameter als nötig gesendet, antwortet der Knoten mit einer Fehlermeldung. Werden mehr Parameter als erwartet gesendet, so werden die überschüssigen Bytes ignoriert; dies garantiert Vorwärtskompatibilität.
Eine Nachricht kann bis zu 64 Bytes lang sein (MSG_LENGTH=63), alle Transportschichten müssen dies unterstützen. Längere Nachrichten im Downstream können, sofern von der jeweiligen Transportschicht und dem Knoten unterstützt, pro Knoten mittels der Nachricht MSG_PKT_CAPACITY erlaubt werden. Um eine lange Nachricht an einen Knoten zu senden, müssen auch alle Interfaces im Transportpfad dies unterstützen. Längere Nachrichten im Upstream sollen sich an der im Downstream verwendeten Länge orientieren.
BiDiB ermöglicht es, Teilnetze zu verdrahten und diese (ähnlich wie bei USB) über Hubs baumförmig aufzubauen. Dies erlaubt die Skalierbarkeit für größere Modellanlagen, für kleinere Anlagen wird man nur ein Netz aufbauen und kann daher die Ausführungen in diesem Kapitel erst mal überspringen. Wie sich die Teilnetze über die lokale Adresszuordnung einigen, wird in einem weiteren Dokument beschrieben – für die Protokollbeschreibung hier sind nur die Ergebnisse dieses Vorgangs relevant.
Zugelassen sind max. 4 kaskadierten Netze. (Diese Beschränkung soll vor allem Hostimplementierungen erleichtern, dadurch ist die jeweilige aktuelle lokale Adresse eines Endknotens auf 32 Bit beschränkt.)
Hierbei gelten folgende Regeln für das Routing der Nachrichten:
Damit der überordnete Knoten respektive der Host diese Struktur erfassen kann, gibt es entsprechende Befehle:
Ändert sich die Zuordnungstabelle im laufenden Betrieb (z. B. durch an- oder abstecken), so sendet das Interface von sich aus eine MSG_NODE_LOST oder MSG_NODE_NEW Nachricht. Diese Message muss mit MSG_NODE_CHANGED_ACK quittiert werden (oder die Knotentabelle wird komplett abgefragt). Sowohl die Nachrichten für MSG_NODE_LOST, MSG_NODE_NEW und MSG_NODE_CHANGED_ACK haben als Parameter die (durchlaufende) Versionsnummer (der Tabelle). Damit wird sichergestellt, dass keine Änderungen der Busstruktur übersehen werden.
Veränderungen der Knotentabelle während der Übertragung soll das Interface vermeiden (z. B. keine Logon-Aufforderung aussenden). Erfolgt doch eine Veränderung der Knotentabelle, während diese mit MSG_NODETAB_GETNEXT abgefragt und übertragen wird, so soll das Interface einfach die Übertragung wieder von vorne mit einer neuen MSG_NODETAB_COUNT (aber mit einer um eins inkrementierten Versionsnummer) beginnen.
Jeder Knoten hat eine eindeutige Nummer, die Unique-ID. Die Unique-ID besteht aus 7 Bytes:
1. Byte | ClassID
Hierbei handelt es sich um ein Bitfeld, welches die prinzipielle Klassenzugehörigkeit eines Knotens angibt. Ein Knoten darf auch mehreren Klassen zugleich angehören. Die Klassen dienen dem Host zur schnellen Orientierung darüber, welche Funktionen auf diesem Knoten zu finden sind. Für das Auffinden von Teilfunktionalitäten mittels Features genügt es, sich nur diejenigen Knoten ansehen welche das entsprechende Klassenbit gesetzt haben. Wenn ein Knoten Befehle einer bestimmten Klasse implementiert hat, so muss er auch das entsprechende Class-Bit gesetzt haben. Umgekehrt muss er die entsprechenden Befehle der gemeldeten Klassen kennen und korrekt beantworten. Selbst wenn in der aktuellen Konfiguration keine Objekte verfügbar sind, soll er die Klasse anmelden und 0 als Anzahl zurückgeben.
| ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2. Byte | ClassID-Erweiterung
Reservierte Bits sind als 0 zu kodieren. | ||||||||||||||||
3. Byte | Vendor-ID:
Hier wird die gleiche Kodierung wie bei DCC verwendet, siehe NMRA Manufacturer ID Numbers. Virtuelle Knoten verwenden die VID 0. | ||||||||||||||||
4.-7. Byte | Produktkennung, bestehend aus 4 Bytes
Diese 4 Byte = 32 Bit unterteilen sich in Produkttyp-Kennung und eine Seriennummer, damit Hostprogramme und Analysewerkzeuge die jeweiligen Knoten leichter identifizieren können. Die Aufteilung, wie viel Bits Produkttyp kodieren und wie viele Bits die Seriennummer kodieren, liegt im Ermessen des Herstellers und wird über das Feature FEATURE_RELEVANT_PID_BITS festlegt. Eine Aufteilung 16Bits/16Bits wird empfohlen. Die Produkttyp-Kennung beginnt immer bei ersten Byte, Bit 0 (BiDiB ist immer little-endian (low-byte first) kodiert). Fehlt das Feature FEATURE_RELEVANT_PID_BITS, so erfolgt die Aufteilung 16 Bit / 16 Bit. |
Die Eindeutigkeit der Produktkennung (und damit der Unique-ID) wird vom jeweiligen Hersteller über die fest einprogrammierten Seriennummern garantiert. Weder Unique-ID noch Produktkennung stellen dabei allerdings eine feste Hardwarekennung dar, ein und dieselbe Baugruppe kann mit verschiedenen Firmwares bespielt werden zwischen denen sich die Klassen oder gar die Produkttypen unterscheiden können. Nur die Seriennummer bleibt dabei in der Regel gleich, alleine ist diese aber nicht nötigerweise eindeutig.
Zusätzlich kann es in den Knoten die Möglichkeit geben, einen benutzerspezifischen Knoten-Kurznamen (siehe MSG_STRING) zu hinterlegen. Dieser kann alternativ für die Darstellung verwendet werden und ermöglicht dem Endanwender einen leichtere Migration von Konfigurationsprogrammen zu Fahrprogrammen.
Beim Verbindungsaufbau mit einen BiDiB-System kann man gemäß folgender Liste vorgehen:
Knoten melden mit Ihrer Unique-ID Klassen an, z. B. Belegtmelder, Interface, Booster, usw. Wie umfangreich die Klasse implementiert ist, wird durch Features bekanntgegeben.
Innerhalb einer Klasse gibt es verpflichtende Nachrichten, die ein Knoten unbedingt implementieren muss sowie optionale Nachrichten, die nur bei bestimmten Features implementiert sind.
Ein BiDiB-System verfügt über eine globale Systemzeit, um bei zeitbasierten Messungen eine höhere Genauigkeit zu erreichen. Verschiedene Nachrichten können Zeitstempel für das jeweilige Ereignis enthalten, dadurch sind genaue Ergebnisse bei Fahrzeugverfolgung und -kalibrierung ("Einmessen") möglich. Die Unsicherheit bei der Latenz der Datenübertragung wird so eliminiert.
Die BiDiB-Systemzeit hat eine Auflösung von 1 Millisekunde und wird als 16-Bit Integer mit zyklischem Überlauf repräsentiert. Es wird ein Fehler von ±5 ms zwischen den Uhren aller Knoten im System angestrebt.
Um eine Zeitmessung über verschieden Knoten hinweg zu ermöglichen, müssen die Uhren der Knoten aufeinander synchronisiert werden. Diese Synchronisation erfolgt auf jeder Busebene abhängig von der Transportschicht und wird vom jeweiligen Interface übernommen. Ob ein Interface/Hub dies unterstützt oder nicht muss in der Produktbeschreibung angegeben sein.
Die Synchronisation erfolgt typischerweise über eine periodisch ausgesendete Broadcastnachricht mit einem Zeitstempel. Beim Empfang dieser Nachricht wird die lokale Knotenuhr auf die Systemzeit eingestellt. Verzögerungen auf dem Übertragungsweg oder intern beim Senden und Empfangen sind dabei zu berücksichtigen und durch entsprechende Offsets zu korrigieren, die entstehende Unsicherheit soll maximal ±1ms pro Busebene sein. Im Moment der Justage kann es mit diesem Verfahren zu einem (kleinen) Sprung der Zeitfolge kommen, ein Host muss dies berücksichtigen.
Bleibt die Synchronisation aus, muss ein Knoten auf die Verwendung von Zeitstempeln verzichten sobald die enstehende Unsicherheit größer als ±3 ms wird. Beispiel: hat ein Prozessortakt eine Abweichung von bis zu 10ppm (0,01 ‰), dann soll er etwa 100 s nach der letzten Synchronisation seine lokale Uhrzeit nicht mehr verwenden.
Ein Interface soll sich mit der darüberliegenden Struktur synchronisieren, bevor es seine untergeordneten Knoten mit der Systemzeit versorgt. Hat es bis zum SYS_ENABLE (oder einem angemessenen Timeout) keine Synchronisationsnachricht erhalten, so soll es autark seine lokale Uhrzeit benutzen und damit die Synchronisation der Unterknoten durchführen.
Die Nachrichten, welche auf dem BiDiB-System benutzt werden, lassen sich in folgende Bereiche gliedern:
System | Abfrage der Software- und Hardwareversion und der Produktkennung, Systemstart und -stop, Verbindungseinstellungen, Abfrage und Einstellen der Node-Adressen. |
---|---|
Feature | Abfrage und Einstellen der Eigenschaften des Knotens (Features) |
User-Config | offene Nachrichten zur herstellerspezifischen, erweiterten Konfiguration |
Nachrichten für Firmwareupdates | Upload neuer Knotensoftware. |
Nachrichten für Melder | Belegtmeldungen und Dekoder-Rückmeldung |
Nachrichten für Booster | Kontrolle und Überwachung von Boostern |
Nachrichten für Gleisausgaben | DCC Fahr- und Schaltbefehle |
Nachrichten für Schaltaufgaben | Weichen, Signale, Fahrwegzubehör |
Nachrichten für Konfiguration und direkten Portzugriff | Beleuchtung, Animationen, Sound, Zubehör |
Nachrichten für Bediengeräte und Gastzugang | |
Lokale Nachrichten | Busverwaltung, Synchronisation, Verbindungsüberwachung |
Mit Downlink wird die Richtung Host ⇒ BiDiB-System bezeichnet, mit Uplink die Richtung zum Host.
Generell erfolgen Meldungen im Uplink spontan (nach erfolgter Freigabe im Interface). Bestimmte Meldungsarten können mittels Feature-Einstellung ein- oder ausgeschaltet werden.
Für die lokale Kommunikation innerhalb einer Busebene können zusätzliche Nachrichten verwendet werden, um Verbindungszustände zu erfassen, An- und Abmelden zu organisieren oder Zeitsynchronisation herzustellen. Je nach Bustopologie und verwendeter Busphysik kann ein unterschiedlicher Umfang an lokalen Nachrichten nötig sein, näheres regeln die Spezifikationen der jeweiligen Verbindungstechnik.
Für lokale Nachrichten sind die Bereiche 0x70 bis 0x7F (Downstream) und 0xF0 bis 0xFF (Upstream) reserviert. Dies ermöglicht die Abtrennung und separate Behandlung dieser Nachrichten auf Linkebene.
Lokale Nachrichten sind grundsätzlich von der Sequenznummerierng ausgenommen, um Index-Folge der übergeordneten Verbindung Host-Zielknoten nicht stören. Sie werden mit Nachrichten-Index = 0 übertragen, welcher beim Empfang auch nicht ausgewertet wird oder den Indexzähler verändert.
Die Systemnachrichten sind verpflichtend für alle BiDiB-Knoten mit der Ausnahme von 'Bootloader'-Knoten, siehe hierzu MSG_SYS_MAGIC für detaillierte Angaben.
Allgemeine Systemnachrichten
Der adressierte BiDiB-Knoten soll die Systemkennung übermitteln. Es folgen keine weiteren Daten. Diese Nachricht soll als erste Nachricht vor jeden anderen Nachricht gesendet werden.
Der Knoten antwortet mit der SYS_MAGIC, welche auch das prinzipielle Verhalten des Knotens beschreibt.
Abfrage der unterstützten Protokollversion von BiDiB. Es folgen keine weiteren Daten.
Der entsprechende Knoten antwortet mit der von seiner Software unterstützten Version des Protokoll.
Es folgen 0 oder 2 Byte Daten. Der Knoten wird freigegeben, ab diesen Zeitpunkt sind spontane Meldungen (z. B. aufgrund von Änderungen von Belegungszuständen oder wegen neu gefundener Hardware) möglich. Die Nachricht gilt rekursiv für alle Unterknoten.
Parameter | Beschreibung |
---|---|
CLASS_ENABLEL | Class-Bits der Klassen, für deren zugehörige Nachrichten die spontane Aussendung erlaubt wird. Spontane Systemnachrichten werden erlaubt, sobald irgendeines der Bits gesetzt ist. |
CLASS_ENABLEH |
Hubs reichen die Nachricht automatisch an alle Unterknoten weiter, es genügt daher im Host nur den Knoten 0 zu adressieren. Es erfolgt keine Quittung.
Der optionale Parameter CLASS_ENABLE ist seit Protokollversion 0.9 verfügbar. Fehlt er, so wird 0xDF 0x00 als Wert angenommen, d.h. Bedienfunktionen sind ausgenommen.
Es folgen 0 oder 2 Byte Daten. Das BiDiB-System wird blockiert, ab diesen Zeitpunkt erfolgen keine spontanen Meldungen mehr. Ereignisse, welche im Zustand SYS_DISABLE passieren, werden nicht für später zwischengespeichert, Knotenzustände lassen sich aber gezielt abfragen. Die Nachricht gilt rekursiv für alle Unterknoten.
Parameter | Beschreibung |
---|---|
CLASS_DISABLEL | Class-Bits der Klassen, für deren zugehörige Nachrichten die spontane Aussendung abgeschalten wird. Spontane Systemnachrichten bleiben solange erlaubt, sobald irgendeines der Bits gesetzt ist. |
CLASS_DISABLEH |
Hubs reichen die Nachricht automatisch an alle Unterknoten weiter, es genügt daher im Host nur den Knoten 0 zu adressieren. Es erfolgt keine Quittung.
Der optionale Parameter CLASS_DISABLE ist seit Protokollversion 0.9 verfügbar. Fehlt er, so wird 0xFF 0xFF als Wert angenommen, d.h. sämtliche Spontannachrichten werden blockiert.
Abfrage der Unique-ID und des Konfigurations-Fingerprints des Knotens. Es folgen keine weiteren Daten.
Der entsprechende Knoten antwortet mit MSG_SYS_UNIQUE_ID.
(Die Unique-ID eines Knotens ist auch in der Knotentabelle seines Interfaces hinterlegt).
Abfrage der installierten Softwareversion(en) des Knotens. Es folgen keine weiteren Daten. Der Knoten antwortet mit einer MSG_SYS_SW_VERSION.
Es folgt ein Byte.
Der entsprechende Knoten im BiDiB-System wird veranlasst, eine quasi leere Nachricht (MSG_SYS_PONG) zurück zu senden. Diese Antwort muss binnen 250ms eintreffen, ansonsten hat der Host den entsprechenden Knoten als ausgefallen anzusehen. Das als Parameter übergebene Byte wird bei MSG_SYS_PONG zurückgesendet.
Es folgen keine weiteren Daten.
Der entsprechende Knoten im BiDiB-System wird veranlasst, eine Nachricht des Typs MSG_LOCAL_PONG zurück zu senden. Diese Antwort muss binnen 250ms eintreffen, ansonsten betrachtet das Interface den entsprechenden Knoten als ausgefallen und meldet diesen Ausfall mittels einer MSG_NODE_LOST an den Host.
(Im Falle des BiDiBus übernimmt der Token und die Antwort auf den Token diese Ausfallüberprüfung.)
Es folgt ein weiteres Byte. 0: Identify wird abgeschaltet, 1: Identify wird eingeschaltet.
Der entsprechende Knoten im BiDiB-System wird veranlasst, lokal eine Anzeige für Identify anzuzeigen (z. B. eine blinkende LED). Der Knoten antwortet mit einer MSG_SYS_IDENTIFY_STATE Nachricht.
Die letzte aufgetretene (und nicht bereits per Spontanmeldung abgesendete) Fehlermeldung wird ausgelesen. Der Fehlerspeicher wird durch das Lesen gelöscht. Sollte kein Fehler vorliegen, so wird eine leere Fehlermeldung (also Fehlernummer 0) zurückgeliefert.
Es folgen zwei Bytes (TIMEL, TIMEH) mit der BiDiB-Systemzeit, TIME gibt dabei den Zeitpunkt des letzten Framemarkers vor der Nachricht an. Der Knoten stellt seine lokale Uhr auf den empfangenen Zeitstempel, eventuelle Datenlaufzeiten sind dabei durch entsprechende Offsets zu kompensieren. Die Nachricht wird nicht beantwortet.
Beispiel: Ein Knoten empfängt MSG_LOCAL_SYNC 3. Die Zeit vom Framesignal bis zur Bearbeitung der Nachricht beträgt 2 ms. Die interne Uhr wird also auf 5 gestellt.
Systemnachrichten für die Busverwaltung
(Hinweis zur Implementierung: diese Nachrichten sind mandatory, aber diese Nachrichten beinhalten nur bei Interface-Knoten variable Daten, einfache Endknoten haben konstante Daten. D.h. die Antworten auf MSG_NODETAB_GET* usw. sind als Konstanten ablegbar und damit auch auf sehr kleinen Microcontrollern implementierbar). BiDiB verfügt über eine automatische Zuordnung der Knoten (z. B. Melder, Booster usw.). Diese Zuordnung ist im Interface hinterlegt und kann dort abgeholt werden. Hierfür sind folgende Nachrichten vorgesehen:
Das BiDiB-System wird hinsichtlich der Hostschnittstelle zurückgesetzt und die Zuordnung aller Knoten wird erneut durchgeführt. Die bisherige Zuordnungstabelle verliert ihre Gültigkeit.
Wenn diese Nachricht an einen Knoten gerichtet wird, so soll sich dieser Knoten aus dem Bus ausloggen (durch eine Wartezeit von 1s) und anschließend erneut einloggen. Interne Zustände des Knotens können dabei verloren gehen.
Ein Knoten kann von sich aus einen Reset anfordern: Dies geschieht durch Senden einer Fehlermeldung mit dem Fehlercode BIDIB_ERR_RESET_REQUIRED.
Mit diesem Befehl wird das Interface veranlasst, die aktuelle Zurordnungstabelle von Unique-ID und lokaler Adresse auszugeben. Diese Ausgabe erfolgt als Reihe von Nachrichten, es wird mit einer MSG_NODETAB_COUNT begonnen, gefolgt von MSG_NODETAB, welche jeweils durch eine MSG_NODETAB_GETNEXT ausgelöst wird.
Während die Ausgabe läuft, führen weitere Anfragen mit MSG_NODETAB_GETALL zu einem Abbruch und Neustart der Übertragung.
Sollte eine solche Tabelle noch nicht vorliegen, antwortet das Interface mit einer Nachricht MSG_NODETAB_COUNT = 0. In diesem Fall muss der Host nach ein paar ms erneut nachfragen.
Liegt die Tabelle vor, antwortet das Interface mit MSG_NODETAB_COUNT = 'Tabellenlänge'.
Mit diesem Befehl wird das Interface veranlasst, die nächste Zeile der Knotentabelle zu senden. Es folgen keine Parameter.
Der Knoten antwortet mit einer MSG_NODETAB Nachricht. Liegt keine Zeile (mehr) vor, antwortet er mit MSG_NODE_NA 255. Hat sich die Knotentabelle seit der letzen Übertragung von MSG_NODETAB_COUNT verändert, antwortet er mit MSG_NODETAB_COUNT und beginnt bei den MSG_NODETAB-Nachrichten von vorn (mit der inkrementierten Versionsnummer).
Mit diesem Befehl kann man aus einem Knoten auslesen, welche maximale Nachrichtenlänge er verarbeiten kann. Dies entspricht der maximalen Länge einer Nachrichtensequenz, wenn diese nur aus der einen Nachricht besteht, und damit der maximalen Anzahl an Bytes in einem Paket (zwischen zwei Frame-Markierungen).
Der Knoten antwortet mit einer MSG_PKT_CAPACITY Nachricht. Antwortet der Knoten nicht oder mit einem Wert unter 64, gilt die standardmäßige Beschränkung auf 64.
Es folgt ein Byte mit der Sequenznummer (Versionsnummer der Knotentabelle) der NODE_NEW- bzw. NODE_LOST-Nachricht, welche bestätigt wird. Diese Nachricht sendet der Host innerhalb von 250ms an ein Interface, wenn es von diesem eine Mitteilung über einen verlorenen oder neu hinzugekommenen Knoten erhalten hat. Wenn das Interface die gleiche Versionsnummer der Knotentabelle bestätigt bekommen hat, die es bei der letzten Änderungsmitteilung gesandt hat, so wird diese und alle vorangegangenen Änderungen als quittiert angesehen.
Es folgt ein Byte mit der lokalen Adresse (NODE_ADDR) und 7 Bytes mit der Unique-ID. Nur wenn der Knoten die empfangene Unique-ID identisch zu seiner internen Unique-ID geprüft hat, darf er seine lokale Adresse auf empfangene NODE_ADDR einstellen.
Die Nachricht wird als Broadcast und mit der MSG_NUM = 0 gesendet. Sie wird immer interpretiert, selbst wenn (noch) kein Logonversuch unternommen wurde. Es ist damit auch möglich, einem Knoten eine lokale Adresse vor dem allgemeinen Logon zuzuteilen.
Es folgen 7 Bytes mit der Unique-ID. Die Anmeldeversuche eines angesprochenen Knoten werden damit abgewiesen.
Mögliche Ursache für das Abweisen des Logons können sein:
Zugleich mit der MSG_LOCAL_LOGON_REJECTED schickt das Interface eine Fehlermeldung mit BIDIB_ERR_BUS an den Host ab.
Systemnachrichten für die Anlagenverwaltung
(Hinweis zur Implementierung: diese Nachrichten sind mandatory)
Mit diesem Befehl wird eine Anlagen-Modelluhrzeit übertragen. Diese Anlagenuhr läuft typischerweise beschleunigt gegenüber der Echtzeit. Es folgen vier Bytes (TCODE0, TCODE1, TCODE2, TCODE3) mit der Angabe der Uhrzeit. Die Kodierung dieser Bytes stimmt mit der Kodierung des entsprechenden DCC-Befehls überein.
Feld | Kodierung | Bedeutung |
---|---|---|
TCODE0 | 00mmmmmm | mmmmmm = Angabe der Minute, Wertebereich 0…59. |
TCODE1 | 100HHHHH | HHHHH = Angabe der Stunde, Wertebereich 0…23. |
TCODE2 | 01000www | www = Wochentag, 0=Montag, 1=Dienstag, ... 6=Sonntag. |
TCODE3 | 11ffffff | ffffff = Uhrbeschleunigungsfaktor, ffffff=0 heißt Uhr angehalten. |
Die Daten bestehen jeweils aus einem 2 Bit Feld (Typ) und 6 Bit Wert. Der Host sendet das komplette Zeitpaket jede Modellbahn-Minute.
Wenn die Anlage angehalten wird, soll der Uhrbeschleunigungsfaktor 0 gesendet werden.
Auf Busimplementationen soll diese Nachricht bevorzugt als Broadcast gesendet werden.
Allgemeine Systemnachrichten
Übertragung der Systemkennung: Diese Variable dient zum Identifizieren und zur Kontrolle der Übertragung. Es folgen zwei Datenbytes, MAGICL, MAGICH, welche die Systemkennung darstellen. Die Systemkennung wird mit laufendem Nachrichtenindex 0 übertragen, damit kann die Nachrichtenfolge hostseitig einsynchronisiert werden.
MAGICL | MAGICH | Bedeutung |
---|---|---|
0xFE | 0xAF | BIDIB_SYS_MAGIC = Standard BiDiB-Knoten |
0x0D | 0xB0 | BIDIB_BOOT_MAGIC = Nur reduzierter Bootloader |
… | … | reserviert |
Wenn ein Knoten bei der Abfrage der SYS_MAGIC mit BIDIB_BOOT_MAGIC = 0xB00D antwortet, so handelt es sich um einen in seiner Funktionalität stark reduzierten Knoten, welcher nur den Bootloader aktiviert hat. Dieser Knoten beherrscht nur einen kleinen Teil der BiDiB-Nachrichten (siehe Tabelle), er kennt keine Featureabfragen, hat jedoch das Feature FEATURE_FW_UPDATE_MODE (254) = 1 gesetzt (obwohl es nicht abfragbar ist). Auch die Fehlererkennung und -behandlung in diesem Knoten ist reduziert, die Prüfung der Integrität der Datenübertragung (CRC) ist jedoch verpflichtend. Dieser Knoten hat keine ClassID-Bits gesetzt.
Downstream | Upstream |
---|---|
MSG_SYS_GET_MAGIC | MSG_SYS_MAGIC |
MSG_SYS_GET_P_VERSION | MSG_SYS_P_VERSION |
MSG_SYS_GET_SW_VERSION | MSG_SYS_SW_VERSION |
MSG_SYS_IDENTIFY | MSG_SYS_IDENTIFY_STATE |
MSG_FW_UPDATE_OP | MSG_FW_UPDATE_STAT |
MSG_SYS_RESET | |
MSG_LOCAL_LOGON_ACK | MSG_LOCAL_LOGON |
MSG_SYS_GET_UNIQUE_ID | MSG_SYS_UNIQUE_ID |
Es folgt ein Byte. Diese Nachricht erfolgt als Antwort auf eine MSG_SYS_PING Anfrage, dabei wird das bei PING übergebene Byte wieder zurückgesendet.
Leere Nachricht, es folgen keine weiteren Daten. Diese Nachricht ist die Antwort zu MSG_LOCAL_PING.
Übertragung der unterstützten Protokollversion. Es folgen zwei Datenbytes, welche die Protokollversion von BiDiB kodieren.
Parameter | Beschreibung |
---|---|
P_VERSIONL | Nebenversionsnummer |
P_VERSIONH | Hauptversionsnummer |
Der Knoten sendet seine eindeutige Kennung. Es folgen 7 Bytes mit der Unique-ID und optional 4 Bytes mit einem Konfigurations-Fingerprint.
Der Fingerprint ist eine 32-bittige Prüfsumme über sämtliche Einstellungen des Knotens. Dazu gehören:
Explizit ausgenommen sind sämtliche Bus- und Betriebszustände (auch solche die über Neustarts hinweg persistiert werden), unterstützte Protokollversionen und Firmwarestände (solange sich nichts anderes ändert).
Der Fingerprint wird vom Knoten mittels einer guten (gleichverteilten, chaotischen, effizienten) aber nicht notwendigerweise kryptographischen Hashfunktion errechnet. Ändert sich ein Konfigurationswert, ändert sich auch der Fingerprint.
Übertragung der Softwareversion: Es folgen 1 bis 16 Tripel (je 3 Bytes), diese kodieren den Softwarestand des Knotens und evtl. assoziierter knoteninterner Subsysteme. Der Wertebereich ist herstellerspezifisch. In jedem Tripel wird der Subänderungsindex als erstes, der Hauptänderungsindex als letztes übertragen. Eine jeweils neuere Version hat einen numerisch größeren Änderungsindex.
Das erste Tripel beschreibt die Softwareversion des Knotens selbst, weitere Tripel können für fest dem Knoten zugeordnete Untersysteme (Coprozessoren, Boardversionen u.ä.) verwendet werden.
Anmerkung: bis zur Spezifikationsrevision 1.21 war nur ein Triple als Antwort erlaubt.
Es folgt ein Byte mit dem Zustand des Identify: 0: abgeschaltet, 1: eingeschaltet.
Diese Nachricht wird gesendet, wenn entweder per Hostbefehl (MSG_SYS_IDENTIFY) oder lokal per Taster die Identifizierung des Knotens ausgelöst oder abgeschaltet wurde.
Empfehlung: Sollte der Taster für Identify mehrfach belegt sein (z. B. wenn ein Dekoder auch per DCC Adresse-Lernen programmiert werden kann), so soll ein kurzer Tastendruck Identify auslösen, ein langer Tastendruck das DCC-Lernen. Mit dieser Empfehlung soll gleiches Verhalten über verschiedene Baugruppen hinweg realisiert werden.
Fehlermeldung eines Knotens. Die Fehlermeldungen erfolgen entweder nach einer Abfrage (per MSG_SYS_GET_ERROR), spontan (sofern der Knoten enabled ist), oder anstatt der Antwort (bei Verwerfen der Nachricht). Es folgt ein Byte mit der Fehlerart sowie fallweise weitere Parameter. Je nach Fehlerart wird die Verarbeitung der Daten nicht mehr möglich sein.
Wert | Name | Bedeutung | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0x00 | BIDIB_ERR_NONE | Der Knoten hat keinen Fehler (mehr) im Fehlerspeicher. | ||||||||||||||
0x01 | BIDIB_ERR_TXT | Der Knoten sendet eine Textfehlermeldung: es folgt ein Byte mit Angabe der Länge, gefolgt von ASCII-Zeichen der Fehlermeldung. | ||||||||||||||
0x02 | BIDIB_ERR_CRC | Die empfangene Nachricht (bzw. das Nachrichtenpaket) hatte einen CRC-Fehler,
es folgt ein Byte mit der MSG_NUM der fehlerhaften Nachricht.
Der Knoten verwirft das empfangene Nachrichtenpaket. Hinweis: diese Nachricht ist nur sinnvoll bei Punkt-zu-Punkt Verbindungen, bei physikalischen Strukturen mit gleichzeitigem Empfang mehrerer Teilnehmer erfolgt keine Fehlermeldung. | ||||||||||||||
0x03 | BIDIB_ERR_SIZE | Die empfangene Nachricht weist eine zu geringe Länge auf (zu wenig Parameter). Es folgt ein Byte mit der MSG_NUM. Der Knoten verwirft die empfangene Nachricht. | ||||||||||||||
0x04 | BIDIB_ERR_SEQUENCE | Die empfangene Nachrichtenfolge weist einen Sequenzfehler auf, es sind Nachrichten verloren gegangen. Es folgt ein Byte mit der MSG_NUM der aktuell erwarteten Nachricht (bei korrekter Sequenz) sowie optional ein Byte mit der MSG_NUM der aktuellen Nachricht, also der ersten wieder richtig empfangenen Nachricht. Der Knoten bearbeitet jedoch die empfangenen Nachrichten und übernimmt die aktuelle Sequenznummer als neuen Startpunkt. | ||||||||||||||
0x05 | BIDIB_ERR_PARAMETER | Die empfangene Nachrichten weist einen Parameterfehler auf. es folgt ein Byte mit der MSG_NUM der Nachricht, welche den Fehler enthielt. Die Nachricht wird nicht bearbeitet. | ||||||||||||||
0x10 | BIDIB_ERR_BUS | Die diesem Knoten zugeordnete Unterstruktur hat einen Busfehler.
Es folgt ein Byte mit der Fehlernummer:
| ||||||||||||||
0x11 | BIDIB_ERR_ADDRSTACK | Eine Nachricht von einem Unterknoten enthält 3 lokale Adressen, d.h. der verfügbare Adressstack ist bereits
erschöpft (weil da zu viele Ebenen hintereinander liegen) und die Nachricht kann nicht mehr geroutet werden. Es folgen 4 Bytes: NODE ADDR_STACK NODE: der Knoten, welche die zu lange Adresse eingereicht hat. ADDR_STACK: die restlichen Bytes dieser zu langen Adresse. Damit kann der Host die Ebene identifizieren, in welcher die Adressverletzung auftrat. | ||||||||||||||
0x12 | BIDIB_ERR_IDDOUBLE | Es versucht sich ein Knoten anzumelden, welcher bereits angemeldet ist
oder der dieselbe ID hat wie ein bereits in der Knotentabelle enthaltener. Es folgen optional 7 Bytes mit der Unique-ID des Knotens. | ||||||||||||||
0x13 | BIDIB_ERR_SUBCRC | Eine Nachricht von einem Unterknoten konnte wegen eines CRC-Fehlers nicht empfangen werden. Es folgt 1 Byte: NODE NODE: Lokale Adresse des gerade adressierten Knotens. | ||||||||||||||
0x14 | BIDIB_ERR_SUBTIME | Eine Nachricht von einem Unterknoten konnte nicht komplett empfangen werden, timeout. Es folgt 1 Byte. NODE NODE: Lokale Adresse des gerade adressierten Knotens. | ||||||||||||||
0x15 | BIDIB_ERR_SUBPAKET | Ein Paket mit einer Nachricht von einem Unterknoten hatte eine Konsistenzfehler in der Size-Angabe. Es folgt 1 Byte mit der NODE-Adresse und optional weitere Bytes mit dem Inhalt des Pakets. NODE: Lokale Adresse des gerade adressierten Knotens. | ||||||||||||||
0x16 | BIDIB_ERR_OVERRUN | Ein Interface konnte die übermittelten Nachrichten nicht mehr auf seiner nachgeordneten Struktur weitersenden, es sind Nachrichten verlorengegangen. | ||||||||||||||
0x20 | BIDIB_ERR_HW | Der Knoten hat einen internen Fehler festgestellt. Es folgt ein Byte mit der Fehlernummer (Herstellerspezifisch) | ||||||||||||||
0x21 | BIDIB_ERR_RESET_REQUIRED | Der Knoten ist (z. B. durch Umkonfiguration von CVs) in einem Zustand, welcher einen Reset erfordert. | ||||||||||||||
0x30 | BIDIB_ERR_NO_SECACK_BY_HOST | Die Maximalzahl an Wiederholungen von Belegtmeldungsnachrichten wurde erreicht ohne dass der Host den Zustand quittiert hat. |
Systemnachrichten für die Busverwaltung
(Anmerkung zur Implementierung: diese Nachrichten sind nur bei Interface-Knoten mit variablen Daten, einfache Endknoten haben konstante Daten, entsprechende Antworten können also statisch im Flashspeicher des Prozessors abgelegt werden).
Diese Nachricht wird vor der Übertragung einzelner MSG_NODETAB gesendet, wenn der Host mit MSG_NODETAB_GETALL angefragt hat. Es folgt ein Byte mit der Länge der Knotentabelle. Diese Tabelle wird anschließend mit einer entsprechenden Anzahl an MSG_NODETAB_GETNEXT-Abfragen abgeholt.
Es folgen 9 Bytes mit einem Eintrag der Zuordnungstabelle:
Parameter | Beschreibung |
---|---|
NODETAB_VERSION | Aktuelle Version der Tabelle, wird bei jeder Änderung inkrementiert, Überlauf: 255→1 |
NODE_ADDR | Zugewiesene lokale Adresse des Knotens (Wertebereich 0…127) Adresse 0 steht für den Knoten selbst. |
UNIQUE_ID[7] | Die Unique-ID des Knotens, diese besteht aus 7 Bytes |
Wenn ein Knoten keine Unterknoten hat (also auch kein Class-Bit 'Hub' in der Unique-ID gesetzt hat), so ist die Knotentabelle nur einen Eintrag lang, und enthält den Knoten selbst.
Die Übertragung der Knotentabelle erfolgt mit einer oder mehreren MSG_NODETAB-Nachrichten. Während die Übertragung läuft, sollen keine Knoten der Tabelle hinzugefügt oder entnommen werden. Erfolgt dennoch eine Änderung, beginnt das Interface wieder von vorn mit MSG_NODETAB_COUNT.
Mit dieser Nachricht teilt ein Knoten dem Host mit, welche maximale Nachrichtenlänge er lokal verarbeiten kann. Dies ist in der Regel begrenzt durch die Größe des Empfangspuffers für Pakete der jeweiligen Transportschicht (welche ansonsten transparent für den Host ist). Die Länge entspricht bei paketbasierter Übertragung von Nachrichtensequenzen der maximalen Anzahl von Bytes für den Paketinhalt (als eine Sequenz mit nur einer Nachricht), z. B. 64 beim BiDiBus.
Es folgt eine Längenangabe, bestehend aus einem Byte, Wertebereich 64…127. Der Minimalwert ist 64, kleinere Werte sind reserviert und zu ignorieren. (MSB ist reserviert für length-extension)
Es folgt ein Byte mit der (lokalen) Nummer des angesprochenen Knotens. Die Meldung wird vom Interface zurückgesendet, wenn der Host versucht, einen Knoten anzusprechen, welcher nicht (oder nicht mehr) in der Liste ist.
Diese Nachricht (mit Knoten 255) wird auch gesendet, wenn bei der Übertragung mittels MSG_NODETAB_GETNEXT bereits alle Knoten übertragen wurden.
Es folgt die aktuelle Versionsnummer der Knotentabelle, und der Tabelleneintrag des verlorenen Knotens (siehe MSG_NODETAB), bestehend aus lokaler Adresse (1 Byte) und Unique-ID (7-Bytes).
Ein bereits angemeldeter Knoten antwortet nicht mehr.
Wenn es sich bei dem verlorenen Knoten z. B. um einen Melder handelt, so kann (und soll) der Host geeignete Maßnahmen einleiten (partieller oder allgemeiner Nothalt, Verkehrslenkung). Die MSG_NODE_LOST des Interfaces muss vom Host bestätigt werden. Sollte sie innerhalb von 250ms nicht bestätigt werden, so wird sie von Interface max. 16 Mal wiederholt.
Wenn es sich bei dem verlorenen Knoten um einen Hub handelt, so sind implizit auch alle Knoten hinter diesem Hub verloren.
Es wurde ein neuer, bisher nicht vorhandener Knoten erkannt und der Knoten-Liste hinzugefügt. Es folgt die aktuelle Versionsnummer der Knotentabelle, und der Tabelleneintrag dieses neuen Knotens (siehe MSG_NODETAB), bestehend aus lokaler Adresse (1 Byte) und Unique-ID (7-Bytes).
Die Nachrichten für MSG_NODE_LOST und MSG_NODE_NEW werden erst nach dem erstmaligen Einlesen der Knotentabelle gesendet und nur dann, wenn das (Spontan-)Enable des Interfaces gesetzt ist. MSG_NODE_NEW muss ebenso wie MSG_NODE_LOST vom Host bestätigt werden (mittels MSG_NODE_CHANGED_ACK oder einer Komplettabfrage beginnend mit MSG_NODETAB_GETALL), ansonsten erfolgen bis zu 16 Wiederholungen.
Wenn mehrere Änderungen hintereinander auftreten, so wird jedes Mal die Versionsnummer inkrementiert und eine Nachricht erzeugt, wiederholt wird aber nur die letzte Änderung.
Es folgt ein Byte, welches den Zustand kennzeichnet.
0: | Der Knoten arbeitet normal |
1: | Ein Knoten sendet diese Nachricht, wenn er feststellt, dass sein Ausgangsdatenpuffer voll zu werden droht und deswegen die aktuelle Downstream-Nachricht nicht mehr bearbeitet werden kann. Ein solche Situation kann eintreten, wenn der Host den Knoten mit Anfragen 'zuschüttet'. Sie kann auch eintreten, wenn z. B. eine Zwischenebene des BiDiB-Baumes eine geringere Transportbandbreite hat: das entsprechende Interface schafft es nicht mehr, die vom Host übergebenen Daten auf seiner Unterstruktur weiterzugeben. Bei MSG_STALL eines Interfaces darf daher der Host auch keine Nachrichten mehr an Subknoten des Interfaces schicken. |
Ein MSG_STALL 1 wird vom Knoten mit einem MSG_STALL 0 wieder aufgehoben.
Es folgen 7 Bytes mit der Unique-ID. Der Knoten versucht sich anzumelden. Diese Nachricht wird beim Systemstart verwendet, um die lokale Buszuteilung abzuklären.
Vorbemerkung: Es gibt unterschiedliche Implementierung und auch Anforderungen an ein BiDiB-System, welche auch teilweise anlagenspezifisch sind. Zudem können auf einer Anlage Knoten mit unterschiedlichen Eigenschaften installiert sein.
Aus diesem Grund gibt es im Protokoll die Möglichkeit, Eigenschaften des Knotens abzufragen und den Knoten zu konfigurieren, d.h. diese Eigenschaft freizugeben. Dies geschieht über die Feature-Einstellungen. Wenn ein Knoten eine bestimmte Eigenschaft nicht unterstützt, so kann die entsprechende Feature-Einstellung nicht umgestellt werden. Der Host kann dies durch Prüflesen der vorgenommenen Einstellung kontrollieren.
Vom Knoten selbst dürfen Features nur beim Power-Up verändert werden. Der PC liest Features einmalig ein und geht dann davon aus, dass die Hardware diese gemeldeten Eigenschaften hat.
Das Beantworten von Featurenachrichten ist für Knoten verpflichtend, Features selbst jedoch nicht. Die ID's für bestimmte Featureeinstellung sind verpflichtend. Nicht vergebene Feature-IDs sind reserviert. Erweiterungen der Features (neue ID's) sind zuvor beim Arbeitskreis BiDiB zu beantragen.
Ein vollständige Liste aller Feature-IDs ist in der Datei bidib_messages.h enthalten.
Nummer | Name | Bedeutung |
---|---|---|
112 | FEATURE_CELL_NUMBER | Logische Kennung des Knotens (besonders für Funk, Meshsysteme) 0: Nur ein globaler Kanal. 1…n: Nummer der Funkzelle. |
113 | FEATURE_RF_CHANNEL | Verwendeter HF-Kanal 0…83: Kanalnummer im 2.4GHz Band 84…255: reserviert. |
250 | FEATURE_STRING_NAMESPACES_AVAILABLE | Verfügbarkeit der String-Namensräume als Bitfeld:
|
251 | FEATURE_STRING_DEBUG | Verwendung des String-Namensraums 1. Wertebereich: 0 (aus), 1 (Modus für 7 Text-Streams); Default 0. |
252 | FEATURE_STRING_SIZE | Maximale Stringlänge für Stringvariablen im Namensraum 0. Wertebereich: 0; 8…24 (Fehlt das Feature FEATURE_STRING_SIZE bzw. hat es den Wert 0, so kann der Knoten keine Stringnachrichten verarbeiten.) |
253 | FEATURE_RELEVANT_PID_BITS | Anzahl der relevanten Bits für die Produktkennung in der Unique-ID. Wertebereich: 0…31. Default 16. (Fehlt das Feature FEATURE_RELEVANT_PID_BITS, so erfolgt die Aufteilung 16 Bit / 16 Bit.) |
Mit dieser Nachricht beginnt die Abfrage aller Featurewerte. Es folgt optional ein Byte, welches dem Knoten signalisiert, dass der Host das Streaming der Featurewerte wünscht. Der Knoten setzt intern den Zähler für die MSG_FEATURE_GETNEXT-Abfragen zurück und antwortet mit der Nachricht MSG_FEATURE_COUNT, welche die Anzahl der vorhandene Features angibt. Ist diese Anzahl 0, hat der Knoten keine Features.
Hat der optionale Parameter den Wert 1, signalisiert dies dem Knoten dass er selbständig mit dem Senden der Feature-Nachrichten beginnen soll ohne auf MSG_FEATURE_GETNEXT-Abfragen zu warten. Der optionale Parameter mit dem Wert 0 signalisiert, dass der Host das Streaming der Featurewerte nicht wünscht. Die Werte 2..255 sind reserviert. Die Unterstützung dieser Funktionalität ist optional, wird aber für Knoten ab ausgewiesener Protokollversion 0.8 empfohlen.
Mit dieser Nachricht wird ein Featurewert abgefragt. Es folgt kein Byte. Die Antwort besteht entweder aus einer MSG_FEATURE (wobei der Knoten selbst das jeweils nächste FEATURE auswählt und sendet) oder aus einer MSG_FEATURE_NA Nachricht (mit feature_num = 255), wenn bereits alle Features übermittelt wurden.
ein einzelnes Feature abfragen. Es folgt ein Byte mit der Featurenummer, welche abgefragt wird.
Der Knoten antwortet mit einer MSG_FEATURE.
ein einzelnes Feature einstellen. Es folgen zwei Bytes: Featurenummer, Wert.
Der Knoten antwortet mit einer MSG_FEATURE als Bestätigung. Sollte ein Wert übermittelt worden sein, welcher nicht einstellbar war, wird der tatsächlich eingestellte Wert zurückgesendet.
Die Kodierung der Feature-Sets für die jeweiligen Klassen ist den Dokumentationen der einzelnen Klassen zu entnehmen.
Wenn ein Knoten mit einer Feature-ID angesprochen wird, und dieses Feature am Knoten nicht bekannt ist, so wird eine MSG_FEATURE_NA (=feature not available) zurückgesendet.
Für die Antwort einer Featureabfrage werden folgende Nachrichtentypen verwendet:
es folgt eine Byte mit der Feature-Nummer und ein Byte mit dem Wert. Logische Features sind bei 1 aktiviert, bei 0 deaktiviert.
Diese Nachricht wird gesendet, wenn ein Feature angefragt wurde, das auf diesem Knoten nicht verfügbar ist. Es folgt ein Byte mit der (nicht implementierten) Feature-Nummer.
Ebenso wird diese Nachricht (mit Feature-Nummer 255) gesendet, wenn bei einer Reihenabfrage mit MSG_FEATURE_GETNEXT bereits alles übermittelt wurde.
Diese Nachricht wird vor der Übertragung gesendet, wenn der Host mit MSG_FEATURE_GETALL angefragt hat. Es folgt ein Byte mit der Anzahl der vorhandenen Features und optional ein Byte zur Ankündigung des Übertragungsmodus.
Das Modus-Byte wird mit dem Wert 1 übertragen, wenn der Host Streaming angefordert hat und es vom Knoten unterstützt wird. Der Knoten beginnt selbständig mit dem Senden der MSG_FEATURE, wobei er selbst für die Datenflusskontrolle verantwortlich ist und auch während einer laufenden Übertragung voll abfragbar bleibt. Mit der Anzahl kann der Host kontrollieren, ob alle Feature-Nachrichten eingetroffen sind.
Andernfalls werden die Feature-Werte einzeln mit einer Reihe von MSG_FEATURE_GETNEXT abgeholt. Mit der Anzahl kann der Host eine entsprechende Anzahl von Anfragen stellen.
Es gibt fallweise herstellerspezifische Parameter, welche über die normale Konfiguration hinausgehen. Für diese wird seitens des Protokoll nur die Übertragungstechnik definiert, Parameterbezeichnung, -inhalt und -bedeutung sind Sache des Herstellers.
Vendor-spezifische Datenübertragungen dürfen nicht für Steuer-, Rückmelde- und sonstige Befehle verwendet werden, für die es im normalen Protokoll ein Pendant gibt.
Bevor diese Parameter übertragen werden, muss der entsprechende Knoten mit seiner UNIQUE-ID aktiviert werden. Zwischen VENDOR_ENABLE und VENDOR_DISABLE sind keine anderen Nachrichten außer VENDOR_** zulässig. Erst nachdem der Knoten MSG_VENDOR_DISABLE bestätigt hat, sind Zugriffe auf diesen Knoten wieder erlaubt.
Es folgen 7 Bytes der zuvor ausgelesenen UNIQUE-ID. Der Knoten antwortet mit MSG_VENDOR_ACK.
Es folgen keine weiteren Daten; der Knoten ist wieder deaktiviert. Der Knoten antwortet mit MSG_VENDOR_ACK.
Es folgen Daten, die wie folgt aufgebaut sind:
VENDOR_DATA ::= V_NAME V_VALUE V_NAME ::= LENGTH V_NAME_STR V_NAME_STR ::= V_NAME_CHAR | V_NAME_CHAR V_NAME_STR V_VALUE ::= LENGTH V_VALUE_STR V_VALUE_STR ::= ε | V_VALUE_CHAR V_VALUE_STR
Der Knoten speichert den Parameterwert in seiner Konfiguration, sofern ihm der Schlüssel (V_NAME) bekannt ist. Er antwortet mit einer MSG_VENDOR Nachricht, diese enthält denselben V_NAME und den gespeicherten Wert. Tritt bei der Verabeitung ein Fehler auf, kann der gespeicherte Wert von dem in MSG_VENDOR_SET übertragenen Wert abweichen, in der Regel wird dann der vorherige Wert beibehalten.
Es folgen Daten, die wie folgt aufgebaut sind:
V_NAME ::= LENGTH V_NAME_STR V_NAME_STR ::= V_NAME_CHAR | V_NAME_CHAR V_NAME_STR
Der Knoten antworten mit einer MSG_VENDOR Nachricht, diese enthält denselben V_NAME und den gespeicherten Wert dieses Parameters.
Ist der Schlüssel (V_NAME) dem Knoten nicht bekannt,
so antwortet der Knoten mit dem leeren Wert (V_VALUE = 0x00 ""
).
Die Knotenkonfiguration wird wie ein assoziatives Feld (Schlüssel-Wert-Paare) behandelt. V_NAME und V_VALUE sind ASCII-Folgen, damit kann eine Nutzereingabe direkt an den Knoten weitergereicht werden. Wenn die Folge aus Ziffern 0…9 besteht, so handelt es sich um einen numerischen Wert. Die Schlüssel (V_NAME) sollen in der Regel mit einem Buchstaben beginnen. Das Prinzip ist vergleichbar mit den Einträgen in einer Ini-Datei.
Es wird empfohlen, sprechende Namen für die Parameter und ihre Werte zu verwenden, sich dabei aber auf etwa 32 Bytes Gesamtlänge zu beschränken. Ein hartes Limit ist durch die Paketgröße gegeben, bei maximaler Nachrichtenlänge von 64 Bytes bleiben 55 Bytes für die beiden Strings V_NAME_STR und V_VALUE_STR.
Mit numerischen Werten für V_NAME und V_VALUE wird die klassische CV-Programmierung emuliert,
der Adressbereich wird (wie in Dekoderbeschreibungen üblich) bei 1 beginnend gezählt.
V_NAME = 0x01 "0"
ist unzulässig.
MSG_VENDOR_GET 0x01 0x38
(=1 '8'): Es wird die CV 8 (bei üblichen Dekodern = Herstellerkennung) gelesen:
1 ist hier die Länge des Strings, welcher nur aus dem ASCII-Zeichen für 8 besteht.MSG_VENDOR_SET 8 'S'C'H'W'E'L'L'E' 3 '2'5'5'
:
Die Nachricht beginnt mit der Kennung MSG_VENDOR_SET, dann kommt die
Längenangabe von 8, gefolgt vom Parameternamen 'SCHWELLE'.
Es folgt wieder eine Längenangabe (3), dann der Parameterwert (hier 255).Senden eines Strings an den Knoten. Es folgen weitere Bytes, welche den angesprochenen Namensraum, den angesprochenen Identifier (zu setzende Variable, Kanal) und den String selbst angeben.
Diese Funktion ist im Knoten nur verfügbar wenn vom entsprechenden Feature angekündigt.
Parameter | Beschreibung |
---|---|
NAME_SPACE | bezeichnet den Namensraum innerhalb des Knotens, Wertebereich 0…255
|
STRING_ID | bezeichnet den angesprochenen String innerhalb des Namensraumes. Namensraum 0:
|
SIZE | bezeichnet die Stringlänge.
|
CHARS | String, kodiert im Zeichensatz ISO 8859-1 (reiner 8-Bitcode). Das Byte 0x00 darf im String nicht vorkommen. |
Der Knoten antwortet (bei Namensraum 0 und 2) mit MSG_STRING und dem neu gespeicherten Wert. Ist der geschriebene String länger als zulässig, wird er vom Knoten gekürzt oder die Nachricht wird mit BIDIB_ERR_PARAMETER abgelehnt. Wenn die Antwort für einen String die Size 0 ergibt, so existiert der String nicht.
\n
verwendet.
So lassen sich auch lange Ein- und Ausgaben transportieren, die Darstellung mehrerer Kanäle kann zeilenweise erfolgen.
Ein Sequenzfehler in der Übertragung soll wie ein Zeilenumbruch behandelt werden.Abfragen einer Stringvariable im Knoten. Es folgen weitere Bytes, welche den angesprochenen Namensraum und den angesprochenen Identifier angeben.
Diese Funktion ist im Knoten nur verfügbar wenn vom entsprechenden Feature (FEATURE_STRING_SIZE, FEATURE_STRING_NAMESPACES_AVAILABLE) angekündigt.
Der Knoten antwortet mit einer MSG_STRING die den abgefragten String enthält. Sofern ein String nicht existiert, wird SIZE = 0 zurückgegeben.
Für die Antwort einer Userconfig wird folgender Nachrichtentyp verwendet:
Es folgen Daten, die wie folgt aufgebaut sind:
VENDOR_DATA ::= V_NAME V_VALUE V_NAME ::= LENGTH V_NAME_STR V_NAME_STR ::= V_NAME_CHAR | V_NAME_CHAR V_NAME_STR V_VALUE ::= LENGTH V_VALUE_STR V_VALUE_STR ::= ε | V_VALUE_CHAR V_VALUE_STR
Es folgt ein Datum: 0: kein Userconfig-Mode, 1: Bestätigung, dass der Knoten im Userconfig-Mode ist.
Diese Nachricht ist die Antwort auf eine MSG_STRING_SET oder MSG_STRING_GET. Im Namensraum 1 kann die Nachricht auch spontan gesendet werden, wenn dies freigegeben ist.
Es folgen weitere Bytes, welche den angesprochenen Namensraum, den angesprochenen Identifier, die Stringlänge und den String selbst angeben. Reihenfolge und Format der Parameter entsprechen MSG_STRING_SET, zur Bedeutung siehe dort.
Ein Modul kann nach einen Firmwareupdate seine Unique-ID wechseln, es sind auch Module möglich, welche zu Beginn nur Firmware-Update beherrschen. In diesem Fall melden sie sich normal an, es sind jedoch alle Class-Bits auf Null gesetzt.
Für eine Fehlerbehebung oder das Nachrüsten neuer Funktionen ist es wünschenswert, dass Knoten die Fähigkeit zum Update ihrer Software haben. Ob und wie die Software eines Knotens aktualisiert werden kann, wird durch ein Feature festgelegt.
Im folgenden ist der Ablauf für FEATURE_FW_UPDATE_MODE = 1 exemplarisch dargestellt:
Am Ende des Firmwareupdates sendet der Host ein Kommando zum Reboot bzw. Exit. Der Node quittiert diese Nachricht, wartet dann 1s (damit meldet ihn das Interface ab), startet dann neu und wird automatisch neu angemeldet. Es wird empfohlen, durch Maßnahmen innerhalb der Firmware (z. B. CRC-Prüfung beim Start), die vollständige und korrekte Übertragung der Firmware zu prüfen.
Da sich der Knoten nach dem FW-Update neu anmeldet, hat er keine Kenntnis über den Systemzustand (ob Spontanmeldungen erlaubt sind oder nicht) und sendet keine Spontanmeldungen. Fallweise muss man (wie auch bei jedem anderen neuen Knoten) eine entsprechende MSG_SYS_ENABLE an den neuen Knoten senden.
Nummer | Name | Bedeutung |
---|---|---|
254 | FEATURE_FW_UPDATE_MODE | 0: kein FW-Update möglich 1: FW-Update im Intel-Hex-Verfahren möglich. Die maximale Zeilenlänge beträgt 16 Daten-Bytes (d.h. die Intelhex-Zeile beginnt mit ':10' oder kleiner). |
Zielspeicherbereiche:
Je nach Implementierung des Nodes können dort unterschiedliche Zielspeicherbereiche vorhanden sein: z. B. Flash, EEPROM, usw. Für jeden dieser Zielspeicherbereiche gibt es ein Updatefile vom Hersteller.
Für Updatefiles ist ein einheitliches Namensschema festgelegt:
Platzhalter | Verwendung |
---|---|
name_version | Name der Firmware, diese soll erkennbar Hersteller und Produkt kennzeichnen sowie eine Versionsbezeichnung haben. Alle Datei für verschiedene Zielbereiche müssen den gleichen String für name_version verwenden. |
ddd | Zielspeicherbereich, 3-stellig, mit führenden 0 aufgefüllt. |
hex | Dateierweiterung, hier wird fest die Erweiterung .hex verwendet. |
xyz_occupancydetector_v1_23f.000.hex xyz_occupancydetector_v1_23f.001.hex
000 und 001 wäre hier dann die jeweilige Nummer des Ziel-Speicherbereichs. Es wird empfohlen, den Bereich 000 für den Hauptprogrammspeicher zu verwenden und 001 für den Konfigurationsspeicher (EEPROM).
Auch gilt ein strenges Quittungsverfahren: jede Nachricht des Hosts muss von Node quittiert werden, erneute Nachrichten dürfen nur gesendet werden, wenn die Quittung der vorherigen Nachricht vorliegt. (Grund hierfür sind fallweise Speicherzeiten, in denen der Node den Programmspeicher beschreibt und daher nicht in der Lage ist, normalen Programmcode auszuführen.)
Es folgen ein weiteres Byte, welche die durchzuführende Operation angibt. Abhängig von diesem Byte können weitere Parameter folgen.
Der Node antwortet jeweils mit einer MSG_FW_UPDATE_STAT.
Wert | Name | Bedeutung |
---|---|---|
0x00 | BIDIB_MSG_FW_UPDATE_OP_ENTER | Node soll in den Update-Modus wechseln. Es folgen 7 Byte mit der Unique-ID des Nodes. Nur wenn die Unique-ID mit der des Nodes übereinstimmt, darf der Node in den Update-Mode wechseln. Der Node antwortet mit einer MSG_FW_UPDATE_STAT(BIDIB_MSG_FW_UPDATE_STAT_READY), falls er im Bootloader ist, bzw. mit einer MSG_FW_UPDATE_STAT(BIDIB_MSG_FW_UPDATE_STAT_EXIT), falls er nicht in den Bootloader wechseln konnte. |
0x01 | BIDIB_MSG_FW_UPDATE_OP_EXIT | Node soll den Update-Modus verlassen. |
0x02 | BIDIB_MSG_FW_UPDATE_OP_SETDEST | Auswahl Zielspeicher. Mit diesem Befehl wird der Zielbereich festgelegt, in welchem die folgenden
Daten gespeichert werden sollen. Es folgt ein Byte mit der Nummer des Zielbereiches. Der Knoten
antwortet mit einer MSG_FW_UPDATE_STAT(BIDIB_MSG_FW_UPDATE_STAT_DATA). 0: Flash (Applikation) 1: EEPROM |
0x03 | BIDIB_MSG_FW_UPDATE_OP_DATA | Daten: Für den aktuell gewählten Zielspeicher wird eine Dateneinheit gesendet. Die Daten werden als Zeile einer Intel-Hex-Datei übertragen. 'White'-Charakters (also 0x20, 0x09, 0x0D und 0x0a) werden dabei nicht mit übertragen. |
0x04 | BIDIB_MSG_FW_UPDATE_OP_DONE | Für den aktuell gewählten Zielspeicher sind keine weiteren Daten mehr vorhanden, Node soll den Update des Zielspeichers durchführen. Der Node antwortet mit einer MSG_FW_UPDATE_STAT(BIDIB_MSG_FW_UPDATE_STAT_READY). |
Nach einem MSG_FW_UPDATE_OP Befehl wird immer eine Statusnachricht gesendet. Es folgen zwei Bytes:
Parameter | Beschreibung | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
STATUS | Prozess-Status
|
|||||||||||||||||||||||||||
TIMEOUT bzw. ERROR |
Nach erfolgreicher Ausführung gibt das Byte die vom Host mindestens
einzuhaltende Zeit an, bis das nächste Paket gesendet werden darf:
|
Gleisausgabe-Geräte sind Knoten, die in der Lage sind, ein DCC-Signal zu erzeugen. Dieses DCC-Signal ist a-priori nur dem Knoten selbst und allen direkt angeschlossenen Geräten bekannt. Der Knoten kann durch Systemnachrichten freigeschaltet werden, dass er die zentrale Verteilung des DCC-Signals (über das entsprechende Leitungspaar im BiDiBus) ansteuern darf. BiDiB enthält also die Möglichkeit, verschiedene DCC-Systeme parallel zu betreiben. Mögliche Anwendungen hierfür sind z. B. ein separates Programmiergleis, welches unabhängig von Hauptgleis betrieben werden kann oder ein separater DCC-Signalzweig, welcher nur für das Schalten verwendet wird.
Ein Problem auf Ausstellungsanlagen sind 'hängende' Fahrzeuge, welche bedingt z. B. durch Kontaktschwierigkeiten Fahrbefehle nicht mehr empfangen und dadurch den Betrieb stören. Im BiDiBus ist eine schnelle Durchleitung der Information vorgesehen, ob eine railcom-Quittung von der Lok empfangen wurde. Diese Information kann von der Gleisausgabeeinheit empfangen werden und zu einer Aussage zusammengefasst werden, ob die entsprechende Lok noch in Verbindung mit der Zentrale ist. Stellt die Zentrale einen Verlust der Lok fest, so sendet sie ein Nachricht an den Host.
Im Regelbetrieb wird das Gleisausgabe-Gerät vom Host angesprochen. Es besteht jedoch der Wunsch, dass DCC-Generatoren sowohl vom Host als auch dezentral angesprochen werden können. Hierbei entsteht neben dem Zielkonflikt über die Kontrolle ('wer kontrolliert die Lok, wer sichert den Fahrweg') auch ein Konflikt, welche Stelle eine Quittierung über den Befehl und die erfolgte Ausgabe auf dem Gleis erhält. In BiDiB ist es vorgesehen, dass im Regelbetrieb lokale Kontrollgeräte (verteilte Handregler und Stellpulte) ihre Stellanforderungen an den Host senden, dieser prüft und filtert das fallweise (z. B. kein Stellen einer Weiche in einer reservierten Fahrstraße) und erteilt dann den entsprechenden Befehl an das Gleisausgabegerät. Das Gleisausgabegerät quittiert dies im Regelbetrieb gegenüber dem Host.
Havarie- und Testbetrieb: Darüber hinaus gibt es Situationen, in denen der Host nicht in der Lage ist, die gewünschten Befehle zu erteilen, z. B. weil die Betriebssituation nicht vorgesehen ist, das PC-Programm abgestürzt ist oder der PC schlicht nicht angeschlossen ist. Für diesen Havarie- und Testbetrieb ist direkte lokale Kontrolle vorgesehen.
Für diesen Notbetrieb dürfen daher DCC-Generatoren die lokale Busstruktur (z. B. BiDiBus) auf Befehle zur Zugsteuerung abhören und diese Befehle (quittungsfrei) ausführen. Diese Fähigkeit wird über ein Feature eingestellt. Wenn das Feature aktiviert ist, werden Handreglerbefehle (die eigentlich an den Host gesendet werden) von der Gleisausgabeeinheit sozusagen im 'Spionage-Mode' mitgelesen und ausgeführt. Damit hier jedoch der Zielkonflikt (wer kontrolliert) eindeutig gelöst werden kann, hat der Host über den Befehl MSG_CS_ALLOCATE die Möglichkeit, diese Spionage zu unterbinden und die Handregler damit quasi 'auszusperren'. Dieses 'Aussperren' der Handregler über den Befehl MSG_CS_ALLOCATE ist aber immer nur für eine beschränkte Zeit gültig, MSG_CS_ALLOCATE muss also permanent wiederholt werden. Damit ist ein nahtloser Übergang der Steuerung vom PC auf Handregler möglich, auch Fahren ohne PC ist ohne weitere Maßnahmen möglich.
Watchdog: Um im Falle eines unerwarteten Verbindungsabbruches zwischen Hostprogramm und Gleisausgabe nicht Züge ohne Kontrolle unterwegs zu haben, ist die Gleisausgabe mit einer Verbindungsüberwachung ausgerüstet. Hierbei muss das Hostprogramm in regelmäßigen Abständen mittels MSG_CS_SET_STATE (BIDIB_CS_STATE_GO) den ON-Zustand der Zentrale erneuern, dabei legt das Feature FEATURE_GEN_WATCHDOG das Intervall fest, in dem die Erneuerung mindestens erfolgen muss.
Erfolgt diese Erneuerung nicht, dann werden von der Gleisausgabeeinheit alle Loks angehalten, welche unter Kontrolle des Hosts stehen. Dieses Anhalten erfolgt permanent (d.h. die geladene Geschwindigkeit der Loks wird auf bleibend 0 gesetzt).
Ein Hostprogramm muss also vor Beginn der Lokkontrolle das Feature FEATURE_GEN_WATCHDOG auslesen und entsprechend häufig den ON-Zustand erneuern.
Auskunftsfunktion: Wenn ein Steuer- oder Anzeigeprogramm auf eine bereits laufende Gleisausgabe trifft und sie nicht zurücksetzt, sind Auskünfte über die zur Zeit aktiven Fahrzeuge nötig. Die Nachricht MSG_CS_QUERY und die zugehörige Antwort MSG_CS_DRIVE_STATE ermöglichen diese Abfrage der Adressen, Formate und Zustände.
Nummer | Name | Bedeutung | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
100 | FEATURE_GEN_SPYMODE | Spymode Hier wird eingestellt, ob lokale Kontrolle (Mithören von Handreglernachrichten) erlaubt ist oder nicht. 0: Mithören nicht erlaubt. 1: Mithören prinzipiell erlaubt, kann aber durch MSG_CS_ALLOCATE unterbunden sein. | ||||||||||||||||
101 | FEATURE_GEN_WATCHDOG | Hostüberwachung 0: Keine Überwachung (=keine Watchdogfunktion). 1…100: Hostprogramm muss periodisch den MSG_CS_SET_STATE(GO) wiederholen. Wiederholung muss innerhalb des Intervalls FEATURE_GEN_WATCHDOG * 100ms erfolgen. default = 20, entsprechend 2s. | ||||||||||||||||
102 | FEATURE_GEN_DRIVE_ACK | Quittungen für Fahr- und Programmierbefehle – Bitfeld: Bit 0 aktiviert zusätzlich Ebene 1 (Gleisausgabe) | ||||||||||||||||
103 | FEATURE_GEN_SWITCH_ACK | Quittungen für Schaltbefehle – Bitfeld: Bit 0 aktiviert zusätzlich Ebene 1 (Gleisausgabe) | ||||||||||||||||
106 | FEATURE_GEN_POM_REPEAT | Anzahl von POM-DCC-Nachrichten, welche die Zentrale je POM-Befehl sendet 2: Standard gemäß railcom-Spezifikation (default). 3…8: Höhere Anzahl an DCC-Nachrichten, um unwillige Dekoder zu korrektem Antworten zu bewegen. | ||||||||||||||||
107 | FEATURE_GEN_DRIVE_BUS | Kontrolle des DCC-Busses (innerhalb BiDiBus) 0: Knoten empfängt DCC vom BiDiBus 1: Knoten treibt DCC auf dem BiDiBus | ||||||||||||||||
108 | FEATURE_GEN_LOK_LOST_DETECT | Gleisausgabe erkennt und meldet 'verlorene' Lokomotiven 0: Verlorene Lokomotiven werden nicht erkannt bzw. gemeldet. 1: Verlorene Lokomotiven werden gemeldet. | ||||||||||||||||
109 | FEATURE_GEN_NOTIFY_DRIVE_MANUAL | Die Gleisausgabe kann fallweise lokale Bedienelemente aufweisen.
| ||||||||||||||||
110 | FEATURE_GEN_START_STATE | Zustand der Gleisausgabe nach Power-Up. 0: DCC ist abgeschaltet. 1: DCC ist eingeschaltet. | ||||||||||||||||
111 | FEATURE_GEN_EXT_AVAILABLE | Zusätzliche (Protokoll-)Eigenschaften der Gleisausgabe, die Erweiterung ist verfügbar wenn das jeweilige Bit gesetzt ist.
|
Es folgt ein Byte mit Inhalt 0. (= lokale Busaddresse des Hosts)
Der Gleisausgabeknoten nimmt keine Befehle von sonstigen lokalen Adressen an. Diese Sperre ist für 2s gültig und verfällt dann von selbst.
Mit diesem Befehl wird der Zustand der Gleisausgabe eingestellt oder abgefragt. Es folgt ein Byte, das den neuen Zustand kodiert. Der Knoten antwortet immer mit einer MSG_CS_STATE.
Vor dem erstmaligen Aufschalten der Ausgabe sollte der Befehls-Zustand der Lokomotiven kontrolliert werden bzw. alle Lokomotiven aus dem Ausgabespeicher entfernt werden. Damit wird vermieden, dass eventuell noch alte Fahrstufen bei Lokomotiven geladen sind.
Der Startzustand nach dem Einschalten kann durch das FEATURE_GEN_START_STATE eingestellt werden.
Wert | Name | Bedeutung |
---|---|---|
0x0 | BIDIB_CS_STATE_OFF | Die Gleisausgabe wird abgeschaltet. Als Folge werden auch angeschlossene Booster abschalten. |
0x1 | BIDIB_CS_STATE_STOP | Alle Loks werden mittels Nothalt angehalten, jedoch Weichen können nach wie vor geschaltet werden. Wenn Stop von der Zentrale nicht unterstützt wird, so wird OFF ausgeführt. |
0x2 | BIDIB_CS_STATE_SOFTSTOP | Alle Loks werden mit Fahrstufe 0 (also mit ihrer eigenen Verzögerung)
angehalten, Weichen können weiterhin geschaltet werden.
Wenn Soft-Stop von der Zentrale nicht unterstützt wird, so wird STOP ausgeführt. Die Gleisausgabe führt den Soft-Stop durch und steht anschließend im Zustand STOP. |
0x3 | BIDIB_CS_STATE_GO | Wiederaufnahme des Betriebes, Loks und Weichen können geschaltet werden. Bei aktiviertem Watchdog muss dieser Befehl permanent wiederholt werden. |
0x4 | BIDIB_CS_STATE_GO_IGN_WD | Wiederaufnahme des Betriebes, Loks und Weichen können geschaltet werden. Ein evtl. vorhandener Watchdog wird dabei außer Betrieb gesetzt (=ignore Watchdog) |
0x8 | BIDIB_CS_STATE_PROG | Programmiermode; Die Zentrale hat in den Programmiermode umgeschaltet und ist zur Ausführung von Programmierbefehlen (auf den Programmiergleis) bereit. Der normale Betrieb sowie ein evtl. Watchdog ruht. |
0x9 | BIDIB_CS_STATE_PROGBUSY | Programmiermode; diese Meldung zeigt an, dass aktuell ein Programmiervorgang auf dem Programmiergleis durchgeführt wird. (nur bei Abfrage). |
0xD | BIDIB_CS_STATE_BUSY | Die Gleisausgabe ist nicht mehr aufnahmefähig für neue Befehle, z. B. weil entsprechende Ausgabe-Fifos voll sind. (Nachricht nur bei Abfrage) |
0xFF | BIDIB_CS_STATE_QUERY | Der Zustand wird abgefragt. (nur für MSG_CS_SET_STATE). |
Mit diesem Befehl werden Fahrbefehle ausgegeben. Es folgen weitere Parameter, welche Format und auszugebende Funktionen kennzeichnen. Wenn eine Lok keine höheren Funktionen angelegt hat, sollen die entsprechenden Gruppen der Funktionsbefehle als inaktiv gekennzeichnet werden. Das schont speziell die knappe Ressource Bandbreite am Gleis.
MSG_CS_DRIVE Befehle werden von einer oder mehreren MSG_CS_DRIVE_ACK Nachrichten quittiert. Die verschiedenen Quittungsstufen können per FEATURE_GEN_DRIVE_ACK im Ausgabeknoten zugeschaltet werden. Wenn mehrere Fahrbefehle für die gleiche DCC-Adresse erteilt werden, so ist es den Ausgabegerät erlaubt, bei Engpässen in der Bandbreite diese zusammenzufassen. In diesem Fall können zwischenliegende Quittungen entfallen.
Fahrbefehle werden immer mit einer Fahrstufenanzahl von 127 + Richtungsbits übergeben, erst die Gleisausgabeeinheit konvertiert diesen Fahrbefehl entsprechend dem gewählten Format auf die entsprechende Fahrstufenzahl am Gleis.
Parameter | Beschreibung | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ADDRL | Adresse, untere 8 Bits. | ||||||||||||||||
ADDRH | Adresse, obere 6 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. Die Adresse 0 ist keiner echten Lok zugeordnet und hat eine Sonderfunktion. (3) (4) | ||||||||||||||||
DATA0 | Bitfeld
| ||||||||||||||||
DATA1 | Bitfeld Ausgabe Aktiv
Wenn alle Bits = 0 gesetzt sind, so wird die Lok in der Ausgabeeinheit aus dem Wiederholspeicher entfernt (2), dies wird mit ACK=1 quittiert. | ||||||||||||||||
DATA2 | Geschwindigkeit, bestehend aus Richtung (MSB) und Speed (7 LSBs) (1) | ||||||||||||||||
DATA3 | FL, F4 – F1; 3 MSBs sind reserviert. Die Bitorder der Funktionsbits ist: 3*reserved, FL (Licht), F4, F3, F2, F1 | ||||||||||||||||
DATA4 | F12 – F5 | ||||||||||||||||
DATA5 | F20 – F13 | ||||||||||||||||
DATA6 | F28 – F21 |
Mit diesem Befehl werden Zubehörobjekte über die Gleisausgabe (DCC) angesteuert. Es folgen 4 Bytes: ADDRL, ADDRH, DATA, TIME
Der Zubehördekoder mit der Adresse [ADDRH*256+ADDRL] wird mit dem Begriff in DATA angesteuert. DATA ist eine Bitstruktur, bestehend aus CONFIG (Bit 7,6) ACTIVATE (Bit 5) und ASPECT (Bit 4 – Bit 0).
Parameter | Beschreibung | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ADDRL | Adresse, untere 8 Bits. | ||||||||||
ADDRH | Adresse, obere 3 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-) Adresse und wird bei 0 beginnend gezählt. | ||||||||||
DATA | Bitfeld
| ||||||||||
TIME | Definition der Schaltzeit analog zur Spezifikation von railcom.
|
Auch für Accessory-Befehle gibt es ein mehrstufiges Quittungsverfahren, dessen Stufen per FEATURE_GEN_SWITCH_ACK im Ausgabeknoten zugeschaltet werden kann. Der Knoten sendet entsprechende MSG_CS_ACCESSORY_ACK-Nachrichten.
Anmerkung: Dieser Befehl deckt Zubehördekoder über DCC ab. Es gibt auch noch direkt über BiDiB angesteuertes Zubehör (mit erweiterten Eigenschaften), hierzu dienen die Befehle der Klasse Accessory.
Mit diesem Befehl werden (legacy) DCC-Accessory-Befehle als Broadcast verteilt, die Nachricht ist nicht an einzelne Knoten adressiert und wird nicht quittiert. Hubs müssen die Nachricht als Broadcast weiterverteilen. Die Auswertung ist nur für Sonderfälle vorgesehen, wie z. B.:
Es folgen drei Parameter, STAT_FLAG, ADDRL, ADDRH.
Parameter | Beschreibung |
---|---|
STAT_FLAG | Statusflag, zeigt den Zustand der Hostansteuerung und definiert die Auswertbarkeit. 0: Auswertung freigegeben (z. B. keine gültige Hostverbindung oder Legacy-Mode) 1…n: reserviert. |
ADDRL | Adresse, untere 8 Bits der DCC-Spulenadresse. |
ADDRH | Adresse, obere 4 Bits der DCC-Spulenadresse. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. |
Mit diesem Befehl werden Programmierbefehle für das Hauptgleis (Program on Mains) ausgegeben. Es folgen weitere Parameter, welche Adresse, angesprochene CV, Daten und durchzuführende Operation bezeichnen. Programmierbefehle werden von einer oder mehreren MSG_CS_POM_ACK Nachrichten quittiert. Die verschiedenen Quittungsstufen können per FEATURE_GEN_DRIVE_ACK im Ausgabeknoten zugeschaltet werden. Sofern eine Gleisausgabeeinheit einen Befehl nicht ausgeben kann (z. B. weil die Operation nicht implementiert ist), liefert sie trotzdem einen MSG_CS_POM_ACK mit ACK=0.
Sofern ein Railcom-fähiger Dekoder den POM-Befehl beantwortet, erzeugt der zuständige Bidi-Detektorknoten eine MSG_BM_CV oder MSG_BM_XPOM Nachricht.
POM Befehle gibt es in mehreren Varianten, es gibt folgende wesentliche Unterscheidungsmerkmale:
Die Parameter des MSG_CS_POM-Befehls werden immer mit der maximalen Feldgröße kodiert, auch wenn z. B. nur kurze CV-Adresse angesprochen werden soll. Das Adressfeld ist also immer 8+32 Bit, das CV-Adressfeld 24 Bit und das Datenfeld 32 Bit breit. Wie bei BiDiB üblich wird generell das LSB zuerst übertragen (Little-Endian).
Parameter | Beschreibung | ||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ADDRL | Adresse, untere 8 Bits (DID0 bei Dekoderadressierung). | ||||||||||||||||||||||||||||||||||||||||||
ADDRH | Adresse, obere 8 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. (DID1 bei Dekoderadressierung); Die Unterscheidung, ob Accessory oder Fahrzeugdekoder adressiert wird, ist in Bit 14 und 15 kodiert:
| ||||||||||||||||||||||||||||||||||||||||||
ADDRXL | 0 bei Lokadressierung, DID2 bei Dekoderadressierung | ||||||||||||||||||||||||||||||||||||||||||
ADDRXH | 0 bei Lokadressierung, DID3 bei Dekoderadressierung | ||||||||||||||||||||||||||||||||||||||||||
MID | 0: Adressierung über die Lokadresse 1…255: Adressierung über Dekoderkennung, dieses Feld ist dann die Herstellerkennung (=DID4) | ||||||||||||||||||||||||||||||||||||||||||
OPCODE | Byte, definiert die auszuführende Operation
| ||||||||||||||||||||||||||||||||||||||||||
CVL, CVH, CVX | CV-Adresse, Low Byte zuerst. CVX ist nur bei XPOM erforderlich und wird
bei klassischem POM mit 0 übertragen. CV wird beginnend bei 0 gezählt (wie auch
der Gleisbefehl). Die CV-Benennungen von Decodern beginnen bei CV1 (CV1 wird mit 0 kodiert). Bei Short Form CV Access wird hier direkt der 4-bittige Instruction Type gesetzt, mit folgenden Werten:
| ||||||||||||||||||||||||||||||||||||||||||
DATA[1…4] | CV-Werte. Bei Standard-POM ist nur ein Datum erforderlich, bei XPOM-Write sind je nach Zahl der zu schreibenden Bytes bis zu 4 DATA-Bytes erforderlich. Die Angabe erfolgt little endian, d.h. DATA0 kommt an die CV-Adresse, DATA1 an CV-Adresse+1, usw. |
Mit diesem Befehl werden einzelne Aktionen bei einem Fahrzeugdekoder ausgelöst, z. B. die Kupplung betätigt oder eine (nicht permanente) Funktion ausgelöst. Des weiteren sind einzelne DCC-Nachrichten wie ein Analogfunktionskommando möglich. Es folgen 5 Bytes: ADDRL, ADDRH, STATEL, STATEH, DATA. Dabei kennzeichnet STATE die auszugebende DCC Nachricht.
Parameter | Beschreibung | ||
---|---|---|---|
ADDRL | Adresse, untere 8 Bits. | ||
ADDRH | Adresse, obere 6 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. Die Adresse 0 ist dabei reserviert. | ||
STATEL | Binary State Nummer, untere 8 Bits | Funktionssteuerung mit Gruppenbefehlen (RCN 212 2.3.1-4) 0: reserviert. 1: Funktionen F1…F4, F0. 2: Funktionen F5…F8. 3: Funktionen F9…F12. 4: Funktionen F13…F20. 5: Funktionen F21…F28. 6: Funktionen F29…F36. 7: Funktionen F37…F44. 8: Funktionen F45…F52. 9: Funktionen F53…F60. 10: Funktionen F61…F68. |
Analogkanal (RCN 212 2.3.8), Wertebereich 0…255 |
STATEH | Binary State Nummer, obere 7 Bits. MSB ist zu 0 gesetzt. | 0x80 (Opcode 0, MSB ist zu 1 gesetzt). | 0x81 (Opcode 1, MSB ist zu 1 gesetzt). |
DATA | Binary State Zustand. Wertebereich 0,1 | Bitvektor der Funktionsbits gemäß obiger Tabelle, mit der zuerst genannten Funktion als LSB. Wertebereich 0…255 | Analoger Datenwert. Wertebereich 0…255 |
DCC Binary States umfassen 32767 mögliche Ausgänge, diese werden auf Gleisebene zusammen mit den Datum D in 2 Bytes ausgegeben: DCC kodiert das als DLLLLLLL HHHHHHHH. Die Binary State Nummer 0 bedeutet Adressierung aller Binary States im Dekoder.
Funktionen und Analogwerte werden einmal mit der normgerechten Wiederholzahl am Gleis ausgegeben, jedoch nicht in den Kommando-Wiederholspeicher übernommen. Sollte eine Funktion aufgrund eines vorangegangen MSG_CS_DRIVE bereits im Wiederholspeicher sein, so wird sie dort aktualisiert.
Die Fähigkeit zur Ausgabe von Analogfunktionen und Funktionsgruppen bis F68 ist im FEATURE_GEN_EXT_AVAILABLE angekündigt.
MSG_CS_BIN_STATE-Befehle werden wie Fahrbefehle mit einem MSG_CS_DRIVE_ACK quittiert.
Mit diesem Befehl wird eine Abfrage aktiver Fahrzeuge durchgeführt. Es folgen 1 oder mehrere Bytes, welche die Abfrage kodieren: QUERY[, ADDRL, ADDRH].
Parameter | Beschreibung | ||||||||
---|---|---|---|---|---|---|---|---|---|
QUERY | ENUM der abgefragten Information und Abfragemodus:
| ||||||||
ADDRL | Adresse, untere 8 Bits. | ||||||||
ADDRH | Adresse, obere 6 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. Die Adresse 0 ist dabei reserviert. |
Die Unterstützung der Gleisausgabe für diesen Befehl ist im FEATURE_GEN_EXT_AVAILABLE festgelegt.
Mit diesem Befehl werden Programmierbefehle (Programmiergleis) ausgegeben. Diese Gleis-Befehle werden von einer Ausgabeeinheit nur unterstützt, wenn das Classbit 3 gesetzt ist.
Es folgen weitere Parameter, welche angesprochene CV, Daten und durchzuführende Operation bezeichnen. MSG_CS_PROG Befehle werden von einer oder mehreren MSG_CS_PROG_STATE Nachrichten quittiert.
Programmierbefehle gibt es (historisch bedingt) in mehreren Varianten, es gibt folgende wesentliche Unterscheidungsmerkmale:
Der Zieldekoder kann ein Fahrzeugdekoder oder ein Zubehördekoder (Standard oder Accessory) sein. Bei der Programmierung am Programmiergleis spielt diese Unterscheidung keine Rolle.
Adressierung der Ziel-CV innerhalb des Dekoders: Mit den Programmiergleisbefehlen können 1024 CVs adressiert werden. Darüber hinausgehende Adressen sind hostseitig durch entsprechende vorherige Einstellungen der Indexregister (CV 31 und CV 32) durchzuführen.
Parameter | Beschreibung | ||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
OPCODE | Byte, definiert die auszuführende Operation
| ||||||||||||||||||
CVL, CVH | CV-Adresse, Low Byte zuerst. CV wird beginnend bei 0 gezählt (wie auch der Gleisbefehl). Die CV-Benennungen von Decodern beginnen bei CV1 (CV1 wird mit 0 kodiert). | ||||||||||||||||||
DATA[0…1] | CV-Daten. Im Falle des Byte-Lesens wird DATA nicht benötigt, kann aber trotzdem im Befehl enthalten sein. |
(optional, ob ein Knoten diesen Befehl unterstützt ist im FEATURE_GEN_RCPLUS_AVAILABLE festgelegt)
Mit diesem Befehl wird die Railcom-Plus Ausgabe der Zentrale gesteuert. Es folgt mindestens ein Byte (OPCODE), abhängig vom Inhalt von Opcode folgen optional weitere Bytes.
Jede MSG_CS_RCPLUS wird mit einer oder mehreren MSG_CS_RCPLUS_ACK mit dem entsprechenden OPCODE beantwortet.
Name | Bedeutung | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
RC_GET_TID | Die Gleisausgabeeinheit liefert die aktuelle TID zurück. | ||||||||||
RC_SET_TID | Setzen der TID. Es folgen 6 Bytes: CID0, CID1, CID2, CID3, CID4, SID | ||||||||||
RC_PING | Permanentes Aussenden der RailcomPlus-Kennung (TID). Es folgt ein Parameter INTERVAL, dieser gibt den zeitlichen Abstand der Aussendungen in der Einheit 100ms an. Ein Wert von 0 schaltet die Aussendung ab. | ||||||||||
RC_PING_ONCE_P0 | Einmaliges Aussenden der RailcomPlus-Kennung (TID). | ||||||||||
RC_PING_ONCE_P1 | |||||||||||
RC_BIND | Zuweisen der Dekoderadresse. Es folgen 7 Byte: DEC_MUN0,DEC_MUN1,DEC_MUN2,DEC_MUN3, DEC_MID, NEW_ADDRL, NEW_ADDRH. Die neue Adresse ist wie folgt kodiert:
| ||||||||||
RC_FIND_P0 | Der Gleisausgabebefehl FIND wird mit gelöschtem bzw. gesetztem P-Bit erzeugt.
Es folgen 5 Byte: DEC_MUN0,DEC_MUN1,DEC_MUN2,DEC_MUN3, DEC_MID | ||||||||||
RC_FIND_P1 |
Für Fahr-, Schalt- und Programmier-Nachrichten an die Gleisausgabe existiert ein mehrstufiges Quittungsverfahren:
Während Ebene 0 immer verplichtend ist, lassen sich die höheren Ebenen optional per Feature zuschalten. Deren Quittungen werden zusätzlich gesendet.
Wert | Ebene | Bedeutung |
---|---|---|
0 | 0 | Sofortige Quittung: Befehl konnte nicht angenommmen werden. Dies tritt auf, wenn die entsprechenden Puffer voll sind oder die Gleisausgabe abgeschaltet ist. Ebenfalls wird mit 0 quittiert, wenn die Ausgabeeinheit den angeforderten Befehl nicht unterstützt (z. B. XPOM Opcode, DRIVE Gleisformat). |
1 | 0 | Sofortige Quittung: Befehl wurde angenommen und wird demnächst auf das Gleis ausgegeben. |
2 | 0 | Sofortige Quittung: Befehl wurde angenommen und wird mit Verzögerung auf das Gleis ausgegeben. Diese Quittung ist ein Hinweis an den Host, dass aktuell ein gewisser Engpass in der Gleisausgabe vorliegt und eine Drosselung in der Anzahl der Befehle seitens der Ausgabeeinheit angeraten wird. Die Gleisausgabeeinheit muss nach einer Quittung mit 2 noch in der Lage sein, mindestens einen weiteren Befehl anzunehmen. |
3 | 1 | Spontane Quittung: Der Befehl für diese Adresse wurde jetzt aufs Gleis ausgegeben. |
4 | 2 | Spontane Quittung: Nach der Gleisausgabe des Befehls wurde der Empfang von keinem Dekoder bestätigt. Dies dient dem schnellen Auffinden von Lücken mittels FIND im RailComPlus-Vereinzelungsprozess. |
5 | 2 | Spontane Quittung: Nach der Gleisausgabe des Befehls wurde der Empfang wurde von mindestens einem Dekoder bestätigt. |
Mit dieser Nachricht wird der aktuelle Zustand der Ausgabe mitgeteilt. Es folgt ein Byte, das den aktuellen Zustand kodiert. Der Zustand ist hierbei ebenso wie bei MSG_CS_SET_STATE kodiert.
Mit diesem Befehl werden Fahrbefehle quittiert. Es folgen weitere Parameter:
Parameter | Beschreibung |
---|---|
ADDRL | Adresse, untere 8 Bits. |
ADDRH | Adresse, obere 6 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. |
ACK | Quittung, diese ist kodiert wie oben beschrieben. |
Mit diesem Befehl werden Schaltbefehle quittiert. Es folgen weitere Parameter:
Parameter | Beschreibung |
---|---|
ADDRL | Adresse, untere 8 Bits |
ADDRH | Adresse, obere 3 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. |
ACK | Quittung, diese ist kodiert wie oben beschrieben. |
Mit diesem Befehl werden POM Befehle quittiert. Es folgen weitere Parameter, Adresse und Quittung. Adresse ist identisch zum MSG_CS_POM-Befehl kodiert und wird im Knoten einfach 'durchgereicht'.
Parameter | Beschreibung |
---|---|
ADDRL | Adresse, untere 8 Bits (DID0 bei Dekoderadressierung). |
ADDRH | Adresse, obere 8 Bits. (DID1 bei Dekoderadressierung); Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. Die Unterscheidung, ob Accessory oder Fahrzeugdekoder adressiert wird, ist in Bit 14 und 15 kodiert:
|
ADDRXL | 0 bei Lokadressierung, DID2 bei Dekoderadressierung |
ADDRXH | 0 bei Lokadressierung, DID3 bei Dekoderadressierung |
MID | 0: Adressierung über die Lokadresse 1…255: Adressierung über Dekoderkennung, dieses Feld ist dann die Herstellerkennung (=DID4) |
ACK | Quittung, diese ist kodiert wie oben beschrieben. |
Mit diesem Befehl werden Handbedienungen einer Lokomotive gemeldet. Hierzu muss jedoch das FEATURE_GEN_NOTIFY_DRIVE_MANUAL auf 1 gesetzt sein. Es folgen weitere Parameter, deren Struktur wie bei MSG_CS_DRIVE angelegt ist:
Parameter | Beschreibung |
---|---|
ADDRL | Adresse, untere 8 Bits |
ADDRH | Adresse, obere 6 Bits |
DATA0 | Bitfeld, Format |
DATA1 | Bitfeld Ausgabe Aktiv |
DATA2 | Geschwindigkeit |
DATA3 | 3*reserved, FL (Licht), F4, F3, F2, F1 |
DATA4 | F12 – F5 |
DATA5 | F20 – F13 |
DATA6 | F28 – F21 |
Mit diesem Befehl werden Ereignisse bei einer Lokomotive gemeldet. Es folgen weitere Parameter:
Parameter | Beschreibung | ||||||
---|---|---|---|---|---|---|---|
ADDRL | Adresse, untere 8 Bits | ||||||
ADDRH | Adresse, obere 6 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. | ||||||
EVENT | Event, dieses ist wie folgt kodiert:
|
Eine häufige Störursache beim Fahrbetrieb sind 'hängende' Lokomotiven, welche z. B. durch Kontaktschwierigkeiten keine Fahrbefehle mehr erhalten. Sofern eine Modellbahnanlage flächendeckend mit railcom-Meldern ausgerüstet ist, kann die Gleisausgabeeinheit den Verbindungsverlust zu einer Lokomotive bemerken und melden.
Die Gleisausgabeeinheit überwacht hierzu die ACK-Leitung auf dem BiDiBus und schaltet für eine Fahrzeug-Dekoder Adresse den Überwacher scharf, sofern ACK-Bestätigungen für diesen Dekoder eingehen. Nach 10 Lokbefehlen ohne ACK-Bestätigung soll das MSG_CS_DRIVE_EVENT erzeugt werden. Dies kann natürlich nur dann funktionieren, wenn die Modellanlage flächendeckend mit railcom-Meldern ausgerüstet ist, ansonsten kommt es bereits beim Befahren von nicht railcom-überwachten Abschnitten zu einer 'LOST'-Meldung.
Auf die Möglichkeit der präventiven Gleisüberwachung mittels MSG_BM_DYN_STATE sei hier ergänzend hingewiesen.
Mit diesem Befehl werden Handverstellungen bei einem DCC-Accessory gemeldet. Es folgen weitere Parameter:
Parameter | Beschreibung | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
ADDRL | Adresse, untere 8 Bits. | ||||||||||
ADDRH | Adresse, obere 3 Bits. Die gesamte Adresse ergibt sich zu ADDRH*256+ADDRL. Die Adresse bezeichnet die echte (DCC-)Adresse und wird bei 0 beginnend gezählt. | ||||||||||
DATA | Bitfeld
|
Mit diesem Befehl werden Abfragen zu MSG_CS_QUERY beantwortet. Es folgt ein Parameter, welcher die Art der Antwort kodiert. Die weiteren Befehlsparameter sind identisch zu MSG_CS_DRIVE_MANUAL kodiert. Im Falle der Abfrage einer nicht existierenden Lok wird diese Lok mit allen Datenfeldern = 0 gemeldet.
Parameter | Beschreibung | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
OPCODE | ENUM der abgefragten Information und Abfragemode:
| ||||||||||
ADDR[2] | Identisch zu MSG_CS_DRIVE_MANUAL kodiert | ||||||||||
DATA[7] |
Mit diesem Befehl werden Ergebnisse bei einem Programmiervorgang im Service-Mode gemeldet. Es folgen weitere Parameter:
Parameter | Beschreibung | |||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
STATE | Ergebnis
| |||||||||||||||||||||||||||
TIME | prognostizierte Restdauer in Einheiten von 100ms. Die Restdauer kann technisch bedingt nur schwer abgeschätzt werden, insbesondere bei Dekodern, welche Bitmode nicht unterstützen, ist die Aussage stark schwankend. Der Knoten probiert hier einfach Daten der Reihe nach durch und ist bei 'Treffer' fertig. | |||||||||||||||||||||||||||
CVL, CVH | CV-Adresse, Low Byte zuerst. CV wird beginnend bei 0 gezählt (wie auch der Gleisbefehl). Die CV-Benennungen von Decodern beginnen bei CV1 (CV1 wird mit 0 kodiert). Wertebereich 0…1023 | |||||||||||||||||||||||||||
DATA[0…1] | CV-Daten. Im Falle des Byte-Schreibens oder einer Fehlermeldung wird DATA nicht benötigt, kann aber trotzdem im Befehl enthalten sein. |
(optional, ob ein Knoten diese Nachricht unterstützt ist im FEATURE_GEN_RCPLUS_AVAILABLE festgelegt)
Mit dieser Nachricht werden Railcom-Plus-Befehle von der Zentrale quittiert. Es folgt mindestens ein Byte (OPCODE), abhängig vom Inhalt von Opcode folgen ein oder mehrere Bytes.
Parameter | Beschreibung |
---|---|
OPCODE | Klassifizierung der Antwort, s.u. |
ACK | (bei BIND, PING_ONCE und FIND) Quittung, diese ist kodiert wie oben beschrieben. Zusätzlich zur Ebene-0-Empfangsquittung als direkte Antwort auf MSG_CS_RCPLUS kann das Digitalsystem Quittungen höherer Ebenen versenden, die Unterstützung dafür ist in FEATURE_GEN_DRIVE_ACK kodiert. Das regelmäßige Aussenden der TID im per RC_PING festgelegten Intervall wird dabei mit OPCODE = RC_PING_ONCE_P0/P1 gemeldet. |
Wert | Bedeutung | |
---|---|---|
RC_TID | Meldet die angefragte bzw. gesetzte TID. Es folgen 6 Bytes: CID0, CID1, CID2, CID3, CID4, SID | |
RC_PING | Meldet den zeitlichen Abstand des Aussendens der RailcomPlus-Kennung (TID). Es folgt ein Byte INTERVAL (Einheit 100ms, der Wert 0 entspricht "inaktiv") | |
RC_BIND | Zuweisung der Dekoderadresse. Es folgen 6 Byte: ACK, DEC_MUN0,DEC_MUN1,DEC_MUN2,DEC_MUN3, DEC_MID | |
RC_PING_ONCE | P0 | Aussendung der RailcomPlus-Kennung (TID). Es folgt 1 Byte mit der Quittung. |
P1 | ||
RC_FIND | P0 | Suche nach Dekodern. Es folgen 6 Byte: ACK, DEC_MUN0,DEC_MUN1,DEC_MUN2,DEC_MUN3, DEC_MID |
P1 |
1. Accessory | 2. Schaltanwendungen | 3. Makro |
---|---|---|
für Objekte mit einem Zustand, Einsatz 'am Gleis', also für Weichen und Signale. | für Dinge 'neben' dem Gleis, also Beleuchtung, Animation, Sound, Bedienfelder, usw. | für die Zusammenfassung von Schaltbefehlen zu lokalen Abläufen. |
BiDiB unterscheidet bei der Ansteuerung von stationären Modellbahnobjekten zwischen Funktionen der Klasse Accessory und Funktionen der Klasse Schaltanwendungen. Nur erstere werden für den sicheren Zugbetrieb eingesetzt, sie verfügen über die Möglichkeiten der Begriffsvorgabe, Lagerückmeldung und Fehlerbehandlung.
Für sekundäre Effekte und zur Konfiguration der Accessorys gibt es die einfachen Schaltfunktionen und Makros, welche die Ausgänge der Baugruppen direkt kontrollieren können.
Knoten können in der Lage sein, Weichen, Drehscheiben, Signale, Bahnübergänge und vieles mehr abzubilden, im Allgemeinen wird hier von 'Objekten' gesprochen. Knoten mit Ansteuerung solcher für den Fahrweg relevanten Objekte haben das Class-ID-Flag 'Accessory' gesetzt.
Accessory-Objekte haben jeweils einen 'Begriff' (=Aspect), den sie darstellen oder auf den sie schalten können. Typische Weichen haben z. B. 'Gerade' und 'Abzweig', aber im Sinne dieser Norm fallen auch Mehrwegweichen, Drehscheiben und Schiebebühnen unter diese Definition. Bei einer Drehscheibe ist der 'Begriff' dann der jeweilige Abgang. Der Zustand des Objektes wird allein vom Host kontrolliert und kann nicht durch fremde Einflüsse gestört werden kann. Von sich aus kann das Accessory nur in einen Fehlerzustand wechseln.
Wird ein neuer Begriff angewählt, nimmt das Objekt den entsprechenden Zustand ein. Dieser Schaltvorgang kann Zeit in Anspruch nehmen, ein Knoten meldet diese Stellzeit als Befehlsbestätigung und schickt eine weitere Zustandsmeldung nach Ende der Aktion. Tritt ein Problem auf, schickt der Knoten selbsttätig eine Fehlernachricht.
Es besteht die Möglichkeit, dass eine unvorhergesehene Zustandsänderung z. B. durch eine Handverstellung erfolgt. In diesem Fall sendet der Knoten spontan eine MSG_ACCESSORY_NOTIFY-Nachricht. Dieses spontane Senden muss sowohl durch 'SYS_ENABLE' als auch durch eine entsprechende Feature-Einstellung freigegeben sein.
MSG_ACCESSORY_NOTIFY wird auch zur Übermittlung von Zwischenberichten während der Ausführung verwendet. Diese können neben der zu erwartenden Restlaufzeit auch zusätzliche Information wie Drehwinkel enthalten.
Die Konfiguration des zu schaltenden Objektes hängt von dessen Ansteuerung ab, die Umsetzung obliegt dem Hersteller und kann je nach Baugruppe und Anwendungsfall (z. B. Magnetantrieb, Servo, Stepper, Lichtsignal, Formsignal, etc.) verschieden sein. Zur Verfügung stehen allgemein gehaltene Parameter, siehe MSG_ACCESSORY_PARA_SET, sowie die generischen Nachrichten zur Userkonfiguration. Darüberhinaus lassen sich Accessory-Operation auch auf Portbefehle (Schaltfunktionen) abbilden, wodurch sich die umfangreichen Möglichkeiten für die Konfiguration einzelner Ports nutzen lassen, siehe MSG_LC_CONFIGX_SET.
Ein Knoten teilt dem Host nur die Anzahl der Begriffe eines Accessorys mit, nicht um welche Art von Objekt es sich handelt. Diese Zuordnung ist Aufgabe des Steuerungsprogramms, eine Systematisierung würde den Rahmen des Protokolls sprengen und könnte keine Vollständigkeit erlangen.
Allerdings sind bei der Anordnung der Begriffe einige Vorgaben zu beachten. Der Begriff 0 soll immer die Ruhelage abbilden, bei Weichen also üblicherweise das Stammgleis. Bei Signalen muss der Begriff 0 auf die Stellung Halt abgebildet werden. Bei Drehscheiben, Schiebebühnen, Segmentscheiben usw. sind zwei unterschiedliche Geometrien zu beachten:
Beispiel 1: Angenommen, es gibt 12 Abgänge, dann sind die Abgänge 0 und 6, 1 und 7, 2 und 8, usw. jeweils gegenüberliegend.
Beispiel 2: Ein Wenden auf der Drehscheibe kann dadurch erreicht werden, dass man aus dem aktuellen Begriff mittels
new = (current + total / 2) % total
den neuen Begriff errechnet.
Umfangreiche Objekte können auch über mehrere Accessorys angesteuert werden, ihr "mehrdimensionaler" Zustandsraum setzt sich aus den Begriffen der einzelnen Accessorys zusammen. Der Knoten bildet dann jedes Tupel aus der Produktmenge der Accessoryzustände auf seine Ausgänge ab. Alle Kombinationen sind möglich und anwählbar – es gibt keine ungültigen –, manche mögen sich aber dieselbe Bedeutung und Wirkung teilen. Die Zusammenstellung des Objekts aus den Accessorys erfolgt frei in der Hostsoftware.
Die Nachrichten an die verschiedenen Accessorys bleiben weiterhin unabhängig voneinander, ein Schalten eines Accessorys darf keine Seiteneffekte auf die anderen Begriffe haben. Der Einfachkeit halber kann ein Steuerungsprogramm immer die gesamte Begriffskombination senden. Es müssen dabei die Umlaufzeiten und Fehlerzustände aller Accessorys berücksichtigt werden.
Beispiel: Ein Lichthauptsignal mit Geschwindigkeitsanzeiger wird mit zwei Accessorys repräsentiert, eines für den Signalbegriff und eines für die Geschwindigkeitskennziffer. Ein darüberhinaus installierter Geschwindigkeitsvoranzeiger würde über ein drittes Accessory dargestellt. Dies ist einfacher als alle möglichen Kombinationen der Signalbilder in einem Accessoryzustand zu vereinen.
Auch wenn das Zusatzsignal implizit erlischt sobald Hp 0 gezeigt wird, ändert sich beim Schalten des Signalbegriffs nicht der Aspect auf "keine Geschwindigkeit anzeigen", eine Abfrage liefert weiter den eingestellten Wert. Die Begriffskombination "Hp 0"+"Ziffer 3" führt zum selben Signalbild wie "Hp 0"+"keine Ziffer", ohne dass der Host dies gesondert berücksichtigen muss.
Ein Spezialfall der kombinierten Ansteuerung von Objekten ist der Betriebsmodus. Hier wirkt sich der Zustand eines Accessorys auf die Bedeutung eines anderen Accessory-Zustandes aus. Diese Abhängigkeit ist mittels des BIDIB_ACCESSORY_PARA_OPMODE erkennbar. Dabei hat das Accessory für den Betriebsmodus zwei oder mehr Begriffe, die wie folgt definiert sind:
Auch während ihr Zustand keine Auswirkungen auf das Objekt hat, können Accessorys weiter normal betätigt werden. Typischerweise wird das Objekt erst beim Wechsel in den Einsatzmodus die gewählten Begriffe annehmen. Bei einem Wechsel des Betriebsmodus muss daher wie üblich die Umlaufzeit beachtet werden.
Die Eigenschaften des Knotens sind mittels Feature-Abfragen feststellbar. Generell gilt: Feature Werte außerhalb des angegebene Wertebereichs sind reserviert.
Nummer | Name | Bedeutung |
---|---|---|
40 | FEATURE_ACCESSORY_COUNT | Anzahl der Weichen / Signale auf diesem Knoten Hier wird die Anzahl der steuerbaren Objekte abgefragt. Wertebereich: 0…128. |
41 | FEATURE_ACCESSORY_SURVEILLED | Lage-Überwachung 0: Knoten meldet keine Verstellung 1: Knoten meldet bei Verstellung den neuen Zustand mit einer MSG_ACCESSORY_NOTIFY Nachricht. |
42 | FEATURE_ACCESSORY_MACROMAPPED | Abbildung von Begriffen auf Macros 0: Knoten hat keine Abbildungsfunktion 1…n: Knoten bildet Begriffe bei Accessory auf Macros ab. Diese Zahl gibt auch an, wie viele Begriffe maximal auf ein Accessoryobjekt abgebildet werden könnten, d.h. wie viele verschiedene Begriffe max. konfiguriert werden können (nicht müssen). Die Anzahl tatsächlicher Begriffe des jeweiligen Accessory wird bei MSG_ACCESSORY_STATE übermittelt. |
Wenn per Feature eine bestimmte Zahl an Accessorys gemeldet werden, dann müssen diese auch implementiert und ansprechbar sein.
Stellen eines Modellbahnzubehörs, es folgen 2 Bytes: ANUM, ASPECT. Diese beiden Bytes definieren das steuerbare Objekt und den darzustellenden Begriff.
Parameter | Beschreibung |
---|---|
ANUM | bezeichnet das Objekt innerhalb des Knotens, Wertebereich 0…127 |
ASPECT | Dieses Byte beschreibt den Zustand des Objekts, 0 soll dabei den Ruhezustand darstellen. 254 versetzt das Modell in einen sicheren Zustand ("Nothalt"). Wertebereich 0…127, 254 |
Der Knoten antwortet mit einer MSG_ACCESSORY_STATE. Sollte die Aktion länger als 100ms dauern, so wird sofort mit einer MSG_ACCESSORY_STATE geantwortet und dabei die prognostizierte Stellzeit übermittelt. Am Ende des Stellvorgangs erfolgt automatisch eine weitere MSG_ACCESSORY_STATE als Zeichen, dass der Stellvorgang abgeschlossen ist.
Wenn mit ANUM ein Objekt angesprochen wird, welches am Knoten nicht existiert, dann antwortet der Knoten mit einer MSG_ACCESSORY_STATE, Objektnummer 255, Aspect 255, Fehlercode 0x01. Die Zahl der möglichen Objekte kann mit einer Feature-Anfrage erfragt werden.
Wenn mit ASPECT ein Begriff außerhalb des Bereiches dieses Objekts angesprochen wird, dann antwortet der Knoten mit einer MSG_ACCESSORY_STATE, Aspect = 255, Fehlercode 0x01.
Mit diesem Befehl wird der Zustand des Objektes abgefragt. Es folgt ein Byte: ANUM.
Der Knoten antwortet mit MSG_ACCESSORY_STATE.
Mit diesem Befehl wird der Zustand aller Accessory-Objekte des Knoten abgefragt. Es folgen keine Parameter.
Der Knoten antwortet mit einer MSG_ACCESSORY_STATE pro Objekt. Die Zahl der zu erwartenden Antworten entspricht dem FEATURE_ACCESSORY_COUNT.
Der Knoten ist bei den Antwortnachrichten selbst für die Datenflusskontrolle verantwortlich und bleibt auch während einer laufenden ACCESSORY_GETALL-Übertragung voll abfragbar.
Der Befehl ist ab ausgewiesener Protokollversion 0.8 verfügbar.
(optional)
Mit diesem Befehl werden die Konfigurations-Parameter eines Accessory-Objektes eingestellt.
Es folgen zwei oder mehr Bytes:
Parameter | Beschreibung |
---|---|
ANUM | bezeichnet das Objekt innerhalb des Knotens, Wertebereich 0…127 |
PARA_NUM | Nummer des einzustellenden Parameters |
DATA[0…] | zu setzende Werte, abhängig vom Parameter |
Der Knoten antwortet mit MSG_ACCESSORY_PARA. Sollte der PARA_NUM am Objekt unbekannt sein, antwortet der Knoten mit einer PARA_NUM = BIDIB_ACCESSORY_PARA_NOTEXIST (=255) und dem unkannten Parameter.
Wert | Name | Bedeutung | ||||||
---|---|---|---|---|---|---|---|---|
1-248 | – | Reserviert. | ||||||
249 | BIDIB_ACCESSORY_PARA_USES_STRINGS | Das Accessory ist für die Auswahl eines Strings zur Textanzeige auf einem Display zuständig,
die Begriffe 0 bis TOTAL-1 entsprechen den Strings aus Namensraum 2 (Index 0 bis TOTAL-1).
Es folgt ein weiteres Byte mit dem Wert 1.
Der String-Namensraum 2 hat mindestens die Länge von TOTAL. Dieser Parameter ermöglicht es, für die betroffenen Accessorys ein entsprechendes Begriffsauswahlfeld anzubieten. Er ist typischerweise nicht schreibbar. | ||||||
250 | BIDIB_ACCESSORY_PARA_HAS_ESTOP | Das Accessory unterstützt den Nothalt-Begriff. Es folgt ein weiteres Byte mit dem Wert 1. Ist der Parameter nicht vorhanden oder folgt ein anderer Wert, hat das Accessory keinen Nothalt implementiert und wird nur mit einer Fehlermeldung auf Nutzungsversuche reagieren. Der Parameter ist typischerweise nicht schreibbar. | ||||||
251 | BIDIB_ACCESSORY_PARA_OPMODE | Das Accessory ist Teil eines zusammengesetzen Objektes mit einem Betriebsmodus. Es folgt ein weiteres Byte ANUM mit der Nummer des Accessoryobjektes, das den Betriebsmodus repräsentiert, Wertebereich 0…127. Der Parameter ist typischerweise nicht schreibbar. Der Wertebereich enthält keine Möglichkeit zur Trennung der Abhängigkeit, wo keine Abhängigkeit wirkt ist der gesamte Parameter nicht vorhanden. | ||||||
252 | BIDIB_ACCESSORY_PARA_STARTUP | Verhalten des Accessorys während des Knoten(neu)starts. Es folgt 1 weiteres Byte mit folgender Bedeutung:
Falls eine Überwachung (Lagerückmeldung) vorhanden ist, kann bei Übereinstimmung mit dem Zielzustand (bei 0…127, 254) der Schaltvorgang entfallen. Ein Knoten darf (und sollte) anfallende Schaltvorgänge zeitlich strecken bzw. dynamisch verzögern, um Überlastungen beim Einschalten zu verhindern. Beantwortet er in dieser Zeit schon MSG_ACCESSORY_GET-Nachrichten, muss er jedoch eine Restzeit bis zum Einlaufen des Zustandes melden. | ||||||
253 | BIDIB_ACCESSORY_PARA_MACROMAP | Zuordnung von Begriffen zu Makros. Jedem Begriff des Accessoryobjekts wird ein Makro zugeordnet. Es folgen weitere Daten, welche die Zuordnung definieren.
(siehe auch FEATURE_ACCESSORY_MACROMAPPED) | ||||||
254 | BIDIB_ACCESSORY_SWITCH_TIME | Definition der Schaltzeit analog zur Spezifikation von railcom.
| ||||||
255 | BIDIB_ACCESSORY_PARA_NOTEXIST | (nur im Uplink) Der angefragte PARA_NUM ist am Knoten unbekannt oder existiert für dieses Accessory nicht. Ab Protokollversion 0.7 folgt ein Byte mit der Nummer des angefragten Parameters. |
(optional)
Mit diesem Befehl werden die Konfigurations-Parameter eines Accessory-Objektes abgefragt. Es folgen zwei Bytes: ANUM, PARA_NUM Der Knoten antwortet mit MSG_ACCESSORY_PARA.
Dieser Befehl teilt dem Host den Zustand des Accessory-Objektes mit. Diese Antwort wird gesendet nach einer Abfrage (MSG_ACCESSORY_GET), nach einem Stellbefehl (MSG_ACCESSORY_SET) oder spontan bei Erreichen des Zielzustandes.
Es folgen 5 oder mehr Bytes:
Parameter | Beschreibung | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
ANUM | bezeichnet das Objekt innerhalb des Knotens, Wertebereich 0…127. Bei ANUM=255 existiert das angefragte Objekt nicht. | ||||||||||||||||||||||||||||||||||||
ASPECT | Dieses Byte beschreibt den aktuellen (bzw. während eines Wechsels: den geplanten)
Zustand des Objekts, Wertebereich 0…127.
Bei ASPECT=254 befindet sich das Objekt im Nothalt, sämtliche Bewegungen sind angehalten um Schäden an Modellen zu vermeiden.
Bei ASPECT=255 ist der Zustand unbekannt. Dies entspricht normalerweise dem gesetzten Zustand, solange kein Fehler vorliegt. | ||||||||||||||||||||||||||||||||||||
TOTAL | Dieses Byte gibt an, wie viele mögliche Zustände (=ASPECT) das Objekt hat. Begriffe werden immer bei 0 beginnend (ohne Lücke) angesprochen. Wertebereich 0…128.
Beispiele:
Unterstützt ein Objekt den Nothalt-Zustand, muss dies im Parameter HAS_ESTOP angegeben werden. Anmerkung: wenn ein Accessory den Wert TOTAL mit 0 zurückliefert, dann sind da keine Begriffe vorhanden und es kann nichts geschaltet werden. Das kann z. B. bei Macro-basierten Accessory der Fall sein, wenn keine Macros zu Begriffen hinterlegt sind. | ||||||||||||||||||||||||||||||||||||
EXECUTE | Dieses Byte gibt an, wie der aktuelle Stand der Ausführung ist, also ob die Aktion schon beendet ist,
ob sie überwacht wird und ob evtl. ein Fehler aufgetreten ist: Bitfeld:
| ||||||||||||||||||||||||||||||||||||
WAIT | normale Operation: Wenn der Zielzustand eingelaufen ist, wird hier 0 gemeldet. Wenn der Zielzustand noch nicht eingelaufen ist, wird hier die angenommene Restzeit wird gemäß Railcom-Spec angegeben:
Es wird die Fehlerursache übermittelt:
| ||||||||||||||||||||||||||||||||||||
DETAILS[0…40] | Optionale ergänzende Details zum aktuellen Stand der Accessory-Operation.
Sie dienen der präziseren Verfolgung und Darstellung eines Accessories, sind aber nicht betrieblich relevant.
Der Knoten entscheidet, welche Informationen er wann anfügt, sie lassen sich nicht gezielt abfragen. Übertragen werden sie als Liste aus bis zu 8 Schlüssel-Wert-Paaren, bestehend jeweils aus Parametertyp und -wert. DETAILS_LIST ::= ε | DETAIL_PAIR DETAILS_LIST DETAIL_PAIR ::= D_ENUM1 D_VALUE | D_ENUM2 D_VALUE[2] D_ENUM1 = 0x00 | … | 0x3F D_ENUM2 = 0x40 | … | 0x7F |
Name | Code | Werttyp | Bedeutung |
---|---|---|---|
BIDIB_ACC_DETAIL_CURR_ANGLE1DEG5 | 0x01 | uint8 | Aktueller Positionswinkel (etwa einer Drehscheibe) in Einheiten von 1,5 Grad, Wertebereich 0…239. Objekte mit einem einstellbaren Min/Max-Bereich (z.B. Schiebebühnen) melden die (Zwischen-)Position ebenfalls auf den Bereich 0…239 skaliert. |
BIDIB_ACC_DETAIL_TARGET_ANGLE1DEG5 | 0x02 | uint8 | Angezielter Positionswinkel am Ende der Bewegung, in Einheiten von 1,5 Grad, Wertebereich 0…239 |
BIDIB_ACC_DETAIL_TIMESTAMP | 0x40 | uint16 | Systemzeitstempel vom Moment der Lageerfassung |
Die spontane Meldung bei Abschluss des Stellvorgangs sendet der Knoten nur ab, wenn SYS_ENABLE gesetzt ist. Sie wird auch nicht vom Host quittiert. Der Zustand kann aber jederzeit (auch während des Stellvorgangs) per MSG_ACCESSORY_GET abgefragt werden, ein regelmäßiges Einlesen ist denkbar.
Spontane Ereignisse außerhalb eines Stellvorgangs und Begriffswechsel werden mit MSG_ACCESSORY_NOTIFY gemeldet.
Dieser Befehl meldet dem Host den Zustand eines Accessory-Objektes. Die Nachricht wird bei einem spontanen Ereignis (z. B. Detailzustandsänderung, Handverstellung, Fehler) gesendet. Voraussetzung ist, dass sowohl SYS_ENABLE gesetzt ist und das Feature FEATURE_ACCESSORY_SURVEILLED auf 1 steht.
Es folgen 5 oder mehr Bytes, diese sind identisch zu MSG_ACCESSORY_STATE kodiert.
Ist das Bit 6 im Feld WAIT gesetzt (d.h. es liegen noch weitere Fehler vor), dann sind diese Fehler mit einer weiteren (oder mehreren) MSG_ACCESSORY_GET Nachricht abzuholen bis Fehlercode 0x00 erreicht ist.
(optional)
Diese Nachricht wird als Antwort auf eine Abfrage oder Setzen von Konfigurations-Parametern gesendet.
Es folgen zwei oder mehr Bytes: ANUM, PARA_NUM [Daten], diese sind wie beim Befehl MSG_ACCESSORY_PARA_SET kodiert.
Knoten mit Schaltfunktionen können z. B. Lichtsteuerungen, Animationen (mit Bewegung) o.ä. sein. Auch Bedienpulte sind möglich, Knoten dürfen auch Tastereingaben haben. Knoten mit Schaltfunktion haben das Class-ID-Flag 'Schalten' gesetzt.
Knoten mit Schaltfunktionen haben einen oder mehrere Ein- und Ausgänge. Diese werden als 'Ports' angesprochen, jeder Port lässt sich individuell konfigurieren, abfragen und schalten.
Schaltfunktionen unterscheiden sich erheblich, je nach Art des Ausgangs: Hier gibt es reine Schaltausgänge, Lichtausgänge mit Dimm- oder Blinkfunktionen, Servos (mit Positionierung), Sounds, Analogspannungen usw. Für Ausgänge gibt es daher einen 'Ausführbefehl', mit dem eine Veränderung des Ausgangs angesteuert wird und einen Konfigurationsbefehl, mit welchem die Eigenschaften festgelegt werden.
Knoten können auch über die Fähigkeit verfügen, Ports in ihrer Funktion zu verändern. So kann beispielsweise ein Ausgang zu einem Eingang umkonfiguriert werden. Dies soll während der Konfigurationsphase des Knotens, nicht im operativen Einsatz geschehen. Die Umkonfiguration des Typs soll keine Auswirkungen auf die restlichen Konfigurationsparameter des Ports haben.
Ein Knoten kann überdies Makros unterstützen, diese optionale Fähigkeit bringt weitere Befehle und Konfigurationsmöglichkeiten mit:
Für das Ansprechen von Ports gibt es ab Protokollversion 0.6 zwei verschiedene Adressierungsmodelle. Beide verwenden 2 Bytes, unterscheiden sich jedoch in der Anordnung der verfügbaren Ports im Adressraum.
Typorientiertes Portmodell | Flaches Portmodell | |||
---|---|---|---|---|
Definition | Jeder Ausgang und Eingang (Port) ist fest einem Porttyp zugeordnet. Jeder Porttyp hat einen eigenen Nummernbereich, welcher jeweils für sich von 0 an beginnend gezählt wird. Die Funktion (z. B. Servoausgang, Schaltausgang) ist damit direkt in der Adresse kodiert. | Alle Ausgänge und Eingänge (Ports) benutzen einen gemeinsamen Nummernbereich,
die Adressen werden linear für alle Ports vergeben.
Der Porttyp (Funktion) ist einzig über die Konfiguration des jeweiligen Ports bestimmt.
Im flachen Portmodell besteht damit die Möglichkeit, dass sich der Typ eines Ports durch eine Konfigurationsnachricht verändern lässt. Für Operationen, die auf mehreren Aus- und Eingänge wirken, gibt es Porttypen die mehrere nebeneinanderliegende Adressen belegen. Solche Ports werden unter der ersten Adresse angesprochen, die weiteren Adressen sind deaktiviert und werfen bei Verwendung den Fehler PORT_INACTIVE. Die Anzahl der belegten Adressen wird Breite des Typs genannt. |
||
Aktivierung | Das typorientierte Portmodell ist an einem Knoten aktiv, wenn
FEATURE_CTRL_PORT_FLAT_MODEL und FEATURE_CTRL_PORT_FLAT_MODEL_EXTENDED nicht vorhanden sind oder den Wert 0 haben. Die Anzahl der verfügbaren Ports wird vom Knoten je Typ über FEATURE_CTRL_*_COUNT bekanntgegeben. |
Das flache Portmodell ist an einem Knoten aktiv, wenn
FEATURE_CTRL_PORT_FLAT_MODEL und/oder FEATURE_CTRL_PORT_FLAT_MODEL_EXTENDED einen Wert > 0 hat.
In diesem Fall geben diese Features auch gleich die Gesamtzahl aller Ports an, sie berechnet sich als
die Summe PORT_FLAT_MODEL_EXTENDED*256+PORT_FLAT_MODEL. Die FEATURE_CTRL_*_COUNT geben, falls vorhanden, die maximal mögliche Anzahl der auf den jeweiligen Typ konfigurierbaren Ports an. Dieses Modell ist ab Protokollversion 0.6 verfügbar. |
||
PORT0 | PTYPE | Ausgangstyp. | PORTADDRESS | Ausgangsnummer pro Knoten; diese wird ab 0 gezählt. Sie wird als 16-bit little-endian Integer kodiert, dessen 4 MSB reserviert und mit 0 zu belegen sind. Wertebereich 0…4095 |
PORT1 | PORTNUM | Ausgangsnummer pro Typ; diese wird ab 0 gezählt. Wertebereich 0…127, Bit 7 ist reserviert (0). |
Wert | Name | Bedeutung | Breite | Operationen | Konfigurationsmöglichkeiten |
---|---|---|---|---|---|
0 | SWITCH | Schaltausgang (früher: SPORT) | 1 | aus/ein | Pulsdauer, Lasttyp |
1 | LIGHT | Lichtausgang (früher: LPORT) | 1 | aus/ein/blinken/dimmen | Helligkeit, Dimmgeschwindigkeit |
2 | SERVO | Servoausgang | 1 | positionieren | Endpositionen, Umlaufgeschwindigkeit |
3 | SOUND | Tonausgang | 1 | play/stop | Lautstärke, Tonquelle |
4 | MOTOR | Motorausgang | 1 | Drehen/Geschwindigkeit | Regelung |
5 | ANALOGOUT | allgemeine Ansteuerung | 1 | Spannung | Maximalwerte |
6 | BACKLIGHT | Lichtausgang | 1 | Helligkeit direkt | Dimmgeschwindigkeit, Kanal-Mapping |
7 | SWITCHPAIR | 2 Schaltausgänge mit exklusiver Ansteuerung | 2 | erster/zweiter | Pulsdauer, Lasttyp |
8…14 | reserviert | ||||
15 | INPUT | Kontakteingang, z. B. Taster oder Endschalter | 1 | offen/geschlossen | keine |
16…254 | reserviert | ||||
255 | reserviert | (interner Gebrauch in Knoten oder PC-Programmen) |
Im typorientierten Portmodell finden nur Porttypen mit Breite 1 Verwendung. Andere Breiten kommen nur im flachen Portmodell zur Anwendung, wo je nach Typkonfiguration verschieden viele Ports zur Verfügung stehen können. Im typorientierten Modell können zwei Ausgänge mit exklusiver Ansteuerung auch als ein SWITCH-Port abgebildet werden.
Die Eigenschaften der Knoten (wie z. B. die Anzahl der jeweiligen Ausgangsarten) sind mittels Feature-Abfragen feststellbar:
Nummer | Name | Bedeutung |
---|---|---|
50 | FEATURE_CTRL_INPUT_COUNT | Anzahl der Eingänge (z. B. für Taster) Wertebereich: 0…128. |
51 | FEATURE_CTRL_INPUT_NOTIFY | Spontan-Meldung von Taster-Eingängen erlaubt.
Der Knoten liefert Änderungen des Tasterzustand von selbst an den Host. Wertebereich: 0…1. |
52 | FEATURE_CTRL_SWITCH_COUNT | Anzahl der Standard-Ausgänge Hier wird die Anzahl der Schaltausgänge abgefragt. Wertebereich: 0…128. |
53 | FEATURE_CTRL_LIGHT_COUNT | Anzahl der Licht-Ausgänge Lichtausgänge haben erweiterte Eigenschaften, wie z. B. Blinken, Dimmen, usw. Hier wird die Anzahl der Lichtausgänge abgefragt. Wertebereich: 0…128. |
54 | FEATURE_CTRL_SERVO_COUNT | Anzahl der Servoausgänge Hier wird die Anzahl der Servoausgänge abgefragt. Wertebereich: 0…128. |
55 | FEATURE_CTRL_SOUND_COUNT | Anzahl der abspielbaren Sounds Hier wird die Anzahl der Sounds abgefragt. Wertebereich: 0…128. |
56 | FEATURE_CTRL_MOTOR_COUNT | Anzahl der Motorausgänge Gemeint sind hier Motorausgänge für Zubehörartikel (z. B. Karusselldrehzahl) Wertebereich: 0…128. |
57 | FEATURE_CTRL_ANALOGOUT_COUNT | Anzahl der Analogausgänge Hier wird die Anzahl der Analogausgänge abgefragt. Wertebereich: 0…128. |
58 | FEATURE_CTRL_STRETCH_DIMM | Verlangsamung von Helligkeitsübergängen bei Lichtausgängen. Helligkeitsübergänge werden zusätzlich um diesen Faktor verlangsamt. Wertebereich 1…250. |
59 | FEATURE_CTRL_BACKLIGHT_COUNT | Anzahl der Lichtausgänge (dimmbar, für Raumlicht) Gemeint sind hier Lichtausgänge, deren Helligkeit dann im Stellbefehl einstellt wird. Wertebereich: 0…128. |
70 | FEATURE_CTRL_PORT_FLAT_MODEL | Unterstützung des flachen Portmodells, unteres Byte der Anzahl der darin
ansprechbaren Ports. Zahl der insgesamt am Knoten vorhandenen Ein- und Ausgänge. Wertebereich: 0…255. |
71 | FEATURE_CTRL_PORT_FLAT_MODEL_EXTENDED | Unterstützung des flachen Portmodells, oberes Byte der Anzahl der darin
ansprechbaren Ports. Zahl der insgesamt am Knoten vorhandenen Ein- und Ausgänge. Wertebereich: 0…16. |
66 | FEATURE_CTRL_PORT_QUERY_AVAILABLE | Abfragen von Portzuständen möglich 0 = Ausgangszustände sind nicht abfragbar. (default) 1 = Ausgangszustände sind abfragbar, es erfolgt eine Antwort auf MSG_LC_PORT_QUERY(_ALL). |
67 | FEATURE_SWITCH_CONFIG_AVAILABLE | (veraltet, ab Protokollversion 0.6 ist MSG_LC_CONFIGX zur Portkonfiguration zu verwenden) Konfiguration von Ports möglich 0 = Schaltport sind nur einfach schaltbar. (default) Bit 1 = Schaltports bieten eine erweiterte Konfiguration und können zu INPUTs werden. |
Direkte Ausgangsoperation, es folgen 3 Bytes: PORT0, PORT1, PORTSTAT. Diese drei Bytes definieren den Ausgang und die Operation, welche auf diesem erfolgt.
Parameter | Beschreibung | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
PORT[2] | Diese Bytes adressieren den Port | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
PORTSTAT | Dieses Byte beschreibt den Zustand des Ports, die Bedeutung ist abhängig vom Typ des angesprochenen Ausgangs.
|
Auf eine Schaltanforderung antwortet ein Knoten mit MSG_LC_STAT. Sollte ein Port außerhalb der vorhandenen Ports angesteuert werden, oder ein Schaltzustand angesteuert werden, der nicht unterstützt wird, so antwortet der Knoten mit MSG_LC_NA. Sollte ein Knoten einen bestimmten Zustandsübergang nicht beherrschen, so soll er den nächstmöglichen Übergang durchführen: also z. B. Neon-Einschaltflackern sei nicht vorhanden, es wird normal eingeschaltet.
(bis einschließlich Protokollversion 0.6 unter dem Namen MSG_LC_OUTPUT_QUERY, nur für Ausgänge)
Abfrage des Status eines Ausgangs oder Eingangs, es folgen 2 Bytes zur Adressierung des Ports. Auf eine Abfrage antwortet ein Knoten mit MSG_LC_STAT oder fallweise MSG_LC_NA.
(veraltet, ab ausgewiesener Protokollversion 0.7 ist der Befehl MSG_LC_PORT_QUERY zu verwenden)
Mit dieser Nachricht kann der Zustand eines lokalen Tasters eines Knotens abgefragt werden. Ob der Knoten Taster hat (und wie viele) ist durch eine Feature-Abfrage zu klären. Es folgt ein Byte: PORT.
Parameter | Beschreibung |
---|---|
PORT | Nummer des Tasteneingangs. Entspricht PORT0 im flachen Portmodell und PORTNUM im typorientierten (bei PTYPE=15). |
Der Knoten antwortet mit einer MSG_LC_KEY Nachricht, welche den Zustand des Tasters enthält, oder fallweise mit MSG_LC_NA.
Abfrage des Status aller oder mehrerer Ports. Es folgen 0, 2 oder 6 Bytes. Sofern Parameter folgen, geben diese die abzufragenden Typen sowie den Bereich an.
Parameter | Beschreibung |
---|---|
SELECT[2] | Diese Bytes bilden eine 16 Bit lange Bitmap, mit der sich die abzufragenden Ports nach Typ filtern lassen. Bit 0 von SELECT0 entspricht SWITCH, Bit 1 LIGHT usw. Ist das entsprechende Bit nicht gesetzt, so wird der Port übersprungen. |
START[2] | Diese Bytes adressieren den ersten zu übertragenden Port. |
END[2] | Diese Bytes adressieren den ersten nicht mehr zu übertragenden Port. |
Sind die Parameter nicht vorhanden, so wird für SELECT der Wert 0xFFFF, für START der Wert 0 und für END der Wert 0xFFFF angenommen. Es muss START <= END gelten.
Der Knoten antwortet mit mehreren MSG_LC_STAT Nachrichten, für jeden am Knoten vorhandenen Port welcher im von START und END angegebenen Bereich liegt und für welchen das seinem Typ entsprechende Bit in SELECT gesetzt ist. Die Reihenfolge der Ports ist dabei zu befolgen, die Antworten sind aufsteigend nach Portnummer zu senden.
Am Ende der Übertragung sendet der Knoten MSG_LC_NA mit der Portadresse 0xFFFF.
SELECT &= 0xFF00
).Konfiguration eines Ports. Es folgen n Parameter:
Parameter | Beschreibung |
---|---|
PORT[2] | Diese Bytes adressieren den Port |
DATA[2…41] | Liste aus 1 bis 8 Schlüssel-Wert-Paaren, bestehend jeweils aus Parametertyp und -wert.
P_LIST ::= P_PAIR | P_PAIR P_LIST P_PAIR ::= P_ENUM P_VALUE |
Der Knoten speichert diese Parameter ab und antwortet mit einer Nachricht MSG_LC_CONFIGX, dabei werden die neu eingestellten Werte übermittelt sowie etwaige Parameter-Fehler mittels BIDIB_PCFG_NONE gemeldet. Existiert der angesprochene Port am Knoten nicht, wird stattdessen mit MSG_LC_NA geantwortet.
Name | Code | Werttyp | Bedeutung |
---|---|---|---|
BIDIB_PCFG_NONE | 0x00 | uint8 | 0: keine Parameter für diesen Port verfügbar 1…n: Fehlerhafter Parameter (unbekannter oder an diesem Port nicht unterstützter Typ, ungültiger Wert). Das Byte gibt dabei den Code des Parameters an. Bei ungültigen Werten wird der alte Wert beibehalten und mitgesendet. |
BIDIB_PCFG_LEVEL_PORT_ON | 0x01 | uint8 | Analogwert der Helligkeit für den Zustand EIN, Wertebereich 0…255; (1) |
BIDIB_PCFG_LEVEL_PORT_OFF | 0x02 | uint8 | Analogwert der Helligkeit für den Zustand AUS, Wertebereich 0…255 (1) |
BIDIB_PCFG_DIMM_UP | 0x03 | uint8 | Dimmgeschwindigkeit in Richtung EIN, als Schrittweite pro 10ms (2), Wertebereich 1…255 |
BIDIB_PCFG_DIMM_DOWN | 0x04 | uint8 | Dimmgeschwindigkeit in Richtung AUS, als Schrittweite pro 10ms (2), Wertebereich 1…255 |
BIDIB_PCFG_OUTPUT_MAP | 0x06 | uint8 | Zuordnung zu Ausgabekanal (wie bei DMX) (3) |
BIDIB_PCFG_SERVO_ADJ_L | 0x07 | uint8 | Unterer Justierwert für Servos (4) |
BIDIB_PCFG_SERVO_ADJ_H | 0x08 | uint8 | Obererer Justierwert für Servos (4) |
BIDIB_PCFG_SERVO_SPEED | 0x09 | uint8 | Servo Speed (Umlaufzeit) |
BIDIB_PCFG_SERVO_EXTRA | 0x0a | uint8 | Besondere Einstellungen für Servos, Bitfeld Bit 0: Spannung abschalten. Wenn dieses Bit gesetzt ist, wird die Servospannung nach Bewegung abgeschaltet. Das spart Strom und reduziert mögliche kleine Bewegungen in der Ziellage. |
BIDIB_PCFG_TICKS | 0x0b | uint8 | Einschaltzeit eines Ausgangs, in Einheiten von 10ms. Nach der angegebenen Zeit schaltet der Ausgang selbsttätig ab, um eine Überlastung zu verhindern. Durch wiederholte Schaltbefehle lässt sich das Ausschalten hinauszögern. Der Wert 0 steht für einen Dauerausgang. |
BIDIB_PCFG_SWITCH_CTRL | 0x0d | uint8 | Elektrisches Verhalten eines SWITCH-Ports.
Im oberen Nibble ist das Verhalten für den ON-Zustand kodiert, im unteren das für den OFF-Zustand.
Jedes der beiden Nibble verfügt über folgenden Wertebereich: 0: LOW (gegen GND geschaltet) 1: HIGH (gegen VCC geschaltet) 2: Z (hochohmig) 3: WEAK_LOW (mit Widerstand auf GND gezogen, nicht belastbar) 4: WEAK_HIGH (mit Widerstand auf VCC gezogen, nicht belastbar) Werden WEAK_LOW oder WEAK_HIGH nicht unterstützt, so sind sie vom Knoten wie Z zu behandeln. |
BIDIB_PCFG_INPUT_CTRL | 0x0e | uint8 | Elektrisches Verhalten eines INPUT-Ports. Wertebereich: 0: ACTIVE_LOW (der Eingang ist aktiv wenn er mit GND verbunden wird) 1: ACTIVE_HIGH (der Eingang ist aktiv wenn er an VCC gelegt wird) 2: ACTIVE_LOW + PULLUP (der Eingang wird mittels hohem Widerstand auf VCC gezogen, für definierten Ruhezustand) 3: ACTIVE_HIGH + PULLDOWN (der Eingang wird mittels hohem Widerstand auf GND gezogen, für definierten Ruhezustand) Wird PULLUP bzw. PULLDOWN nicht unterstützt, so hat der Knoten nur das LSB zu respektieren. |
BIDIB_PCFG_LOAD_TYPE | 0x0f | uint8 | Lasttyp eines OUTPUT-Ports. Wertebereich: 0: allgemein (nur Schalten, alle Fehlerbilder ignorieren) 1: ohmsche Last 2: Magnetspule ohne Endabschaltung 3: Magnetspule mit Endabschaltung Wird für keine Last eine Lageüberwachung unterstützt, entfällt der Parameter. |
BIDIB_PCFG_MOVE_TYPE | 0x10 | uint8 | Servobewegungsmuster, Umlaufkurve (5) Der Wert besteht aus 2 Nibble zu je 4 Bit. Jedes Nibble wählt eine Bewegungsart aus, wobei das niederwertige Nibble (4 LSBs) für Bewegungen gilt, bei denen der Zielwert größer als der Startwert ist. Das höherwertige Nibble (4 MSBs) gilt für Bewegungen, bei denen der Zielwert kleiner als der Startwert ist. Wertebereich: 0=Lineare Bewegung 1=Weiches Anlaufen, weiches Auslaufen (Smooth start, smooth end) 2=Weiches Anlaufen, Auslaufen mit Nachwippen. 3=Weiches Anlaufen, Auslaufen mit Rückprellen. 4-15=reserved 14=Reserviert für vollständig benutzerdefinierte Kurve 1 15=Reserviert für vollständig benutzerdefinierte Kurve 2 Wenn der Knoten einen BIDIB_PCFG_MOVE_TYPE nicht unterstützt, wird der Defaultwert 0=Lineare Bewegung gesetzt. |
BIDIB_PCFG_DIMM_UP_8_8 | 0x43 | uint16 | Dimmgeschwindigkeit in Richtung EIN, Schrittweite pro 10ms (2), Wertebereich 1…65535 (6) |
BIDIB_PCFG_DIMM_DOWN_8_8 | 0x44 | uint16 | Dimmgeschwindigkeit in Richtung AUS, Schrittweite pro 10ms (2), Wertebereich 1…65535 (6) |
BIDIB_PCFG_TRANSITION_TIME | 0x46 | uint16 | Zeit für den sanften Wechsel zwischen Portzuständen, etwa Überblenden von Farben oder Dimmen der Helligkeit. Einheit 10ms, Wertebereich 0…65535 |
BIDIB_PCFG_RGB | 0x80 | uint24 | RGB-Wert zur Farbwahl eines Lichtausgangs: erstes Byte Rot, zweites Grün, drittes Blau |
BIDIB_PCFG_RECONFIG | 0x81 | uint24 | Port Reconfiguration (7) |
BIDIB_PCFG_CONTINUE | 0xFF | none | Eine zusätzliche Nachricht mit weiteren Wertepaaren folgt |
Abfrage der Konfiguration eines Ports. Es folgen 2 Parameter:
Parameter | Beschreibung |
---|---|
PORT[2] | Diese Bytes adressieren den Port |
Die Nachricht MSG_LC_CONFIGX_GET wird mit einer Nachricht MSG_LC_CONFIGX beantwortet, dabei werden alle eingestellten Werte übermittelt. Existiert der angesprochene Port am Knoten nicht, wird stattdessen mit MSG_LC_NA geantwortet.
Abfrage der Konfigurationen aller oder mehrerer Ports. Es folgen 0 oder 4 Bytes. Sofern Parameter folgen, definieren diese den Bereich.
Parameter | Beschreibung |
---|---|
START[2] | Diese Bytes adressieren den ersten zu übertragenden Port. |
END[2] | Diese Bytes adressieren den ersten nicht mehr zu übertragenden Port. |
Sind die Parameter nicht vorhanden, so wird für START der Wert 0 und für END der Wert 0xFFFF angenommen. Es muss START <= END gelten.
Der Knoten antwortet mit mehreren MSG_LC_CONFIGX Nachrichten, für jeden am Knoten vorhandenen Port welcher im von START und END angegebenen Bereich liegt. Die Reihenfolge der Ports ist dabei zu befolgen, die Antworten sind aufsteigend nach Portnummer zu ordnen.
(veraltet, ab ausgewiesener Protokollversion 0.6 ist der Befehl MSG_LC_CONFIGX_SET zu verwenden)
Konfiguration eines Ports hinsichtlich seiner Parameter. Es folgen 6 Bytes:
Parameter | Beschreibung |
---|---|
PORT[2] | Diese Bytes adressieren den Port im typorientierten Portmodell |
DATA[4] | Konfigurationswerte |
Die Konfigurationswerte sind immer als uint8 (im Bereich 0…255) angegeben. Ihre Bedeutung ist abhängig vom Ausgangstyp und entspricht jeweils einem CONFIGX-Wertepaar:
Typ (PORT0) | DATA0 | DATA1 | DATA2 | DATA3 |
---|---|---|---|---|
Schaltausgang 0 (=BIDIB_PORTTYPE_SWITCH) |
Hier ist im Normalfall keine Konfiguration vorgesehen. Für Sonderanwendungen (z. B. Kontrolle weiterer Baugruppen) gibt es die Möglichkeit der Konfiguration. Ob der Knoten diese Konfiguration anbietet, ist dem Feature FEATURE_SWITCH_CONFIG_AVAILABLE zu entnehmen. Fehlt dieses Feature, gibt es keine Konfiguration und Schaltports können nur geschaltet werden. | |||
IO-Setup (1) | BIDIB_PCFG_TICKS | reserviert | reserviert | |
Lichtausgang 1 (=BIDIB_PORTTYPE_LIGHT) |
Bei Lichtausgängen ist die min. und und max. Helligkeit, Geschwindigkeit des Dimmens konfigurierbar. Mittels des Features FEATURE_CTRL_STRETCH_DIMM (sofern vorhanden) kann der Übergang bis zum Faktor 250 zusätzlich verlangsamt werden, damit dauert ein Helligkeitsübergang bis zu 10min und ist damit für die Tag-Nacht-Simulation einer Anlage geeignet. |
|||
BIDIB_PCFG_LEVEL_PORT_OFF | BIDIB_PCFG_LEVEL_PORT_ON | BIDIB_PCFG_DIMM_DOWN | BIDIB_PCFG_DIMM_UP | |
Servoausgang 2 (=BIDIB_PORTTYPE_SERVO) |
Bei Servoausgängen lässt sich der untere und obere Anschlag justieren sowie die Umlaufgeschwindigkeit festlegen. | |||
BIDIB_PCFG_SERVO_ADJ_L | BIDIB_PCFG_SERVO_ADJ_H | BIDIB_PCFG_SERVO_SPEED | reserviert | |
Lichtausgang 6 (=BIDIB_OUTTYPE_BACKLIGHT) |
Bei Lichtausgängen mit direkt steuerbarer Helligkeit ist eine eventuelle Abbildung auf die echte Hardware und Geschwindigkeit des Dimmens konfigurierbar. | |||
BIDIB_PCFG_DIMM_DOWN | BIDIB_PCFG_DIMM_UP | BIDIB_PCFG_OUTPUT_MAP | reserviert | |
3, 4, 5, … | Genauere Definition für Sound, Motor- und Analogspannungsausgänge folgt. |
Reservierte Werte sind mit 0 zu belegen.
Der Knoten speichert diese Parameter ab und antwortet mit einer MSG_LC_CONFIG Nachricht. Sollte ein Port außerhalb der vorhandenen Ports angesteuert werden, so antwortet der Knoten mit MSG_LC_NA.
(veraltet) Abfrage eines Ports hinsichtlich seiner Parameter. Es folgen 2 Parameter:
Parameter | Beschreibung |
---|---|
PORT[2] | Diese Bytes adressieren den Port |
Sollte ein Port außerhalb der vorhandenen Ports angesteuert werden, so antwortet der Knoten mit MSG_LC_NA. Ansonsten erfolgt eine Antwort mit MSG_LC_CONFIG.
Diese Nachricht wird gesendet, wenn eine Ausnahme an einem Port aufgetreten ist. Dabei kann es sich um einen Fehler beim Schalten oder Konfigurieren eines Ausgangs handeln oder auch das Ende einer Übertragung bei QUERY_ALL. Es folgen zwei oder drei Bytes mit Angaben zu Port und Fehlerursache.
Parameter | Beschreibung |
---|---|
PORT[2] | Diese Bytes geben den angesprochenen Port an. Port 0xFFFF signalisiert den Abschluss einer Übertragung von mehreren Ports. |
ERRCAUSE[0…1] | Optionaler Parameter, kodiert die Fehlerursache. |
Wert | Name | Bedeutung |
---|---|---|
0 | reserviert | (interner Gebrauch in Knoten oder PC-Programmen) |
1 | BIDIB_ERR_LC_PORT_GENERAL | (oder Parameter ERRCAUSE nicht vorhanden) Fehlerursache nicht näher spezifiziert |
2 | BIDIB_ERR_LC_PORT_UNKNOWN | Port ist unbekannt, nicht aktivierbar:
Der angesprochene Port bzw. Typ existiert an dem Knoten nicht. Dieser Fehler ist auch durch eine
Konfigurationsänderung nicht heilbar. Beispiel: Ein Knoten meldet per Feature nur 16 Ports, es wurde aber eine Nachricht für Port 20 gesendet. |
3 | BIDIB_ERR_LC_PORT_INACTIVE | Port ist aufgrund der Knotenkonfiguration zurzeit nicht nutzbar. Er ist deaktiviert. Dieser
Fehler kann durch eine Umkonfiguration geheilt werden. Beispiel 1: Angenommen flaches Portmodell, Port 0 lässt sich als SWITCH und SWITCHPAIR konfigurieren, blockiert in zweiterem Fall aber Port 1. Dieser beantwortet Schaltbefehle dann mit BIDIB_ERR_LC_PORT_INACTIVE. Beispiel 2: Ein Port wurde mit zueinander inkompatiblen (aber für sich validen) Parametern konfiguriert, oder eine Parameteränderung ist vor einem Neustart noch nicht wirksam. Er lehnt währenddessen Schaltbefehle ab. |
4 | BIDIB_ERR_LC_PORT_EXEC | Ausführen der Portoperation nicht möglich. Beispiele: Ein SWITCH-Port erhält einen Befehl mit PORTSTAT 5. Oder ein Ausgang im flachen Portmodell wird mit MSG_LC_KEY_QUERY abgefragt. |
5…254 | reserviert | |
255 | BIDIB_ERR_LC_PORT_BROKEN | Hardwarefehler liegt vor. Diese Meldung betrifft genau den gemeldeten Port, genauere Ursachen (interner Knotenfehler, Stromversorgung, usw.) werden fallweise über die allgemeinen Knotenfehler berichtet. |
Diese Nachricht überträgt den momentanen Zustand eines Ports. Es folgen drei Bytes: PORT0, PORT1, PORTSTAT.
Für Ausgänge wird sie als Antwort auf eine Abfrage gesendet oder als Quittung für einen Operationsbefehl, sobald der Ausgang seinen gewünschten Zustand erreicht hat. Sollte es sich um einen Ausgang mit mehr als 100ms Schaltzeit handeln, so wird sofort nach dem Erhalt der MSG_LC_OUTPUT eine Nachricht MSG_LC_WAIT zurückgesendet.
Für Eingänge wird sie als Antwort auf eine Abfrage gesendet oder auch spontan, wenn sich der Portzustand ändert und der Knoten enabled ist sowie FEATURE_CTRL_INPUT_NOTIFY gesetzt ist.
Parameter | Beschreibung |
---|---|
PORT[2] | angesprochener Port |
PORTSTAT | Je nach Porttyp: Zustand des Ausgangs, identisch zu MSG_LC_OUTPUT kodiert, oder Zustand des Eingangs:
|
Diese Nachricht wird als sofortige Empfangsbestätigung gesendet, wenn der Ausgang seinen angeforderten Zustand erst nach einer Zeit von 100ms oder mehr erreicht.
Es folgen drei Bytes: PORT0, PORT1, TIME.
Parameter | Beschreibung |
---|---|
PORT[2] | angesprochener Port |
TIME | Prognostizierte Umlaufzeit. Diese Umlaufzeit wird analog zur Railcom-Spezifikation wie folgt kodiert: Die 7 niederwertigen Bits der Restlaufzeit kennzeichnen die Laufzeit bis zum Erreichen des Ende-Zustand der angeforderten Schaltaktion (prognostizierte Umlaufzeit). Die Zeit wird abhängig vom MSB in Einheiten von 1/10 Sekunden (MSB = 0) oder 1 Sekunde (MSB = 1) angegeben. Eine Zeit von 0 bedeutet keine Schaltzeit ermittelbar. Damit ergibt sich ein Wertebereich 0…12,7 Sekunden bzw. 0…127 Sekunden. |
(veraltet, ab ausgewiesener Protokollversion 0.7 wird nur MSG_LC_STAT verwendet)
Diese Nachricht wird gesendet, wenn der Knoten lokale Taster enthält und diese betätigt wurden oder wenn eine explizite Abfrage erfolgte. Diese Nachricht erfolgt spontan (MSG_SYS_ENABLE und das entsprechende feature muss hierfür gesetzt sein) und wird nicht wiederholt. Es folgen zwei Bytes: PORT, KSTATE.
Parameter | Beschreibung |
---|---|
PORT | Nummer des Tasteneingangs. Entspricht PORT0 im flachen Portmodell und PORTNUM im typorientierten (bei PTYPE=15). |
KSTATE | Zustand des Tasters:
|
Nachricht eines Ports hinsichtlich seiner Parameter. Es folgen 4 bis max. 43 Bytes Parameter.
Parameter | Beschreibung |
---|---|
PORT[2] | Diese Bytes geben den angesprochenen Port an. |
DATA[2…42] | Liste aus 1 bis 8 Schlüssel-Wert-Paaren, bestehend jeweils aus Parametertyp und -wert. Die Kodierung entspricht der Nachricht MSG_LC_CONFIGX_SET. |
(veraltet.) Diese Nachricht wird nach einer Konfiguration oder nach einer Abfrage mittels MSG_LC_CONFIG_GET gesendet. Sie beschreibt die Einstellung eines einzelnen PORTs.
Es folgen 6 Parameter, Reihenfolge und Kodierung wie bei MSG_LC_CONFIG_SET.
Zubehörsteuerungen können die Fähigkeit zu Makros haben, diese Fähigkeit kann unterschiedlich gut ausgeprägt sein und wird durch einen Level definiert. Ob Makros unterstützt werden und welcher Level der Makrofähigkeit unterstützt wird, kann durch eine Feature-Abfrage geklärt werden.
Ebenso sind Anzahl und mögliche Länge der Makrokanäle durch Featureabfragen zu klären.
Makros des Level 1 bestehen aus einer linearen Liste an Schaltpunkten, zu denen bestimmte Aktionen ausgeführt werden. Ein Schaltpunkt ist definiert durch den zeitlichen Abstand zum vorherigen Schaltpunkt, durch den geschalteten Ausgang und durch den Befehlswert. Jede dieser Aktionen entspricht einem MSG_LC_OUTPUT-Kommando. Zusätzlich hat ein Makro noch generelle Parameter wie z. B. die Schrittgeschwindigkeit, mit der es ausgeführt wird.
(Anmerkung: Intern im Knoten kann durch geschickte Programmierung der MSG_LC_OUTPUT-Befehl auf 2 Bytes verkürzt werden, damit ist dann bei einer Verwendung innerhalb Makros auch bei knappen Speicher eine große Zahl an Schaltpunkten möglich.)
Makros des Level 2 bestehen ebenso aus einer linearen Liste an Schaltpunkten (entsprechend Level 1), zusätzlich gibt es Schaltpunkte, welche das Starten und Anhalten weiterer Makros sowie das Synchronisieren verschiedener Makroläufe und die Abfrage von Eingängen (z. B. Endschalter oder Bedientaster) ermöglichen. Damit lassen sich dann bereits kleine lokale Ablaufsteuerungen realisieren, wie sie für animierte Szenen auf der Modellbahn gebraucht werden.
Ein Makro ist also eine Schrittkette von Aktionen auf einem Knoten, welche in einem bestimmten Raster ausgeführt wird. Das Raster für die Ausführung wird durch MACRO_TICK definiert. MACRO_TICK ergibt sich durch BIDIB_MACRO_PARA_SLOWDOWN (s.u.), multipliziert mit der Grundeinheit von 20ms.
Beispiel: stellt man BIDIB_MACRO_PARA_SLOWDOWN auf 50, so ergibt sich MACRO_TICK zu 50 * 20ms = 1s. Das Makro wird also jede Sekunde um einen TICK weitergeschaltet.
Makros sind selbständig. Makros lassen sich individuell laden, verändern und starten. Eine bestimmte Aktion oder ein bestimmter Ausgang darf in mehreren Makros vorkommen. Es dürfen so viele Makros gleichzeitig gestartet werden, wie der Dekoder anbietet. Auch kann es möglich sein, aus Makros Accessory-Objekte zusammenzustellen.
Beispiel für ein Makro:
Dieses Beispiel zeigt eine Verkehrsampel, ein Makro A soll diese auf den Signalisierungsbegriff 'STOP' schalten, ein weiteres Makro B soll die Ampel auf 'FAHRT' schalten.
Delay | Aktion |
---|---|
0 | Ausgang für 'GELB' einschalten. |
0 | Ausgang für 'GRÜN' ausschalten. |
10 | Ausgang für 'ROT' einschalten. |
0 | Ausgang für 'GELB' ausschalten. |
Erklärung: beim Start des Makros wird ohne Verzögerung GELB ein- und GRÜN ausgeschaltet (die Ampel springt also auf GELB). Die nächste Aktion hat eine Wartezeit von 10, nach dieser Wartezeit geht ROT an und ohne weitere Verzögerung geht GELB aus.
Delay | Aktion |
---|---|
0 | Ausgang für 'GELB' einschalten. |
10 | Ausgang für 'ROT' ausschalten. |
0 | Ausgang für 'GELB' ausschalten. |
0 | Ausgang für 'GRÜN' einschalten. |
Bei diesem Makro wird zuerst GELB zugeschaltet, dann nach einer Verzögerung ROT zusammen mit GELB abgeschaltet und zugleich grün eingeschaltet.
Makros sind Konfigurationshilfsmittel für Knoten, die Fähigkeit zum Anzeigen und Erstellen von Makros ist für PC-Programme optional.
Die Makrounterstützung und das Level der Makrofähigkeit sind mittels Feature-Abfragen feststellbar:
Nummer | Name | Bedeutung |
---|---|---|
60 | FEATURE_CTRL_MAC_LEVEL | Unterstützter Makro-Level 0 = keine Makrofähigkeit 1 = Makros des Level 1 (einfache Aktionslisten) 2 = Makros des Level 2 (Aktionslisten, mit Abfragen, Start, Stop, Zufall) |
61 | FEATURE_CTRL_MAC_SAVE | Permanente Speicherung von Makros möglich 0 = keine Speicherfähigkeit; 1…n = Anzahl der Speicherplätze für permanente Speicherung |
62 | FEATURE_CTRL_MAC_COUNT | Zahl möglicher Makros 0 = keine Makrofähigkeit 1…n = Anzahl der möglichen Makros des angegebenen Levels |
63 | FEATURE_CTRL_MAC_SIZE | Länge lokaler Makrolisten 0 = keine Makrofähigkeit; 1…n = Anzahl der Einträge je Makroliste |
64 | FEATURE_CTRL_MAC_START_MAN | Start von Makros durch lokale Eingänge 0 = Makros können nicht durch lokale Eingänge gestartet werden. 1 = Makros können durch lokale Eingänge gestartet werden. Dabei gilt eine feste Zuordnung: Eingang 0 startet Makro 0, Eingang 1 startet Makro 1, usw. |
65 | FEATURE_CTRL_MAC_START_DCC | Start von Makros durch DCC 0 = Makros können nicht durch DCC gestartet werden. 1 = Makros können durch DCC-Befehle gestartet werden. Die Programmierung der DCC-Adresse erfolgt mit den jeweils üblichen Mitteln (z. B. per Progtaster oder CV-Programmierung. Zubehörbefehl 0 startet Makro 0, usw. |
Es gibt folgende Befehle zum Erstellen und Verwalten von Makros:
Es folgen zwei Bytes: Makroindex, Operations-Code. Die jeweilige Operation wird mit einer MSG_LC_MACRO_STATE beantwortet.
Wert | Name | Bedeutung |
---|---|---|
0 | BIDIB_MACRO_OFF | Makro soll abgebrochen werden. |
1 | BIDIB_MACRO_START | Makro soll gestartet werden. |
2…0xFB | reserviert. | |
0xFC (=252) | BIDIB_MACRO_RESTORE | Wiederherstellen. Das angegebene Makro wird aus dem Permanentspeicher (sofern vorhanden, dies kann durch eine Abfrage des Features überprüft werden) übertragen und überschreibt damit das aktuell geladene Makro. Sollte kein Permanentspeicher vorhanden sein, so wird das angegebene Makro gelöscht (wie BIDIB_MACRO_DELETE). |
0xFD (=253) | BIDIB_MACRO_SAVE | Sichern. Das angegebene Makro wird in den Permanentspeicher (sofern vorhanden, kann durch eine Abfrage des Features überprüft werden) übertragen und steht nach dem erneuten Start des System wieder zur Verfügung. |
0xFE (=254) | BIDIB_MACRO_DELETE | Löschen des Makros. Der Inhalt des angegebene Makros wird gelöscht (im Arbeitsspeicher). Diese Operation ist identisch zum Setzen aller(!) Schaltzustände auf 255, 255 (END_OF_MACRO). Durch anschließendes BIDIB_MACRO_SAVE wird auch eine ev. Kopie im Permanentspeicher gelöscht. |
Setzen eines Makroschaltpunktes, damit wird ein einzelner Makropunkt definiert. Es folgen 6 Parameter:
Parameter | Beschreibung | |
---|---|---|
DATA0 | Index des Makros | |
DATA1 | Index des Punktes innerhalb des Makros | |
DATA2 | DELAY: Verzögerungszeit zum Vorgängerpunkt. Wertebereich 0…250 | SYS_TYPE: unverzögerter Aufruf einer Systemfunktion. Wertebereich 251…255 |
DATA3 | PORT[2]: Diese Bytes geben den angesprochenen Port an. | SYS_CMD: Systemfunktion, z. B. das Ende des Macros. |
DATA4 | SYS_ARG[2]: Argumente der Systemfunktion. Von der jeweiligen Funktion nicht verwendete Bytes sind mit 0 zu belegen, sie werden zwar mitübertragen, jedoch nicht ausgewertet. | |
DATA5 | PORTSTAT: Schaltzustand gemäß der Tabelle bei MSG_LC_OUTPUT |
Das Setzen eines Makroschaltpunktes wird mit einer MSG_LC_MACRO Nachricht beantwortet. Sollte ein Port außerhalb der vorhandenen Ports konfiguriert werden, so wird das Makro bei Ausführung an dieser Stelle beendet.
Das Ende eines Makro wird mit dem Setzen aller Parameter auf 255 signalisiert, bzw. wenn der für Makro verfügbare Speicherplatz zu Ende ist.
DELAY, Verzögerungszeit: Die hier angegebene Zahl bezeichnet die Zeit bezogen auf den vorhergehende Makropunkt. Eine Zeit von 0 bedeutet keine zeitliche Lücke zwischen den Aktionen (wiewohl sie doch aus physikalischen Gründen i. d. R. knapp nacheinander ausgeführt werden). Die hier angegebene Zeit bedeutet die Zahl der MAKRO_TICKs, welche bis zur Ausführung der Schaltaktion vergehen. Der gültige Bereich beträgt 0…250.
Die tatsächliche Wartezeit ergibt sich, wenn man diese Zahl mit der Geschwindigkeit der Makroausführung multipliziert. Damit lassen sich Zeiten von 20ms bis über 20min realisieren.
Für Makros des Level 2 sind bei DELAY = 255 weitere Systemfunktionen gemäß folgender Tabelle definiert:
Wert | Name | Funktion |
---|---|---|
255 | BIDIB_MSYS_END_OF_MACRO | Das Makro wird beendet. |
254 | BIDIB_MSYS_START_MACRO | Das in SYS_ARG0 angegebene Makro wird gestartet. Dies kann auch das aktuelle Makro sein, es beginnt dann wieder von vorn. |
253 | BIDIB_MSYS_STOP_MACRO | Das in SYS_ARG0 angegebene Makro wird gestoppt. Stop bedeutet hierbei Abbruch, nicht Pause. Sollte sich das Zielmakro in einem kritischen Abschnitt befinden, so wird die Stopanforderung nach dem kritischen Abschnitt ausgeführt. |
252 | BIDIB_MSYS_BEGIN_CRITCAL | Das Makro wird nicht durch eine Stopanforderung angehalten,
der momentane Ablauf soll fertiggestellt werden (bis END_CRITICAL). Beispiel: die Bewegung eines mechanisches Objekts soll nicht 'auf halber Strecke' abbrechbar sein. |
251 | BIDIB_MSYS_END_CRITCAL | Das Makro darf durch eine Stopanforderung angehalten werden (default) |
250 | BIDIB_MSYS_FLAG_QUERY1 | Das in SYS_ARG0 angegebene Flag wird auf Zustand 1 abgefragt. Sofern es nicht gesetzt ist, wird die Makroausführung pausiert, bis das Flag (z. B. durch ein anderes Makro) gesetzt ist. |
249 | BIDIB_MSYS_FLAG_SET | Das in SYS_ARG0 angegebene Flag wird gesetzt. Wertebereich: 0…15 |
248 | BIDIB_MSYS_FLAG_CLEAR | Das in SYS_ARG0 angegebene Flag wird gelöscht. Wertebereich: 0…15 |
247 | BIDIB_MSYS_INPUT_QUERY1 | Der in SYS_ARG angegebene Eingang bzw. Schalter wird abgefragt.
Im flachen Portmodell wird hier die Portadresse angegeben,
im typorientierten wird nur die PORTNUM in SYS_ARG0 kodiert (mit PTYPE=15). Sofern der Schalter offen ist (PORTSTATE=0), wird die Makroausführung pausiert. Wenn der Schalter geschlossen ist (PORTSTATE=1), wird die Makroausführung fortgesetzt. |
246 | BIDIB_MSYS_INPUT_QUERY0 | Der in SYS_ARG angegebene Eingang / Schalter wird abgefragt.
Im flachen Portmodell wird hier die Portadresse angegeben,
im typorientierten wird nur die PORTNUM in SYS_ARG0 kodiert (mit PTYPE=15). Sofern der Schalter geschlossen ist (PORTSTATE=1), wird die Makroausführung pausiert. Wenn der Schalter offen ist (PORTSTATE=0), wird die Makroausführung fortgesetzt. |
245 | BIDIB_MSYS_DELAY_RANDOM | Die Makroausführung wird um eine zufällige Zeit verzögert. Die Zeitspanne wird als Zufallswert aus einem Zeitraum von 0…SYS_ARG0 MACRO_TICKS bei jedem Aufruf neu berechnet. Damit lassen sich z. B. bei Beleuchtungen von Häusern realistische Abläufe erzielen. |
244 | BIDIB_MSYS_DELAY_FIXED | Die Makroausführung wird um eine feste Zeit von 0…255 MACRO_TICKS verzögert. Die Zeit ist in SYS_ARG0 angegeben. |
243 | BIDIB_MSYS_ACC_OKAY_QIN1 | Der in SYS_ARG angegebene Eingang / Schalter wird abgefragt.
Im flachen Portmodell wird hier die Portadresse angegeben,
im typorientierten wird nur die PORTNUM in SYS_ARG0 kodiert (mit PTYPE=15). Sofern der Schalter geschlossen ist (PORTSTATE=1), wird an das Accessory, welches dieses Makro gestartet hat, eine erfolgreiche Ausführung gemeldet. Wenn der Schalter offen ist (PORTSTATE=0), wird ein Rückmeldefehler gemeldet. |
242 | BIDIB_MSYS_ACC_OKAY_QIN0 | Der in SYS_ARG angegebene Eingang / Schalter wird abgefragt.
Im flachen Portmodell wird hier die Portadresse angegeben,
im typorientierten wird nur die PORTNUM in SYS_ARG0 kodiert (mit PTYPE=15). Sofern der Schalter offen ist (PORTSTATE=0), wird an das Accessory, welches dieses Makro gestartet hat, eine erfolgreiche Ausführung gemeldet. Wenn der Schalter geschlossen ist (PORTSTATE=1), wird ein Rückmeldefehler gemeldet. |
241 | BIDIB_MSYS_ACC_OKAY_NF | An das Accessory, welches dieses Makro gestartet hat, wird eine erfolgreiche Ausführung gemeldet (mit der Zusatzinfo: No Feedback available). |
240 | BIDIB_MSYS_SERVOMOVE_QUERY | Das in SYS_ARG angegebene Servo wird abgefragt.
Im flachen Portmodell wird hier die Portadresse angegeben,
im typorientierten wird nur die PORTNUM in SYS_ARG0 kodiert (mit PTYPE=2). Sofern die Bewegung des Servos noch nicht beendet ist, wird die Makroausführung pausiert. Wenn die Bewegung beendet ist, wird die Makroausführung fortgesetzt. |
239 | BIDIB_MSYS_FLAG_QUERY0 | Das in SYS_ARG0 angegebene Flag wird auf Zustand 0 abgefragt. Sofern es gesetzt ist, wird die Makroausführung pausiert, bis das Flag (z. B. durch ein anderes Makro) rückgesetzt ist. |
Abfrage eines Makropunktes, es folgen zwei Bytes mit Makroindex und Schaltpunktindex. Die Abfrage wird mit einer MSG_LC_MACRO beantwortet.
Parameter | Beschreibung |
---|---|
DATA0 | Index des Makros, in dem der Schaltpunkt abgefragt wird. |
DATA1 | Index des Schaltpunktes innerhalb des Makros |
Die Indizes werden beginnend ab 0 gezählt.
Setzen eines allgemeinen Parameters für ein Macro, damit werden die Ausführungsparameter des Makros festgelegt: Makrogeschwindigkeit, Ausführungsmode (z. B. repetierend), Startbedingung usw. Es folgen 6 Parameter:
Parameter | Beschreibung |
---|---|
DATA0 | Index des Makros |
DATA1 | Index des Parameters |
DATA2 | Wert des Parameters (LSB) |
DATA3 | Wert des Parameters |
DATA4 | Wert des Parameters |
DATA5 | Wert des Parameters (MSB) |
Das Setzen eines Makroparameters wird mit einer MSG_LC_MACRO_PARA Nachricht beantwortet.
Indexwerte der Parameter:
Wert | Name | Bedeutung | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | BIDIB_MACRO_PARA_SLOWDOWN | Laufgeschwindigkeit des Macros. Mit diesem Wert wird die Abarbeitungsgeschwindigkeit
angegeben. Die Grundeinheit ist 20ms. Wertebereich: 1…250 Voreinstellung 1. Beispiel: bei einer Einstellung von 5 schaltet das Macro alle 100ms um einen Macro-Tick weiter. Wenn also in der Makroliste etwa 2 angegeben ist, dann bedeutet das in Summe einen zeitlichen Abstand von 200ms zwischen den Aktionen. | ||||||||||
2 | BIDIB_MACRO_PARA_REPEAT | Wiederholungen des Makros.
Das Makro wird so oft wiederholt, wie hier angegeben.
Wenn hier 0 angegeben wird, dann wird das Makro endlos wiederholt. Wertebereich: 0…250 Voreinstellung: 1, d.h. das Makro wird genau einmal ausgeführt. | ||||||||||
3 | BIDIB_MACRO_PARA_START_CLK | Macrostart per Systemuhr freigegeben.
DATA2 bis DATA5 enthalten den Zeitpunkt als TCODE (siehe hierzu die Erläuterungen beim Befehl MSG_SYS_CLOCK) Ergänzend zum Start zu einer bestimmten Modell-Uhrzeit besteht auch den Möglichkeit, Macro-Starts wiederholend festzulegen, also z. B. jede Stunde. oder jeden Tag zur gleichen Stunde. Dies wird durch Angabe eines TCODEs erreicht, welcher nicht in einer normalen Zeitnachricht enthalten sein kann. Solche TCODEs sind also Triggerbedingungen, welche ähnlich einem 'wildcard' bei mehreren Zeitpunkt erfüllt werden:
Soll das Starten via TCODE unterbunden werden, sind alle Triggerbedingungen auf void zu stellen, d.h. für min/hr/day ist jeweils 0x3F als Datenwert anzugeben. Wenn also die Triggerung ganz abgeschaltet werden soll, so ist 0x3f, 0xbf, 0x7f, 0xff zu senden. Voreinstellung: 0x3f, 0xbf, 0x7f, 0xff (=abgeschaltet) Beispiele: TCODE = (0x00 + 15), (0x80 + 24), (0x40 + 7): Hier erfolgt ein Start jeden Tag, jede Stunde, immer zur Minute 15. TCODE = (0x00 + 00), (0x80 + 18), (0x40 + 7): Hier erfolgt ein Start jeden Tag, 18:00 | ||||||||||
tbd. | tbd. | Macrostart per DCC-Schaltbefehl freigegeben. | ||||||||||
tbd. | tbd. | Macrostart per externen Eingang freigegeben. |
Wenn ein Knoten in der Lage ist, Makros permanent zu speichern, dann müssen die Makroparameter bei diesem Vorgang auch mit abgespeichert werden.
Abfrage eines Makroparameters, es folgen zwei Bytes mit Makroindex und Parameterindex. Die Abfrage wird mit einer MSG_LC_MACRO_PARA beantwortet.
Die Nachricht wird als Quittung nach der Zustandsänderung (Operation) eines Makros gesendet. es folgen zwei Bytes mit Makroindex und Zustand.
Wert | Name | Bedeutung |
---|---|---|
0 | BIDIB_MACRO_OFF | Makro ist angehalten |
1 | BIDIB_MACRO_START | Makro wird gestartet |
2 | BIDIB_MACRO_RUNNING | Makro wird bereits ausgeführt |
252 | BIDIB_MACRO_RESTORE | Makro wurde wiederhergestellt |
253 | BIDIB_MACRO_SAVE | Makro wurde gesichert |
254 | BIDIB_MACRO_DELETE | Makro wurde gelöscht |
255 | BIDIB_MACRO_NOTEXIST | Makro existiert nicht (Makroindex beim Aufruf zu groß) |
Übermittlung eines abgefragten Makropunktes, es folgen 6 Bytes mit Makroindex und Schaltpunktindex sowie dem Inhalt dieses Punktes. Die Kodierung ist identisch zu MSG_LC_MACRO_SET.
Übermittlung eines abgefragten Makroparameters, es folgen 6 Bytes mit Makroindex, Parameterindex und Parameterwert (Data). Wenn der Parameter im Knoten nicht existiert, dann wird der Wert 0xFF für alle Datenbytes zurückgeliefert.
Parameter | Beschreibung |
---|---|
DATA0 | Index des Makros |
DATA1 | Index des Parameters |
DATA2 | Wert des Parameters (LSB) |
DATA3 | Wert des Parameters |
DATA4 | Wert des Parameters |
DATA5 | Wert des Parameters (MSB) |
Belegtmeldung dient dazu, den Aufenthaltsort von Fahrzeugen zu melden. Dieser wird i. d. R. durch eine Stromverbrauchsmessung detektiert. Parallel dazu können Belegtmelder in der Lage sein, bidirektionale Nachrichten (railcom) der Fahrzeuge auszuwerten.
Melder haben das Bit 'Melderfunktion' in der ClassID gesetzt. Melder dienen nur zur Anzeige von Belegtzuständen, nicht zum Melden sonstiger Ereignisse wie z. B. ein Tastendruck oder eine Eingabe aus der Anlage (z. B. von einem Stellpult). Hierfür ist die Klasse 'Zubehör' vorgesehen.
Eine verloren gegangene Belegtmeldung kann im Rechnerbetrieb dramatische Auswirkungen haben: wenn die Belegtmeldung eines Haltabschnittes nicht eingeht, wird ein Zug nicht rechtzeitig angehalten und es kann zu einem Unfall mit materiellen Schäden und Betriebsunterbrechung kommen.
Deshalb ist zum einen die Übertragung in BiDiB mit CRC abgesichert und die Nachrichtenfolge sequentiell durchnummeriert, so dass Übertragungsfehler erkannt werden. Darüber hinaus bietet BiDiB für Belegtmelder noch weitere Sicherungsmethoden:
Ein weiterer beachtenswerter Punkt ist der verwendete Adressraum. DCC kennt eigentlich zwei Adressräume: kurze und lange Adresse. Es ist jedoch allgemeine Praxis, dass in Steuergeräten diese beiden Adressräume zu einem Adressraum vereint werden. Immer dann, wenn eine Adresse mittels kurzer Adresse darstellbar ist, dann wird kurze Adresse verwendet.
BiDiB behandelt alle DCC Adressen als eindeutig (nach RCN 211), die Unterscheidung kurz-lang existiert im Protokoll nicht.
Nummer | Name | Bedeutung |
---|---|---|
0 | FEATURE_BM_SIZE | Anzahl der Belegtmeldungen. Hier werden die Anzahl der Melderbits eines Knotens abgefragt. Für Melder mit unbekannter Anzahl an Eingängen (z. B. Interface zu einem S88-Bus) kann diese Variable auch geschrieben werden. Wertebereich: 0…128. |
1 | FEATURE_BM_ON | 0: Der Knoten liefert keine Belegtmeldung. 1: Der Knoten liefert Belegtmeldungen (spontan). Dies erfolgt automatisch bei einer Änderung des Zustandes. |
2 | FEATURE_BM_SECACK_AVAILABLE | 0: keine Quittungen 1: Der Melder beherrscht das Secure-ACK-Quittungsverfahren für Belegtmeldungen |
3 | FEATURE_BM_SECACK_ON | Wenn dieses Feature ungleich 0 ist, dann ist Secure-ACK-Quittungsverfahren enabled. Der Wert gibt das Retransmitintervall in Einheiten von 10ms an. Empfohlen ist eine Einstellung von 20 entsprechend 200ms. |
4 | FEATURE_BM_CURMEAS_AVAILABLE | 0: keine Strommessdaten 1: Der Melder kann Strommessdaten (eines Abschnittes) liefern |
5 | FEATURE_BM_CURMEAS_INTERVAL | Wenn dieses Feature ungleich 0 ist, dann ist Strommessung enabled. Der Wert gibt das Abtastintervall der Strommessung in Einheiten von 10ms an. Empfohlen ist eine Einstellung von 200 entsprechend 2s. |
6 | FEATURE_BM_DC_MEAS_AVAILABLE | 0: keine Ersatzmessung verfügbar (siehe hierzu auch MSG_BM_CONFIDENCE) 1: Ersatzmessung: Der Melder kann Belegtmeldungen auch bei abgeschaltetem Fahrstrom liefern |
7 | FEATURE_BM_DC_MEAS_ON | 1: Der Melder liefert Belegtmeldungen auch bei abgeschaltetem Fahrstrom |
30 | FEATURE_BM_TIMESTAMP_ON | 0: Der Melder liefert keine Zeitstempel 1: Der Melder liefert Belegtmeldungen mit Systemzeitstempeln |
Vorbemerkung: Die Anzahl der Melder eines Knotens wird mit den Befehlen MSG_FEATURE... abgefragt bzw. verändert. Man kann über die Featureeinstellung auch die Zahl der Melder konfigurieren. Diese Möglichkeit dient speziell zum Support von Interfaces auf bisherige Meldersysteme: z. B. ein S88-System hat erst mal eine unbekannte Länge und muss daher erst in der Größe definiert werden. Die Zahl der Melder je Knoten ist auf 128 beschränkt.
Mit diesem Befehl werden die Zustände aller Belegtmelder in einem bestimmten Bereich abgefragt. Es folgen 2 Bytes: START, ENDE, welche die zu übertragenden Melderbits bezeichnen.
Das Rückmeldersystem antwortet mit einer MSG_BM_MULTIPLE Nachricht, die alle Belegtmeldungen von START bis (exklusiv) ENDE enthält.
Mit diesem Befehl wird eine einzelne Belegtmeldung zurück an den Melder übertragen. Bei aktiviertem Secure-ACK-Quittungsverfahren (FEATURE_BM_SECACK_ON) wird diese einzelne Belegtmeldung vom Melder nochmal übertragen, falls der Zustand im Melder nicht mit der Mirrormeldung übereinstimmt.
Wenn Secure-ACK nicht aktiviert ist, muss der Melder diese Nachricht ignorieren.
Es folgt ein Byte mit der lokalen Melderadresse (MNUM) wie bei MSG_BM_OCC.
Mit diesem Befehl wird eine einzelne Freimeldung zurück an den Melder übertragen. Bei aktiviertem Secure-ACK-Quittungsverfahren (FEATURE_BM_SECACK_ON) wird diese einzelne Freimeldung vom Melder nochmal übertragen, falls der Zustand im Melder nicht mit der Mirrormeldung übereinstimmt.
Wenn Secure-ACK nicht aktiviert ist, muss der Melder diese Nachricht ignorieren.
Es folgt ein Byte mit der lokalen Melderadresse (MNUM) wie bei MSG_BM_FREE.
Mit diesem Befehl werden die eingelesenen Zustände byteweise zurück an den Melder übertragen. Bei aktiviertem Secure-ACK-Quittungsverfahren (FEATURE_BM_SECACK_ON) werden nicht mit dem Zustand im Melder übereinstimmende Belegtmeldungen vom Melder nochmal übertragen.
Wenn Secure-ACK nicht aktiviert ist, muss der Melder diese Nachricht ignorieren, bei aktiviertem Secure-ACK erfolgt die Antwort umgehend (mit MSG_BM_MULTIPLE).
Es folgen Angaben zur Basisadresse dieses Abschnittes und Länge der Meldung sowie die Belegtmeldungsdaten, kodiert wie bei MSG_BM_MULTIPLE.
Es folgen keine Parameter.
Die aktuelle 'Qualität' der Belegtmeldung wird angefragt, der Knoten antwortet mit einer MSG_BM_CONFIDENCE.
Vorbemerkung: Generell erfolgen Meldungen im Uplink spontan (nach erfolgter Freigabe im Interface). Bestimmte Meldungsarten können mittels Feature-Einstellung ein- oder ausgeschaltet werden.
Für Belegtmeldung werden 3 verschiedene Nachrichtentypen verwendet:
eine einzelne Belegtmeldung (als Änderungsmeldung); es folgen ein Byte mit der lokalen Melderadresse (MNUM) und optional zwei Bytes mit einem BiDiB-Systemzeitstempel (TIMEL, TIMEH).
Ist das FEATURE_BM_TIMESTAMP_ON aktiviert und liegt dem Melder eine gültige Systemzeit vor, liefert er einen Zeitstempel für den Zeitpunkt der Melderauslösung mit. Ist dieser nicht genau bestimmbar, soll der Zeitstempel weggelassen werden.
Hinweis: Die Systemzeit wird auf dem BiDiBus mittels MSG_LOCAL_SYNC-Nachrichten in Abständen von bis zu 32 s synchronisiert. Ein Melder muss eine Clock-Genauigkeit besser als 30ppm haben, um innerhalb dieser Zeitspanne maximal 1 ms wegzudriften. Hat der Melder eine höhere Ungenauigkeit (z. B. mit RC-Oszillator), darf er dieses Feature nicht verwenden.
Ist das FEATURE_BM_SECACK_ON aktiviert, muss der Host sofort eine MSG_BM_MIRROR_OCC für dieselbe MNUM an den Detektor zurücksenden. Bis diese Quittung eingetroffen ist, wird die Nachricht im eingestellten Intervall mehrfach wiederholt. Der Ereignis-Zeitstempel kann dabei weggelassen werden, wenn er nicht mehr vorliegt. Um keine Meldungsflut zu verursachen, ist die Zahl der Wiederholungen zu begrenzen; längere Ausfälle werden vom Businterface behandelt. Liegt die Quittung danach immer noch nicht vor, wird eine Fehlermeldung mit dem Code BIDIB_ERR_NO_SECACK_BY_HOST gesendet.
Es soll auch solange keine Freimeldung für den Abschnitt gegeben werden, bis die Belegtmeldung bestätigt worden ist; dies ist insbesondere für Punktmelder mit kurzen Auslösezeiten wichtig.
eine einzelne Freimeldung (als Änderungsmeldung); es folgen ein Byte mit der lokalen Melderadresse (MNUM). Wenn durch eine Belegtmeldung ein Abschnitt als frei gemeldet wird, so ist implizit auch eine evtl. gemeldete Lok auf diesem Abschnitt verschwunden.
Ist das FEATURE_BM_SECACK_ON aktiviert, muss der Host sofort eine MSG_BM_MIRROR_FREE für dieselbe MNUM an den Detektor zurücksenden. Bis diese Quittung eingetroffen ist, wird die Nachricht im eingestellten Intervall mehrfach wiederholt. Um keine Meldungsflut zu verursachen, ist die Zahl der Wiederholungen zu begrenzen; längere Ausfälle werden vom Businterface behandelt. Liegt die Quittung danach immer noch nicht vor, wird eine Fehlermeldung mit dem Code BIDIB_ERR_NO_SECACK_BY_HOST gesendet.
Diese Nachricht übermittelt Belegt/Freimeldungen eines ganzen, zusammenhängenden Bereiches an Melderadressen. Es folgen Angaben zur Basisadresse dieses Bereiches und Anzahl der der Meldungen sowie die Belegtmeldungsdaten selbst.
Parameter | Beschreibung |
---|---|
MNUM | Basisadresse des gemeldeten Abschnittes (wie bei MSG_BM_OCC), diese muss hier aber ein ganzzahliges Vielfaches von 8 sein. |
SIZE | Anzahl der gemeldeten Bits, Wertebereich 8… 128. Size kann ebenfalls nur vielfache Werte von 8 annehmen. |
DATA[1…16] | Melderdaten. Das LSB des ersten Bytes entspricht der Basisadresse, das MSB des ersten Bytes der Basisadresse + 7. Das LSB des zweiten Bytes entspricht Basisadresse + 8 usw. Ein gesetztes Bit steht für einen belegten Abschnitt, ein nicht gesetztes für einen freigemeldeten. Bei einer Melderanzahl (FEATURE_BM_SIZE), die kein Vielfaches von 8 ist, wird am Ende mit 0-Bits aufgefüllt. |
Diese Nachricht ist speziell in der Initialisierungsphase bzw. nach einem Protokollfehler zum schnellen Einlesen der Belegtmeldung gedacht.
Ist das FEATURE_BM_SECACK_ON aktiviert, muss der Host sofort eine MSG_BM_MIRROR_MULTIPLE für denselben Bereich an den Detektor zurücksenden. Bis diese Quittung eingetroffen ist, wird die Nachricht im eingestellten Intervall mehrfach wiederholt. Um keine Meldungsflut zu verursachen, ist die Zahl der Wiederholungen zu begrenzen; längere Ausfälle werden vom Businterface behandelt. Liegt die Quittung danach immer noch nicht vor, wird eine Fehlermeldung mit dem Code BIDIB_ERR_NO_SECACK_BY_HOST gesendet.
Diese Nachricht übermittelt eine Information über die 'Vertrauenswürdigkeit' der aktuellen Belegtmeldung. Es folgen 3 Bytes, welche den Zustand bezeichnen. Je nach Zustand des Gleissignals kann die Erfassung der Belegtmeldung beeinträchtigt sein: so ist z. B. bei einem Kurzschluss des Gleissignals je nach internem Aufbau des Belegtmelders nur eine 'eingefrorene' oder gar keine gültige Meldung möglich.
Bei Ausfall der Gleisstromversorgung oder des Erfassungsystems muss die entsprechende CONFIDENCE-Meldung zeitlich vor den Änderungen der Belegt- oder Adressmeldungen eingehen. Damit hat das Hostprogramm die Möglichkeit, nachfolgende Belegt- oder Adressmeldungen im richtigen Kontext zu sehen.
Nach einem Wechsel des Vertrauenszustands sind die Nachrichten zur Lokgeschwindigkeit und eine evtl. davon abgeleitete Ortsbestimmung fallweise veraltet.
Parameter | Beschreibung |
---|---|
VOID | 0: die Belegtmeldung leitet sich aus der tatsächlichen Situation am Gleis ab. <>0: die gemeldete Belegung ist ungültig, eine Erfassung zurzeit nicht möglich. |
FREEZE | 0: die Belegtmeldung wurde mit dem Eingangssignal oder einer Ersatzmethode des Melders ermittelt. <>0: die Belegtmeldung ist nicht aktuell, sondern der gespeicherte Zustand einer früheren Situation. |
NOSIGNAL | 0: die Belegtmeldung wurde mit gültigem Eingangssignal ermittelt (d.h. es liegt ein Gleissignal an). <>0: es fehlt ein gültiges Eingangssignal vom Booster. |
Es handelt sich bei diesen Bytes also um 'Warnstufen':
Anmerkung: Mittels dieser Nachricht lässt sich auch ohne Boosterüberwachung ein Boosterausfall erkennen, welcher z. B. durch Kurzschluss, Nothalt oder einen Hardware-Defekt ausgelöst werden kann.
Es ist zulässig, dass der Melderbaustein bis zu 8 Erfassungsbereiche hat, in diesem Fall soll je Erfassungsbereich das entsprechende Bit in VOID, FREEZE und NOSIGNAL gesetzt werden. Wenn nur ein Erfassungbereich vorhanden ist, wird jeweils das LSB gesetzt, bei 2 Erfassungsberreichen die beiden unteren Bits, usw. Eine Hostsoftware muss die Bereiche nicht zwingend getrennt betrachten, sondern kann die Meldung auch einfach für den gesamten Knoten gelten lassen.
Wenn spontane Belegtmeldung aktiviert ist, dann erfolgt auch eine spontane Meldung bei Änderung des Vertrauenszustandes des Melders. Sollte ein Melder mehrere Erfassungsbereiche besitzen (welche evtl. zugleich den Zustand wechseln), soll die Zusammenfassung zeitlich dicht aufeinanderfolgender Zustandsänderungen zu einer einzigen Meldung bereits im Knoten erfolgen.
Strom-Meldung, es folgen zwei Bytes: MNUM, CURRENT
Parameter | Beschreibung | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MNUM | lokale Adresse des Melders | ||||||||||||||||||||
CURRENT | Stromverbrauch
|
MSG_BM_CURRENT wird nur spontan gemeldet und kann nicht abgefragt werden. Durch Setzen oder Löschen des FEATURE_BM_CURMEAS_INTERVAL kann die Übertragung zu- oder abgeschaltet werden.
Bidirektionale Nachrichten der Fahrzeuge (Railcom nach RCN 217) können in verschiedenen Knoten wie Belegtmeldern und Boostern ausgewertet werden. Dazu können diese die folgenden Features anmelden:
Nummer | Name | Bedeutung |
---|---|---|
8 | FEATURE_BM_ADDR_DETECT_AVAILABLE | 0: Der Detektor verfügt über keine Adresserkennung 1: Der (lokale) Detektor kann erkannte Lok-Adressdaten (1) pro Meldeabschnitt liefern 2: Der globale Detektor (2) kann erkannte Lok-Adressdaten (1) mit MNUM=255 liefern |
9 | FEATURE_BM_ADDR_DETECT_ON | 1: Der Detektor liefert die Adressdaten |
10 | FEATURE_BM_ADDR_AND_DIR | 1: Der Detektor hat Richtungserkennung, d.h. die prinzipielle Fähigkeit dazu |
11 | FEATURE_BM_ISTSPEED_AVAILABLE | 0: Der Detektor versteht keine Speedmeldungen 1: Der Detektor kann Speedmeldungen vom Dekoder weiterleiten |
12 | FEATURE_BM_ISTSPEED_INTERVAL | 0: Der Detektor leitet Speedmeldungen nicht weiter 1…255: Der leitet Speedmeldungen weiter, der Wert gibt das Intervall der Speedmeldungen in Einheiten von 10ms an. Empfohlen ist eine Einstellung von 50 entsprechend 500ms. |
13 | FEATURE_BM_CV_AVAILABLE | 0: Der Detektor versteht keine CV-Antworten 1: Der (lokale) Detektor kann CV-Antworten (PoM) erkennen 2: Der globale Detektor (2) kann CV-Antworten (PoM) erkennen |
14 | FEATURE_BM_CV_ON | 0: Der Detektor leitet CV-Antworten des Dekoders nicht weiter 1: Der Detektor leitet CV-Antworten des Dekoders weiter |
28 | FEATURE_BM_DYN_STATE_INTERVAL | 0: Der Detektor leitet DYN-Antworten des Dekoders nicht weiter 1…255: Der Detektor leitet DYN-Antworten des Dekoders weiter; Intervall in Einheiten von 100ms |
29 | FEATURE_BM_RCPLUS_AVAILABLE | 0: Der Detektor versteht keine RailcomPlus-Antworten 1: Der Detektor kann RailcomPlus-Antworten von Dekodern melderabschnittsbezogen weiterleiten 2: Der Detektor kann RailcomPlus-Antworten von Dekodern global weiterleiten (MNUM=255) |
31 | FEATURE_BM_POSITION_ON | 0: Der Detektor leitet Positionsmeldungen des Dekoders nicht weiter 1: Der Detektor leitet Positionsmeldungen des Dekoders weiter |
32 | FEATURE_BM_POSITION_SECACK | 0: Der Detektor wiederholt Positionsmeldungen des Dekoders nicht. 1…255: Das Secure-ACK-Quittungsverfahren ist für Positionsmeldungen enabled. Der Wert gibt das Retransmitintervall in Einheiten von 10ms an. Empfohlen ist eine Einstellung von 20 entsprechend 200ms. |
Es folgen 2 Bytes: START, ENDE.
Mit diesem Befehl werden die vom Detektor erfassten Lok-Adressen erneut übertragen und zwar für die Abschnitte von Index START bis Index ENDE-1. Es erfolgt eine Reihe von (Einzel-)Adressmeldungen (MSG_BM_ADDRESS). Wenn ein Abschnitt keine Lokadresse enthält, wird dieser Abschnitt mit Adresse 0 übertragen. Wenn ein Abschnitt am Detektor nicht existiert, wird nichts übertragen. Ein globaler Detektor kann mit START=255 und optional ENDE=0 abgefragt werden.
Die Nachricht ist nur verfügbar, wenn das FEATURE_BM_ADDR_DETECT_ON gesetzt ist.
Mit diesem Befehl wird eine Positionsmeldung eines Dekoders zurück an den Detektor übertragen. Bei aktiviertem Secure-ACK-Quittungsverfahren (FEATURE_BM_POSITION_SECACK) wird die letzte Positionsmeldung vom Detektor nochmal übertragen, falls der dem Detektor bekannte Ort für den Dekoder nicht mit der Mirrormeldung übereinstimmt.
Liegen dem Detektor keine Ortsinformationen zu dem Dekoder vor oder ist Secure-ACK nicht aktiviert, ignoriert der Detektor diese Nachricht.
Es folgen fünf Bytes mit der Adresse des Dekoders und der ID der Ortsmarke, kodiert wie bei MSG_BM_POSITION.
Sowohl in Belegtmeldern als auch in anderen Knoten, wie etwa Boostern, können bidirektionale Nachrichten (railcom) der Fahrzeug- bzw. Stationärdekoder ausgewertet werden. Globale Detektoren, die nicht zwischen mehreren Meldeabschnitten unterscheiden, setzen das MNUM-Feld auf 255.
Bei der Meldung einer Dekoderadresse wird folgendes Schema verwendet:
Wert | Bedeutung | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
0 | keine Adresse erkannt. | ||||||||||
1…10239 | Lok- bzw. Zubehöradresse. Zur Unterscheidung werden die beiden MSB verwendet.
|
In Knoten, die BiDi unterstützen, dienen die folgenden BiDiB-Nachrichten zur Weiterleitung der entsprechenden Rückmeldungen:
Mit dieser Meldung wird das Auftreten einer Lok in einem bestimmten Abschnitt angezeigt.
Es folgen drei oder mehrere Bytes: MNUM, ADDRL, ADDRH, [ADDRL, ADDRH], ...
Ist nur ein Dekoder im Abschnitt, so erfolgt eine 3 Byte Meldung. Sind mehrere Dekoder im Abschnitt, so werden die Adressen der Dekoder in folgenden Bytepaaren ADDRL, ADDRH übertragen. Es können maximal 16 Adressen in einem Abschnitt gemeldet werden. Dies gilt auch für globale Detektoren. Adressmeldung ist dort nur für kleine Aufbauten (z.B. Programmiergleis) vorgesehen.
Parameter | Beschreibung |
---|---|
MNUM | Lokale Nummer des Belegtmelders, Wertebereich 0…127; 255 |
ADDR[2][1…16] | Adressen der Lok- bzw. Zubehördekoder. Wertebereich entsprechend dem DCC-Wertebereich, kodiert wie oben beschrieben |
(noch genauer zu spezifizieren)
Mit dieser Meldung wird die Rückmeldung eines Accessory Dekoders angezeigt.
CV-Meldung, es folgen fünf Bytes: ADDRL, ADDRH, CVL, CVH, DAT
Parameter | Beschreibung |
---|---|
ADDR[2] | Adresse des meldenden Dekoders, kodiert wie oben beschrieben |
CV[2] | CV, Wertebereich 0…1023; 0 entspricht der CV1 |
DAT | Das gelesene Datum. |
CV-Meldung einer POM-Operation. Es folgen 10 bis 13 Bytes: ADDRL/DID0, ADDRH/DID1, 0/DID2, 0/DID3, 0/VID, OPCODE, CVL, CVH, CVX, DATA[1…4]
Alle Parameter sind wie bei MSG_CS_POM kodiert, eine Lokadresse enthält jedoch zusätzlich die Aufgleisrichtung wie oben beschrieben.
Geschwindigkeits-Meldung, es folgen vier Bytes: ADDRL, ADDRH, SPEEDL, SPEEDH
Parameter | Beschreibung |
---|---|
ADDR[2] | Adresse des meldenden Dekoders, kodiert wie oben beschrieben |
SPEED[2] | Geschwindigkeit in km/h, Lowbyte wird zuerst übertragen |
FEATURE_BM_ISTSPEED_INTERVAL legt fest, wie oft die Übertragung erfolgt. Empfohlen ist eine Einstellung von mind. 200ms. Der Detektor soll Speednachrichten mitteln, wenn diese vom Dekoder häufiger als die eingestellte Übertragungsrate eintreffen. Sollte keine Änderung der Geschwindigkeit erfolgen, soll der Detektor nichts übermitteln, dies gilt insbesondere bei der Geschwindigkeit 0.
Die MSG_BM_SPEED soll nur einmal je (Lok-)Dekoder erfolgen, auch wenn dieser Dekoder aktuell verschiedene Abschnitte überbrückt und daher in diesen Abschnitten zugleich erfasst wird.
MSG_BM_SPEED wird nur spontan gemeldet und kann nicht abgefragt werden. Durch Setzen oder Löschen des FEATURE_BM_ISTSPEED_INTERVAL kann die Übertragung zu- oder abgeschaltet werden.
MSG_BM_SPEED Nachrichten mit Adressfeld = extended Accessory werden von stationären Messanlagen gesendet.
Zustands-Meldung eines Dekoders, es folgen fünf oder mehr Bytes beginnend mit MNUM, ADDRL, ADDRH, DYN_NUM.
Parameter | Beschreibung | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
MNUM | Lokale Nummer des Belegtmelders, Wertebereich 0…127; 255 | ||||||||||||||||||||||||||
ADDR[2] | Adresse des meldenden Dekoders, kodiert wie oben beschrieben | ||||||||||||||||||||||||||
DYN_NUM | Kennzeichnung des übertragenen Zustand.
| ||||||||||||||||||||||||||
VALUE[1…N] | Zustandswert, ein Byte sofern nicht anders angegeben.
|
FEATURE_BM_DYN_STATE_INTERVAL legt fest (in Einheiten von 100ms), wie oft die Übertragung erfolgt. Empfohlen ist eine Einstellung von mind. 1s. FEATURE_BM_DYN_STATE_INTERVAL = 0 schaltet die Übertragung ab. Der Detektor soll Zustandmeldungen der Lok nicht übermitteln, wenn diese vor Ablauf von eines FEATURE_BM_DYN_STATE_INTERVAL vom Lokdekoder eintreffen.
Die MSG_BM_DYN_STATE soll nur einmal je (Lok-)Dekoder erfolgen, auch wenn dieser Dekoder aktuell verschiedene Abschnitte überbrückt und daher zugleich in mehreren Abschnitten erfasst wird.
MSG_BM_DYN_STATE wird nur spontan gemeldet und kann nicht abgefragt werden. Durch Setzen oder Löschen des Features FEATURE_BM_DYN_STATE_INTERVAL kann die Übertragung zu- oder abgeschaltet werden.
Hintergrund-Information zur DYN_NUM = 1: Entsprechende Lokdekoder vorausgesetzt (diese müssen railcom ID7, Sub-ID7 bedienen) kann damit eine Art Quality-of-Service Anzeige realisiert werden. Der Lokdekoder führt eine Statistik über alle empfangenen DCC-Pakete (Zahl fehlerhafter Pakete / Gesamtzahl). Diese Statistik wird an den Detektor übertragen und von BiDiB weitergeleitet. Das Hostprogramm entscheidet dann über die Auswertung: korreliert der Fehler mit der Lok, kann ein Hinweis über verschmutzte Radkontakte ausgegeben werden, korreliert der Fehler mit dem Gleisabschnitt, kann auf verschmutztes Gleis geschlossen werden.
Hintergrund-Information zur DYN_NUM = 6: Diese Meldung dient zum genauen Rangieren bzw. zum genauen Vermessen einer Modellanlage. Die Daten werden aus der Rückmeldung des Dekoders gewonnen (Railcom ID07, DV22 und DV23). Die Informationen unterliegen einer Streuung hinsichtlich des Erfassungszeitpunktes abhängig von der DCC-Wiederholrate. Für die Auswertung relevant sind daher sowohl die Belegtmeldungen des Abschnitts als auch die DISTANCE-Meldungen des Dekoders. Beide sind daher - bei gesetztem FEATURE_BM_TIMESTAMP_ON - mit millisekundengenauen BiDiB-Systemzeitstempeln gekennzeichnet, womit ein sehr guter Näherungswert für die exakte Fahrzeugposition durch Interpolation errechnet werden kann.
Meldung eines Dekoders im RailcomPlus-Anmeldeprozess. Ein BiDi-Detektor sendet diese Nachricht ab, wenn im Anmeldevorgang eine entsprechende Rückmeldung eines oder mehrerer Dekoder im Abschnitt erkannt wurde.
Es folgen zwei oder mehr Bytes: MNUM OPCODE DECVID DECUID[4]
Parameter | Beschreibung |
---|---|
MNUM | Lokale Nummer des Belegtmelders, Wertebereich 0…127; 255 |
OPCODE | Klassifizierung der Antwort, s.u. |
DEC_MUN[4] | Seriennummer des Dekoders. Diese 4 Bytes (Manufacturer Unique Number) bilden zusammen mit der DEC_MID die Unique-ID des Dekoders (DID). |
DEC_MID | Herstellerkennung des Dekoders (Manufacturer IDentifier, wie DCC Vendor ID) |
Wert | Bedeutung | |||
---|---|---|---|---|
T | C | P | ||
RC_PONG | LOCO | OKAY | 0 | Auf den Gleisausgabebefehl PING oder FIND hat genau ein Dekoder geantwortet. T gibt an, ob ein Lok- oder Accessory-Dekoder geantwortet hat. C gibt an, ob der Dekoder die CID dieses Systems bereits kennt; wenn nicht dann sind weitere Abfragen erforderlich, insbesondere eine Kontrolle der Adresse. P gibt die Orientierung des Dekoders an. Es folgen 5 Bytes mit der DID des antwortenden Dekoders. |
1 | ||||
NEW | 0 | |||
1 | ||||
ACCESSORY | OKAY | 0 | ||
1 | ||||
NEW | 0 | |||
1 | ||||
RC_PING_COLLISION | 0 | Auf den Gleisausgabebefehl PING haben mehrere Dekoder gleichzeitig geantwortet. Die Antwort am Gleis ist nicht kollisionsfrei und fehlerhaft. | ||
1 | ||||
RC_FIND_COLLISION | 0 | Auf den Gleisausgabebefehl FIND haben mehrere Dekoder gleichzeitig geantwortet.
Die Antwort am Gleis ist nicht kollisionsfrei und fehlerhaft. Es folgen 5 Bytes mit der DID des Suchbefehls, auf den geantwortet wurde. | ||
1 | ||||
RC_BIND_ACCEPTED | LOCO | Auf den Gleisausgabebefehl BIND ist eine Bestätigung des Dekoders erfolgt.
Der Dekoder ist unter der zugewiesenen Adresse ansprechbar. Es folgen 7 Bytes mit der DID des quittierenden Dekoders sowie der befohlenen Adresse, kodiert wie oben beschrieben, um den Aufbau einer Zuordnungstabelle im Host zu erleichtern. | ||
ACCESSORY |
Positionsmeldung. Es folgen fünf Bytes: ADDRL, ADDRH, TYPE, LOCATIONL, LOCATIONH
Parameter | Beschreibung |
---|---|
ADDR[2] | Adresse des meldenden Dekoders, kodiert wie oben beschrieben. |
TYPE | Art der Ortsangabe:
|
LOCATION[2] | Ortsangabe des Dekoders, Lowbyte wird zuerst übertragen. |
Positionsmeldungen werden gesendet, wenn ein Fahrzeugdekoder über bidirektionale Nachrichten seine Position bekanntgibt. Diese bestimmt er üblicherweise aus Ortsmarken, die ihre Kennnung (ID, auch: Adresse) per Infrarot oder Ähnlichem direkt an das Fahrzeug übertragen. Auch beim Wechsel zwischen Funkzellen kann der Dekoder den Host über die neue Verbindung informieren. Im Gegensatz zu Belegtmeldungen, bei denen die Fahrzeuge von einem fest installierten Sensor detektiert werden und je Meldeabschnitt (MNUM) ein oder mehrere Dekoderadressen vorliegen können, wird hier jeder Dekoderadresse eine Ortskennung pro Typ zugeordnet.
MSG_BM_POSITION wird nur spontan gemeldet und kann nicht abgefragt werden. Durch Setzen oder Löschen des FEATURE_BM_POSITION_ON kann die Übertragung zu- oder abgeschaltet werden.
Ist das FEATURE_BM_POSITION_SECACK aktiviert, muss der Host sofort eine MSG_BM_MIRROR_POSITION mit demselben Inhalt an den Detektor zurücksenden. Bis diese Quittung eingetroffen ist, wird die Nachricht im eingestellten Intervall mehrfach wiederholt. Um keine Meldungsflut zu verursachen, ist die Zahl der Wiederholungen zu begrenzen; längere Ausfälle werden vom Businterface behandelt. Liegt die Quittung danach immer noch nicht vor, wird eine Fehlermeldung mit dem Code BIDIB_ERR_NO_SECACK_BY_HOST gesendet.
Es soll darauf geachtet werden, je Dekoder erst dann eine neue Position zu melden, wenn die vorherige bestätigt worden ist.
MSG_BM_POSITION-Nachrichten mit Adressfeld = extended Accessory werden von stationären Empfängern gesendet, die zur Identifikation von Ortsmarken dienen.
Booster dienen zum Verstärken und Aufbereiten des Gleissignals, je nach Größe der Modellanlage können diese mehrfach vorhanden sein.
Booster verstärken das Gleissignal und stellen es an ihrem Ausgang zur Verfügung. Hierzu verwenden sie ein eigenes Netzteil. Wenn als Busmedium BiDiBus verwendet wird, so wird über den Bus auch das DCC-Signal (mit RS485-Pegeln) übertragen.
Booster haben fallweise Diagnosemöglichkeiten (Ausgangsstrom und -spannung messen, Kurzschlusserkennung), Bedienmöglichkeiten (An- und Abschalten), und können einen globalen Detektor für railcom enthalten. In diesem Fall ist der Booster in der Lage, entsprechende Nachrichten zu senden (siehe auch Klasse Belegtmelder). Er verwendet den Wert 255 für das MNUM-Feld.
Kontrolle von Boostern:
Prinzipiell wird zwischen dem Zustand der Gleisausgabe (GO, SOFTSTOP, STOP) und dem Zustand der Booster unterschieden, d.h. auch wenn die Gleisausgabe auf STOP geht, bleiben die Booster in Betrieb. Erst wenn die Gleisausgabe komplett abgeschaltet wird, schalten auch die Booster ab. Dies ist notwendig, um ein versehentliches Losfahren der Lokomotiven bedingt durch die Analogerkennung in den Dekodern zu verhindern.
Es kann der Fall eintreten, dass Booster am Ausgang gegenseitig verbunden sind (z. B. durch ein Fahrzeug, welches gerade eine Versorgungsgrenze überbrückt). BiDiB trägt dem Rechnung und legt fest, dass Boosternachrichten i. d. R. als Broadcast zu verteilen sind. Der Host schickt daher eine Änderung des Boosterzustand (ON, OFF) nur an das Interface, dieses sendet die Nachricht als Broadcast an alle angeschlossenen Booster.
Es ist auch möglich, einzelne Booster gezielt an- oder abzuschalten (durch direkte Adressierung). Egal ob ein Booster über Broadcast oder individuell umgeschaltet wurde, er meldet immer seinen Statuswechsel an den Host. Das bedeutet z. B. wenn man ein System mit 10 Boostern hat und sendet an das Interface MSG_BOOST_ON (Broadcast), so entstehen 10 MSG_BOOST_STAT-Nachrichten.
Mehrere Gleisausgabeknoten und Booster:
Es ist denkbar, dass nicht nur das Interface eine Gleissignalerzeugung meldet, sondern auch weitere Knoten (z. B. separate DCC-Schaltansteuerung). Diese Knoten sind dann vom Host mit separatem BOOST_ON bzw. BOOST_OFF anzusteuern. Sollte einem solchen Knoten eine Unterstruktur mit weiteren Boostern zugeordnet sein, dann gelten die Broadcast nur für diesen Teilast, vom Hauptverteiler ist das abgekoppelt.
Enthält der Booster einen globalen Detektor für BiDi-Nachrichten von Dekodern, so muss er zusätzlich die entsprechenden Features (siehe BiDi-Detektoren) unterstützen.
Nummer | Name | Bedeutung | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
15 | FEATURE_BST_VOLT_ADJUSTABLE | Ausgangsspannung einstellbar Wenn dieses Feature ungleich 0 ist, dann kann die Ausgangsspannung des Boosters konfiguriert werden. | ||||||||||||||||
16 | FEATURE_BST_VOLT | Die Ausgangsspannung ist der hier angegebene Wert in Volt. | ||||||||||||||||
17 | FEATURE_BST_CUTOUT_AVAILABLE | Cutout verfügbar. 1 = Der Booster kann eine Austastlücke erzeugen | ||||||||||||||||
18 | FEATURE_BST_CUTOUT_ON | Cutout eingeschaltet. 1 = Der Booster erzeugt die Austastlücke | ||||||||||||||||
19 | FEATURE_BST_TURNOFF_TIME | Abschaltzeit normal Zeitdauer, welche nach einem Kurzschluss bis zum Abschalten benötigt wird. Booster, welche das nicht variabel haben, sollen den eingestellten Wert zurückliefern. Der Wert ist in der Einheit 1ms angegeben. | ||||||||||||||||
20 | FEATURE_BST_INRUSH_TURNOFF_TIME | Abschaltzeit Inrush (optional) Zeitdauer, während welcher ein Kurzschluss sofort nach dem Einschalten (bedingt durch Einschaltstrom-Spitze) toleriert wird. Der Wert in der Einheit 1ms angegeben. | ||||||||||||||||
21 | FEATURE_BST_AMPERE_ADJUSTABLE | Ausgangsstrom ist einstellbar Wenn dieses Feature ungleich 0 ist, dann kann der maximale Ausgangsstrom des Boosters konfiguriert werden. | ||||||||||||||||
22 | FEATURE_BST_AMPERE | maximaler Ausgangsstrom max. Ausgangsstrom. Dieses Feature ist so kodiert wie die Strommessung (siehe MSG_BOOST_DIAGNOSTIC). Es kann sein, dass der gewünschte Wert nicht einstellbar ist, der Knoten stellt dann den nächstkleineren Strom und sofern dieser 0 ist, den minimal möglichen Strom ein. Der eingestellte Wert kann dann wieder abgefragt werden.
| ||||||||||||||||
23 | FEATURE_BST_CURMEAS_INTERVAL | Diagnoseintervall Der Booster kann Diagnosewerte (z. B. Strommessdaten, Temperatur, Spannungen) liefern, wenn dieses Feature ungleich 0 ist, dann ist Strommessung enabled. Der Wert gibt das Abtastintervall der Strommessung in Einheiten von 10ms an. Empfohlen ist eine Einstellung von 200 entsprechend 2s. Der Knoten soll ein Intervall von 100ms nicht unterschreiten. | ||||||||||||||||
26 | FEATURE_BST_INHIBIT_AUTOSTART | Normalerweise startet ein Booster automatisch, wenn DCC an seinem Eingang eingeschaltet wird. Wenn dieses Feature auf 1 gestellt ist, dann wird dieser Start unterbunden und der Booster muss explizit mit einer MSG_BOOST_ON eingeschaltet werden. Es ist damit z. B. möglich, gezielt Anlagenbereiche dauerhaft stromlos zu schalten. | ||||||||||||||||
27 | FEATURE_BST_INHIBIT_LOCAL_ONOFF | Sollte ein Booster über lokale Taster für Stop und Go verfügen, so kann mit diesem Feature entschieden werden, ob diese Taster wirken. Wenn dieses Feature auf 1 gestellt ist, dann wird der Tastendruck nicht direkt ausgewertet, sondern an den Host (als Boosterstatus) gemeldet. Der Host kann das weitere Vorgehen entscheiden (Anwendung: dezentrale Nothalttaster) |
Mit diesem Befehl wird die Gleisspannung eingeschaltet. Es folgt ein Byte (UNICAST), welches definiert, ob die Nachricht als Broadcast weiterverteilt werden soll oder nicht. Der Knoten antwortet mit MSG_BOOST_STAT.
Wert | Bedeutung |
---|---|
0 | Ein Interface muss diese Nachricht als Broadcast an alle angeschlossenen Knoten verteilen, damit das Einschalten der Booster möglichst synchron erfolgt. Die Einschaltnachricht gilt für den Interfaceknoten sowie alle dem Interface nachgelagerten Knoten, die das Gleissignal aus dem Bus entnehmen. |
1 | Die Einschaltnachricht gilt nur für diesen Knoten |
Es ist zu beachten, dass Booster auch über einen Statuswechsel der DCC-Erzeugung eingeschaltet werden können, sofern dies nicht durch ein gesetztes Feature FEATURE_BST_INHIBIT_AUTOSTART blockiert ist.
Wenn im Moment des Einschaltens kein DCC vorhanden ist, dann schaltet der Booster nicht ein. Daraus ergeben sich je nach Einschaltreihenfolge unterschiedliches Verhalten:
Mit diesem Befehl wird die Gleisspannung ausgeschaltet. Es folgt ein Byte (UNICAST), welches definiert, ob die Nachricht als Broadcast weiterverteilt werden soll oder nicht. Der Knoten antwortet mit MSG_BOOST_STAT.
Wert | Bedeutung |
---|---|
0 | Ein Interface muss diese Nachricht als Broadcast an alle angeschlossenen Knoten verteilen. Die Nachricht gilt für den Interfaceknoten sowie alle dem Interface nachgelagerten Knoten, die das Gleissignal aus dem Bus entnehmen. |
1 | Die Nachricht gilt nur für diesen Knoten. |
Es folgen keine weiteren Daten. Mit diesem Befehl wird der Status des Boosters abgefragt. Sofern Spannungs- oder Strommessung verfügbar ist, wird auch diese mit übermittelt.
Der Knoten antwortet mit einer MSG_BOOST_STAT und optional MSG_BOOST_DIAGNOSTIC.
Booster können neben ihrem Status auch Stromverbrauch und Bidi-Ergebnisse melden. Falls dies unterstützt wird, werden dazu die Bidi-Detektor-Nachrichten verwendet. Bei der Gleisausgabe können bei Boostern sowohl behebbare als auch permanente Fehler auftreten. Mögliche Fehler sind z. B. Übertemperatur, Fremdspeisung, Kurzschluss, ...
Noch in Diskussion: Soll man diese mit einer eigenen Nachricht übermitteln oder besser in Status kodieren.
Nach einer Statusänderung des Boosters wird diese Nachricht abgesendet. Diese Statusänderung kann durch einen Hostbefehl oder durch Hardwarebedingungen hervorgerufen sein. Es folgt ein Byte mit dem Status, generell kodiert dabei das MSB den Einschaltzustand, das nächste Bit die Zuordnung des Booster zur Busstruktur (DCC-Eingang), weitere Bits kennzeichnen darüber hinausgehende Zustände:
Bit | Bedeutung | ||||
---|---|---|---|---|---|
7 | Betriebszustand
| ||||
6 | Buszugehörigkeit (für DCC-Signal)
| ||||
5…0 | Zusätzliche Information zum Boosterzustand. |
Wert | Name | Bedeutung |
---|---|---|
0x00 | BIDIB_BST_STATE_OFF | Booster ist abgeschaltet (allgemein, z. B. aufgrund Host-Befehl). |
0x01 | BIDIB_BST_STATE_OFF_SHORT | Booster ist abgeschaltet (wegen Kurzschluss). |
0x02 | BIDIB_BST_STATE_OFF_HOT | Booster ist abgeschaltet (wegen Übertemperatur). |
0x03 | BIDIB_BST_STATE_OFF_NOPOWER | Booster ist abgeschaltet (wegen fehlender Netzspannung). |
0x04 | BIDIB_BST_STATE_OFF_GO_REQ | Booster ist abgeschaltet und es liegt eine Einschalt-Anforderung vor. |
0x05 | BIDIB_BST_STATE_OFF_HERE | Booster ist abgeschaltet (aufgrund lokalen Tastendrucks). |
0x06 | BIDIB_BST_STATE_OFF_NO_DCC | Booster ist abgeschaltet (wegen fehlendem Eingangssignal). |
0x80 | BIDIB_BST_STATE_ON | Booster ist eingeschaltet. |
0x81 | BIDIB_BST_STATE_ON_LIMIT | Booster ist eingeschaltet und läuft in der Strombegrenzung. |
0x82 | BIDIB_BST_STATE_ON_HOT | Booster ist eingeschaltet und ist im kritischen Temperaturbereich. |
0x83 | BIDIB_BST_STATE_ON_STOP_REQ | Booster ist eingeschaltet und es liegt eine Stop-Anforderung vor. |
0x84 | BIDIB_BST_STATE_ON_HERE | Booster ist eingeschaltet (aufgrund lokalen Tastendrucks). |
Hinweis: GO- oder STOP-Anforderungen können fallweise dezentral anfallen (z. B. durch auf der Anlage verteilte Notaustaster), das Feature FEATURE_BST_INHIBIT_LOCAL_ONOFF entscheidet in diesem Fall über das Verhalten:
Diagnose-Meldung eines Booster als Liste, diese umfasst z. B. Strom-Meldung, Spannung, Temperatur.
Die Meldewerte sind jeweils Paare, bestehend aus einer Kennung der Meldungsart und dem Meldewert.
DIAG_LIST ::= DIAG_PAIR | DIAG_PAIR DIAG_LIST DIAG_PAIR ::= DIAG_ENUM DIAG_VALUE
Name | Code | Bedeutung | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
BIDIB_BST_DIAG_I | 0x00 | Stromwert.
| ||||||||||||||||||||
BIDIB_BST_DIAG_V | 0x01 | Spannungswert.
| ||||||||||||||||||||
BIDIB_BST_DIAG_TEMP | 0x02 | Temperatur (signed char).
|
Eine Modelleisenbahnsteuerung besteht fallweise aus mehreren mehr oder minder autonomen Komponenten. Der Anwender trifft Eingaben durch sie oder möchte Rückmeldung durch Statusanzeigen und -meldungen bekommen. All diese Systeme müssen in die Steuerung und Absicherung einbezogen werden und benötigen dazu Zugriff auf das BiDiB-System in verschiedener Tiefe. Zu ihnen gehören unter anderem:
Auf technischer Seite werden auch Anwendungen ermöglicht wie:
Das Konzept eines zentralen Hosts, der alleine für den sicheren Betrieb verantwortlich ist und die volle Kontrolle über sein BiDiB-Netz ausübt, wird dabei nicht aufgegeben. Er sitzt an der Wurzel des Adressbaumes, empfängt alle Upstream-Nachrichten von den ihm untergebenen Knoten und sendet alle Downstream-Nachrichten.
Ein Host kann als Gastgeber einen Gastzugang bereitstellen, auf dem er verschiedene Dienste zum Zugriff auf sein Netz anbietet. Andere Bediengeräte können sich als Gast mit diesem Gastgeber verbinden und verschiedene Anfragen (Requests) schicken.
Ein Host ist nicht verpflichtet, irgendwelche Dienste bereitzustellen. Spontannachrichten mit Anfragen von Gästen kann er durch MSG_SYS_DISABLE unterbinden. Ein Gastgeber ist jederzeit dazu berechtigt, Anfragen abzuweisen.
Empfängt ein Gastgeber eine Anfrage oder will er von sich aus etwas mitteilen, kann er dem Gast auf dem jeweiligen Weg eine Antwort (Response) zukommen lassen.
Gast-Knoten können unterschiedlich ausgeprägt sein: Es kann sich um eine in Hardware ausgeführte Baugruppe handeln, die eine physische Benutzerschnittstelle enthält. Der Knoten kann aber auch rein der Kommunikation zwischen autonomen Geräten dienen und etwa als Programmierschnittstelle (API) oder Netzwerkschnittstelle ausgeführt sein. Eine solche Software-Instanz zeichnet sich unter anderem dadurch aus, dass sie eine zufällig erzeugte Unique-ID verwenden kann (vgl. netBiDiB). Zum Ausgleich dafür sind die MSG_STRING_*-Nachrichten für Produktname und Username verpflichtend, der Username soll auch direkt beim Start oder in den Einstellungen der Software vergeben werden können.
Ein Gast, der die Kontrolle über einen Teil des BiDiB-System übernehmen möchte, kommuniziert ausschließlich mit dem Gastgeber, der seinerseits die volle Verantwortung über das System hat. Für den Zugriff auf Knoten kapselt der Gast die üblichen BiDiB-Downstream-Nachrichten (konkret deren Typ und Datenteil) in REQ_SEND-Nachrichten ein und sendet das Gesamtpaket an den Gastgeber. Der Gastgeber dient dabei als Stellvertreter des Zielknotens (Proxy) und leitet die eingekapselten Nachrichten nach erfolgreicher Prüfung der Zugriffsrechte an den vom Gast adressierten Knoten weiter. In Gegenrichtung werden Antworten sowie die abonnierte Kommunikation mit dem Zielknoten vom Gastgeber in RESP_NOTIFY-Nachrichten eingekapselt und an den Gast gesendet.
Ein Gast-Knoten erfährt per MSG_SYS_ENABLE, ob der Host Gast-Nachrichten unterstützt. Er darf nicht einfach spontan Nachrichten senden (ohne je eine Antwort zu bekommen). Bekommt er eine MSG_SYS_ENABLE ohne dass Gast-Nachrichten erlaubt werden, soll er eine Fehlermeldung zeigen.
Um Anfragen zu den von ihm kontrollierten Knoten entsprechend beantworten zu können, verwaltet ein Gastgeber eine Struktur in der gespeichert ist, welche Nachrichtenarten von welchen Knoten an welche Gäste weitergeleitet werden sollen. Bekommt er eine Anfrage eines Gastes, an einen bestimmten Knoten eine bestimmte Nachrichten zu senden, und lässt er dies zu (führt das Senden des Downstream-Befehls aus), so trägt er die erwarteten Antwortmöglichkeiten ein um beim Eintreffen der Upstream-Antwort diese an den Gast weiterleiten zu können.
Sämtliche Anfragen und Antworten beziehen sich auf einen bestimmten Knoten im System des Gastgebers. Dabei kann es sich sowohl um physische Baugruppen handeln, die über ein Bussystem an den Gastgeber angeschlossen sind, als auch um virtuelle Knoten (typischerweise mit VID=0), die vom Gastgeber simuliert werden. Der Gastgeber kann so auch beliebige interne Objekte abbilden (etwa Fahrstraßen, Blöcke, Berechtigungen, Fahrtaufträge, Zubehörabläufe etc) oder Legacy-Systeme ohne BiDiB-Unterstützung in das System integrieren. Der Gastgeber kann für diese Knoten ausgesuchte Nachrichtentypen implementieren und dem Gast so die Ausführung bestimmter Befehle ermöglichen, nicht implementierte Nachrichtentypen werden einfach immer abgelehnt.
Ein Knoten kann vom Gast auf verschiedene Weisen adressiert werden, die Zielangabe besteht aus einem Byte mit dem Modus und davon abhängigen weiteren Parametern. Der Gastgeber löst die Zielangabe in der Nachricht zu einer Knotenreferenz auf und diese weiter zu einer Session-Adresse. Mit dem TARGET_MODE wird die Art der gewünschten Zieladressierung beschrieben:
Wert | Name | Bedeutung |
---|---|---|
0x00 | BIDIB_TARGET_MODE_UID | Es folgen 5 Bytes mit der VID und PID eines Knotens, also dessen Unique-ID ohne die Klassenbits. Der Gastgeber löst die UID anhand seiner Knotenliste zu einer Session-Adresse auf. Dieser Adressierungsmodus ist zu verwenden, wenn der Gast einen bestimmten, bereits bekannten Zielknoten ansprechen will. Durch die Identifikation über die UID statt der Verwendung einer Session-Adresse kann der Gast darauf verzichten, den Knotenbaum zu laden und aktuell zu halten. Dies ist insbesondere für Bediengeräte wie beispielsweise Stellpullte geeignet, bei denen der Nutzer einen bestimmten Zielknoten in die Konfiguration von Elementen oder Aktionen eingetragen hat. Dazu zählen etwa auch Teilnehmer, die DCC-Befehle bestimmten Knoten zuordnen. |
0x01 | BIDIB_TARGET_MODE_ALL | Es folgen keine Parameter. Dieser Adressierungsmodus hat eine besondere Bedeutung in Abonnement-Nachrichten: er repräsentiert ein globales Abonnement auf allen Knoten im System. Bei Verwendung in REQ_SEND soll der Zielknoten wie bei BIDIB_TARGET_MODE_TOP aufgelöst werden. Dieser Adressierungsmodus ist inbesondere für Logger (zum passiven Monitoring) oder für Konfigurationsprogramme geeignet, die selbst den gesamten Knotenbaum einlesen ohne ein bestimmtes Ziel zu haben. |
0x02 | BIDIB_TARGET_MODE_TOP | Es folgen keine Parameter. Der Gastgeber wählt selbstständig den von ihm kontrollierten Knoten aus. Dieser bildet die Wurzel des Knotenbaums des für den Gast sichtbaren BiDiB-Systems und ist typischerweise ein Hub-Knoten. Ein Hostprogramm wählt typischerweise den "obersten" Knoten des Systems, d.h. den direkt mit dem Host verbundenen Knoten dafür aus. Es kann sich aber auch um einen virtuellen Knoten handeln, der den Host selbst repräsentiert, und als Hub mehrere verbundene BiDiB-Systeme einbindet. Dieser Adressierungsmodus ist inbesondere für das Einlesen der verfügbaren Knoten durch den Gast geeignet, etwa für eine Auswahlliste in einer graphischen Bedienoberfläche. Über das Einlesen der Knotentabellen an über BIDIB_TARGET_MODE_UID gewählte Knoten kann der Gast rekursiv den Knotenbaum einlesen, der Start erfolgt dabei mit BIDIB_TARGET_MODE_TOP wenn noch keine Unique-ID bekannt ist. |
0x08 | BIDIB_TARGET_MODE_SWITCH | Es folgen keine Parameter. Der Gastgeber wählt selbständig die von ihm kontrollierten Schaltzubehör-Knoten aus. Dieser Adressierungsmodus ist bevorzugt zu verwenden, wenn der Gast nur einen minimalen spezifischen Funktionsumfang für Konfiguration und direkten Portzugang hat, die Zuordnung zum konkreten Knoten jedoch im Hostprogramm vorgenommen werden soll. Kann eine Ausführungsanfrage (MSG_GUEST_REQ_SEND) nicht eindeutig auf einen Knoten aufgelöst werden, wird die Anfrage abgelehnt. |
0x09 | BIDIB_TARGET_MODE_BOOSTER | Es folgen keine Parameter. Der Gastgeber wählt selbständig die von ihm kontrollierten Booster-Knoten aus.
Dieser Adressierungsmodus ist bevorzugt zu verwenden, wenn der Gast nur einen minimalen spezifischen Funktionsumfang für Boostersteuerung hat, die Zuordnung zu konkreten Aktionen jedoch im Hostprogramm vorgenommen werden soll. Kann eine Ausführungsanfrage (MSG_GUEST_REQ_SEND) nicht eindeutig auf einen Knoten aufgelöst werden, wird die Anfrage abgelehnt. |
0x0A | BIDIB_TARGET_MODE_ACCESSORY | Es folgen keine Parameter. Der Gastgeber wählt selbständig die von ihm kontrollierten Accessory-Knoten aus. Dieser Adressierungsmodus ist bevorzugt zu verwenden, wenn der Gast nur einen minimalen spezifischen Funktionsumfang für Schaltaufgaben hat, beispielsweise Taster und Zustandsanzeige für zweibegriffige Accessorys, während die Zuordnung zur konkreten Aktion im Hostprogramm vorgenommen werden soll. Kann eine Ausführungsanfrage (MSG_GUEST_REQ_SEND) nicht eindeutig auf einen Knoten aufgelöst werden, wird die Anfrage abgelehnt. |
0x0C | BIDIB_TARGET_MODE_DCCGEN | Es folgen keine Parameter. Der Gastgeber wählt selbständig die von ihm kontrollierten Gleissignalgenerator-Knoten aus. Dieser Adressierungsmodus ist von Bediengeräten mit DCC-Geschwindigkeits- u. Funktionssteuerung (Handregler, Stellpult, ...) bevorzugt zu verwenden,
diese müssen sich so nicht mit der Busverwaltung auseinandersetzen und keine Möglichkeit zur Auswahl eines individuellen Zielknoten anbieten.
Stattdessen verteilt das Steuerungsprogramm die von verschiedenen Gästen kommenden Fahrbefehle an die jeweils passende Gleisausgabe. Kann eine Ausführungsanfrage (MSG_GUEST_REQ_SEND) nicht eindeutig auf einen Knoten aufgelöst werden, wird die Anfrage abgelehnt. |
0x0F | BIDIB_TARGET_MODE_HUB | Es folgen keine Parameter. Der Gastgeber wählt selbständig die von ihm kontrollierten Knoten mit Hub-/Subknotenfunktionalität aus. Dieser Adressierungsmodus ist bevorzugt zu verwenden, wenn der Gast an Veränderungen der Baumstruktur (NODE_NEW/NODE_LOST) interessiert ist, um ggf. seine Subscriptions zu erweitern. |
Das Format der Zielangabe TARGET in vom Gast gesendeten Nachrichten ist dabei durch den TARGET_MODE wie folgt unterteilt:
TARGET_MODE | Parameter |
---|---|
0x00 | Es folgt eine UniqueID ohne Klassenbits, 5 Byte |
0x01…0x0F | Es folgen keine Bytes, der Host sendet direkt an einen bestimmten Knoten |
0x10…0xFF | reserviert. Nachrichten mit einem solchen Modus werden vom Gastgeber ignoriert und nicht beantwortet. |
Ein Gastgeber muss nicht alle Arten der Zieladressierung unterstützen. Er muss jedoch die verschiedenen Formate verstehen und alle Nachrichten mit TARGET_MODE ≤ 0x10 beantworten, bei Nichtunterstützung mit RESULT=0xFF.
Der Gast bittet den Gastgeber, bestimmte Nachrichten an und von dem ausgewählten Knoten an den Gast weiterzumelden. Der Gastgeber merkt sich diese Abonnements, kann sie aber auch jederzeit auslaufen lassen.
Der Gastgeber speichert dazu jede Gast-Zielknoten-Kombination. Ein Bitfeld zur groben Filterung, über welche Nachrichten von welchen Knoten der Gast informiert werden will, reicht dazu aus.
Unterschieden wird zwischen Upstream und Downstream sowie dem Bereich, zu welchem der Nachrichtentyp gehört.
Die definierten Nachrichtentypen im SUBSCRIPTION sind unabhängig vom verwendeten TARGET_MODE in der REQ_(UN)SUBSCRIBE Nachricht.
Parameter | Beschreibung | |||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TARGET[1;6] | Bestimmung des Zielknotens, bestehend aus TARGET_MODE und dessen Parametern — beim BIDIB_TARGET_MODE_UID folgen 5 Byte. | |||||||||||||||||||||||
SUBSCRIPTION[2] | Bitfeld mit der Auswahl, welche Nachrichen abonniert werden sollen:
|
Der Gastgeber antwortet mit RESP_SUBSCRIPTION_COUNT und beginnt danach automatisch mit dem Versand von RESP_SUBSCRIPTION für jeden aufgelösten Knoten.
Der Gast bittet den Gastgeber, das Weiterleiten bestimmter Nachrichten an und von dem ausgewählten Knoten an den Gast zu beenden.
Der Gastgeber antwortet mit RESP_SUBSCRIPTION_COUNT und beginnt danach automatisch mit dem Versand von RESP_SUBSCRIPTION für jeden aufgelösten Knoten, welcher den aktuellen Stand der ggf. weiterhin bestehenden Abonnements beinhaltet.
Es werden die gleichen Parameter wie für REQ_SUBSCRIBE verwendet.
Der Gast fordert den Gastgeber auf, die verpackte Nachricht an den ausgewählten Knoten zu senden.
Parameter | Beschreibung |
---|---|
TARGET[1;6] | Bestimmung des Zielknotens, bestehend aus TARGET_MODE und dessen Parametern — beim BIDIB_TARGET_MODE_UID folgen 5 Byte. |
REQ_MSG_TYPE | Nachrichtentyp der zu sendenden Nachricht |
REQ_DATA[0…N] | Weitere Parameter der zu sendenden Nachricht |
Der Gastgeber prüft, ob die Nachricht gesendet werden kann, und schickt sie fallweise an den Zielknoten. Die Sequenznummer (MSG_NUM) wird dazu vom Gastgeber generiert. Er antwortet in jedem Fall mit RESP_SENT als Empfangsbestätigung der Anfrage (solange TARGET_MODE ≤ 0x10).
Unabhängig vom Targetmode folgt in den Antworten vom Gastgeber an den Gast auf TARGET_MODE (1 Byte) immer TARGET_UID (5 Byte).
Der Gastgeber benachrichtigt den Gast über eine abonnierte Nachricht.
Parameter | Beschreibung |
---|---|
TARGET_MODE | Der TARGET_MODE des Abonnements. Der aktuelle Wert ist immer BIDIB_TARGET_MODE_UID. |
TARGET_UID[5] | Bestimmung des Knotens, der die Upstream-Nachricht gesendet hat bzw. an den die Downstream-Nachricht addressiert ist. Bestehend aus 5 Bytes mit der VID und PID, also der Unique-ID ohne die Klassenbits. |
SUB_MSG_NUM | Nachrichtennummer der vom Gastgeber empfangenen bzw. gesendeten Nachricht, oder 0 wenn die Nachricht lokal vom Gastgeber erzeugt wurde. |
SUB_MSG_TYPE | Nachrichtentyp der vom Gastgeber empfangenen bzw. gesendeten Nachricht. Das MSB des Typs kodiert, ob es eine Nachricht vom Gastgeber an das Ziel oder eine Nachricht vom Ziel an den Gastgeber ist. |
SUB_DATA[0…N] | Weitere Parameter der vom Gastgeber empfangenen bzw. gesendeten Nachricht |
Der Gastgeber bestätigt dem Gast, dass er eine REQ_SEND-Nachricht bekommen hat und was damit geschehen ist.
Parameter | Beschreibung | |||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TARGET_MODE | Der TARGET_MODE aus der REQ_SEND-Nachricht. | |||||||||||||||||||
TARGET_UID[5] | Bestimmung des Zielknotens, zu dem das TARGET der REQ_SEND-Nachricht aufgelöst wurde. Bestehend aus 5 Bytes mit der VID und PID, also der Unique-ID ohne die Klassenbits. Mit dieser UID werden später eventuelle Antworten des Zielknotens via RESP_NOTIFY übertragen. | |||||||||||||||||||
ACK_SEQ | Die Sequence-Number der bestätigten bzw. abgelehnten REQ_SEND-Nachricht. | |||||||||||||||||||
RESULT | Bestätigung, dass die angeforderte Nachricht gesendet wurde (MSB=0), oder warum dies nicht geschah (MSB=1).
| |||||||||||||||||||
DETAILS[0…N] | Abhängig von RESULT werden hier verschiedene Daten übertragen. Im Gutfall wird die Sequence-Number der vom Host an den Zielknoten gesendeten Nachricht angegeben, sofern die Antwort nicht bereits im Host vorlag. Im Falle einer Ablehnung (0x80) wird optional ein Präfix der zu sendenden Nachricht angegeben, für welche die Einschränkung gilt.
Kein Präfix bedeutet, dass sämtliche Nachrichten mit diesem Grund abgelehnt werden.
Ein Präfix von einem Byte bedeutet, dass nur dieser Nachrichtentyp abgelehnt wurde.
Ein Präfix von mehreren Byte bedeutet, dass nur dieser Nachrichtentyp bezogen auf den bestimmten Teil des Knotens abgelehnt wurde. |
Diese Nachricht wird zu Beginn der Übertragung gesendet, wenn der Gast mit MSG_GUEST_REQ_SUBSCRIBE/UNSUBSCRIBE angefragt hat.
Parameter | Beschreibung | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TARGET_MODE | Der TARGET_MODE aus der REQ_SUBSCRIBE/REQ_UNSUBSCRIBE-Nachricht. | ||||||||||||
TARGET_UID[5] | Bestimmung des Zielknotens, zu dem das TARGET der REQ_SUBSCRIBE/REQ_UNSUBSCRIBE-Nachricht aufgelöst wurde. Bestehend aus 5 Bytes mit der VID und PID, also der Unique-ID ohne die Klassenbits. Die abonnierten Nachrichten später mit dieser UID in RESP_NOTIFY übertragen. | ||||||||||||
ACK_SEQ | Die Sequence-Number der REQ_SUBSCRIBE/REQ_UNSUBSCRIBE-Nachricht. | ||||||||||||
RESULT | Quittung
| ||||||||||||
COUNT[2] | Zwei Bytes mit der Anzahl der entsprechend des TARGET aufgelösten Knoten. |
Der Gastgeber bestätigt ein Nachrichtenabonnement des Gasts oder teilt eine Änderung mit.
Parameter | Beschreibung | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
TARGET_MODE | Der TARGET_MODE aus der REQ_SUBSCRIBE/REQ_UNSUBSCRIBE-Nachricht. | ||||||||||||
TARGET_UID[5] | Bestimmung des Zielknotens, zu dem das TARGET der REQ_SUBSCRIBE/REQ_UNSUBSCRIBE-Nachricht aufgelöst wurde. Bestehend aus 5 Bytes mit der VID und PID, also der Unique-ID ohne die Klassenbits. Die abonnierten Nachrichten später mit dieser UID in RESP_NOTIFY übertragen. | ||||||||||||
ACK_SEQ | Die Sequence-Number der REQ_SUBSCRIBE/REQ_UNSUBSCRIBE-Nachricht. | ||||||||||||
RESULT | Quittung
| ||||||||||||
SUBSCRIPTION[2] | Aktive Nachrichtenauswahl, als Bitfeld wie bei REQ_SUBSCRIBE/REQ_UNSUBSCRIBE |
© Wolfgang Kufer 28.10.2010, update 17.03.2024, (www.bidib.org)
('RailCom' ist ein eingetragenes Warenzeichen der Lenz GmbH, Giessen)