寨亳 发表于 2025-6-4 19:36:06

PLC结构化文本(ST)——接口引用转换(__QUERYINTERFACE)

PLC Structured Text Object Oriented Programming

PLC结构化文本(ST)——接口引用转换(__QUERYINTERFACE)

__QUERYINTERFACE

运算符__QUERYPOINTER是IEC61131-3的扩展,该运算符允许在运行时将一个接口引用转换成另一个接口的引用。返回值BOOL类型:True表示转换成功,Flase表示转换失败。
语法格式

__QUERYINTERFACE(,);
ITF_Source:接口变量或FB实例;
ITF_Dest :目标类型的接口变量。
显式转换的先决条件是 ITF_Source 和 ITF_Dest 都是 __System.IQueryInterface 的派生。这与使用运算符__QUERYPOINTER条件类似。
官方例程


[*]定义接口
INTERFACE I_Base EXTENDS __System.IQueryInterface
METHOD BaseMethod : BOOL INTERFACE I_Sub1 EXTENDS I_Base
METHOD SubMethod1 : BOOL INTERFACE I_Sub2 EXTENDS I_Base
METHOD SubMethod2 : BOOL INTERFACE I_Sample EXTENDS __System.IQueryInterface
METHOD SampleMethod : BOOL

[*]定义功能块
FUNCTION_BLOCK FB_1 IMPLEMENTS I_Sub1
METHOD BaseMethod : BOOL
    BaseMethod := TRUE;
METHOD SubMethod1 : BOOL
    SubMethod1 := TRUE;FUNCTION_BLOCK FB_2 IMPLEMENTS I_Sub2
METHOD BaseMethod : BOOL
    BaseMethod := FALSE;
METHOD SubMethod2 : BOOL
    SubMethod2 := TRUE;FUNCTION_BLOCK FB_3 IMPLEMENTS I_Base, I_Sample
METHOD BaseMethod : BOOL
    BaseMethod   := FALSE;
METHOD SampleMethod : BOOL
    SampleMethod := FALSE;

[*]Main主程序调用
PROGRAM MAIN
VAR
    fb1         : FB_1;
    fb2         : FB_2;
    fb3         : FB_3;
    iBase1      : I_Base   := fb1;
    iBase2      : I_Base   := fb2;
    iBase3      : I_Base   := fb3;
    iSub1         : I_Sub1   := 0;
    iSub2         : I_Sub2   := 0;
    iSample       : I_Sample := 0;
    bResult1      : BOOL;
    bResult2      : BOOL;
    bResult3      : BOOL;
    bResult4      : BOOL;
    bResult5      : BOOL;
END_VAR // 结果: bResult1 = TRUE 由于转换成功 => iSub1 references fb1
// 解释: iBase1引用实现接口I_Sub1的FB_1类型的对象fb1
bResult1 := __QUERYINTERFACE(iBase1, iSub1);

// 结果: bResult2 = FALSE 由于转换不成功 => iSub2 = 0
// 解释: iBase1引用FB_1类型的对象fb1,该对象不实现接口I_Sub2
bResult2 := __QUERYINTERFACE(iBase1, iSub2);

// 结果: bResult3 = FALSE 由于转换不成功 => iSub1 = 0
// 解释: iBase2引用FB_2类型的对象fb2,该对象不实现接口I_Sub1
bResult3 := __QUERYINTERFACE(iBase2, iSub1);

// 结果: bResult4 = TRUE 由于转换成功 => iSub2 references fb2
// 解释: iBase2引用实现接口I_Sub2的FB_2类型的对象fb2
bResult4 := __QUERYINTERFACE(iBase2, iSub2);

// 结果: bResult5 = TRUE 由于转换成功 => iSample references fb3
// 解释: iBase3引用实现接口I_Sample的FB_3类型的对象fb3
bResult5 := __QUERYINTERFACE(iBase3, iSample);总结

倍福官方在线帮助助手查看上述例程:https://infosys.beckhoff.com/index_en.htm

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: PLC结构化文本(ST)——接口引用转换(__QUERYINTERFACE)