__QUERYINTERFACE

定义

IEC 61131-3 标准未说明此操作符。

在运行时,__QUERYINTERFACE 能够将接口引用类型转换为其他类型。此操作符将返回 BOOL 类型的结果。TRUE 意指转换成功完成。

语法

__QUERYINTERFACE(<ITF_Source>, < ITF_Dest>

此操作符需要一个接口引用或预期类型的功能块实例作为第一个操作数,并且需要一个接口引用作为第二个操作数。如果从 ITF_Source 引用的对象实现预期接口,则在执行 __QUERYINTERFACE 后,ITF_Dest 会保留此接口的引用。在此情况下,转换成功,并且此操作符的结果返回 TRUE。在所有其他情况下,此操作符返回 FALSE。

显式转换的前提条件是,ITF_Source 以及 ITF_Dest 两者均为接口 __System.IQueryInterface 的扩展。此接口以隐式方式提供,并且不需要库。

示例

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