# Modbus: "Illegal data address" Fehler in Holding Register in zulässigem Bereich



## Bohnet (20 Juli 2018)

*Modbus: "Illegal data address" Fehler in Holding Register in zulässigem Bereich*

Bei den Unit-Tests für einen Modbus-Treiber am Testobjekt einer Wago-Steuerung bin ich über folgendes Verhalten gestoßen:

 Ich kann die Holding Register 0 bis 1022 auslesen.
 Ich kann die Holding Register 1022 bis 13000 *nicht *auslesen. Ich bekomme eine "illegal data address" Fehlermeldung.
 Ich kann die Holding Register 13000 bis 25000 auslesen.

Das Verhalten verwundert mich, da ich angenommen hatte, dass Geräte, welche Modbus unterstützen, sich auf eine der beiden folgenden Arten im Bezug auf Read Holding Registers (3) verhalten:

Jedes Gerät unterstützt die volle Reichweite an Adressen zwischen 0x0000 und 0xFFFF.
Jedes Gerät unterstützt Adressen im Bereich 0x0000 bis N, wobei N <= 0xFFFF

Keine der beiden oben genannten Thesen würde das vorgefundene Verhalten erklären, deswegen hier meine Fragen:


Ist eine der Thesen über das erwartete Verhalten bei Lesezugriffen zutreffend und mein Gerät verhält sich fehlerhaft? Wenn nein, welches Verhalten kann ich erwarten?
Gibt es einen anderen Grund, als "out of bounds" für eine "illegal data address" Fehlermeldung die das Verhalten erklären könnte?

Vielen Dank für jede Hilfe!


----------



## Blockmove (20 Juli 2018)

Welche Wago-Steuerung hast du?
Bei CodeSys 2 werden bestimmte Bereiche auf E/A und Merker gemappt.


----------



## Bohnet (20 Juli 2018)

Es ist für mich nicht ganz klar, welche der beiden Steuerungen am Rack ich jetzt eigentlich benutze, aber es ist entweder eine 750-841 oder eine 750-312. Aber wenn das zumindest theoretisch möglich ist, nimmt mir das schon viel Last, dann weiß ich, dass ich mich darauf einstellen muss, dass ich auch innerhalb meines möglichen Addressierungsbereiches "illegal data address" Fehlermeldung erhalten kann und mich bei Optimierungsüberlegungen zu einem möglichen Zusammenfassen der Leseoperationen eben nicht darauf verlassen kann, dass wenn A und B, dann auch alles dazwischen.

Vielen Dank schon Mal.


----------



## Thruser (20 Juli 2018)

Hallo,


Bohnet schrieb:


> Das Verhalten verwundert mich, da ich angenommen hatte, dass Geräte, welche Modbus unterstützen, sich auf eine der beiden folgenden Arten im Bezug auf Read Holding Registers (3) verhalten:
> 
> Jedes Gerät unterstützt die volle Reichweite an Adressen zwischen 0x0000 und 0xFFFF.
> Jedes Gerät unterstützt Adressen im Bereich 0x0000 bis N, wobei N <= 0xFFFF



die Annahme ist leider falsch.

Aber selbst wenn sie richtig wäre, die Hersteller haben alle ihre eigene Interpretationen.

So gibt es unter anderen auch bei den Wago Controllern/Kopplern Adressen, auf die man mit Read Holding Registers und einer Länge größer 1 zugreifen muß, um Informationen zu bekommen, bei denen man aber nicht mit auf das nächsthöhere Register zugreift.

Z.B. beim Wago Koppler 352
Da erhält man über die Registeradresse 0x2020 die Kurzbeschreibung des Kopplers. Um die volle Beschreibung zu erhalten muß man die Adresse mit der Länge 16 lesen. Das zweite Word, daß man zurückbekommt gibt jetzt aber nicht den Inhalt der Adresse 0x2021 (Kompilierzeit) an sondern das zweite Word der Beschreibung. Um die Kompilierzeit zu erhalten muß man direkt addressieren (0x2021) und dann mit der Länge 8.

Gruß


----------



## Bohnet (20 Juli 2018)

Thruser schrieb:


> So gibt es unter anderen auch bei den Wago Controllern/Kopplern Adressen, auf die man mit Read Holding Registers und einer Länge größer 1 zugreifen muß, um Informationen zu bekommen, bei denen man aber nicht mit auf das nächsthöhere Register zugreift.



Das ist sehr interessant und definitiv gut zu wissen! Ich glaube ich habe aber noch nicht ganz verstanden, wie das mit dem oben beschriebenen Verhalten korreliert. So, wie du das Problem beschreibst, verstehe ich, dass man beim Zugriff auf manche Register nicht die Daten bekommt, die man denkt zu bekommen, aber ich verstehe noch nicht, wie das dazu führen kann das manche Register unlesbar werden.


----------



## Thruser (20 Juli 2018)

Hallo,

sieh Dir mal die Tabelle auf Seite 240, Kapitel 12.3.4 MODBUS-Register-Mapping an: https://www.wago.com/wagoweb/docume...coupler_controller/m07500841_00000000_0de.pdf

Modbus Adresse 1024-4095: Modbus Exception: "Illegal data address"

Gruß


----------



## Bohnet (20 Juli 2018)

Ahh, dass erklärt natürlich alles. Vielen Dank! Ich werde mich mal ein bisschen genauer einlesen.


----------



## Blockmove (20 Juli 2018)

Und bei PFC100 und 200 von Wago sieht es nochmal ganz anders aus.
Fazit:
Alle Konstanten sind variabel


----------

