PLC結構化文字(ST)——介面指標轉換(__QUERYPOINTER)

J_Sheng發表於2024-09-09

PLC Structured Text Object Oriented Programming

PLC結構化文字(ST)——介面指標轉換(__QUERYPOINTER)

__QUERYPOINTER

運算子__QUERYPOINTERIEC61131-3的擴充套件,該運算子允許在執行時將功能塊的介面引用轉換為指標。返回值BOOL型別:True表示轉換成功,Flase表示轉換失敗。

出於相容性考慮,需要轉換的指標的定義必須是基於__SYSTEM.IQueryInterface的擴充套件。

官方例程

  • 語法結構

__QUERYPOINTER (<ITF_源>, <Pointer_目標>)
第一個運算元是介面引用或具有所需目標型別的 FB 例項,第二個運算元是指標。

  • 程式碼示例
    定義兩個介面,I_Base擴充套件__System.IQueryInterfaceI_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

相關文章