Skip to main content
Suche

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.

Beispiel 159. Beispiel

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