__QUERYINTERFACE
Dieser Operator wird in der Norm IEC 61131-3 nicht beschrieben.
Bei Laufzeit aktiviert __QUERYINTERFACE
eine Typenkonvertierung von einer Schnittstellenreferenz zu einer anderen. Der Operator gibt ein Ergebnis vom Typ BOOL zurück. TRUE bedeutet, dass die Konvertierung erfolgreich durchgeführt wurde.
__QUERYINTERFACE(<ITF_Quelle>, < ITF_Ziel>
Dieser Operator bekommt als 1. Operand eine Interface-Referenz oder eine FB-Instanz und als 2. Operand eine Interface-Referenz mit dem gewünschten Typ. Nach dem Abarbeiten von __QUERYINTERFACE
enthält ITF_Dest eine Referenz zu der gewünschten Schnittstelle, wenn das von ITF_Source referenzierte Objekt die Schnittstelle implementiert. Dann war die Konvertierung erfolgreich und das Ergebnis des Operators gibt den Wert TRUE zurück. In allen anderen Fällen gibt der Operator den Wert FALSE zurück.
Eine Vorbedingung für eine explizite Konvertierung ist, dass nicht nur ITF_Source, sondern auch ITF_Dest eine Erweiterung der Schnittstelle __System.IQueryInterface ist. Dieses Interface steht implizit zur Verfügung und benötigt keine Bibliothek.
Beispiel in 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