PLC結構化文字(ST)——臨時&靜態&例項-變數(TEMP&STAT&INST)

J_Sheng發表於2024-09-06

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的內部變數原本的型別以及變數的生命週期。

相關文章