PLC Structured Text Object Oriented Programming PLC結構化文本(ST)——臨時&靜態&實例-變數(TEMP&STAT&INST) 臨時變數(VAR_TEMP) 臨時變數在每次調用POU時都會初始化。 用在程式(PRG) 和 功能塊(FB) 中。 在方 ...
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的內部變數原本的類型以及變數的生命周期。