PLC结构化文本(ST)——接口指针转换(__QUERYPOINTER)

PLC Structured Text Object Oriented Programming

PLC结构化文本(ST)——接口指针转换(__QUERYPOINTER)

__QUERYPOINTER

运算符__QUERYPOINTERIEC61131-3的扩展,该运算符允许在运行时将功能块的接口引用转换为指针。返回值BOOL类型:True表示转换成功,Flase表示转换失败。

出于兼容性考虑,需要转换的指针的定义必须是基于__SYSTEM.IQueryInterface的扩展。

官方例程

  • 语法结构

__QUERYPOINTER (<ITF_源>, <Pointer_目标>)
第一个操作数是接口引用或具有所需目标类型的 FB 实例,第二个操作数是指针。

  • 代码示例
    定义两个接口,I_Base扩展__System.IQueryInterfaceI_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