PLC結構化文字(ST)——建構函式(FB_init)

J_Sheng發表於2024-09-05

PLC Structured Text Object Oriented Programming

PLC結構化文字(ST)——建構函式(FB_init)

建構函式的作用

簡單來說,建構函式是一種方法,用來初始化類的例項也就是物件。類在建立時會有一個預設的建構函式,如果自定義一個建構函式,那麼預設建構函式失效。

與高階語言的區別

高階語言C#、Java和C++都有建構函式這個概念,那麼IEC61131-3有沒有這個特殊的方法呢?當然是有的,只不過ST的建構函式與高階語言稍有不同。

  • 1.高階語言比如C#Java,它們的建構函式方法名與類名相同,而在IEC61131-3 ST中所有PRGFB的建構函式名均為FB_init
  • 2.C#Java的預設建構函式是無參的,PLC ST中的預設建構函式有兩個引數。
METHOD FB_init : BOOL
VAR_INPUT
	bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
	bInCopyCode : BOOL;  // if TRUE, the instance afterwards gets moved into the copy code (online change)
END_VAR

新增建構函式

CODESYS源生平臺或二次開發平臺為例:

  • 1.在PRG或者FB程式塊上右鍵--->新增--->Method--->名稱(右側下拉框)--->選擇FB_init--->Open。
  • 2.在PRG或者FB程式塊上右鍵--->新增--->Method--->名稱--->直接輸入FB_init--->Open。
    上述兩種方法均可以,個人建議選擇第一種方法較好,防止編譯器抽風

使用建構函式

建立Dog類

FUNCTION_BLOCK FB_Dog
VAR_INPUT
END_VAR
VAR_OUTPUT
END_VAR
VAR
	name : STRING;
END_VAR

自定義建構函式

METHOD FB_init : BOOL
VAR_INPUT
	bInitRetains : BOOL; // if TRUE, the retain variables are initialized (warm start / cold start)
	bInCopyCode : BOOL;  // if TRUE, the instance afterwards gets moved into the copy code (online change)
	sname	: STRING; // 初始化名字
END_VAR
----------------------------------------------
THIS^.name := sname;

主程式呼叫

PROGRAM MAIN
VAR
	dog : FB_Dog('laifu'); // 初始化dog name 來福
END_VAR

啟用下載,程式初始化時自動呼叫(隱式呼叫)FB_init,無需手動呼叫(顯式呼叫)。
自定義建構函式中增加了一個引數,所以在宣告FB變數時必須給出對應引數,否則編譯不透過。
系統只有在每次初始化FB時自動呼叫一次,後續週期不再繼續呼叫執行。

Tips : FB_init可以隱式呼叫也可以顯式呼叫,但是在顯式呼叫時需要補全輸入引數。

dog.FB_init(bInCopyCode := TRUE,bInitRetains :=TRUE ,sname := 'laifu');

因此,一般在變數宣告區初始化輸入引數,很少直接呼叫建構函式。

總結

建構函式主要用來初始化物件,一般不會將它暴露在PLC掃描週期內迴圈執行,要是這樣與普通Method有什麼區別。建議使用之前先去學習高階語言C#Java的使用方法,寧可不用也不濫用

相關文章