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