(Diese Funktionalität steht nur zur Verfügung, wenn die Option "Daten von externen Eingängen über Modbus TCP einlesen" installiert wurde.)


Eine weitere weit verbreitete Möglichkeit, Messdaten von externen Sensoren einzulesen ist über das Modbus Protokoll. Der  dydaqmeas kann Daten von anderen Geräten einlesen, die im gleichen Netz liegen.


Hierzu muss auf der Seite Externe Eingänge eine Datenquelle vom Typ Modbus TCP angelegt werden. Geben Sie eine Beschreibung ein, wählen Sie Modbus TCP in der Kombobox aus und drücken Sie auf Anlegen. Es öffnet sich ein Einstellungsdialog.


Geben Sie die TCP Adresse des Sensors, den zu verwendenden TCP Port und die Geräte-ID ein. Als TCP-Port ist 502 üblich, als Geräte-ID (Modbus-Adresse) ist für Modbus-TCP 255 üblich, sofern das Gerät nicht auf eine Modbus-Adresse im Bereich von 1 bis 247 konfiguriert ist.


Für manche Hersteller kann (und sollte) bei Betriebsart der Name des Herstellers eingetragen werden. Ist der Hersteller des benutzten Sensors dort nicht aufgelistet, kann „Allgemein“ verwendet werden.

Die Unterscheidung zwischen „Allgemein Big Endian“ und „Allgemein Little Endian“ beschreibt, in welcher Reihenfolge die einzelnen Bytes eines Wertes übertragen werden. Dabei steht „Big Endian“ für „das höherwertige Byte (Most Significant Byte, MSB) wird zuerst übertragen“ und „Little Endian“ für „das niederwertige Byte (Least Significant Byte, LSB) wird zuerst übertragen“. Eine entsprechende Angabe sollte in der Dokumentation des Sensors zu finden sein.


Beispiel: Der Zahlenwert 4660 entspricht in 16-Bit hexadezimaler Schreibweise dem Wert 0x1234 und setzt sich aus dem höherwertigen Byte 0x12 (entspricht 18 dezimal) und dem niederwertigen Byte 0x34 (entspricht 52 dezimal) zusammen. Bei Big Endian würde zuerst der Wert 0x12 und dann der Wert 0x34 übertragen, bei Little Endian anders herum, also zuerst 0x34 und dann 0x12. Wenn Endian falsch (also anders als für den angeschlossenen Sensor erforderlich) eingestellt ist, würde der Wert nach der Übertragung fälschlich als 0x3412 interpretiert, das entspricht dezimal 13330. Generell können „unsinnige“ Werte darauf hindeuten, dass der Endian falsch eingestellt sein könnte.


Die Beschreibung für die Datenquelle können Sie frei vergeben, sie darf jedoch nicht leer sein.



Für die Definition der Kanäle ist etwas Hintergrundwissen zu Modbus nützlich. Bei Modbus wird zwischen den folgenden Datentypen unterschieden:


„coils“: Das sind Daten die aus nur einem Bit bestehen und die sowohl gesetzt als auch zurück gelesen werden können. Eine „coil“ könnte z. B. die Spule eines Relais sein, das ein und aus geschaltet werden kann, und dessen Zustand auch zurück gelesen werden kann. Im dydaqlog wird nur das Zurücklesen unterstützt, also nicht das Setzen. Coils können im  dydaqmeas als „boolean“ Werte eingelesen werden.


„discrete inputs“: Das sind Daten die aus nur einem Bit bestehen und nur gelesen werden können. Ein „discrete input“ entspricht einem digitalen Eingang. Discrete Inputs können im  dydaqmeas als „boolean“ Werte eingelesen werden.


„input registers“: Das sind Daten die aus 16-Bit Werten bestehen und nur gelesen werden können. Input Register können im  dydaqmeas als „float“ Werte eingelesen werden. Das Format der Daten kann dabei unterschiedlich sein. Ebenso kann es sein, dass mehrere dieser 16-Bit Werte zu einem Wert zusammen gefasst werden müssen, oder dass an Stelle von Zahlen Zeichenketten (Strings) in manchen Registern abgelegt sind. Näheres dazu weiter unten.


