Ziel: mit CODESYS einen RevPi als Modbus Client konfigurieren, um gleichzeitig mit Modbus-TCP- und Modbus-RTU-basierten Industriegeräten stabil zu kommunizieren. Die Anwendung liest die Holding-Register (0 … 9) der angeschlossenen Modbus Server aus und schreibt ihre Werte zurück in die Holding-Register (10 … 19).

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 Server

✓ Modbus RTU Server

Note

Stelle sicher, dass die Server 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-Master 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 Client liest und schreibt auf ein Modbus TCP Server Gerät.

  • Modbus RTU Client kommuniziert mit einem seriellen Modbus RTU Server Gerät.

  • POU_Modbus verarbeitet die Anwendungslogik für das Lesen und Schreiben von Daten.

Project Setting

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-Server 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 Server konfigurieren #

▷ Richte den Modbus RTU Server wie folgt ein:

  • Kanal 1: Read Holding Registers

  • Kanal 2: Write Multiple Registers

Project Setting

▷ Definiere den Wert 12 als Default Value für die ersten zehn Holding-Register.

Project Setting

▷ Ordne diese Kanäle in der POU-Modbus-Logik für den Zugriff auf Anwendungsebene zu.

Project Setting

4. Modbus TCP Server konfigurieren #

▷ Gib für Modbus TCP die Slave IP address in der CODESYS-Konfiguration an.

Project Setting

▷ Verwende dieselbe Mapping-Logik wie bei Modbus RTU für die Holding-Register 0 … 9 und 10 … 19.

5. Modbus Server simulieren #

Um Modbus TCP und Modbus RTU Serever zu simulieren, verwende einen Modbus-Simulator, z. B. ModRSsim2:

▷ Installiere die Anwendung ModRSsim2.

▷ Konfiguriere Modbus TCP/RTU Server mit Holding-Registern:

  • 40001 … 40010 für Quelldaten

  • 40011 … 40020 für Zieldaten

Modbus RTU Server in ModRSsim2 mit konfigurierten Quell- und Zielregistern:

Project Setting

Modbus TCP Server in ModRSsim2 mit konfigurierten Quell- und Zielregistern:

Project Setting

6. Anwendung ausführen #

▷ Wähle in der Menüleiste Generate Code (F11), um das Projekt zu übersetzen.

▷ Öffne das Stammgerät.

▷ Wähle in den Communication Settings Scan Network, wähle den RevPi und stelle mit OK die Verbindung zum Gerät her.

▷ Wähle in der Menüleiste Login (Alt+F8), um dich auf dem RevPi anzumelden.

▷ Lege bei der ersten Anmeldung einen Nutzer an, indem du dem Assistenten folgst und Anmeldedaten festlegst.

▷ Melde dich im Fenster Device User Logon auf dem RevPi an.

▷ Bestätige beim ersten Mal das Herunterladen der Anwendung auf den RevPi mit Yes.

▷ Wähle in der Menüleiste ⯈ (F5), um die Anwendung zu starten.

7. Anwendung überprüfen #

▷ Prüfe in CODESYS und im Modbus Server, ob:

  • Daten korrekt aus den Holding-Registern 0 … 9 gelesen werden.

  • Daten zurück in die Holding-Register 10 … 19 geschrieben werden.

▷ Verwende die CODESYS-Überwachungstools, um den Echtzeitaustausch zwischen Client und Server zu überprüfen.

Weitere Ressourcen #