Skip to content

Modbus-Adressierung ​

Ca. 9 Min. Lesezeit

Diese Seite beschreibt, wie die Felder Adresse, Datentyp und Länge der Tags von Geräten der Typen Modbus seriell, Modbus Serial over Ethernet und Modbus TCP interpretiert werden. Die drei Modbus-Verbindungstypen verwenden dieselben Adressregeln. Die Kanal- und Geräteeinstellungen finden Sie auf den Seiten Modbus seriell (RTU/ASCII), Modbus Serial over Ethernet und Modbus TCP.

Adressformat ​

Eine Modbus-Tag-Adresse besteht aus einer Ziffer für den Bereichstyp und der Register- (oder Bit-)Nummer. Üblich ist die 6-stellige Schreibweise (400001); die 5-stellige Schreibweise (40001) bezeichnet dasselbe Register. Für den Zugriff auf ein Bit innerhalb eines Registers werden am Ende der Adresse ein Punkt und die Bitnummer angefügt.

text
400001      Holding register 1
300010      Input register 10
000005      Coil 5
100003      Discrete input 3
400020.7    Holding register 20, bit 7

Das Adressfeld folgt dieser Regel:

  • Die erste Ziffer muss 0, 1, 3 oder 4 sein.
  • Nach der ersten Ziffer folgen nur Ziffern, und diese Zahl muss im Bereich 0–65535 liegen (z. B. 400001, 40001, 465535). Vorzeichen, Leerzeichen oder zusätzliche Teile sind nicht zulässig.
  • Das Bitsuffix ist nach dem Punkt eine Zahl von 0 bis 15 und wird nur bei Register-Tags vom Typ Bool verwendet (siehe Bitadressierung).

Passt die Adresse nicht zu diesen Regeln oder zum Datentyp des Tags, erscheint in der Tag-Tabelle eine Warnung wie „Die Adresse stimmt nicht mit dem ModbusTcp-Adressmuster überein.“; die Meldung nennt den Verbindungstyp des Geräts. Dieselbe Regel gilt auch auf dem Server; ein Tag, das gegen die Regel verstößt, wird nicht gespeichert, und die Fehlermeldung nennt den Grund. Bei Tags, die als Erweitertes Tag markiert sind, und bei den Gerätesystemadressen _ConnError und _TagQualityBad entfällt diese Prüfung (siehe Tag-Verwaltung).

Bereichstypen ​

Erste ZifferModbus-BereichZugriffLesefunktionSchreibfunktionZulässige Datentypen
0Coil (Ausgangsbit)Lesen/SchreibenFC01 Read CoilsFC05 Write Single CoilNur Bool
1Discrete Input (Eingangsbit)Nur lesenFC02 Read Discrete Inputs—Nur Bool
3Input RegisterNur lesenFC04 Read Input Registers—Bool (mit Bitsuffix) und numerische Typen
4Holding RegisterLesen/SchreibenFC03 Read Holding RegistersFC06 / FC16 (siehe unten)Bool (mit Bitsuffix) und numerische Typen

Die Funktion für Schreibzugriffe auf Holding Register richtet sich nach der Anzahl der Register, die der Wert belegt:

  • Werte mit einem Register (Byte, Sbyte, Int, Word): FC06 Write Single Register
  • Werte mit mehreren Registern (DInt, DWord, Real, LInt, ULInt, LWord, LReal): FC16 Write Multiple Registers
  • Bit innerhalb eines Registers (Bool): Zuerst wird der aktuelle Wert des Registers mit FC03 gelesen, nur das Zielbit wird geändert, und der Wert wird mit FC06 zurückgeschrieben.

Adressen, die mit 1 und 3 beginnen, sind im Gerät schreibgeschützt. Markieren Sie diese Tags mit Nur lesen; auch ohne diese Markierung sendet der Dienst keine Schreibanfrage an diese Adressen und schreibt den Fehler in das Dienstprotokoll.

Einstellung Nullbasiert ​

Die Option Nullbasiert auf der Registerkarte Einstellungen des Geräts legt fest, welchem Register im Protokoll die Nummer in der Adresse entspricht.

NullbasiertAdresseAn das Gerät gesendete Protokolladresse
Aktiviert (Standard)4000010
Aktiviert (Standard)40010099
Nicht aktiviert4000000
Nicht aktiviert400100100

Sind die Register in der Gerätedokumentation ab 1 nummeriert (z. B. „40001“), muss Nullbasiert aktiviert bleiben. Gibt die Dokumentation die Protokolladresse ab 0 an (z. B. „Adresse 0x0000“), deaktivieren Sie die Option. Gehören die gelesenen Werte zu dem Register vor oder nach dem erwarteten Register, prüfen Sie zuerst diese Einstellung.

Bei aktiviertem Nullbasiert entspricht auch die Adresse 400000 dem Register 0; lassen Sie die Adressen in diesem Fall zur Vermeidung von Verwechslungen bei 1 beginnen. Die Nummer in der Adresse darf höchstens 65535 sein. Bei Werten über mehrere Register muss auch das letzte Register im Adressbereich des Geräts liegen.

