SDM630 über Modbus RTU auslesen und per Modbus TCP bereitstellen
Szenario
Ein Energiezähler Eastron SDM630-Modbus V2 ist über RS485 mit einem IOZER basic verbunden. Der IOZER liest die Messwerte als Modbus-RTU-Master zyklisch aus und stellt sie in einem IP-Netzwerk als Modbus-TCP-Slave bereit.
Ein Modbus-TCP-Client kann dadurch auf die Messwerte des Energiezählers zugreifen, ohne selbst an den RS485-Bus angeschlossen zu sein.

In aktueller Modbus-Terminologie entsprechen „Master“ und „Slave“ den Rollen „Client“ und „Server“. In diesem Beitrag werden die Bezeichnungen der IOZER-Benutzeroberfläche verwendet.
Ziel
Nach Abschluss der Konfiguration:
- liest der IOZER basic zwölf elektrische Messwerte aus dem SDM630,
- zeigt die Datenpunktübersicht aktuelle und gültige Werte,
- stellt der IOZER die Werte über Modbus TCP in Holding Registern bereit und
- kann ein Rechner im Netzwerk die Werte mit
mbclientlesen.
Die Registeradressen auf der TCP-Seite sind frei definierbar. In diesem Beispiel werden die 0-basierten Startadressen des SDM630 unverändert übernommen. Die Messwerte wechseln dabei vom Input-Registerbereich des SDM630 in den Holding-Registerbereich des IOZER. Das vereinfacht die Inbetriebnahme und die spätere Zuordnung.
Eingesetzte Hardware
IOZER-Komponenten
- IOZER basic (IOZ-B-10)
- geeignete Spannungsversorgung mit 7 bis 30 V DC, SELV/PELV
Weitere Komponenten
- Eastron SDM630-Modbus V2
- verdrillte, für RS485 geeignete Busleitung
- Ethernet- oder WLAN-Netzwerk
- Rechner mit
mbclientaus ModbusTools
Voraussetzungen
- Der IOZER basic ist entsprechend den Sicherheitshinweisen montiert und an eine geeignete Spannungsversorgung angeschlossen.
- Der IOZER ist über Ethernet oder WLAN erreichbar und besitzt eine bekannte IP-Adresse.
- Der SDM630 wurde fachgerecht installiert und ist über RS485 mit den Klemmen
A,Bund bei BedarfSHLDdes IOZER verbunden. - Die Busleitung ist korrekt gepolt. Bei längeren Leitungen wird der Bus nur an seinen beiden physikalischen Enden terminiert.
- Die Modbus-Adresse des SDM630 ist bekannt. Die folgenden Schritte verwenden beispielhaft die Unit-ID
1. Bei einer abweichenden Geräteadresse ist dieser Wert entsprechend anzupassen. - Am SDM630 sind folgende Kommunikationsparameter eingestellt:
| Parameter | Wert |
|---|---|
| Baudrate | 9600 Bit/s |
| Datenbits | 8 |
| Parität | Keine (N) |
| Stoppbits | 1 |
Installation und Arbeiten am Energiezähler dürfen nur durch qualifiziertes Fachpersonal und im spannungsfreien Zustand durchgeführt werden.
Der IOZER basic darf nicht direkt mit Netzspannung versorgt werden.
Umsetzung
1. Modbus RTU konfigurieren
Öffnen Sie die Weboberfläche des IOZER und wechseln Sie zu Einstellungen → Modbus → Modbus RTU.
Konfigurieren Sie die RS485-Schnittstelle wie folgt:
| Einstellung | Wert |
|---|---|
| Modus | Master (Client) |
| Baudrate | 9600 |
| Datenbits | 8 |
| Parität | None |
| Stopbits | 1 |
Legen Sie anschließend den SDM630 als RTU-Slave an:
| Einstellung | Wert |
|---|---|
| Bezeichnung | SDM630_1 |
| Unit-ID | 1 oder die am Zähler eingestellte Adresse |
| Timeout | projektspezifisch beziehungsweise Standardwert |
| Wiederholungen | projektspezifisch beziehungsweise Standardwert |
Speichern Sie die Konfiguration. Hinweise zur Schnittstelle und zur Statusanzeige finden Sie unter Modbus.
2. Modbus TCP konfigurieren
Wechseln Sie zu Einstellungen → Modbus → Modbus TCP und konfigurieren Sie den IOZER als Modbus-TCP-Slave:
| Einstellung | Wert |
|---|---|
| Modus | Slave (Server) |
| Slave-Port | 502 |
| Slave Unit-ID | 1 |
| Max. Register | mindestens 24; im Screenshot 100 |
| Multi-Write | Deaktiviert |
Die TCP-Unit-ID ist unabhängig von der RTU-Geräteadresse konfigurierbar. In diesem Beispiel wird für beide Seiten die Unit-ID 1 verwendet. Auf der TCP-Seite belegt das Mapping die Holding-Register mit den 0-basierten Startadressen 0 bis 23.

