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 Register | 16Bit Register mit Lese-/Schreibzugriff |
---|---|
Input Register | 16Bit Register mit Lesezugriff |
Coil Register | 1Bit Register mit Lese-/Schreibzugriff |
Status Register | 1Bit Register mit Lesezugriff |
Für die Register werden jeweils unterschiedliche Lese- sowie Schreibfuntionen genutzt.
Register lesen | Register schreiben | Mehrere zusammenhängende Register schreiben (MultiWrite, default) | |
---|---|---|---|
Holding | 3 | 6 | 16 |
Input | 4 | – | – |
Coil | 1 | 5 | 15 |
Status | 2 | – | – |
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 |
---|---|
M | Ganzzahliger Wert (Binäre Datenpunkte,Zählwerte) der vom Gateway nur gelesen werden kann/soll. |
S | Ganzzahliger Wert der vom Gateway gelesen sowie geschrieben werden kann/soll. |
X | Analogwert (mit Nachkommastellen) der vom Gateway nur gelesen werden kann/soll. |
Y | Analogwert (mit Nachkommastellen) der vom Gateway gelesen sowie geschrieben werden kann/soll. |
A | String, 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:
Parameter | Wertebereich | Beschreibung |
---|---|---|
<ip> | Host Name oder IP-Adresse des Server Gerätes | 0.0.0.0 bedeutet lokal (Modbus Server Modus) |
<port> | Port des Server Gerätes | Nur anzugeben falls dieser vom Standard-Port 502 abweicht |
<server/unit_ID> | 1 - 255 | Adresse des anzusprechenden Server-Gerätes |
<register> | holding, input, coil, status | Registertyp |
<no> | 0 - 65535 | Registeradresse |
<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 |
---|---|
BIT | Einzelbit innerhalb des Registers bzw. Coil- und Status-Register |
UINT8 | 8bit unsigned (Vorzeichenlos) |
UINT16 | 16bit unsigned |
UINT32 | 32bit unsigned |
SINT8 | 8bit signed (Vorzeichenbehaftet) |
SINT16 | 16bit signed |
SINT32 | 32bit signed |
FLOAT32 | 32bit IEEE754 floating point (Fliesskommazahl) |
FLOAT64 | 64bit IEEE754 floating point (Fliesskommazahl) |
FIXED32 | 32bit Festkommazahl |
FIXED48 | 48bit 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> | Beschreibung | Bytereihenfolge |
---|---|---|
0 | little endian (Intel) | 1234, bei in mbtcp1.cfg gesetzter Option „WisagMode = 1“ 2143 (wie S:2) |
1 (default) | big endian (Motorola) | 4321 |
2 | little endian (Intel),Bytes vertauscht | 2143 |
3 | big endian (Motorola),Bytes vertauscht | 3412 |
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 |
---|---|
0 | MultiWrite (default, Modbus Function 15 für COIL, 16 für HOLDING) |
1 | SingleWrite (Modbus Function 5 für COIL, 6 für HOLDING) |
2 | Masked (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