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

cnblogs 2024-09-10 16:39:00 阅读 92

PLC Structured Text Object Oriented Programming

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

__QUERYINTERFACE

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

语法格式

__QUERYINTERFACE(<ITF_Source>,<ITF_Dest>);

ITF_Source:接口变量或FB实例;

ITF_Dest :目标类型的接口变量。

显式转换的先决条件是 ITF_SourceITF_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



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。