PLC Structured Text Object Oriented Programming
PLC結構化文字(ST)——建構函式(FB_init)
建構函式的作用
簡單來說,建構函式是一種方法,用來初始化類的例項也就是物件。類在建立時會有一個預設的建構函式,如果自定義一個建構函式,那麼預設建構函式失效。
與高階語言的區別
高階語言C#、Java和C++都有建構函式這個概念,那麼IEC61131-3
有沒有這個特殊的方法呢?當然是有的,只不過ST的建構函式與高階語言稍有不同。
- 1.高階語言比如
C#
和Java
,它們的建構函式方法名與類名相同,而在IEC61131-3
ST
中所有PRG
和FB
的建構函式名均為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
的使用方法,寧可不用也不濫用。