Operator: TEST_AND_SET
Der Multicore-Operator ist eine Erweiterung der Norm IEC 61131-3.
Der Operator kann zur Realisierung einer Semaphore verwendet werden, beispielsweise um einen exklusiven Zugriff auf eine Variable zu garantieren, die von verschiedenen Tasks geschrieben wird.
TEST_AND_SET
bekommt als Eingabe eine Variable vom Typ DWORD
. Für diese Variable muss ein Schreibzugriff möglich sein. Die Variable wird auf 1
gesetzt und der vorherige Wert wird als Ergebnis zurückgeliefert.
Die Operation verläuft atomar, das bedeutet, dass sie nicht von einer anderen Task unterbrochen werden kann. Dies gilt auch auf Multicore-Plattformen.
Der Aufruf im Programm ist beispielsweise dwOldValue := TEST_AND_SET(dw);
, wobei die Variablen dwOldValue
und dw
vom Datentyp DWORD
sein müssen.
Das folgende Beispiel zeigt eine typische Verwendung. Es soll ein exklusiver Zugriff auf eine Variable vom Typ STRING
implementiert werden, die über den Pointer pstrOutput
angesprochen wird. Der Zugriff auf einen String ist nicht atomar. Wenn mehrere Tasks gleichzeitig auf denselben String schreiben, dann kann der Inhalt inkonsistent sein. Mit der Funktion TEST_AND_SET
ist es nun möglich, in verschiedenen Tasks dieselbe STRING
-Variable zu schreiben.
FUNCTION ExclusiveStringWrite : BOOL VAR_INPUT strToWrite : STRING; pstrOutput : POINTER TO STRING; END_VAR VAR_STAT dwSynch : DWORD; END_VAR VAR dwOldValue: DWORD; END_VAR dwOldValue := TEST_AND_SET(dwSynch); // Write the 1 and read the old value at the same time IF dwOldValue = 0 THEN // 0 means: no other task is currently writing pstrOutput^ := strToWrite; // Now you can write safely on the string dwSynch := 0; // The DWORD must be reset ExclusiveStringWrite := TRUE; // Writing was successful ELSE ExclusiveStringWrite := FALSE; // Writing was not successful END_IF