Ziel: mit CODESYS einen RevPi als Modbus-Slave konfigurieren, um gleichzeitig mit Modbus-TCP- und Modbus-RTU-basierten Industriegeräten stabil zu kommunizieren. Die Anwendung kopiert die ersten 10 Holding-Register in die 10 Eingangsregister beider Slaves.

Dieses Tutorial ist anwendbar mit den Basismodulen

Ein bereits programmiertes Beispielprojekt mit RevPi Connect/+/S als Basismodul steht dir in einem GitLab Repository zur Verfügung. Es kann auf die o. g. Basismodule angepasst werden.

Voraussetzungen #

Geräte #

RevPi Basismodul mit RS485-Schnittstelle

✓ Modbus-TCP-Slave

✓ Modbus-RTU-Slave

Note

Stelle sicher, dass die Slaves mit eindeutigen IDs und konsistenten Kommunikationseinstellungen konfiguriert sind.

Hardware-Installation #

✓ RevPi Basismodul ist mit dem Netzwerk verbunden.

✓ RevPi Basismodul ist an die Spannungsversorgung angeschlossen.

Software-Installation #

✓ CODESYS Development System (CODESYS) ist auf deinem PC installiert.

✓ CODESYS Runtime ist im CODESYS Development System installiert.

✓ RevPi I/O-Treiber ist im CODESYS Development System installiert.

✓ CODESYS ist mit dem RevPi verbunden.

✓ CODESYS Runtime ist auf dem RevPi installiert.

Siehe CODESYS-Dokumentation zu System einrichten.

1. Projekt in CODESYS anlegen #

▷ Öffne CODESYS auf deinem PC.

▷ Öffne das Beispielprojekt ModbusTCP-RTU-Slave aus dem GitLab Repository.

▷ Passe ggf. das RevPi Basismodul im Gerätebaum an dein tatsächlich verwendetes Gerät an.

Der Gerätebaum in CODESYS ist wie folgt konfiguriert:

  • Modbus-TCP-Slave empfängt Anfragen von einem Modbus-TCP-Master über Ethernet und stellt Holding-Register und Eingangsregister zur Verfügung.

  • Modbus-RTU-Slave kommuniziert mit einem Modbus-RTU-Master über die serielle RS485-Schnittstelle und stellt ebenfalls Holding-Register und Eingangsregister zur Verfügung.

  • POU_Modbus verarbeitet die Anwendungslogik, um Daten zwischen den Holding-Registern und Eingangsregistern zu kopieren.

CODESYS Device Tree Overview

2. Serielle Modbus-RTU-Schnittstelle konfigurieren #

Für RevPi Geräte mit RS485-Schnittstelle

▷ Öffne die Konfigurationsdatei CODESYSControl_User.cfg mit:

sudo nano /etc/codesyscontrol/CODESYSControl_User.cfg

▷ Füge folgende Zeile hinzu, um das Namensschema für die seriellen Ports zu definieren.

[SysCom]
Linux.Devicefile=/dev/ttyRS485-

Das ermöglicht CODESYS, die RS485-Schnittstellen im Linux-System zu finden und über Modbus RTU zu kommunizieren.

▷ Öffne in CODESYS das MODBUS_COM Gerät.

▷ Weise auf dem Reiter General die COM ports je nach Anzahl der RS485-Schnittstellen wie folgt zu:

  • /dev/ttyRS485-0 → COM Port 1

  • /dev/ttyRS485-1 → COM Port 2

  • /dev/ttyRS485-x → COM Port x+1

Bis RevPi Bullseye (04/2024)

Ältere Images verfügen nur über das Verzeichnis /dev/ttyRS485.

▷ Lege einen symbolischen Link an, um auf denselben physikalischen RS485-Anschluss zugreifen und mit dem Modbus-Slave kommunizieren zu können:

ls -la /dev/ttyRS485-0

▷ Bei Fehlermeldung No such file or directory, erstelle den symbolischen Link mit:

sudo ln -s /dev/ttyRS485 /dev/ttyRS485-0

▷ Starte das System neu.

Mit USB-485-Konverter

Wenn ein zusätzlicher USB-485-Konverter angeschlossen ist, muss der korrekte COM-Port identifiziert werden.

▷ Füge der Datei /etc/codesyscontrol/CODESYSControl_User.cfg folgende Zeile hinzu:

[SysCom]
Linux.Devicefile=/dev/ttyRS485-

Die USB-Gerätenummer wird beim Anschließen des USB-485-Konverters automatisch vom System vergeben.

▷ Ermittle die Gerätenummer mit:

ls /dev/ttyUSB*

❯ Das zeigt Geräte wie /dev/ttyUSB0, /dev/ttyUSB1 an.

▷ Lege einen symbolischen Link für den USB-485-Konverter auf die nächste freie /dev/ttyRS485-x-Gerätedatei an:

sudo ln -s /dev/ttyUSBx /dev/ttyRS485-y

x ist die USB-Geräte-Nummer, die das System zuweist.

y ist die nächsthöhere RS485-Portnummer, die nicht durch einen integrierten Port belegt ist.

Beispiel:

Wenn dein Gerät einen integrierten Port /dev/ttyRS485-0 hat und dein USB-Konverter /dev/ttyUSB0 ist, verwende:

sudo ln -s /dev/ttyUSB0 /dev/ttyRS485-1

3. Modbus-RTU-Slave und Modbus-TCP-Slave konfigurieren #

Configuring Modbus RTU Slave

▷ Mappe die Holding-Register und Eingangsregister auf die Variablen in POU_Modbus, um die Modbus-Daten in deiner Anwendung lesen und schreiben zu können.

Configuring Modbus RTU Slave

4. Modbus-TCP-Master und Modbus-RTU-Master simulieren #

▷ Verwende QModMaster, um Modbus-TCP- und Modbus-RTU-Master zu simulieren.

Modbus-Funktionen #

Write Multiple Registers schreibt Daten in die Holding-Register des auf dem RevPi laufenden Modbus-TCP/RTU-Slaves.

Configuring Modbus RTU Master

Read Holding Registers liest die Daten aus den Holding-Registern des Modbus-TCP/RTU-Slaves aus.

Configuring Modbus RTU Master

Modbus-TCP-Unit-ID konfigurieren #

Bei Modbus-TCP übernimmt die Unit-ID die gleiche logische Rolle wie die Slave-ID bei Modbus-RTU. Sie ist insbesondere relevant, wenn ein Modbus-TCP-Gateway mehrere untergeordnete Geräte adressiert oder wenn ein einzelnes Gerät wie der RevPi direkt angesprochen wird.

▷ Verwende Unit-ID 255 für den auf dem RevPi laufenden Modbus-TCP-Slave, um das Gerät (Gateway) direkt anzusprechen.

Note

Besonderheit bei QModMaster:

QModMaster verwendet Unit ID 0 anstelle von Unit ID 255, um das Gateway selbst anzusprechen.

▷ Verwende daher in QModMaster Unit ID 0, wenn du mit dem Modbus-TCP-Slave auf dem RevPi kommunizierst.

Configuring Modbus RTU Master
Configuring Modbus RTU Master

Weitere Ressourcen #