PLC Structured Text Object Oriented Programming
PLC結構化文字(ST)——臨時&靜態&例項-變數(TEMP&STAT&INST)
臨時變數(VAR_TEMP)
- 臨時變數在每次呼叫POU時都會初始化。
- 用在程式(PRG) 和 功能塊(FB) 中。
- 在方法(Method) 和 函式(Function) 中的內部變數都是臨時變數。
PROGRAM MAIN
VAR
iResult : UINT; // STATIC
END_VAR
VAR_TEMP
iCounter : UINT; // TEMP
END_VAR
----------------------------
iCounter := iCounter + 1; // 無法實現累加,每次呼叫都會被初始化。
iResult := iResult + 1; // 可以正常累加。
靜態變數(VAR_STAT)
- 靜態變數只在POU的第一次呼叫時被初始化。
- 靜態變數宣告賦值後,值不會丟失。
- 可用在 方法(Method) 和 函式(Function) 中。
- 在 程式(PRG) 和 功能塊(FB) 中宣告的變數都是靜態的。
FUNCTION F_Counter : UINT
VAR
iTemp : UINT; // TEMP
END_VAR
VAR_STAT
iCounter : UINT; // STATIC
END_VAR
----------------------------
iCounter := iCounter + 1; // 靜態變數,可以實現累加。
iTemp := iTemp + 1; // 臨時變數,每次呼叫都會被初始化,無法實現累加,因此每個週期計算後的值都是1。
F_Counter := iCounter;
Tips : 需要強調一點,若在功能塊內部(非方法內部)宣告靜態變數,並且在程式中例項化了多次(建立多個物件),此時需要注意不同物件的靜態變數地址是相同的,也就是說如果同一個型別的不同例項,改變其中一個靜態變數值,其它例項的對應靜態變數值也會跟著改變。這就是C#或Java中的單例。有關靜態變數和單例的詳細內容自行谷歌百度。
例項變數(VAR_INST)
- 例項變數(VAR_INST) 只能在方法(Method) 中使用,可以在方法的宣告區線上監控例項變數值。
- 不儲存例項變數(VAR_INST)在方法棧中,但在功能塊的例項棧中。
- 例項變數與功能塊例項的其它變數一樣,每次呼叫方法時不會重新初始化。
METHOD M_Counter : INT
VAR_INPUT
iVar : INT;
END_VAR
VAR_INST
iCounter : INT := 0;
END_VAR
iCounter := iCounter + 1; // 可以實現自增,iCounter只有首次呼叫會被初始化。
M_Counter := iCounter;
總結
在使用臨時變數、靜態變數和例項變數時,需要清楚對應POU的內部變數原本的型別以及變數的生命週期。