TEST_AND_SET

Panoramica

TEST_AND_SET può essere utilizzato per implementare un semaforo, ad esempio, per garantire l'accesso esclusivo a una variabile scritta da task differenti.

NOTA: 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:

  1. Viene assegnata come ingresso una variabile di tipo DWORD. Deve essere possibile l’accesso in scrittura a questa variabile.

  2. La variabile è impostata su 1.

  3. 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.

Esempio

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