Der Screenshot zeigt die vollständige Schnittstellenkonfiguration des Beispiels. Ein höherer Wert für Max. Register ist zulässig; benötigt werden für die zwölf Float32-Werte nur die Adressen 0 bis 23.
3. Register und Datenpunkte konfigurieren
Die gezeigten Messwerte des SDM630 liegen in Input Registern und werden mit Modbus-Funktion 04 gelesen. Jeder Messwert belegt zwei aufeinanderfolgende 16-Bit-Register und wird als 32-Bit-Gleitkommazahl nach IEEE 754 übertragen. Der SDM630 liefert standardmäßig das höherwertige Register zuerst. Eine zusätzliche Skalierung ist für diese Messwerte nicht erforderlich.
Legen Sie unter Einstellungen → Datenpunkte für jeden Messwert einen Datenpunkt vom Typ Float an. Die Adressfelder im IOZER verwenden die 0-basierte Protokolladresse. Konfigurieren Sie jeweils:
- als Datenquelle den SDM630 am Modbus-RTU-Master,
- die Funktion
04 – Read Input Registers, - die jeweilige 0-basierte RTU-Adresse,
- den Datentyp
Float32mit höherwertigem Register zuerst, - Skalierung
1und Offset0sowie - als Datenziel den Modbus-TCP-Slave mit Funktion
03 – Read Holding Registers, - die jeweilige 0-basierte TCP-Adresse und
- für das TCP-Ziel ebenfalls
Float32mit höherwertigem Register zuerst.
Konfigurieren Sie den ersten Datenpunkt vollständig und verwenden Sie anschließend in der Datenpunktübersicht die Funktion Datenpunkt kopieren. Passen Sie in jeder Kopie nur Bezeichnung, technischen Namen, Einheit sowie RTU- und TCP-Adresse gemäß der folgenden Tabelle an. Datenquelle, Datenziel, Datentyp, Registerreihenfolge, Skalierung und Offset können unverändert übernommen werden.
Das folgende Mapping trennt die verwendeten Adressdarstellungen: Die SDM630-Spalte folgt der fünfstelligen Schreibweise der offiziellen SDM630-Modbus-Protokolldokumentation, die mbclient-Spalte der sechsstelligen Standardansicht von ModbusTools. In die Adressfelder des IOZER werden ausschließlich die 0-basierten Werte eingetragen.
| Datenpunktname | Messwert | Einheit | SDM630-Register (5-stellig) | RTU-Adresse im IOZER | mbclient-Adresse (6-stellig) |
TCP-Adresse im IOZER |
|---|---|---|---|---|---|---|
sdm630_voltage_l1 |
Spannung L1-N | V | 30001 |
0 |
400001 |
0 |
sdm630_voltage_l2 |
Spannung L2-N | V | 30003 |
2 |
400003 |
2 |
sdm630_voltage_l3 |
Spannung L3-N | V | 30005 |
4 |
400005 |
4 |
sdm630_current_l1 |
Strom L1 | A | 30007 |
6 |
400007 |
6 |
sdm630_current_l2 |
Strom L2 | A | 30009 |
8 |
400009 |
8 |
sdm630_current_l3 |
Strom L3 | A | 30011 |
10 |
400011 |
10 |
sdm630_power_l1 |
Wirkleistung L1 | W | 30013 |
12 |
400013 |
12 |
sdm630_power_l2 |
Wirkleistung L2 | W | 30015 |
14 |
400015 |
14 |
sdm630_power_l3 |
Wirkleistung L3 | W | 30017 |
16 |
400017 |
16 |
sdm630_apparent_power_l1 |
Scheinleistung L1 | VA | 30019 |
18 |
400019 |
18 |
sdm630_apparent_power_l2 |
Scheinleistung L2 | VA | 30021 |
20 |
400021 |
20 |
sdm630_apparent_power_l3 |
Scheinleistung L3 | VA | 30023 |
22 |
400023 |
22 |
30001 ist die fünfstellige SDM630-Bezeichnung für das erste Input Register. Der IOZER liest dieses Register mit Funktion 04 und Adresse 0. Auf der TCP-Seite stellt der IOZER den Wert mit Funktion 03 ebenfalls unter Adresse 0 bereit. mbclient zeigt dieses Holding Register in seiner sechsstelligen Schreibweise als 400001 an. Die Ziffernfolgen 30001 und 400001 werden nicht in die IOZER-Adressfelder eingetragen.
Speichern Sie die Datenpunkte und kontrollieren Sie in der Übersicht die Spalten Wert, Status und Aktualisiert. Die Werte sollten regelmäßig aktualisiert werden und den Status OK besitzen. In der Übersicht ist die Zuordnung kompakt erkennbar: RTU #1 / F4 / 0 liest das erste SDM630-Input-Register; TCP #1 / F3 / 0 stellt denselben Wert im ersten TCP-Holding-Register bereit.

