PLC Structured Text Object Oriented Programming PLC結構化文本(ST)——構造函數(FB_init) 構造函數的作用 簡單來說,構造函數是一種方法,用來初始化類的實例也就是對象。類在創建時會有一個預設的構造函數,如果自定義一個構造函數,那麼預設構造函 ...
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的使用方法,寧可不用也不濫用。