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.

Datenfluss vom SDM630 über den IOZER basic zu mbclient
Datenfluss vom SDM630 über den IOZER basic zu mbclient

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 mbclient lesen.

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 mbclient aus 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, B und bei Bedarf SHLD des 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

Sicherheitshinweis

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.

Modbus-TCP- und Modbus-RTU-Konfiguration im IOZER
Modbus-TCP- und Modbus-RTU-Konfiguration im IOZER

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 Float32 mit höherwertigem Register zuerst,
  • Skalierung 1 und Offset 0 sowie
  • 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 Float32 mit höherwertigem Register zuerst.

Datenpunkt kopieren

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

Registeradressierung

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.

Datenpunktübersicht mit RTU-Quellen und TCP-Holding-Register-Zielen
Datenpunktübersicht mit RTU-Quellen und TCP-Holding-Register-Zielen

4. Lese-Test mit mbclient

Installieren und starten Sie mbclient aus dem Projekt serhmarch/ModbusTools. Legen Sie anschließend ein neues Projekt an.

  1. Fügen Sie einen Port vom Typ Modbus TCP hinzu.
  2. Tragen Sie als Host die IP-Adresse des IOZER und als Port 502 ein.
  3. Fügen Sie dem Port ein Gerät mit der Unit-Adresse 1 hinzu.
  4. Legen Sie einen Datenansichtseintrag für ein Holding Register an.
  5. Wählen Sie als Adresse 400001 und als Darstellung Float32 beziehungsweise Float mit höherwertigem Register zuerst.
  6. 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.

Messwerte aus den TCP-Holding-Registern in mbclient
Messwerte aus den TCP-Holding-Registern in mbclient

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.

IOZER
Innovative Steuerung für vielseitige Anwendungen.
AnmeldenRegistrieren
DE Deutsch EN English
Home
Shop
Docs
Connect
Kontakt
Sprache: DE
DE Deutsch EN English
AnmeldenRegistrieren