Bitadressierung ​

  • Coil und Discrete Input (0, 1): Jede Adresse ist ein einzelnes Bit. Der Datentyp kann nur Bool sein, und an die Adresse wird kein Bitsuffix angehängt.
  • Bit innerhalb eines Registers (3, 4): Bei Register-Tags mit dem Datentyp Bool ist das Bitsuffix Pflicht. Die Bitnummer liegt zwischen 0 und 15; 0 ist das niederwertigste Bit. Zum Beispiel ist 400020.0 das niederwertigste Bit des Holding Registers 20.
  • Nicht-Bool-Typen: Bei Adressen 3 und 4 wird kein Bitsuffix verwendet.

Diese Regeln werden beim Speichern in der Tag-Tabelle und auf dem Server geprüft; zum Beispiel werden ein Bitsuffix wie .16, ein Bitsuffix an einer Coil-Adresse, ein Coil-Tag mit einem anderen Typ als Bool oder ein Int-Tag mit Bitsuffix nicht gespeichert.

Das Schreiben auf ein Bit eines Holding Registers erfolgt nach dem Verfahren Lesen-Ändern-Schreiben. 2WinScada reiht seine eigenen Schreibzugriffe über dieselbe Verbindung nacheinander ein; es schützt jedoch nicht davor, dass das SPS-Programm oder ein anderes System dasselbe Register zwischen den beiden Vorgängen ändert.

Datentypen ​

DatentypBelegte RegisterBeschreibung
BoolBei Coil/Discrete Input 1 Bit; im Register 1 BitIm Register ist ein Bitsuffix erforderlich
Byte1Niederwertiges Byte des Registers (Bit 0–7), vorzeichenlos
Sbyte1Niederwertiges Byte des Registers (Bit 0–7), vorzeichenbehaftet
Word116-Bit-Ganzzahl ohne Vorzeichen
Int116-Bit-Ganzzahl mit Vorzeichen
DWord232-Bit-Ganzzahl ohne Vorzeichen
DInt232-Bit-Ganzzahl mit Vorzeichen
Real232-Bit-Gleitkommazahl nach IEEE 754
LWord464-Bit-Ganzzahl ohne Vorzeichen
ULInt464-Bit-Ganzzahl ohne Vorzeichen
LInt464-Bit-Ganzzahl mit Vorzeichen
LReal464-Bit-Gleitkommazahl nach IEEE 754

Beim Schreiben auf Byte- und Sbyte-Tags wird das höherwertige Byte des Registers als null geschrieben. Eine Option, das höherwertige Byte des Registers getrennt zu lesen, gibt es nicht; lesen Sie das Register bei Bedarf als Word und trennen Sie den Wert mit einem Ausdruck oder einem erweiterten Tag.

Die Option Automatisch in der Liste Datentyp wird bei Modbus-Geräten nicht unterstützt.

Länge und String ​

  • Länge muss immer 1 sein. Arrays (mehrere aufeinanderfolgende Werte mit einem Tag) werden bei Modbus-Geräten nicht unterstützt; definieren Sie für jeden Wert ein eigenes Tag.
  • Der Datentyp String wird bei Modbus-Geräten nicht unterstützt und kann in der Liste nicht ausgewählt werden.

Tags mit einer Länge größer als 1 oder vom Typ String werden in der Tag-Tabelle und auf dem Server abgelehnt.

Tags aus älteren Versionen

In einer älteren Version gespeicherte Tags, die diese Regeln (Adresse, Bitsuffix, String, Länge) nicht erfüllen, werden nicht gelöscht. Sie werden zur Laufzeit nicht gelesen, bleiben in der Qualität Bad, und der Grund wird einmal in das Dienstprotokoll geschrieben; auch Schreibzugriffe auf diese Tags werden abgelehnt. Zur Korrektur passen Sie Adresse, Datentyp oder Länge des Tags an die Regel an und speichern es; ein Speichern, bei dem nur die Beschreibung geändert wurde, wird abgelehnt.

Wortreihenfolge (32- und 64-Bit-Werte) ​

Die Bytereihenfolge innerhalb eines Registers ist nach dem Modbus-Standard fest (höherwertiges Byte zuerst); es gibt keine Einstellung, die sie ändert. Bei Werten über mehrere Register wird die Reihenfolge der Register durch zwei Optionen auf der Registerkarte Einstellungen des Geräts bestimmt.

In den folgenden Tabellen steht R0 für das erste Register an der Tag-Adresse und W0 für das niederwertigste Wort des Werts.

32-Bit-Werte (DWord, DInt, Real):

Erstes Wort Low (32 Bit)R0R1Übliche Bezeichnung
Aktiviert (Standard)W0 (niederwertig)W1 (höherwertig)Word swap / CDAB
Nicht aktiviertW1 (höherwertig)W0 (niederwertig)Big-endian / ABCD

64-Bit-Werte (LInt, ULInt, LWord, LReal):

Erstes Wort Low (32 Bit)Erstes DWord Low (64 Bit)R0R1R2R3
AktiviertAktiviertW0W1W2W3
AktiviertNicht aktiviertW2W3W0W1
Nicht aktiviertAktiviertW1W0W3W2
Nicht aktiviertNicht aktiviertW3W2W1W0

