PLC结构化文本(ST)——接口指针转换(__QUERYPOINTER)
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