4. Lese-Test mit mbclient
Installieren und starten Sie mbclient aus dem Projekt serhmarch/ModbusTools. Legen Sie anschließend ein neues Projekt an.
- Fügen Sie einen Port vom Typ Modbus TCP hinzu.
- Tragen Sie als Host die IP-Adresse des IOZER und als Port
502ein. - Fügen Sie dem Port ein Gerät mit der Unit-Adresse
1hinzu. - Legen Sie einen Datenansichtseintrag für ein Holding Register an.
- Wählen Sie als Adresse
400001und als DarstellungFloat32beziehungsweiseFloatmit höherwertigem Register zuerst. - Starten Sie die Kommunikation.
ModbusTools verwendet in seiner Standardansicht eine sechsstellige Registerschreibweise. Deshalb wird das Holding Register mit der IOZER-Adresse 0 in mbclient als 400001 eingetragen. Alternativ kann in den Einstellungen unter Tools → Settings → View → Modbus adr. notation eine 0-basierte IEC-61131-3-Darstellung gewählt werden; dasselbe Holding Register lautet dort %MW0.
Für einen einzelnen Test kann außerdem Tools → Send Message verwendet werden:
| Feld | Wert |
|---|---|
| Unit-ID | 1 |
| Funktion | 03 – Read Holding Registers |
| Startadresse | 0 |
| Anzahl Register | 2 |
| Darstellung | Float32, höherwertiges Register zuerst |
Als Ergebnis wird die Spannung zwischen L1 und Neutralleiter erwartet. Der Wert sollte plausibel sein und annähernd mit der Anzeige des SDM630 übereinstimmen. Weitere Messwerte lassen sich über die Startadressen aus der Mapping-Tabelle prüfen.
Der Screenshot zeigt alle zwölf Werte unter den mbclient-Adressen 400001 bis 400023. Der Status Good bestätigt die erfolgreiche TCP-Kommunikation und das Lesen mit Funktion 03.

Fehlerbehebung
| Fehlerbild | Mögliche Ursache und Prüfung |
|---|---|
| Keine RTU-Werte am IOZER | Unit-ID, 9600 8N1, Verdrahtung von A und B, Busabschluss und Spannungsversorgung des SDM630 prüfen. |
| Modbus-Status meldet Timeout | RTU-Geräteadresse kontrollieren, Leitungsführung prüfen und Timeout bei Bedarf erhöhen. |
| RTU-Wert ist unplausibel | Funktion 04, 0-basierte RTU-Adresse und Float32 mit höherwertigem Register zuerst prüfen. |
| TCP-Wert ist unplausibel | Funktion 03, 0-basierte TCP-Adresse und Float32 mit höherwertigem Register zuerst prüfen. |
| Wert ist um ein Register verschoben | Im IOZER die 0-basierte Adresse verwenden: 30001 im SDM630-Handbuch und 400001 in mbclient entsprechen für ihren jeweiligen Registerbereich der IOZER-Adresse 0. |
mbclient kann keine Verbindung herstellen |
IP-Adresse, TCP-Port 502, TCP-Slave-Modus und Netzwerkpfad prüfen. |
| TCP-Verbindung besteht, aber es wird kein Wert geliefert | Unit-ID, Funktion 03 und das konfigurierte TCP-Holding-Register-Mapping kontrollieren. |
Datenpunkt ist Veraltet oder Fehler |
Status des RTU-Slaves und Zeitpunkt der letzten erfolgreichen Aktualisierung prüfen. |
Ergebnis und Erweiterung
Nach erfolgreichem Test arbeitet der IOZER basic als Protokoll-Gateway: Er liest die Messwerte des SDM630 über Modbus RTU und stellt sie unabhängig vom RS485-Bus in Modbus-TCP-Holding-Registern im Netzwerk bereit.
Nach demselben Prinzip lassen sich weitere Modbus-RTU-Geräte über Modbus TCP bereitstellen. Fügen Sie jedes Gerät als zusätzlichen RTU-Slave hinzu und legen Sie für dessen Werte entsprechende Datenpunkte mit einem Modbus-TCP-Ziel an. Beachten Sie dabei:
- Jedes RTU-Gerät benötigt eine eindeutige Unit-ID.
- Alle Geräte am selben RS485-Bus müssen mit derselben Baudrate, Parität und Anzahl Stoppbits arbeiten.
- Weisen Sie jedem Datenpunkt einen eigenen, nicht überlappenden TCP-Registerbereich zu.
- Legen Sie Max. Register so fest, dass auch die höchste verwendete TCP-Adresse vollständig abgedeckt ist.
Der IOZER fasst die Werte der angeschlossenen RTU-Geräte dadurch in einer gemeinsamen Modbus-TCP-Registerbelegung zusammen. Ein TCP-Client kann alle bereitgestellten Werte über die IP-Verbindung zum IOZER lesen und benötigt keinen direkten Zugriff auf den RS485-Bus.