„holding registers“: Das sind Daten die aus 16-Bit Werten bestehen die sowohl gesetzt als auch zurück gelesen werden können. Im  dydaqmeas wird nur das Zurücklesen unterstützt, also nicht das Setzen. Holding Register können im dydaqlog als „float“ Werte eingelesen werden. Das Format der Daten kann dabei unterschiedlich sein. Ebenso kann es sein, dass mehrere dieser 16-Bit Werte zu einem Wert zusammen gefasst werden müssen, oder dass an Stelle von Zahlen Zeichenketten (Strings) in manchen Registern abgelegt sind. Näheres dazu weiter unten.


Die oben genannten Register werden mit verschiedenen Modbus-Kommandos ausgelesen. Für die Adressierung bzw. Nummerierung der einzelnen Register gibt es unterschiedliche Konventionen.

Intern werden die Register jeden Typs über eine 16-Bit-Adresse im Bereich von 0 bis 65535 angesteuert, also das erste Register jedes Typs mit Adresse 0, das zweite mit Adresse 1, und so weiter. Für jeden der vier Typen (Coil, discrete input, input register, holding register) gibt es also jeweils den gleichen internen Adressraum.



Um die vier Typen (Coil, discrete input, input register, holding register)  schon in der Adresse unterscheiden zu können gibt es verschiedene Konventionen. Im  dydaqmeas wird die „Traditional Convention“ benutzt, mit den folgenden Eigenschaften:


„coils“: Werden mit Adressen im Bereich beginnend bei 1 bis zu 9999 bezeichnet, wobei die erste Coil (mit interner Adresse 0) in dieser Konvention die Adresse 1 bekommt.


„discrete inputs“: Werden mit Adressen im Bereich beginnend bei 10001 bis zu 19999 bezeichnet, wobei der erste Discrete Input (mit interner Adresse 0) in dieser Konvention die Adresse 10001 bekommt.


„input registers“: Werden mit Adressen im Bereich beginnend bei 30001 bis zu 39999 bezeichnet, wobei das erste Input Register (mit interner Adresse 0) in dieser Konvention die Adresse 30001 bekommt.


„holding registers“: Werden mit Adressen im Bereich beginnend bei 40001 bis zu 49999 bezeichnet, wobei das erste Holding Register (mit interner Adresse 0) in dieser Konvention die Adresse 40001 bekommt.


Entsprechend werden die Register dann weitergezählt, so dass z. B. das fünfte Holding Register (mit interner Adresse 4) im dydaqlog über die Adresse 40005 (= 40001 + 4) angesteuert wird.

Die als Register-Inhalt übertragenen Bits können / müssen dann je nachdem was der Sensor liefert unterschiedlich interpretiert werden.


Für den Typ „16-Bit unsigned (straight binary)“ ist das wie folgt:

Binär-Wert

Hexadezimal

Wert für „16-Bit unsigned (straight binary)“

0000000000000000

0x0000

0

0000000000000001

0x0001

1

0000000000000010

0x0002

2

… usw. ...



0111111111111111

0x7FFF

32767

1000000000000000

0x8000

32768

1000000000000001

0x8001

32769

… usw. ...



1111111111111101

0xFFFD

65533

1111111111111110

0xFFFE

65534

1111111111111111

0xFFFF

65535



Für den Typ „16-Bit unsigned (offset binary)“ ist das wie folgt:

Binär-Wert

Hexadezimal

Wert für „16-Bit unsigned (offset binary)“

0000000000000000

0x0000

-32768

0000000000000001

0x0001

-32767

0000000000000010

0x0002

-32766

… usw. ...



0111111111111111

0x7FFF

-1

1000000000000000

0x8000

0

1000000000000001

0x8001

1

… usw. ...



1111111111111101

0xFFFD

32765

1111111111111110

0xFFFE

32766

1111111111111111

0xFFFF

32767



Für den Typ „16-Bit signed (twos complement)“ ist das wie folgt:

Binär-Wert

Hexadezimal

Wert für „16-Bit signed (twos complement)“

1000000000000000

0x8000

-32768

1000000000000001

0x8001

-32767

1000000000000010

0x8002

-32766

… usw. ...



1111111111111111

0xFFFF

-1

0000000000000000

0x0000

0

0000000000000001

0x0001

1

… usw. ...



0111111111111101

0x7FFD

32765

0111111111111110

0x7FFE

32766

0111111111111111

0x7FFF

32767



Für den Typ „32-Bit unsigned (straight binary)“ ist das wie folgt:

Binär-Wert

Hexadezimal

Wert für „32-Bit unsigned (straight binary)“

00000000000000000000000000000000

0x00000000

0

00000000000000000000000000000001

0x00000001

1

