Modbus TCP/IP


 

Der Modbus TCP/IP Treiber ermöglicht es Datenpunke/Register aus Geräten die als Modbus Server arbeiten auszulesen sowie zu schreiben. (Client Funktionalität) und/oder Datenpunkte/Register als Server bereitzustellen.

Jeder Modbus Server kann bis zu vier verschiedene Registertypen zur Verfügung stellen.

Holding Register16Bit Register mit Lese-/Schreibzugriff
Input Register16Bit Register mit Lesezugriff
Coil Register1Bit Register mit Lese-/Schreibzugriff
Status Register1Bit Register mit Lesezugriff

Für die Register werden jeweils unterschiedliche Lese- sowie Schreibfuntionen genutzt.

Register lesenRegister schreibenMehrere zusammenhängende Register schreiben (MultiWrite, default)
Holding3616
Input4
Coil1515
Status2

Der Name des Modbus TCP/IP-Treibers lautet: mbtcp
Die Routing-Adresse des ersten Modbus TCP/IP-Treibers ist die 860
Die Datenpunktdatei für den ersten Modbus-Treiber heißt: mbtcp1.txt
Die Konfigurationsdatei für globale Einstellungen des ersten TCP/IP-Treibers heißt: mbtcp1.cfg

Bei dem Modbus-Treiber sowie allen weiteren Gateway-Treibern gilt für die Definiton von Datenpunkten in der Datenpunktdatei:

Typ:Bedeutung
MGanzzahliger Wert (Binäre Datenpunkte,Zählwerte) der vom Gateway nur gelesen werden kann/soll.
SGanzzahliger Wert der vom Gateway gelesen sowie geschrieben werden kann/soll.
XAnalogwert (mit Nachkommastellen) der vom Gateway nur gelesen werden kann/soll.
YAnalogwert (mit Nachkommastellen) der vom Gateway gelesen sowie geschrieben werden kann/soll.
AString, findet z.B. Verwendung bei BACnet Trends und ESPA4.4.4 Datenpunkten

Die Adressen sind wie folgt aufgebaut.

<ip>[:<port>] <server/unit_ID> <register> <no>[.<bit>]

Kommunikationsstatus mit Server Gerät: „<ip> <server/unit_ID> failure“

Dabei gilt folgende Definition:

ParameterWertebereichBeschreibung
<ip>Host Name oder IP-Adresse des Server Gerätes0.0.0.0 bedeutet lokal (Modbus Server Modus)
<port>Port des Server GerätesNur anzugeben falls dieser vom Standard-Port 502 abweicht
<server/unit_ID>1 - 255Adresse des anzusprechenden Server-Gerätes
<register>holding,
input,
coil,
status
Registertyp
<no>0 - 65535Registeradresse
<bit>0-15
0-1
Einzelbit innerhalb des Registers (format = BIT)
Byte innerhalb des Registers (format = UINT8 oder format = SINT8)

Die Adresse des Coil-Registers 120 vom Server „192.168.1.1 2“ wird demnach wie folgt in der Datei mbtcpX.txt angegeben:

[M 192.168.1.1 2 coil 120]

Um dem Treiber mitzuteilen, wie er die unter einem 16Bit Register abgelegten Informationen auswerten kann, muss für jeden Datenpunkt das Format übergeben werden. Dies erfolgt anhand der Formatdefinition:

format = <format> [S:<swap>] [F:<fact>] [O:<ofs>] [M:<mode>]

Dabei kann <format> folgende Werte annehmen:

<format>Beschreibung
BITEinzelbit innerhalb des Registers bzw. Coil- und Status-Register
UINT88bit unsigned (Vorzeichenlos)
UINT1616bit unsigned
UINT3232bit unsigned
SINT88bit signed (Vorzeichenbehaftet)
SINT1616bit signed
SINT3232bit signed
FLOAT3232bit IEEE754 floating point (Fliesskommazahl)
FLOAT6464bit IEEE754 floating point (Fliesskommazahl)
FIXED3232bit Festkommazahl
FIXED4848bit Festkommazahl

Für Coil- sowie Status-Register wird keine Formatangabe benötigt.

Formate grösser als 16Bit benötigen mehr als ein Register, die fehlenden Register werden aus den nachfolgenden Registern gebildet. Diese Register sind dann für andere Datenpunkte nicht mehr verwendbar!

Für die Interpretation der Datenpunkte einiger Geräte kann es nötig sein die Bytereihenfolge des Registerinhaltes zu tauschen. Dies kann mit dem <swap> Parameter übergeben werden.

Wird das format BIT für Einzelbits aus Holding oder Input Registern benutzt, so wird der <swap> Parameter ignoriert.

Dabei kann <swap> folgende Werte annehmen:

