Skip to main content

Opérateur : TEST_AND_SET

L'opérateur multicœur est une extension de la norme CEI 61131-3.

L'opérateur peut être utilisé pour implémenter un sémaphore, par exemple pour garantir un accès exclusif à une variable écrite par différentes tâches.

TEST_AND_SET obtient un type DWORD variable comme entrée. L'accès en écriture à cette variable doit être possible. La variable est définie sur 1 et la valeur précédente est renvoyée comme résultat.

L'opération est atomique, ce qui signifie qu'elle ne peut pas être interrompue par une autre tâche. Cela s'applique également aux plates-formes multicœurs.

Par exemple, l'appel dans le programme est dwOldValue := TEST_AND_SET(dw);, dans laquelle les variables dwOldValue et dw doit être du type de données DWORD.

Exemple 159. Exemple

L'exemple suivant montre une utilisation typique. Accès exclusif à un type STRING variable, qui est adressée via la pstrOutput pointeur, doit être implémenté. L'accès à une chaîne n'est pas atomique. Si plusieurs tâches écrivent dans la même chaîne en même temps, le contenu peut être incohérent. Avec le TEST_AND_SET fonction, il est maintenant possible d'écrire la même STRING variable dans différentes tâches.

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