Steht in der Gerätedokumentation „high word first“ oder „big-endian“, deaktivieren Sie Erstes Wort Low (32 Bit); bei 64-Bit-Werten deaktivieren Sie zusätzlich Erstes DWord Low (64 Bit).

Option Erstes DWord Low (64 Bit)

Wenn Sie 64-Bit-Tags verwenden, aktivieren oder deaktivieren Sie das Kontrollkästchen Erstes DWord Low (64 Bit) bewusst nach der Gerätedokumentation und speichern Sie.

Diese Einstellungen gelten für alle Tags desselben Geräts. Gibt es im selben Gerät Werte mit unterschiedlicher Wortreihenfolge, lesen Sie für einen davon den Wert als zwei Word-Tags und setzen ihn mit einem Ausdruck zusammen.

Lesegruppen und Blockgröße ​

Beim Lesen der Tags fasst 2WinScada nahe beieinanderliegende Adressen zu einer Anfrage zusammen, um die Zahl der Anfragen zu verringern:

  • Zuerst werden die Tags mit demselben Wert Aktualisierungsintervall [s] zusammengefasst; jede Gruppe wird mit ihrem eigenen Intervall gelesen.
  • Innerhalb jeder Gruppe werden die Tags desselben Bereichstyps (Coil, Discrete Input, Input Register, Holding Register) nach Adresse sortiert.
  • Liegt ein Tag höchstens 30 Adressen hinter dem Ende des vorherigen Tags und überschreitet die Gesamtlänge den Wert Blockgröße des Geräts nicht, wird es derselben Anfrage hinzugefügt; andernfalls beginnt eine neue Anfrage.

Blockgröße begrenzt in Registerbereichen die Anzahl der Register, in Coil- und Discrete-Input-Bereichen die Anzahl der Bits (Standard 32). Der Modbus-Standard erlaubt in einer Anfrage höchstens 125 Register und 2000 Bits; viele Geräte setzen eine niedrigere Grenze. Meldet das Gerät „Illegal Data Address“ oder „Illegal Data Value“ oder lehnt es einen Block ab, in dem undefinierte Adressen liegen, verringern Sie Blockgröße.

Schlägt eine Leseanfrage fehl, wird die Qualität der Tags dieser Anfrage Bad; die übrigen Anfragen werden weiter gelesen.

Beispiele ​

AdresseDatentypLängeNur lesenBedeutung
000001Bool1NeinCoil 1 (z. B. Startbefehl für einen Motor)
100004Bool1JaDiscrete Input 4 (z. B. Türkontakt)
300001Word1JaInput Register 1, 16 Bit ohne Vorzeichen
300011Real1JaInput Register 11–12, Gleitkomma-Messwert
400001Int1NeinHolding Register 1, 16-Bit-Sollwert mit Vorzeichen
400101DInt1NeinHolding Register 101–102, 32-Bit-Zähler
400201LReal1JaHolding Register 201–204, 64-Bit-Energiewert
400050.3Bool1NeinBit 3 des Holding Registers 50

Skalierung, Einheit und die anderen gemeinsamen Tag-Felder finden Sie auf der Seite Tag-Verwaltung. Wiederverwendbare Modbus-Registerlisten können mit Geräteprofilen definiert werden.

Fehlerbehebung ​

SymptomPrüfungen
Adresse wird nicht gespeichert, Warnung „stimmt nicht mit dem …-Adressmuster überein“Prüfen Sie, ob die Adresse mit 0, 1, 3 oder 4 beginnt, ob die Nummer zwischen 0 und 65535 liegt und ob das Bitsuffix den Regeln der Bitadressierung entspricht (nur bei Register-Tags vom Typ Bool, 0–15).
Tag nach dem Upgrade BadDas Tag erfüllt die Regeln von 2.10 nicht (String, Länge > 1 oder ungültige Adresse). Korrigieren Sie das Tag nach dem Grund im Dienstprotokoll und speichern Sie es.
Wert scheint um ein Register verschobenStellen Sie Nullbasiert nach der Nummerierung in der Gerätedokumentation ein.
32-/64-Bit-Wert unsinnig oder sehr großPrüfen Sie die Optionen Erstes Wort Low (32 Bit) und Erstes DWord Low (64 Bit), den Wert Datentyp und ob Länge den Wert 1 hat.
Alle Tags der Gruppe werden BadEine der Adressen im Block ist im Gerät möglicherweise nicht definiert. Verringern Sie Blockgröße oder lesen Sie die undefinierten Adressen getrennt mit einem anderen Wert Aktualisierungsintervall [s].
Schreiben funktioniert nichtPrüfen Sie, ob die Adresse mit 0 oder 4 beginnt, die Einstellung Nur lesen, die Benutzerberechtigung und ob das Gerät Schreibzugriffe erlaubt.
Typ String nicht auswählbarModbus-String-Tags werden in 2.10 nicht unterstützt; siehe Länge und String.

2WinScada 2.10