Skip to main content

以太网/现场总线性能

下一节介绍如何优化运行 Linux 的现有 Linux 系统 CODESYS 使用基于以太网的现场总线时的运行系统。例如,这些现场总线包括 EtherCAT, PROFINET,或 EtherNet/IP。

此处的描述是作为示例给出的 EtherCAT Master,也可以用同样的方式用于 PROFINET。

要求

  • 硬件

    • 台式电脑

    • Linux 电脑:

      每个实时敏感现场总线(例如 EtherCAT Master/PROFINET)至少有一个免费以太网端口,仅供专用。

      重要

      不应通过交换机或 USB 连接使用的端口(甚至不能通过内部连接)。

  • 软件

    • CODESYS IDE

    • 带有 EtherCAT 主站的 IEC 应用程序

    • 带有实时内核的 Linux 操作系统,例如 Debian

      有关更多信息,请参阅以下内容: 性能优化

    • CODESYS 运行时系统 — 例如 CODESYS Control​ for Linux SL

配置

目标本质上是确保所有参与操作的线程 CODESYS 运行系统作为 EtherCAT Masters,在预定义的 CPU 上运行,优先级已定义。为此,可以在 IEC 应用程序和 Linux 系统上进行设置。

重要

请勿为此使用 CPU 0,因为操作系统通常将其用于某些系统服务(内务管理)。

为了在 Linux 系统上进行优化,建议使用 PLCShell 命令。也可以通过运行时配置或直接在 Linux 系统上配置所需的设置。有关更多信息,请参阅以下内容: 性能优化

  1. 与 CODESYS 建立与运行时系统的连接,然后打开 PLCShell。

  2. 设置 scaling_governor 到 performance。

    rt-set scaling_governor all performance
  3. 设置 CPU 频率。你需要直接在 Linux 系统上配置这些设置。有关更多信息,请参阅以下内容: 在 Linux 系统上设置 CPU 频率。

    在运行时版本 SP23 及更高版本中,将有用于设置 CPU 频率的 PLCShell 命令。

    首先确定可能的频率:

    rt-get cpu_frequency

    输出示例

    _rtsl_img_ethernet_performance.png
  4. 将频率(最小值和最大值)设置为固定值:

    rt-set cpu_frequency all 3000000
  5. 禁用超线程:

    rt-set hyperthreading off
  6. 禁用节流:

    rt-set throttling off
  7. 为使用的网络适配器启用 NAPI 线程(此处: ens5):

    rt-set napi ens5 on
  8. 确定网络适配器的 IRQ 和 NAPI 线程:

    irq-list

    输出示例

    _rtsl_img_ethernet_performance_1.png
  9. 使用 irq-set-prio 和 irq-set-affinity 提高网络适配器的优先级(例如,在 55 上)并将网络适配器绑定到同一 CPU 上,例如, 0x2 用于 CPU 1。

    重要

    按名称而不是数字设置首选项。当系统启动时,数字可能会发生变化。

    _rtsl_img_ethernet_performance_2.png
  10. 将相应的 NAPI 线程设置为相同的优先级和 CPU:

    _rtsl_img_ethernet_performance_3.png
  11. 设置优先级 EtherCAT_Task 到 1。这相当于 Linux 的实时优先级 55。

    有关更多信息,请参阅以下内容: 在 Linux 系统上映射任务优先级

  12. 使用任务组绑定 EtherCAT_Task 到同一 CPU(此处:Core 1,对应于亲和力) 0x2):

    _rtsl_img_ethernet_performance_4.png

案例示例: EtherCAT, PROFINET, EtherNet/IP

场景:3 条基于以太网的现场总线(示例 EtherCAT, PROFINET, EtherNet/IP) 在至少有 4 个 CPU 的 Linux 系统上

建议使用以下设置(避免使用 CPU 0):

现场总线

IEC 任务名称

IEC 任务优先级

IEC 任务核心

IRQ 优先级

IRQ Affinity

EtherCAT

EtherCAT_Task

1

1

55

0x2(中央处理器 1)

PROFINET

Profinet_IOTask

1

2

55

0x4(中央处理器 2)

EtherNet/IP

ENIPScannerIOTask

1

3

55

0x8(中央处理器 3)

在 Linux 系统上设置 CPU 频率

重要

Linux 系统启动时,以下设置会丢失,因此必须在重启后重置。

  1. 您可以使用以下 Linux 控制台命令来确定最小和最大 CPU 频率(此处: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

    输出示例

    3800000
    3800000
    3800000
    3800000
    1600000
    1600000
    1600000
    1600000
  2. 您可以使用以下命令来设置 CPU 频率:

    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