PLC結構化文字(ST)——介面引用轉換(__QUERYINTERFACE)

J_Sheng發表於2024-09-09

PLC Structured Text Object Oriented Programming

PLC結構化文字(ST)——介面引用轉換(__QUERYINTERFACE)

__QUERYINTERFACE

運算子__QUERYPOINTERIEC61131-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

相關文章