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.
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.
Jetzt kann die serielle Modbus-RTU-Schnittstelle konfiguriert werden.
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
▷ Definiere den Wert 12 als Default Value für die ersten zehn Holding-Register.
▷ Ordne diese Kanäle in der POU-Modbus-Logik für den Zugriff auf Anwendungsebene zu.
4. Modbus TCP Server konfigurieren #
▷ Gib für Modbus TCP die Slave IP address in der CODESYS-Konfiguration an.
▷ 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:
Modbus TCP Server in ModRSsim2 mit konfigurierten Quell- und Zielregistern:
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.