TEST_AND_SET
TEST_AND_SET
può essere utilizzato per implementare un semaforo, ad esempio, per garantire l'accesso esclusivo a una variabile scritta da task differenti.
TEST_AND_SET
non è supportato da Modicon M262 Logic/Motion Controllers. Inoltre, non è specificato dallo standard IEC 61131-3.
La seguente procedura viene applicata a TEST_AND_SET
:
Viene assegnata come ingresso una variabile di tipo DWORD. Deve essere possibile l’accesso in scrittura a questa variabile.
La variabile è impostata su 1
.
Il valore precedente viene restituito come risultato.
Questa operazione non può essere interrotta da un altro task e questo vale anche per le piattaforme multicore.
Esempio: la chiamata nel programma è dwOldValue := TEST_AND_SET(dw);
. Le variabili dwOldValue e dw devono essere di tipo di dati DWORD.
L'esempio seguente illustra un caso d'uso tipico: Implementazione dell'accesso esclusivo a una variabile di tipo STRING indirizzata tramite il puntatore pstrOutput.
Poiché l'accesso a una variabile di tipo STRING non è atomico, il contenuto potrebbe essere incoerente se più task scrivono nella stessa stringa contemporaneamente.
Utilizzando la funzione operatore TEST_AND_SET
è possibile scrivere la stessa variabile STRING in task differenti.
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 on the string
dwSynch := 0; // The DWORD must be reset
ExclusiveStringWrite := TRUE; // Writing was successful
ELSE
ExclusiveStringWrite := FALSE; // Writing was not successful