Operador: TEST_AND_SET
El operador multinúcleo es una extensión del estándar IEC 61131-3.
El operador se puede utilizar para implementar un semáforo, por ejemplo, para garantizar el acceso exclusivo a una variable escrita por diferentes tareas.
TEST_AND_SET obtiene una variable de tipo como entrada DWORD. El acceso de escritura debe ser posible para esta variable. La variable estará encendida 1 se establece y el valor anterior se devuelve como resultado.
La operación es atómica, lo que significa que no puede ser interrumpida por otra tarea. Esto también se aplica a las plataformas multinúcleo.
La llamada en el programa es por ejemplo dwOldValue := TEST_AND_SET(dw);, donde las variables dwOldValue y dw del tipo de datos DWORD tiene que ser.
El siguiente ejemplo muestra un uso típico. Debe haber acceso exclusivo a una variable de tipo STRING implementado a través del puntero pstrOutput está dirigido. Acceder a una cadena no es atómico. Si varias tareas escriben en la misma cadena al mismo tiempo, el contenido puede ser inconsistente. con la función TEST_AND_SET ahora es posible usar el mismo en diferentes tareas STRING-Escribir variables.
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