Skip to main content

多核

任务和 CPU 内核的分配显示在 任务配置 上的对象 选项卡:任务组 选项卡。

当今越来越多的控制器采用具有多个 CPU 内核的处理器。

如果 CODESYS 不使用多核功能的情况下在多核控制器上执行,然后任务的分配由操作系统的调度程序处理。只要一个应用程序是通过多个任务执行的,就会出现这种情况。在这种情况下,你对任务的分配没有直接影响。根据负载平衡的不同,任务还可以在不同的 CPU 内核上运行。

随着 CODESYS 多核功能,IEC 任务本身可以分配给专用 CPU 内核,同时考虑到已获得的 CPU 内核数量。这可以提高性能。为此,IEC 程序应分为多个任务。

有两种基本的不同策略 CODESYS 用于在 CPU 内核上分发 IEC 任务:

  • 链接并固定到 CPU 内核的 IEC 任务:

    任务总是在这个特定的 CPU 内核上执行。通过分组,可以将多个任务链接到一个 CPU 内核。例如,如果 IEC 程序尚无法同时在多个 CPU 内核上运行,这很有用。

  • IEC 任务在所有 CPU 内核上执行:

    操作系统负责在 CPU 核心上分配一组中的一个或多个任务。

重要

当 IEC 任务分布在 CPU 内核上时,某些变化会导致 IEC 程序中的行为,必须予以考虑。

  • 按优先级处理 IEC 任务已不再是既定的。只有当任务捆绑到一个 CPU 内核时,它们才会按优先级处理

  • IEC 任务中优先级最高的数据的周期一致性已不再是既定的。因此,如果在周期中值不发生变化,则必须在 IEC 任务周期开始时在本地复制数据。

  • 对于所有任务,都有一个共享的进程映像来运行任务。这个 ReadInputs() 在每个任务开始时调用函数, WriteOutputs() 函数在最后被调用。因此,首次公开募股模式分别适用于每项任务。这些函数读取和写入共享进程映像。进程映像也是物理写入的,只有在调用总线周期任务时才传输数据包。但是,总线循环任务会等待每次调用 WriteOutputsReadInputs 的任务。这确保了总线周期任务中的数据一致性。

    • 只能将输出分配给一项任务。

    • 可以将输入分配给多个任务,但应避免直接访问。必须通过原子操作将输入写入任务的局部变量。

    • 第二项任务,使用以下内容更新流程映像 ReadInputs() 在执行第一个任务的同时,还会在第一个任务运行时更新其输入。

    • 因此,只有在优先级最高的任务的单核上才能确保任务的数据一致性。

    提示

    您可以在总线上设置总线周期任务 PLC设定 标签。

    您可以显示 I/O 访问 标签:任务部署 标签。

    有关更多信息,请参阅: 总线循环任务

  • 对于一致的计数器(增量器、减量器),原子外部库函数 SysCpuAtomicAdd() 应始终使用(有关更多详细信息,请参阅 SysCpuHandling.library)。

重要

数据一致性

  • 位访问(数据类型) BIT)在 IEC 程序中的多核 CPU 上不能一致(原子)处理。为此,我们建议您使用外部库函数 SysCpuTestAndSetBit()。(有关详细信息,请参阅: SysCpuHandling.library)

  • 宽度不超过 32 位的简单数据类型 (BOOLBYTEWORD/INTDWORD/DINT等)在多核 CPU 上的 IEC 程序中也是一致地(以原子方式)进行处理。

  • 64 位数据类型 (LINT, LWORD, LREAL) 仅在 64 位系统和多核系统上的 IEC 程序中一致(原子地)处理。为此,您无需采取任何预防措施。

  • 要访问复杂的数据类型 (STRINGFBSTRUCT,以及 ARRAY),你需要自己为同步/一致性做好安排。

  • 在任务配置中,在 变量用法 选项卡,您可以定义 IEC 任务中的变量是否具有读取或写入权限。

  • 在多核系统上,可能会发生“内存重新排序效应”。有关更多信息,请参阅:IEC 操作员: __MemoryBarrier()

在多个处理器内核上分配任务

要求:您的应用程序中至少定义了两个任务,例如 MainTask (IEC-Task)和 LowTask (IEC-任务)。

  1. 打开 任务配置 编辑器中的对象。

  2. 切换到选项卡 任务组.

    概述显示了默认值 IEC 任务 任务组。

  3. 点击 添加群组 添加新任务组。

    这个 NewGroup 群组已添加。

  4. 双击群组名称 NewGroup 并将其更改为 LowGroup

  5. 核心,选择一项任务(示例 1)。

  6. 打开任务 LowTask (IEC-Task)在编辑器中。

  7. 任务组,选择新组 LowGroup

    这个 LowTask 任务现在由处理器核心 1 处理,因为它的组成员是 LowGroup

在跟踪中显示每个处理器内核的处理器负载

CODESYS,你可以在可视化中显示处理器负载情况 设备跟踪 对象。

有关如何在项目中显示设备跟踪的更多信息,请参阅: 访问控制器的所有痕迹