__QUERYPOINTER

Definición

Este operador no se especifica en el estándar IEC 61131-3.

Durante el tiempo de ejecución, __QUERYPOINTER asigna una referencia de interfaz a un puntero sin tipo. El operador devuelve un resultado con tipo BOOL. TRUE implica que la conversión se ha ejecutado correctamente.

Sintaxis

__QUERYPOINTER (<Origen_ITF>, <Destino_puntero>

Para el primer operando, el operador requiere una referencia de interfaz o una instancia del bloque de funciones del tipo previsto y para el segundo operando, un puntero sin tipo. Tras la ejecución de __QUERYPOINTER, Pointer_Dest contiene la dirección de la referencia a la interfaz prevista. En este caso, la conversión es correcta y el resultado del operador devuelve TRUE. En el resto de casos, el operador devuelve FALSE. Pointer_Dest es sin tipo y puede emitirse en cualquier tipo. El programador debe garantizar el tipo real. Por ejemplo, la interfaz podría proporcionar un método que devuelva un código de tipo.

Un requisito para una conversión explícita es que ITF_Source sea una extensión de la interfaz __System.IQueryInterface. Esta interfaz se proporciona de forma implícita y no requiere una biblioteca.

Ejemplo

TYPE KindOfFB
    (FB1 := 1, FB2 := 2, UNKOWN := -1);
END_TYPE
INTERFACE Itf EXTENDS __System.IQueryInterface
METHOD KindOf : KindOfFB
END_METHOD
FUNCTION_BLOCK F_BLOCK_1 IMPLEMENTS ITF
METHOD KindOf : KindOfFB
    KindOf := KindOfFB.FB1;
END_METHOD
FUNCTION_BLOCK F_BLOCK_2 IMPLEMENTS ITF
METHOD KindOf : KindOfFB
    KindOf := KindOfFB.FB2;
END_METHOD
FUNCTION CAST_TO_ANY_FB : BOOL
VAR_INPUT
    itf_in : Itf;
END_VAR
VAR_OUTPUT
    pfb_1: POINTER TO F_BLOCK_1 := 0;
    pfb_2: POINTER TO F_BLOCK_2 := 0;
END_VAR
VAR
    xResult1, xResult2 : BOOL;
END_VAR
IF itf_in <> 0
    CASE itf_in.KindOf OF
        KindOfFB.FB1:
            xResult1 := __QUERYPOINTER(itf_in, pfb_1);
        KindOfFB.FB2 THEN
            xResult2 := __QUERYPOINTER(itf_in, pfb_2);
    END_CASE
END_IF
CAST_TO_ANY_FB := xResult1 OR xResult2;