FB_IecCriticalSection

Mit dem Funktionsbaustein werden kritische Bereiche unter gegenseitigen Ausschluss gestellt. Kritische Bereiche sind Modifikationen auf einer oder meist mehreren Variablen, die während der Änderungen einen inkonsistenten Zustand haben. Es ist daher zwingend erforderlich, dass solche Modifikationen nur von exakt einer Task zu einem Zeitpunkt durchgeführt wird. Der Baustein stellt dazu die Methoden Enter() und Leave() bereit. Durch den erfolgreichen Aufruf von Enter() wird der kritische Bereich betreten und gilt dann als belegt. Nach Abschluss der Modifikationen muss der kritische Bereich durch Leave() wieder verlassen werden.

FB_IecCriticalSection 1:

Zykluszeitüberschreitung durch angehaltene Task

Wenn eine weitere Task durch Aufruf von Enter() einen bereits belegten kritischen Bereich betreten will, wird sie durch den TwinCAT Scheduler blockiert. Die Task wird angehalten, bis der Bereich wieder freigegeben ist! Nach der Freigabe wird die Bearbeitung des Programmcode fortgesetzt und der kritische Bereich betreten.

  • Achten Sie darauf, dass die kritischen Bereiche sehr kurz gehalten werden, damit es bei der wartenden Task keine Zyklusüberschreitungen gibt. Mehrere wartende Tasks werden entsprechend ihrer Priorität in den kritischen Bereich gelassen.

Wenn eine Task durch den TwinCAT Scheduler blockiert wird, weil sie einen bereits belegten kritischen Bereich betreten wollte, geschieht dies ohne „Busy-Waiting“. Niederpriore Tasks können also die CPU Kapazität währenddessen nutzen.

FB_IecCriticalSection 2:

Windows CE

Die Funktionalität wird unter Windows-CE-Betriebssystemen ab TwinCAT v3.1.4022.29 unterstützt. (Bei einer älteren TwinCAT Version geben die Methoden FALSE aus.)

Alternative

Kritische Bereiche können auch mit der Funktion TestAndSet() realisiert werden. Mit der Funktion kann die Belegung eines kritischen Bereiches markiert und geprüft werden. Die Funktion blockiert jedoch nicht und es besteht die Möglichkeit, dass der Bereich in einem Zyklus nicht durchlaufen werden kann.

Grundsätzlich muss die Anzahl der kritischen Bereiche möglichst klein und die Länge der kritischen Bereiche kurz gehalten werden.

Methode Enter()

FB_IecCriticalSection 3:

Die Methode markiert den Anfang eines kritischen Bereiches.

Mögliche Rückgabewerte:

TRUE:

FALSE:

Methode Leave()

FB_IecCriticalSection 4:

Die Methode markiert das Ende eines kritischen Bereiches. Sie muss immer bei Abschluss des kritischen Bereiches aufgerufen werden.

Mögliche Rückgabewerte:

TRUE:

FALSE:

Beispiel für die Verwendung des Bausteins:

Der Funktionsbaustein FB_IecCriticalSection bietet die Möglichkeit den Zugriff auf gemeinsame Daten abzusichern. Die Instanz des Funktionsbausteines wird hierzu ebenso wie die zu sichernden Daten global angelegt.

VAR_GLOBAL
    fbCrititcalSection : FB_IecCriticalSection;
END_VAR

IF fbCrititcalSection.Enter() THEN
    (* start of critical section *)
    
    (* end of critical section *)
    fbCrititcalSection.Leave();
END_IF

Voraussetzungen

Entwicklungsumgebung

Zielplattform

Einzubindende SPS-Bibliotheken (Kategoriegruppe)

TwinCAT v3.1.4020

PC oder CX (x86, x64)
WES, WES7, Win7, Win10

Tc2_System (System)

TwinCAT v3.1.4022.29

PC oder CX (x86, ARM)
WinCE

Tc2_System (System)