Skip to main content

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.

Esempio 159. Esempio

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