__QUERYINTERFACE
Cet opérateur n'est pas défini par la norme CEI 61131-3.
Pendant l'exécution, __QUERYINTERFACE
convertit une référence d'interface d'un type en un autre type. L'opérateur renvoie un résultat de type BOOL. La valeur TRUE indique que la conversion a abouti.
__QUERYINTERFACE(<ITF_Source>, <ITF_Dest>
Le premier opérande de l'opérateur doit être une référence d'interface ou une instance de bloc fonction du type souhaité, et le second opérande, une référence d'interface. Après l'exécution de __QUERYINTERFACE
, le paramètre ITF_Dest contient une référence à l'interface voulue, si l'objet référencé à partir de ITF_Source implémente l'interface. Dans ce cas, la conversion aboutit et l'opérateur renvoie TRUE. Sinon, il renvoie FALSE.
Pour effectuer une conversion explicite, il faut que le paramètre ITF_Source et ITF_Dest soient une extension de l'interface __System.IQueryInterface. Cette interface est fournie implicitement, sans bibliothèque.
Exemple en langage 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