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.
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.
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-Slave und Modbus-TCP-Slave konfigurieren #
▷ 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.
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.
Read Holding Registers liest die Daten aus den Holding-Registern des Modbus-TCP/RTU-Slaves aus.
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. |