__QUERYINTERFACE

Definizione

Questo operatore non è prescritto dallo standard IEC 61131-3.

Al runtime, __QUERYINTERFACE abilita una conversione del tipo di un riferimento dell'interfaccia a un altro. L'operatore restituisce un risultato con il tipo BOOL. TRUE implica che la conversione è stata eseguita correttamente.

Sintassi

__QUERYINTERFACE(<ITF_Origine>, < ITF_Dest>

L'operatore richiede come primo operando un riferimento dell'interfaccia o un'istanza del blocco funzione del tipo previsto e come secondo operando un riferimento dell'interfaccia. Dopo l'esecuzione di __QUERYINTERFACE, ITF_Dest mantiene un riferimento all'interfaccia prevista se l'oggetto referenziato dall'ITF di origine implementa l'interfaccia. In questo caso la conversione viene eseguita correttamente e il risultato restituito dall'operatore è TRUE. In tutti gli altri casi, l'operatore restituisce FALSE.

Una condizione preliminare per una conversione esplicita è che non solo ITF_Source ma anche ITF_Dest sia un'estensione dell'interfaccia __System.IQueryInterface. Questa interfaccia è fornita implicitamente e non richiede alcuna libreria.

Esempio

Esempio 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