Skip to main content

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

  1. Stellen Sie die Verbindung mit CODESYS zum Laufzeitsystem her und öffnen Sie die PLCShell.

  2. Setzen Sie scaling_governor auf performance.

    rt-set scaling_governor all performance
  3. 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

    _rtsl_img_ethernet_performance.png
  4. Setzen Sie die Frequenz (min und max) auf einen festen Wert:

    rt-set cpu_frequency all 3000000
  5. Deaktivieren Sie Hyperthreading:

    rt-set hyperthreading off
  6. Deaktivieren Sie Throttling:

    rt-set throttling off
  7. Aktivieren Sie NAPI-Threads für den verwendeten Netzwerkadapter (hier ens5):

    rt-set napi ens5 on
  8. Bestimmen Sie IRQ und NAPI-Threads des Netzwerkadapters:

    irq-list

    Beispiel einer Ausgabe

    _rtsl_img_ethernet_performance_1.png
  9. Erhöhen Sie die Priorität für Netzwerkadapter mittels irq-set-prio und irq-set-affinity (beispielsweise auf 55) und binden Sie die Netzwerkadapter an die gleiche CPU (beispielsweise 0x2 für CPU 1).

    Wichtig

    Setzen Sie die Einstellungen per Name, nicht per Nummer. Nummern können sich beim Systemstart ändern.

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

    _rtsl_img_ethernet_performance_3.png
  11. Setzen Sie die Priorität der EtherCAT_Task auf 1. Dies entspricht der Linux Realtime Priorität 55.

    Für weitere Informationen siehe Mapping der Task-Prioritäten im Linux-System

  12. Binden Sie die EtherCAT_Task mittels Taskgruppe auf die gleiche CPU (hier: Core 1, entspricht Affinity 0x2):

    _rtsl_img_ethernet_performance_4.png

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

EtherCAT_Task

1

1

55

0x2 (CPU 1)

PROFINET

Profinet_IOTask

1

2

55

0x4 (CPU 2)

EtherNet/IP

ENIPScannerIOTask

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.

  1. 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
  2. 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