Ethernet-Feldbus-Performance
Im Folgenden wird beschrieben, wie Sie ein bestehendes Linuxsystem, auf dem ein CODESYS-Laufzeitsystem läuft, optimieren, wenn Sie Ethernet-basierte Feldbusse verwenden. Zu diesen Feldbussen zählen beispielsweise EtherCAT, PROFINET oder EtherNet/IP) .
Die Beschreibung erfolgt hier beispielhaft für den EtherCAT Master und kann analog auch für PROFINET angewendet werden.
Voraussetzungen
Hardware
Desktop-PC
Linux-PC:
Mindestens ein freier Ethernet-Port pro Echtzeit-sensiblem Feldbus (beispielsweise EtherCAT Master / PROFINET) für die exklusive Verwendung.
Wichtig
Die Anbindung des verwendeten Ports sollte (auch intern) nicht über einen Switch oder USB erfolgen.
Software
CODESYS-IDE
IEC-Applikation mit EtherCAT Master
Linux-Betriebssystem (beispielsweise Debian) mit Echtzeit-Kernel
Für weitere Informationen siehe Performance-Optimierung
CODESYS Laufzeitsystem (beispielsweise CODESYS Control for Linux SL)
Konfiguration
Das Ziel besteht im Wesentlichen darin, dass alle Threads, die am Betrieb des CODESYS-Laufzeitsystems als EtherCAT Master beteiligt sind, auf einer vorgegebenen CPU mit einer festgelegten Priorität laufen. Dazu sind sowohl Einstellungen in der IEC-Applikation als auch auf dem Linuxsystem möglich.
Wichtig
Verwenden Sie dazu nicht die CPU 0, da diese typischerweise vom Betriebssystem für bestimmte Systemdienste verwendet wird (Housekeeping).
Für die Optimierung auf dem Linuxsystem wird die Verwendung von PLCShell-Kommandos empfohlen. Die notwendigen Einstellungen können aber auch über die Runtime-Konfiguration oder direkt auf dem Linuxsystem vorgenommen werden. Für weitere Informationen siehe: Performance-Optimierung
Stellen Sie die Verbindung mit CODESYS zum Laufzeitsystem her und öffnen Sie die PLCShell.
Setzen Sie
scaling_governoraufperformance.rt-set scaling_governor all performance
Setzen Sie die CPU-Frequenz. Diese Einstellungen müssen Sie direkt auf dem Linuxsystem vornehmen. Für weitere Informationen siehe: CPU-Frequenz auf Linuxsystem einstellen.
Ab Runtime-Version SP23 wird es für das Setzen der CPU-Frequenz PLCShell-Kommandos geben.
Bestimmen Sie dazu zunächst die möglichen Frequenzen:
rt-get cpu_frequency
Beispiel einer Ausgabe

Setzen Sie die Frequenz (min und max) auf einen festen Wert:
rt-set cpu_frequency all 3000000
Deaktivieren Sie Hyperthreading:
rt-set hyperthreading off
Deaktivieren Sie Throttling:
rt-set throttling off
Aktivieren Sie NAPI-Threads für den verwendeten Netzwerkadapter (hier
ens5):rt-set napi ens5 on
Bestimmen Sie IRQ und NAPI-Threads des Netzwerkadapters:
irq-list
Beispiel einer Ausgabe

Erhöhen Sie die Priorität für Netzwerkadapter mittels
irq-set-prioundirq-set-affinity(beispielsweise auf 55) und binden Sie die Netzwerkadapter an die gleiche CPU (beispielsweise0x2für CPU 1).Wichtig
Setzen Sie die Einstellungen per Name, nicht per Nummer. Nummern können sich beim Systemstart ändern.

Setzen Sie die zugehörigen napi-Threads auf gleiche Priorität und CPU:

Setzen Sie die Priorität der
EtherCAT_Taskauf 1. Dies entspricht der Linux Realtime Priorität 55.Für weitere Informationen siehe Mapping der Task-Prioritäten im Linux-System
Binden Sie die
EtherCAT_Taskmittels Taskgruppe auf die gleiche CPU (hier: Core 1, entspricht Affinity0x2):
Fallbeispiel: EtherCAT, PROFINET, EtherNet/IP
Szenario: 3 Ethernet-basierte Feldbusse (beispielhaft EtherCAT, PROFINET, EtherNet/IP) auf einem Linuxsystem mit mindestens 4 CPUs
Folgende Einstellungen werden empfohlen (CPU 0 wird vermieden):
Feldbus | IEC-Taskname | IEC-Task-Prio | IEC-Task-Core | IRQ-Prio | IRQ Affinität |
|---|---|---|---|---|---|
EtherCAT |
| 1 | 1 | 55 | 0x2 (CPU 1) |
PROFINET |
| 1 | 2 | 55 | 0x4 (CPU 2) |
EtherNet/IP |
| 1 | 3 | 55 | 0x8 (CPU 3) |
CPU-Frequenz auf Linuxsystem einstellen
Wichtig
Die folgenden Einstellungen gehen bei einem Linux-Systemstart verloren und müssen deshalb nach einem Neustart neu gesetzt werden.
Mit folgenden Linux-Konsolen-Kommandos können Sie die minimalen und maximalen CPU-Frequenzen ermitteln (hier: CPU0-3):
cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq cat /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_max_freq cat /sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_max_freq cat /sys/devices/system/cpu/cpu3/cpufreq/cpuinfo_max_freq cat /sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_min_freq cat /sys/devices/system/cpu/cpu1/cpufreq/cpuinfo_min_freq cat /sys/devices/system/cpu/cpu2/cpufreq/cpuinfo_min_freq cat /sys/devices/system/cpu/cpu3/cpufreq/cpuinfo_min_freq
Beispiel einer Ausgabe
3800000 3800000 3800000 3800000 1600000 1600000 1600000 1600000
Mit folgenden Kommandos können Sie die CPU-Frequenzen setzen:
echo "3000000" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq echo "3000000" | sudo tee /sys/devices/system/cpu/cpu1/cpufreq/scaling_max_freq echo "3000000" | sudo tee /sys/devices/system/cpu/cpu2/cpufreq/scaling_max_freq echo "3000000" | sudo tee /sys/devices/system/cpu/cpu3/cpufreq/scaling_max_freq echo "3000000" | sudo tee /sys/devices/system/cpu/cpu0/cpufreq/scaling_min_freq echo "3000000" | sudo tee /sys/devices/system/cpu/cpu1/cpufreq/scaling_min_freq echo "3000000" | sudo tee /sys/devices/system/cpu/cpu2/cpufreq/scaling_min_freq echo "3000000" | sudo tee /sys/devices/system/cpu/cpu3/cpufreq/scaling_min_freq