<swap>BeschreibungBytereihenfolge
0little endian (Intel)1234, bei in mbtcp1.cfg gesetzter Option „WisagMode = 1“ 2143 (wie S:2)
1 (default)big endian (Motorola)4321
2little endian (Intel),Bytes vertauscht2143
3big endian (Motorola),Bytes vertauscht3412

Das Format „S:2“ kommt z. B. bei dem Gerät „E700P“ von Evoqua (ehemals Wallace&Tiernan) zum Einsatz.

Mit dem Parameter „F:“ kann dem Datenpunkt ein Faktor übergeben werden. Der empfangene Wert wird dann jeweils durch den als Faktor angegebenen Wert geteilt. Hinweis: Eine Skalierung von Werten erfolgt nur für Datenpunkte, die als X/Y definiert sind. Ganzzahlige Werte werden nicht skaliert.

Um mit Integer Werten z.B. analoge Daten mit Nachkommastelle abbilden zu können, kann z.B. der Wert auf Seite des sendenden Gerätes mit 10 Multipliziert und beim Empfänger wieder durch 10 Dividiert werden. Die Temperatur 20,5 °C wird so beispielsweise als 205 übertragen. Damit diese auf dem Gateway wiederrum korrekt dargestellt wird, wird an das Format der Parameter F:10.0 übergeben. Als Faktor kann jede beliebige Fließkommazahl angegeben werden. Ist kein Faktor angegeben wir der Faktor 1.0 verwendet.

Mit dem Parameter „O:“ kann dem Datenpunkt ein Offset übergeben werden. Dieser Offset wird dem Wert des Datenpunkts hinzuaddiert.

Mit dem Parameter „M:“ können dem Datenpunkt weitere Modi übegeben werden.

Dabei kann <mode> folgende Werte annehmen:

<mode>Beschreibung
0MultiWrite (default, Modbus Function 15 für COIL, 16 für HOLDING)
1SingleWrite (Modbus Function 5 für COIL, 6 für HOLDING)
2Masked (Nur für das Format „BIT“ in Zusammenhang mit 16Bit Registern, Modbus Function 22)

Typische Datenpunktdefinitionen für entfernte Datenpunkte können demnach sein:

[M 192.168.1.1 2 status 5]
name = digitale Betriebsmeldung
query = pe
format = BIT

[S 192.168.1.1 2 coil 10]
name = digitaler Sollwert
query = pe
format = BIT
writecache = yes

[M 192.168.1.1 2 input 10.3]
name = digitale Betriebsmeldung
query = pe
format = BIT

[S 192.168.1.1 2 holding 11.5]
name = digitaler Sollwert
query = pe
format = BIT
writecache = yes

[M 192.168.1.1 2 holding 15]
name = multistate Meldung z.B. 0,1,2 für Aus,An,Auto
query = pe
format = UINT16

[S 192.168.1.1 2 holding 16]
name = multistate Sollwert z.B. Stufenschalter 0,1,2 für Aus,An,Auto
query = pe
format = UINT16
writecache = yes

[X 192.168.1.1 2 input 17]
name = Temperatur Messwert (Register 17+18)
query = pe
format = FLOAT32

[Y 192.168.1.1 2 holding 17]
name = Temperatur Sollwert, eine Nachkommastelle
query = pe
format = SINT16 F:10
writecache = yes

[Y 192.168.1.1:1234 2 holding 17]
name = Temperatur Sollwert, eine Nachkommastelle, Verbindung wird über Port 1234 aufgebaut
query = pe
format = SINT16 F:10
writecache = yes

Typische Datenpunktdefinitionen für lokale Datenpunkte können demnach sein:

[S 0.0.0.0 2 status 5]
name = digitale Betriebsmeldung
query = pe
format = BIT
writecache = yes

[M 0.0.0.0 2 coil 10]
name = digitaler Sollwert
query = pe
format = BIT

[S 0.0.0.0 2 input 10.3]
name = digitale Betriebsmeldung
query = pe
format = BIT
writecache = yes

[M 0.0.0.0 2 holding 11.5]
name = digitaler Sollwert
query = pe
format = BIT

[S 0.0.0.0 2 holding 15]
name = multistate Meldung z.B. 0,1,2 für Aus,An,Auto
query = pe
format = UINT16
writecache = yes

[M 0.0.0.0 2 holding 16]
name = multistate Sollwert z.B. Stufenschalter 0,1,2 für Aus,An,Auto
query = pe
format = UINT16

[Y 0.0.0.0 2 input 17]
name = Temperatur Messwert (Register 17+18)
query = pe
format = FLOAT32
writecache = yes

[X 0.0.0.0 2 holding 17]
name = Temperatur Sollwert, eine Nachkommastelle
query = pe
format = SINT16 F:10