Skip to main content

Operator: __QUERYINTERFACE

Der Operator ist eine Erweiterung der Norm IEC 61131-3.

Der Operator führt zur Laufzeit eine Typkonvertierung einer Interface-Referenz zu einer anderen aus. Der Operator liefert ein Ergebnis vom Typ BOOL zurück. TRUE bedeutet, dass CODESYS die Konvertierung erfolgreich durchgeführt hat.

__QUERYINTERFACE( <ITF_Source> , <ITF_Dest> );

1. Operand: Interface-Referenz oder FB-Instanz

2. Operand: Interface-Referenz mit gewünschten Zieltypen

Voraussetzung für die explizite Konvertierung ist, dass sowohl das ITF_Source als auch ITF_Dest eine Ableitung vom Interface __System.IQueryInterface sind. Dieses Interface steht implizit zur Verfügung und benötigt keine Bibliothek.

Beispiel 151. Beispiel
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

PROGRAMM POU
VAR
    inst1 : FB1;
    inst2 : FB2;
    itfbase1 : ItfBase := inst1;
    itfbase2 : ItfBase := inst2;
    itfderived1 : ItfDerived1 := 0;
    itfderived2 : ItfDerived2 := 0;
    xResult1, xResult2, xResult3, xResult4: BOOL;
END_VAR


xResult1 := __QUERYINTERFACE(itfbase1, itfderived1); // xResult = TRUE, itfderivedi1 <>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