Nick schrieb:
Größe des Registers. WIMRE gibts bei Modbus unterschiedlich breite
Register
Modbus kennt genau zwei Datentypen, 16-Bit-Register und 1-Bit-Register.
Welcher Datentyp verwendet wird, hängt vom Function Code ab.
Es gibt genau vier Registertypen, zwei davon sind 16 Bit groß, die beiden anderen sind 1 Bit groß.
| name |
Größe |
r/w |
| analog input register |
16 Bit |
kann nur gelesen werden |
| holding register |
16 Bit Register |
kann gelesen und geschrieben werden |
| discrete inputs |
1 Bit |
kann nur gelsen werden |
| coil |
1 Bit |
kann gelesen und geschrieben werden |
Mit dem "function code" wird festgelegt, welche Operation mit welchem Registertyp ausgeführt wird
| code |
Bedeutung] |
| 1 |
eine oder mehrere "coils" lesen |
| 2 |
ein oder mehrer "discrete inputs" lesen |
| 3 |
ein oder mehrere "holding register" lesen |
| 4 |
ein oder merere "analog input register" lesen |
| 5 |
eine "coil" beschreiben |
| 6 |
ein "holding register" beschreiben |
| 15 |
mehrere "coils" beschreiben |
| 16 |
mehrere "holding register" beschreiben |
Das RTU-Telegramm "read holding register" ist wie folgt aufgebaut:
1 |
1 Byte Geräteadresse
|
2 |
1 Byte "function code", hier 0x03
|
3 |
2 Bytes Nummer des ersten zu lesenden Registers
|
4 |
2 Bytes Anzahl der zu lesenden Register
|
5 |
2 Bytes CRC
|
Eine "Anzahl von Bytes" gibt es in diesem Telegramm nicht, die gibt es nur bei der Antwort, die ein Modbusgerät als Folge zurücksendet:
1 |
1 Byte Geräteadresse
|
2 |
1 Byte "function code", hier wieder 0x03
|
3 |
1 Byte Anzahl der folgenden Nutzdatenbytes
|
4 |
... Nutzdatenbytes
|
5 |
2 Bytes CRC
|
Bei der Angabe der Nummer des Registers gibt es mehrere irreführende Konventionen. Im Protokoll (egal ob RTU oder TCP) werden Register im Bereich [0 .. 65535] numeriert.
Aber in der Beschreibung vieler Modbusgeräte wird aus historischen Gründen (Altersstarrsinn?) noch ein vom Registertyp abhängiger Offset dazugerechnet, der in einer Variante auch noch den Eindruck erweckt, es könnte nur 9999 Register jeden Typs geben:
| von |
bis |
Registertyp |
| 00001 |
09999 |
coil |
| 10001 |
19999 |
discrete input register |
| 30001 |
39999 |
analog input register |
| 40001 |
49999 |
holding register |
Das ist und war schon immer Humbug, auch die etwas neuere Konvention, die Offsets im Hunderttausenderbereich verwendet, ist wenig besser.