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.
![]() | 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.
|
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.
![]() | 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:](Images/png/2326162571__Web.png)
Die Methode markiert den Anfang eines kritischen Bereiches.
Mögliche Rückgabewerte:
TRUE:
- Der kritische Bereich darf betreten werden.
FALSE:
- Der kritische Bereich darf nicht betreten werden.
- Der Baustein wird von der Runtime noch nicht unterstützt.
- Der kritische Bereich ist durch eine andere PLC-Task belegt. Diese Task steht in einem Breakpunkt im Stopp. Durch den Rückgabewert FALSE wird ein dauerhaftes Blockieren der Task vermieden und das Update der E/A gewährleistet.
Methode Leave()
![FB_IecCriticalSection 4:](Images/png/2326164619__Web.png)
Die Methode markiert das Ende eines kritischen Bereiches. Sie muss immer bei Abschluss des kritischen Bereiches aufgerufen werden.
Mögliche Rückgabewerte:
TRUE:
- Der Bereich wurde erfolgreich verlassen.
FALSE:
- Der Baustein wird von der Runtime nicht unterstützt.
- Der kritische Bereich war nicht mit Enter belegt worden.
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) | Tc2_System (System) |
TwinCAT v3.1.4022.29 | PC oder CX (x86, ARM) | Tc2_System (System) |