Skip to main content

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.

ejemplo 159. Ejemplo

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