Im ersten Teil des Blogbeitrages über das Kommunikationsprotokoll Modbus sind wir auf die Endianness, die Reihenfolge der Datendarstellung, eingegangen. Nun möchten wir auf die richtige Adressierung der Register hinweisen.
Alles auf 0?
Eine weitere Falle des Modbus ist die Adressierung der Register bzw. der Speicherstellen.
Im vorhergehenden Beitrag hatten wir u. a. folgende Tabelle als Beispiel:
Reihenfolge | Modbus | Big-Endian | Big-Mix* | Little-Mix* | Little-Endian |
1 | 0x12 | 0x12 | 0x34 | 0x56 | 0x78 |
2 | 0x34 | 0x34 | 0x12 | 0x78 | 0x56 |
3 | 0x56 | 0x56 | 0x78 | 0x12 | 0x34 |
4 | 0x78 | 0x78 | 0x56 | 0x34 | 0x12 |
*Phantasienamen
In dieser Tabelle taucht die Adressierung bereits auf: 1, 2, 3, 4. Der erste Wert steht in Zeile 1 oder eben Adresse 1. Dies ist jedoch in „Modbusianisch“ falsch. Da es ein binäres Protokoll ist, zählt man im Modbus logisch ab 0. Der erste Wert steht daher im Register mit Adresse 0.
Will man also den ersten Wert bzw. das erste Register abfragen, muss man die Adresse 0 nutzen. Auf binärer Ebene ist das einfach. Jetzt kommt aber der Mensch ins Spiel, dessen 1. Wert eben an der 1 liegt. Daher nutzen viele Modbus-Komponenten diese menschliche Adressierung und beginnen ab 1 zu zählen.
Verwirrenderweise wird aus dieser 1 dann auf Modbus allerdings „automatisch“ eine 0 im Adressfeld und die Gegenstelle antwortet dann entsprechend mit der 0.
Hier müssen daher beide Seiten die gleiche Zählweise nutzen.
Bei unseren Geräten orientieren wir uns am Modbus und nutzen die Zählung ab 0. Daher haben zum Beispiel die ersten 10 Register auch die Adressen 0 bis 9. Eine Verschiebung um +1 ermöglichen wir nicht.
Falls die Gegenstelle ab 1 zählt, müssen Sie daher in dieser jeweils die Adresse um 1 erhöhen, im Gegensatz zu der Angabe in unseren Geräten.
Wie kann ich das prüfen?
Speziell aus diesen beiden Aspekten heraus haben wir einen sogenannten Test-Modus in unsere Geräte integriert:
Hierbei wird ein statischer Antwort-Datensatz aktiviert, welcher zur Prüfung der Gegenstelle genutzt werden kann. Nur wenn die Zahlen exakt mit den Vorgaben aus unserem Handbuch übereinstimmen, dann stimmen Endianness und Zählweise überein.
Sofern Ihre Gegenstelle Float32 als Datenformat unterstützt, empfehlen wir stets die Prüfung anhand der Register 24 und 25.
Wenn die Zahl in Ihrer Gegenstelle nicht genau der 1234.5677490234375 entspricht (ja, es können bei Float32 kleine Abweichungen auftreten), stimmt etwas nicht. Würden Sie beispielsweise eine 237810783920322510848 angezeigt bekommen, würden Sie die Register 23 und 24 auslesen, was für eine Zählweise ab 1 spricht.
Für die Prüfung der Float32-Werte kann man u.a. folgende Seite nutzen: https://www.h-schmidt.net/FloatConverter/IEEE754.html
PDF | 232 kB