在学习和使用ST语言编写PLC程序,或者西门子的SCL语言开发程序,都会对这几个概念比较陌生!

如果以前只是做梯形图程序,确实也不需要关注这些。但是,我们在熟悉PLC后,ST语言作为必须会的编程语言之一,也越来越多的工程师在实际工作中使用了。
我们这期重点说说静态变量和临时变量之间的区别,和使用范围。

首先在介绍这两个变量类型前,我们先了解内存分配。在计算机还是PLC内部所有的变量都有自己的存储空间。不同的变量类型也是在不同的区域。
我们参照计算机里面对于内存的分配如下图所示:

可执行文件中的代码段被加载到代码区,这个区域的数据是只读的。
对应可执行文件的.data和.bss段。这个区域在程序启动时就被分配好,并一直存在到程序结束。全局变量、静态局部变量、静态全局变量都存放在这里。它们在main函数执行之前就被创建并初始化,在整个程序运行期间始终存在。它们的生命与进程同在。
保存了函数内部的非静态局部变量、函数的参数、返回地址等等。这里的地址是由编译器自动管理的。随着函数调用而分配,随着调用结束而释放。变量与内存的生命周期和函数的作用域是绑定的。
这里的内存由程序代码手动控制。
以上是计算机内部对于内存的分析,PLC虽然不是计算机,但也属于微型控制器,其内存也是必不可少的。只不过相对来说,PLC更加小型和专用。

临时变量和静态变量
关于PLC中的临时变量和静态变量的声明,我们需要了解到PLC的变量作用域,一般来说,声明的变量必须在相对应的作用域:

一般来说,临时变量只在VAR_TEMP,END_VAR之间,例如下图的iTemp变量:

上述iCount作为静态变量,其值会一直保存。而iTemp在每次调用结束后被重置。
而在西门子博途中,静态变量和临时变量的关键字和ST标准里面有些差异:

可以参考1中的内存分配,Temp主要是分在动态内存区域的栈中,用完后即销毁,不会记忆该值。而Static在静态存储区,程序运行后,该区域还会记忆该值。

结论
有效地使用这两种类型变量,可以提高PLC内部运行效率,更大地发挥PLC的性能。虽然,初学时不需要区分那么细致,但是,在后期程序的优化和标准化等,就需要灵活应用这些作用域。
通常推荐优先使用局部临时变量,只在确实需要时才使用 static 变量。不同场合需要按照实际需求选择:
