Objekt: „Taskkonfiguration“
Heutzutage besitzen immer mehr Steuerungen Prozessoren mit mehreren CPU-Kernen. Um dies für das IEC-Programm nutzen zu können und die Performance zu verbessern, besitzt CODESYS Möglichkeiten, die IEC-Tasks auf diese CPU-Kerne zu verteilen. Außerdem sollte das IEC-Programm auf mehrere Tasks aufgeteilt werden.
Bei der Verteilung der IEC-Tasks auf CPU-Kerne gibt es in CODESYS zwei grundlegend unterschiedliche Strategien:
-
IEC-Task fest an einen CPU-Kern gebunden:
Die Task wird immer auf diesem bestimmten CPU-Kern ausgeführt. Hierbei können auch mehrere Tasks auf ein und denselben CPU-Kern gebunden werden, wenn das IEC-Programm noch nicht in der Lage ist, gleichzeitig auf mehreren CPU-Kernen ausgeführt zu werden.
-
IEC-Task wird auf allen CPU-Kernen ausgeführt:
Die Verteilung der Task auf die CPU-Kerne übernimmt das Betriebssystem der Steuerung.




HINWEIS

Bei der Verteilung der IEC-Tasks auf CPU-Kerne ergeben sich einige Änderungen im Verhalten im IEC-Programm, berücksichtigt werden müssen:
-
Die Abarbeitung von IEC-Tasks nach Priorität ist nicht mehr gegeben! Nur wenn die Tasks gemeinsam auf einen CPU-Kern gebunden sind, werden sie nach ihrer Priorität abgearbeitet
-
Die Zykluskonsistenz der Daten in der IEC-Task mit höchster Priorität ist nicht mehr gegeben. Daher müssen Daten am Beginn des IEC-Taskzyklusses lokal kopiert werden, wenn sich die Werte innerhalb des Zyklusses nicht verändern sollen
-
Für konsistente Zähler (Inkrementer, Dekrementer) sollte immer die atomare externe Bibliotheksfunktion
SysCpuAtomicAdd()
verwendet werden (Details sieheSysCpuHandling.library
).




HINWEIS

Datenkonsistenz von Daten
-
Bitzugriffe (Datentyp
BIT
) werden nicht konsistent (atomar) im IEC-Programm auf Mehrkern-CPUs verarbeitet. Hierzu empfehlen wir die Verwendung der externen BibliotheksfunktionSysCpuTestAndSetBit()
(Details sieheSysCpuHandling.library
) -
Einfache Datentypen bis 32-Bit Breite (
BYTE, WORD/INT, DWORD/DINT
, …) werden konsistent (atomar) im IEC-Programm auch auf Mehrkern-CPUs verarbeitet -
64-Bit Datentypen (
LINT, LWORD, LREAL)
werden im IEC-Programm nur auf 64-Bit Systemen and Mehrkernsystemen konsistent (atomar) verarbeitet. Hier müssen Sie keine Vorkehrungen treffen -
Für den Zugriff auf komplexe Datentypen (
STRINGs, FBs, STRUCTs, ARRAYs
) müssen Sie selbst Vorkehrungen für die Synchronisierung/Konsistenz treffen -
Sie können in der Taskkonfiguration in der Registerkarte „Variablenverwendung“ ermitteln, ob auf eine Variable in einer IEC-Task schreibend oder lesend zugegriffen wird
-
Auf Mehrkernsystemen kann es zu einem so genannten Memory Reordering Effekt kommen. Näheres dazu siehe den
__MemoryBarrier()
IEC-Operator
Tasks auf mehrere Prozessorkerne verteilen
Voraussetzung: Sie haben in Ihrer Applikation mindestens zwei Tasks definiert, beispielsweise „MainTask (IEC-Task)“ und „LowTask (IEC-Task)“.
-
Öffnen Sie das Objekt „Taskkonfiguration“ im Editor.
-
Wechseln Sie zur Registerkarte „Taskgruppen“.
Die Übersicht zeigt eine Taskgruppe „IEC-Tasks“.
-
Fügen Sie mit der Schaltfläche „Gruppe hinzufügen“ eine neue Taskgruppe hinzu
Die Gruppe „NewGroup“ wird hinzugefügt
-
Doppelklicken Sie auf den Gruppennamen „NewGroup“ und ändern sie ihn in
LowGroup
. -
Wählen Sie unter „Core“ eine Zuordnung aus, beispielsweise „1“.
-
Öffnen Sie die Task „LowTask (IEC-Task)“ im Editor.
-
Wählen Sie unter „Taskgruppe“ die neu erstelle Gruppe „LowGroup“ aus.
Die Task „LowTask“ wird nun durch ihre Gruppenzugehörigkeit „LowGroup“ zu von dem Prozessorkern 1 abgearbeitet.
Prozessorauslastung pro Prozessorkern im Trace anzeigen
Sie können in CODESYS die Prozessorauslastung in einem Objekt „DeviceTrace“ visualisieren. Sehen Sie hierzu das folgende Hilfekapitel zur Darstellung von Geräte-Traces im Projekt:
Siehe auch