Dokumentation
Modbus RTU/TCP
ModBus ist ein Protokoll welches auf RTU (seriell binär) und TCP/IP Paketen basiert. Eine Verbindung mit IP-Symcon ist via LAN- oder Seriell-Gateway möglich.
Folgende Geräte werden von IP-Symcon unterstützt:
Einbindung in IP-Symcon
Zuerst muss eine "ModBus" Instanz innerhalb von IP-Symcon hinzugefügt werden. Dabei gibt es verschiedene Varianten, die erstellt werden können:
Instanz | Beschreibung |
---|---|
ModBus Gerät | Instanz, welche mehrere Adressen (Coils/Register) abbilden kann und Vorlagen unterstützt (ab 7.0) |
ModBus Coil | Instanz, welche eine einzelne Adresse (Coil) darstellt |
ModBus Adresse | Instanz, welche eine einzelne Adresse (Register) darstellt |
Viele Vorlagen sind in unserer Community zu finden: Vorlagen anzeigen
Anschließend muss die Konfiguration des übergeordneten Gateways und I/O Instanz an das angeschlossene Gerät angepasst werden. Es muss ausgewählt werden über welches Protokoll und Geräte-ID das Gerät angesprochen wird. Die Geräte-ID ist vorallem bei RTU angeschlossenen Geräten wichtig. Bei TCP angeschlossenen Geräten ist diese oftmals die Geräte-ID 1.
Um eine Verbindung zum Gerät herstellen zu können, müssen in der dem Gateway übergeordneten I/O Instanz, IP-Adressse und Port (Default: 502) eingetragen werden.
Weitere Konfiguration (Screenshot siehe unten) ist wiefolgt.
Option | Beschreibung |
---|---|
Einheit | Datentyp der Variable des Devices |
Funktion (Lesen) | Funktion nach der die Werte gelesen werden sollen |
Adresse (Lesen) | Geräteadresse des Registers aus dem gelesen werden soll |
Funktion (Schreiben) | Funktion nach der die Werte geschrieben werden sollen |
Adresse (Schreiben) | Geräteadresse des Registers in das Geschrieben werden soll |
Faktor (Zahlenwerte) | Der Faktor multipliziert oder teilt den empfangenen Wert und schreibt diesen in die Variable des Devices |
Länge (Strings) | Wenn die Länge größer 0 gesetzt ist, bestimmt es die Anzahl der Zeichen (Byte), welche abgefragt werden. Hinweis: 1 Register = 2 Zeichen (Byte) |
Byte-Reihenfolge | Je nach Gerät muss die Byte-Reihenfolge angepasst werden. Oft wird dies nicht dokumentiert, sondern muss ausprobiert werden. Big Endian und Little Endian (Bytes vertauscht) sind die gängigen Werte. |
Status emulieren | "Status emulieren" bedeutet, dass der Wert der Variable bei erfolgreichem Schreibbefehl auf den neuen Wert gesetzt wird und nicht auf einen Lesebefehl angewiesen ist. |
Intervall | Wenn das Intervall größer 0 gesetzt ist, wird die Adresse (Lesen) beim ModBus-Gerät zyklisch abgefragt und die Variable des Devices aktualisiert. |
Durch die Tatsache, dass wir noch 32 Bit Systeme unterstützen werden Int64 Werte als Float64 abgebildet.
Modbus Gerät
Sollen mehrere Adressen für ein Gerät abgefragt werden, sollte das Modbus-Gerät genutzt werden. Hier können mehrere Adressen als Tabelle eigetragen werden, sowie virtuelle Adressen definiert werden.
Konfiguration:
Name | Beschreibung |
---|---|
Adressen | Tabellarische Aufführung der definierten Adressen |
Virtuelle Adressen konfigurieren | Button mit dem eine Liste virtueller Adressen definiert werden kann |
Byte-Reihenfolge | Je nach Gerät muss die Byte-Reihenfolge angepasst werden. Oft wird dies nicht dokumentiert, sondern muss ausprobiert werden. Big Endian und Little Endian (Bytes vertauscht) sind die gängigen Werte. |
Intervall | Wenn das Intervall größer 0 gesetzt ist, wird die Adresse (Lesen) beim ModBus-Gerät zyklisch abgefragt und die Variable des Devices aktualisiert. |
Vorlage importieren | Durch diesen Button, kann eine Vorlage der Tabellen schnell eingefügt werden. |
Vorlage exportieren | Durch diesen Button, kann eine Vorlage aus den vorgenommenen Einstellungen erstellt werden. Die Profile werden dabei ebenfalls exportiert. |
Inhalt der Adressen-Liste:
Name | Beschreibung |
---|---|
Aktiv | Gibt an, ob die Variable erstellt werden soll |
Name | Name, der als Variablenname genutzt wird |
Einheit | Datentyp des Registers |
Funktion (Lesen) | Funktion nach der die Werte gelesen werden sollen |
Adresse (Lesen) | Registers aus dem gelesen werden soll |
Funktion (Schreiben) | Funktion nach der die Werte geschrieben werden sollen |
Adresse (Schreiben) | Registers in das Geschrieben werden soll |
Profil | Profil, welches die Variable bekommen soll |
Unter den Expertenoptionen kann der Ident individuell angepasst und auch eine Übersetzung für den Variablennamen mitgegeben werden.
Inhalt der virtuellen Adressen Liste:
Name | Beschreibung |
---|---|
Aktiv | Die Variable wird erstellt |
Name | Name der als Variablenname genutzt wird |
Variablentyp | Typ der Variable |
Profil | Profil der Variable |
Lesen | Skript, welches die Werte der virtuelle Adresse zu Verfügung stellt |
Schreiben | Skript, welches die Werte an die Variablen weitergibt. |
Beim Lese-Skript sind in $VALUES alle Werte mit den jeweiligen Idents verfügbar. Der neue Wert, der in der Variable der virtuellen Adresse laden soll, wird einfach mit return zurückgegeben. Sofern kein Wert geschrieben werden soll (z.B. weil ungültig) kann null zurückgegeben werden. (ab 7.1)
return ($VALUES["A_3_3_23296"] + $VALUES["A_3_3_23298"] + $VALUES["A_3_3_23300"])/3;
Beim Schreibt-Skript wird ein Assoziatives Array als return erwartet, welches alle Ident enthält, in die geschrieben werden soll. $VALUE enthält den neuen Wert, der per RequestAction angefordert wurde.
return ["A_3_3_23296" => $VALUE];
FunctionCodes
Je nach FunctionCode muss auch eine passende Adresse eingetragen werden. Diese kann der Tabelle entnommen werden.
Die nachfolgende Tabelle bietet ebenfalls einen Überblick, welcher FunctionCode bei welcher Parameterierung innerhalb von IP-Symcon gesendet wird:
FunctionCode | Geräteadresse | Lese-/ Schreibadresse | Name |
---|---|---|---|
0x01 (1) | 1 - 10000 | Geräteadresse - 1 | Read Coils |
0x05 (5) | 1 - 10000 | Geräteadresse - 1 | Write Single Coil |
0x02 (2) | 10001 - 20000 | Geräteadresse - 10001 | Read Discrete Inputs |
0x03 (3) | 40001 - 50000 | Geräteadresse - 40001 | Read Holding Registers |
0x10 (16) | 40001 - 50000 | Geräteadresse - 40001 | Write Multiple registers |
0x04 (4) | 30001 - 40000 | Geräteadresse - 30001 | Read Input Registers |
Wenn Beispielsweise auf der Adresse 40123 geschrieben (FunctionCode = 0x10) werden soll, muss der passende Datentyp (Einheit) ausgewählt werden und die Schreibadresse 122 (40123 - 40001) eingetragen werden.
Manche Hersteller halten sich nicht an diese Konvention. Es muss in der jeweiligen Anleitung oder Datenblätter nachgesehen werden, ob die Geräteadresse je nach Functioncode abgezogen werden muss oder absolute Adressen gelten
Datentypen
Datentyp | Vorzeichen | Bits |
---|---|---|
BOOL | vorzeichenlos | 1 |
UINT8MSB | vorzeichenlos | 8 |
UINT8LSB | vorzeichenlos | 8 |
UINT16 | vorzeichenlos | 16 |
UINT32 | vorzeichenlos | 32 |
UINT64 | vorzeichenlos | 64 |
INT8MSB | vorzeichenbehaftet | 8 |
INT8LSB | vorzeichenbehaftet | 8 |
INT16 | vorzeichenbehaftet | 16 |
INT32 | vorzeichenbehaftet | 32 |
INT64 | vorzeichenbehaftet | 64 |
FLOAT32 | vorzeichenbehaftet | 32 |
FLOAT64 | vorzeichenbehaftet | 64 |
STRING |