Modbus Slave seriell


 

Der Modbus Slave Treiber ermöglicht es Datenpunke/Register als Modbus Slave Teilnehmer zur Verfügung zu stellen. Dabei können bis zu vier verschiedene Registertypen zur Verfügung gestellt werden.

1.Holding Register16Bit Register mit Lese-/Schreibzugriff
2.Input Register16Bit Register mit Lesezugriff
3.Coil Register1Bit Register mit Lese-/Schreibzugriff
4.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-Treibers lautet: mod
Die Routing-Adresse des ersten Modbus-Treibers ist die 90
Die Datenpunktdatei für den ersten Modbus-Treiber heißt: modslave1.txt
Die Konfigurationsdatei für globale Einstellungen des ersten Modbus-Treibers heißt: modslave1.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.

„<slave> <register> <no>[.<bit>]“

Kommunikationsstatus mit Master-Gerät: „failure“

Dabei gilt folgende Definition:

ParameterWertebereichBeschreibung
<slave>0 - 247Adresse des anzusprechenden Slave-Gerätes
<register>holding,
input,
coil,
status
Registertyp
<no>0 - 65535Registeradresse
<bit>1-16Einzelbit innerhalb des Registers

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

[M 2 coil 120]

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

format = <format>

Dabei kann <format> folgende Werte annehmen:

<format>Beschreibung
bcd16bit BCD
c32bit integer signed
ch32bit signed / 100 (Gewinn zweier Nachkommastellen)
ci32bit signed (Bytereihenfolge vertauscht)
cm32bit signed / 1000
ct32bit signed / 10 (Gewinn einer Nachkommastelle)
d64bit IEEE754 floating point (Fliesskommazahl)
dm64bit IEEE754 floating point (Bytereihenfolge vertauscht)
f32bit IEEE754 floating point (Fliesskommazahl)
fi32bit IEEE754 floating point (Bytereihenfolge vertauscht)
j32bit IEEE754 floating point (Fliesskommazahl mit vertauschten Worten)
ji32bit IEEE754 floating point (Byte- und Wortreihenfolge vertauscht)
s16bit integer signed (Vorzeichenbehaftet)
sbit061bit Einzelbit aus Holding oder Input Register. Erfordert die Angabe von <bit> in der Adresse. Zum Schreiben wird Funktionscode 06 verwendet.
sbit161bit Einzelbit aus Holding oder Input Register. Erfordert die Angabe von <bit> in der Adresse. Zum Schreiben wird Funktionscode 16 verwendet.
sh16bit signed / 100 (Gewinn zweier Nachkommastellen)
sm16bit signed / 1000
st16bit signed / 10 (Gewinn einer Nachkommastelle)
u16bit integer unsigned (Vorzeichenlos)
u3232bit integer unsigned
u32s32bit integer unsigned (Wortreihenfolge vertauscht)
u6464bit integer unsigned
uh16bit unsigned / 100 (Gewinn zweier Nachkommastellen)
um16bit unsigned / 1000
ut16bit unsigned / 10 (Gewinn einer Nachkommastelle)

Weitere spezielle Formate sind auf Anfrage möglich.

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

32Bit-Formate 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!

Es dürfen mehrere Slave-Adressen in einer Datei projektiert werden.

Beispiele für typische Datenpunkte:

[S 2 status 5]
name = Slave 2 Status-Register 5 (1 Bit)
query = pe
writecache = yes

[M 2 coil 10]
name = Slave 2 Coil-Register 10 (1 Bit)
query = pe

[S 4 input 10.3]
name = Slave 4 Input-Register 10 Bit 3 (1 Bit)
format = sbit06
query = pe
writecache = yes

[M 4 holding 11.5]
name = Slave 4 Holding-Register 11 Bit5
format = sbit06
query = pe

[S 4 holding 15]
name = Slave 4 Holding-Register 15 (16Bit-Wert ohne Vorzeichen)
query = pe
format = u
writecache = yes

[X 4 holding 16]
name = Slave 4 Holding-Register 16 (16Bit-Wert mit Vorzeichen)
format = s
query = pe

[Y 4 input 17]
name = Slave 4 Input-Register 17+18 (32Bit-Float-Wert)
format = f
query = pe
writecache = yes

[X 4 holding 17]
name = Slave 4 Holding-Register 17 (16Bit-Wert mit Vorzeichen mit Faktor 10 skaliert)
format = st
query = pe