__QUERYINTERFACE
Este operador no se especifica en la norma IEC 61131-3.
Durante el tiempo de ejecución, __QUERYINTERFACE
habilita una conversión de tipo de una referencia de interfaz a otra. El operador devuelve un resultado con tipo BOOL. TRUE implica que la conversión se ha ejecutado correctamente.
__QUERYINTERFACE(<Origen_ITF>, <Destino_ITF>
El operador requiere una referencia de interfaz o una instancia del bloque de funciones del tipo previsto como primer operando y una referencia de interfaz como segundo operando. Tras la ejecución de __QUERYINTERFACE
, ITF_Dest contiene una referencia a la interfaz prevista si el objeto referenciado de ITF_Source implementa la interfaz. En este caso, la conversión es correcta y el resultado del operador devuelve TRUE. En el resto de casos, el operador devuelve FALSE.
Un requisito para una conversión explícita es que no solo ITF_Source, sino también ITF_Dest, sean una extensión de la interfaz __System.IQueryInterface. Esta interfaz se proporciona de forma implícita y no requiere una biblioteca.
Ejemplo en ST:
INTERFACE ItfBase EXTENDS __System.IQueryInterface
METHOD mbase : BOOL
END_METHOD
INTERFACE ItfDerived1 EXTENDS ItfBase
METHOD mderived1 : BOOL
END_METHOD
INTERFACE ItfDerived2 EXTENDS ItfBase
METHOD mderived2 : BOOL
END_METHOD
FUNCTION_BLOCK FB1 IMPLEMENTS ItfDerived1
METHOD mbase : BOOL
mbase := TRUE;
END_METHOD
METHOD mderived1 : BOOL
mderived1 := TRUE;
END_METHOD
END_FUNCTION_BLOCK
FUNCTION_BLOCK FB2 IMPLEMENTS ItfDerived2
METHOD mbase : BOOL
mbase := FALSE;
END_METHOD
METHOD mderived2 : BOOL
mderived2 := TRUE;
END_METHOD
END_FUNCTION_BLOCK
PROGRAM POU
VAR
inst1 : FB1;
inst2 : FB2;
itfbase1 : ItfBase := inst1;
itfbase2 : ItfBase := inst2;
itfderived1 : ItfDerived1 := 0;
itfderived2 : ItfDerived2 := 0;
bTest1, bTest2, xResult1, xResult2: BOOL;
END_VAR
xResult1 := __QUERYINTERFACE(itfbase1, itfderived1); // xResult = TRUE, itfderived1 <> 0
// references the instance inst1
xResult2 := __QUERYINTERFACE(itfbase1, itfderived2); // xResult = FALSE, itfderived2 = 0
xResult3 := __QUERYINTERFACE(itfbase2, itfderived1); // xResult = FALSE, itfderived1 = 0
xResult4 := __QUERYINTERFACE(itfbase2, itfderived2); // xResult = TRUE, itfderived2 <> 0
// references the instance inst2