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