00000000000000000000000000000010

0x00000002

2

… usw. ...



01111111111111111111111111111111‍

0x7FFFFFFF

2147483647

10000000000000000000000000000000

0x80000000

2147483648

10000000000000000000000000000001

0x80000001

2147483649

… usw. ...



‍‍11111111111111111111111111111101

0xFFFFFFFD

4294967293

‍‍11111111111111111111111111111110

0xFFFFFFFE

4294967294

‍‍11111111111111111111111111111111

0xFFFFFFFF

4294967295



Für den Typ „32-Bit signed (twos complement)“ ist das wie folgt:

Binär-Wert

Hexadezimal

Wert für „32-Bit signed (twos complement)“

10000000000000000000000000000000

0x80000000

-2147483648

10000000000000000000000000000001

0x80000001

-2147483647

10000000000000000000000000000010

0x80000002

-2147483646

… usw. ...



1111111111111111‍1111111111111111

0xFFFFFFFF

-1

00000000000000000000000000000000

0x00000000

0

00000000000000000000000000000001

0x00000001

1

… usw. ...



‍‍01111111111111111111111111111101

0x7FFFFFFD

2147483645

‍‍01111111111111111111111111111110

0x7FFFFFFE

2147483646

‍‍01111111111111111111111111111111

0x7FFFFFFF

2147483647


Für den Typ „32-Bit float (IEEE 754)“ erfolgt die Auswertung wie von der Norm  IEEE 754 vorgegeben.


Für die 64-Bit-Werte in „unsigned (straight binary)“ oder „signed (twos complement)“ erfolgt die Auswertung ähnlich wie bei den entsprechenden 16- oder 32-Bit-Werten, nur dann natürlich mit entsprechend mehr Bits.


Wo mehrere 16-Bit-Werte zu einem 32- oder 64-Bit Wert kombiniert werden, liegen die Adressen hintereinander.


Beispiel: Ein 32-Bit Wert der beim siebten Holding Register (interne Adresse 6) beginnt, würde über Register-Adresse 40007 (= 40001 + 6) angesprochen, belegt dann aber auch die nachfolgende Adresse 40008 (intern 7) so dass der nächste Wert dann wieder bei 40009 (intern 8) möglich wäre.


Manche Hersteller speichern auch Strings in einigen Input Registern oder Holding Registern. Da ein Zeichen in einem Byte gespeichert werden kann, können dann zwei Zeichen pro 16-Bit Register abgelegt werden können. Auch hier können mehrere aufeinander folgende Register zusammen gehören und gemeinsam eine Zeichenkette wie z. B. eine Geräte-Bezeichnung enthalten.


Danach können Sie im unteren Teil des Dialogs die Kanäle definieren, die Sie importieren möchten. Vergeben Sie einen Namen (dieser muss der  dydaqmeas Konvention für Kanalnamen entsprechen, d.h. er darf nur aus Buchstaben, Unterstrichen und Zahlen bestehen, muss eindeutig sein und mit einem Buchstaben beginnen). Die Beschreibung können Sie frei vergeben oder auch leer lassen. Hier sind, wie bei allen Kanalbeschreibungen auch Groß- und Kleinschreibung, Leer- und Sonderzeichen möglich.



Der Kanaltyp kann float, boolean oder string sein. Importieren Sie Integer- und Festkommawerte ebenfalls als float, sie werden beim Import automatisch umgewandelt.. Bei float Kanälen können Sie eine Einheit und eine Skalierung angeben. Die Skalierung kann linear über zwei Punkte erfolgen. Außerdem ist eine lineare Anpassung über Faktor und Offset möglich. Ähnlich wie bei den anderen Eingangskanälen muss die Skalierung durch Anhaken der Checkbox aktiviert werden.


Sie können einen Defaultwert angeben, der für den Kanal verwendet wird, falls der Wert nicht gelesen werden kann. Die Adresse für das auszulesende Register entnehmen Sie der Herstellerdokumentation für den Sensor. Bei float Kanälen müssen Sie außerdem angeben, wie die Werte in dem Register kodiert sind (siehe oben). Bei string Kanälen geben Sie bitte die (maximale) Länge des Strings an, also, wie viele aufeinander folgende Register ausgelesen werden müssen. Drücken Sie auf Zufügen, um den Kanal anzulegen.


Wenn Sie alle Kanäle definiert haben, schließen Sie den Einstellungsdialog durch drücken der Schaltfläche Übernehmen.