这个操作不是标准的 IEC 61131-3 中包含的。
在运行系统中 __QUERYINTERFACE 用于激活一个实例相关的接口类型转化。操作返回一个 BOOL类型的结果。如果为 TRUE 表明转化成功处理。
提示! 用于编译原因定义转化相关的实例必须是一个基本接口 __SYSTEM.IQueryInterface 的扩展并且编译器版本必须 >= 3.3.0.20。 |
语法:
__QUERYINTERFACE(<ITF_Source>, < ITF_Dest>)
此操作的第一个操作数为一个接口参照或者一个内部类型的功能块实例,第二个操作数是一个接口参照。经过 __QUERYINTERFACE 的处理 ITF_Dest 将指向一个内部的接口如果此接口是从 ITF 中的接口源扩展。在这种情况下转化将会成功并且操作的结构将会返回为 TRUE。在其他所有情况操作将返回 FALSE。
显示转化的前提条件是不但 ITF_Source but 而且 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
PROGRAMM POU
VAR
itfderived1 : ItfDerived1;
itfderived2 : ItfDerived2;
bTest1, bTest2, xResult1, xResult2: BOOL;
END_VAR
xResult1 := __QUERYINTERFACE(itfbase, itfderived1); // variablen vom Type ItfBase bzw ItfDerived1
xResult2 := __QUERYINTERFACE(itfbase, itfderived2); // variablen vom Type ItfBase bzw ItfDerived2
IF (xResult1 = TRUE) THEN
bTest1 := itfderived1.mderived1();
ELSIF xResult2 THEN
bTest2 := itfderived2.mderived2();
END_IF