PLC结构化文本(ST)——临时&静态&实例-变量(TEMP&STAT&INST)

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的内部变量原本的类型以及变量的生命周期。