Operatore: TEST_AND_SET
L'operatore multicore è un'estensione della norma IEC 61131-3.
L'operatore può essere utilizzato per implementare un semaforo, ad esempio per garantire l'accesso esclusivo a una variabile scritta da diversi task.
TEST_AND_SET ottiene un tipo DWORD variabile come input. L'accesso in scrittura a questa variabile deve essere possibile. La variabile è impostata su 1 e il valore precedente viene restituito come risultato.
L'operazione è atomica, il che significa che non può essere interrotta da un'altra attività. Questo vale anche per le piattaforme multicore.
Ad esempio, la chiamata nel programma è dwOldValue := TEST_AND_SET(dw);, in cui le variabili dwOldValue e dw deve essere di tipo dati DWORD.
L'esempio seguente mostra un utilizzo tipico. Accesso esclusivo a un tipo STRING variabile, che viene indirizzata tramite il pstrOutput puntatore, dovrebbe essere implementato. L'accesso a una stringa non è atomico. Se più attività scrivono contemporaneamente sulla stessa stringa, il contenuto potrebbe essere incoerente. Con il TEST_AND_SET funzione, ora è possibile scrivere lo stesso STRING variabile in diversi compiti.
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