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