PLC Structured Text Object Oriented Programming
PLC结构化文本(ST)——接口指针转换运算符(__QUERYPOINTER)
__QUERYPOINTER
运算符__QUERYPOINTER是IEC61131-3的扩展,该运算符允许在运行时将功能块的接口引用转换为指针。返回值BOOL类型:True表示转换成功,Flase表示转换失败。
出于兼容性考虑,需要转换的指针的定义必须是基于
__SYSTEM.IQueryInterface的扩展。
官方例程
- 语法结构
 
__QUERYPOINTER (<ITF_源>, <Pointer_目标>)
第一个操作数是接口引用或具有所需目标类型的 FB 实例,第二个操作数是指针。
- 代码示例
定义两个接口,I_Base扩展__System.IQueryInterface,I_Derived扩展I_Base。 
INTERFACE I_Base EXTENDS __System.IQueryInterface
METHOD Base : BOOL
INTERFACE I_Derived EXTENDS I_Base
METHOD Derived : BOOL
定义功能块FB_Variante实现I_Derived接口。
FUNCTION_BLOCK FB_Variante IMPLEMENTS I_Derived
METHOD Base : BOOL // 接口方法
METHOD Derived : BOOL // 接口方法
METHOD Run : BOOL // FB_Variante额外添加一个方法
主程序Main调用。
PROGRAM MAIN
VAR
    iDerived   : I_Derived;
    fbVariante : FB_Variante;
    bResult    : BOOL;
    bTest      : BOOL;
    pFB        : POINTER TO FB_Variante;
END_VAR
//__QUERYPOINTER
iDerived := fbVariante;
bResult  := __QUERYPOINTER(iDerived, pFB); // bResult : True
IF bResult THEN
    bTest := pFB^.Derived();
	pFB^.Run();
END_IF
上述例程中,转换成功之后的指针仍然可以调用FB_Variante功能块Run方法,由此可以看出运算符__QUERYPOINTER应该是将接口iDerived的实例地址给到了指针pFB,所以指针可以正常使用接口定义以外的方法。
总结
以上例程改编自倍福在线帮助文档:https://infosys.beckhoff.com/index_en.htm










没有回复内容