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
u16bit unsigned (Vorzeichenlos)
ut16bit unsigned / 10 (Gewinn einer Nachkommastelle)
uh16bit unsigned / 100 (Gewinn zweier Nachkommastellen)
um16bit unsigned / 1000
u3232bit unsigned
u32s32bit unsigned (Wortreihenfolge vertauscht)
s16bit signed (Vorzeichenbehaftet)
st16bit signed / 10 (Gewinn einer Nachkommastelle)
sh16bit signed / 100 (Gewinn zweier Nachkommastellen)
sm16bit signed / 1000
c32bit signed
ci32bit signed (Bytereihenfolge vertauscht)
ct32bit signed / 10 (Gewinn einer Nachkommastelle)
ch32bit signed / 100 (Gewinn zweier Nachkommastellen)
cm32bit signed / 1000
u3232bit unsigned
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)
d64bit IEEE754 floating point (Fliesskommazahl)
dm64bit IEEE754 floating point (Bytereighenfolge vertauscht)
bcd16bit BCD
sbit061bit Einzelbit aus Holding oder Input Register. Erfordert die Angabe von <bit> in der Adresse. Zum schreiben wird Funktionscode 06 bzw. 05 verwendet.

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