找回密码
 立即注册
首页 资源区 代码 PLC结构化文本(ST)——接口引用转换(__QUERYINTERFAC ...

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

寨亳 2025-6-4 19:36:06
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条件类似。
官方例程


  • 定义接口
  1. INTERFACE I_Base EXTENDS __System.IQueryInterface
  2. METHOD BaseMethod : BOOL
复制代码
  1. INTERFACE I_Sub1 EXTENDS I_Base
  2. METHOD SubMethod1 : BOOL
复制代码
  1. INTERFACE I_Sub2 EXTENDS I_Base
  2. METHOD SubMethod2 : BOOL
复制代码
  1. INTERFACE I_Sample EXTENDS __System.IQueryInterface
  2. METHOD SampleMethod : BOOL
复制代码

  • 定义功能块
  1. FUNCTION_BLOCK FB_1 IMPLEMENTS I_Sub1
  2. METHOD BaseMethod : BOOL
  3.     BaseMethod := TRUE;
  4. METHOD SubMethod1 : BOOL
  5.     SubMethod1 := TRUE;
复制代码
  1. FUNCTION_BLOCK FB_2 IMPLEMENTS I_Sub2
  2. METHOD BaseMethod : BOOL
  3.     BaseMethod := FALSE;
  4. METHOD SubMethod2 : BOOL
  5.     SubMethod2 := TRUE;
复制代码
  1. FUNCTION_BLOCK FB_3 IMPLEMENTS I_Base, I_Sample
  2. METHOD BaseMethod : BOOL
  3.     BaseMethod   := FALSE;
  4. METHOD SampleMethod : BOOL
  5.     SampleMethod := FALSE;
复制代码

  • Main主程序调用
  1. PROGRAM MAIN
  2. VAR
  3.     fb1           : FB_1;
  4.     fb2           : FB_2;
  5.     fb3           : FB_3;
  6.     iBase1        : I_Base   := fb1;
  7.     iBase2        : I_Base   := fb2;
  8.     iBase3        : I_Base   := fb3;
  9.     iSub1         : I_Sub1   := 0;
  10.     iSub2         : I_Sub2   := 0;
  11.     iSample       : I_Sample := 0;
  12.     bResult1      : BOOL;
  13.     bResult2      : BOOL;
  14.     bResult3      : BOOL;
  15.     bResult4      : BOOL;
  16.     bResult5      : BOOL;
  17. END_VAR
复制代码
  1. // 结果: bResult1 = TRUE 由于转换成功 => iSub1 references fb1
  2. // 解释: iBase1引用实现接口I_Sub1的FB_1类型的对象fb1
  3. bResult1 := __QUERYINTERFACE(iBase1, iSub1);
  4. // 结果: bResult2 = FALSE 由于转换不成功 => iSub2 = 0
  5. // 解释: iBase1引用FB_1类型的对象fb1,该对象不实现接口I_Sub2
  6. bResult2 := __QUERYINTERFACE(iBase1, iSub2);
  7. // 结果: bResult3 = FALSE 由于转换不成功 => iSub1 = 0
  8. // 解释: iBase2引用FB_2类型的对象fb2,该对象不实现接口I_Sub1
  9. bResult3 := __QUERYINTERFACE(iBase2, iSub1);
  10. // 结果: bResult4 = TRUE 由于转换成功 => iSub2 references fb2
  11. // 解释: iBase2引用实现接口I_Sub2的FB_2类型的对象fb2
  12. bResult4 := __QUERYINTERFACE(iBase2, iSub2);
  13. // 结果: bResult5 = TRUE 由于转换成功 => iSample references fb3
  14. // 解释: iBase3引用实现接口I_Sample的FB_3类型的对象fb3
  15. bResult5 := __QUERYINTERFACE(iBase3, iSample);
复制代码
总结

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

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册