局部变量(Local variables)指在程序中只在特定过程或函数中可以访问的变量。局部变量是相对于全局变量而言的。在PLC中局部变量应用不是很多,西门子PLC则引入局部变量,成为PLC中独具特色的功能。
局部变量是分配给每个子程序的临时存贮区。当子程序被调用时,系统分配局部变量区给子程序;子程序执行完成后,该局部变量区被释放。释放时其中存贮的值也同时丢失,不能再下一扫描周期再被子程序使用。
局部变量区的大小为64个字节,其中最后4个字节被系统所占用,实际可供子程序使用的为60个字节。由于局部变量区的数据不能带到下一扫描周期,因此只能用于存储程序运算中的中间值,可以减少对全局变量区的占用。
由于局部变量区在子程序被调用时才被分配,且分配时并不对数据区进行初始化,所以其初始值是不确定的。因此在程序中用到这些存贮区的值的指令前,必须有对该存贮区地址的赋值操作,否则可能会出现错误的执行结果。尤其在子程序中存在大量的跳转指令时,很容易出现漏掉对局部变量赋值的情况,要格外注意。
每个子程序调用的输入/输出参数的最大限制是16,如果您尝试下载的程序超过此一限制,IN和out加起来共16个超过16个就会出错。使用过程中应注意以下几点:
1、子程序或者中断程序不能访问分配给主程序的局部存储器。子程序不能访问分配给主程序、中断程序或者其他子程序的局部存储器。同样的,中断程序也不能访问分配给主程序或子程序的局部存储器。
2、S7-200 SMART有64个字节的局部存储器,其中60个可以用作临时存储器或者给子程序传递参数。
3、IN、OUT、IN_OUT变量都会与外部进行数据交换,所以不需要数据交换时应使用TEMP变量。
下面讲述西门子S7-200SMART中局部变量的类型以及使用方法。
S7-200 SMART提供了四种类型的局部变量,用L表示。
IN:输入变量。将外部指定位置的参数传入子程序。
OUT:输出变量。将子程序的运算结果传出到外部指定参数位置。
IN_OUT:输入输出变量。将指定位置的外部参数传导子程序,再由子程序修改后再将结果返回到同样的地址。
TEMP:临时保存在局部数据堆栈中的临时变量。一旦POU完全执行,临时变量数值
则无法再用。在两次POU执行之间,临时变量不保持其数值。
创建方法为:打开每个子程序都会弹出对应的变量表,如下图:
在变量表中选择要创建的变量类型,输入符号(英文/中文都行),再选择正确的数据类型,系统将自动分配对应的变量,局部变量地址是系统根据前面的地址及数据类型自动分配,不可自行修改。尽量把所有变量创建好后再开始根据分配的变量地址进行编程。万一在编程过程中需要再添加变量,一定要把显示方式切换成:“仅符号”否则插入变量后地址全部变化,程序中原本使用的地址将报错。
编写好的子程序不仅可以被当前项目的调用,还可以建成库供其它项目调用。在以后的编程中经常会出现一些经典的应用,或者经常处理的类似程序,我们就可以建立成“库”,碰到类似的用法只需要直接调用库进行编程即可。
那么库应该怎么建立呢?
1)重命名:首先把编写好具有特殊功能(脉冲运算、模拟量换算等)的子程序进行重命名,避免与其它项目中子程序重名。我们把以上例中子程序为例,命名为“指示灯延时启动”。
2)创建库文件:在左侧指令树中找到“库”右击弹出对话框,选择“创建库”如左下图,弹出右下图对话框:选择需要建立库的子程序“指示灯延时启动”,点击“添加”;选择“属性”对库进行命名以及指定库文件存储位置;选择“保护”,可以对库文件设置一个密码保护,可以限制阅读和修改库程序。设置好后确定,将会在知道目录下生成一个库文件。
库的创建如下:点击创建库后弹出创建库对话框。
在V2.1之前版本中需要手动添加删除库,库文件可以存储在任何地方。从V2.2开始将库集中管理,必须存储在系统设定目录下,打开新项目刷新即可自动可以显示。重新安装软件或重装系统前请对库文件进行备份。
要消除库和项目之间出现存储器使用冲突的可能性,应避免在用户定义库中使用全局存储器。 可能无法完全消除库对全局资源的使用;但是,在可能的情况下最大程度地减少此类使用是有必要的。 这里列出了最小化全局存储器使用的一些方法:
1)尽量用局部存储器代替全局存储器。
通过使用局部存储器,尽量减少库对全局存储器的依赖性。您还可以直接将局部存储器指定为库指令使用的存储器。
例如:您可能有一个计算数值并将该输出存储在 V 存储单元的子例程的子例程。程序的其余部分则会读取该 V 存储器位置,以便确定计算的结果。 如果您希望将该子例程放入库,考虑在子例程中增加一个输出OUT参数,并将计算结果存储在该参数中。这样就无需使用 V 存储单元,并允许您决定结果的存储位置。
2)使用临时变量进行计算。
将临时变量用于计算和临时结果可尽量减少指令库对全局存储器的使用。 您在子例程变量表中定义的临时变量只对该子例程有效,不会与项目冲突。
3)需要 V 存储器时,要定义符号。
有时您必须在计划包括在指令库中的子例程中使用全局 V 存储器。 必要时,应为所有 V 存储器声明符号,并在程序中使用这些符号。 编译该库时,编译器将使用这些符号来决定您的库所需的存储器大小。通用规则是,将包括在库中的子例程所占用的 V 存储器分组到连续位置中。
以常用的步进脉冲数运算为例,因为使用比较频繁,可以建立成库方便以后编程过程中调用。使用全局变量运算,程序如下:
如果要将该子程序建成库,必须给所有全局变量都定义符号,否则无法建立库。建成库以后编程调用库时,必须要进行库存储器分配,右击左侧项目树中“程序块”选择“库存储器分配”,点击建议地址系统自动分配未使用的存储器供给库使用。如下图:
注意:在编写库程序时,所用到的V存储区地址必须全部定义符号,否则无法创建库。创建成库后再次调用该库进行编程,所用到的V存储器不再是之前编写库程序的地址,需要重新分配V存储器地址。但是会按照之前的地址进行分配,如存储器大小,数据类型及编号之间的规律,所以尽量采用连续的地址进行编程。