深度解析S7-200系列PLC带参数子程序用法

来源:技成培训

一、导读


当控制要求相同或具有相同的算法时,(如对电机的控制,若需要对多台电机进行控制,且每台电机具有相同的控制方式)此时可考虑根据该控要求,编写一个功能块,然后重复调用该功能块,然后赋予不同的实参来实现该控制,如同所示:

但往往有些人做完后发现一台电机启动后,其他的电机本来不该启动的也跟随着启动了,这是什么原因呢?
本篇文章就是为大家分析为什么会出现这种情况,其实这主要还是对子程序中变量类型的使用不正确造成的,在S7-200系列的子程序中有四种变量类型,分别为IN(传入)、IN/OUT(传入/传出)、OUT(传出参数)、TEMP(临时变量),下面就为大家详细介绍下子程序中的这几种变量类型的含义和在应用时应如何选择。

二、变量类型IN


变量类型IN称为输入类型,是“只读”变量,用于把外围的数据或状态传入到子程序中进行运算,若把子程序看作成一个指令(如一个加法指令),那么输入参数就相当于指令的IN的管脚。该变量建立后,在调用子程序时位于子程序的左侧。由于是把数据传入子程序中,所以该形式参数在赋实参时可使用常数、存储器或指针。
变量建立时只需要建立符号名称和选择对应的数据类型即可,至于该变量的地址,系统会自动分配一个局部存储器的地址,注意该地址不可修改,如下图所示,第一个地址的符号命名为“Start_Motor”,选择数据类型为“BOOL”后,系统自动给其分配了一个L0.1的局部存储器地址。

三、变量类型OUT


变量类型OUT称为输出变量类型,是一个可写的变量,主要用于把子程序运算完的结果传递出来,类似于指令中的OUT管脚(如一个加法指令)。该变量建立后,在调用子程序时位于子程序的右侧。由于该变量类型用于存储运行的结果,所以在使用时该变量类型的形参在赋实参时只能使用存储器,不能使用常数或是指针。

由于输出参数并不保留子程序最后一次执行时分配给它的数值,所以必须在每次调用子程序时将数值分配给输出参数。注意:在电源上电时,SET和RESET指令只影响布尔量操作数的值,建立OUT的变量类型与建立IN的类型方法一样,也会根据选择的数据类型系统自动分配地址。

四、变量类型IN_OUT



变量类型IN_OUT称为输入输出变量类型
,是一个可读可写的变量即可读取他的值传递给子程序内部的运算,也可把运算完的结果输出放入到该变量中,比如说我们用到的自加1指令或是启保停电路中用于输出和自保持的变量就需要用到该变量。该变量建立后,在调用子程序时位于子程序的左侧,由于该地址需要存储子程序运算完的结果,所以在赋予实参时不允许使用常数和指针作。

五、变量类型TEMP


变量类型TEMP称为临时变量,该变量与前面所介绍的三种变量的最大区别就是不参与对子程序数据传递,即不把外围的数据传入到子程序,也不把子程序的运算结果传递出子程序,该变量主要用于子程序的内部暂存中间运算结果使用,所以该变量类型无需赋实参。

Temp变量在运算前一定需要有一个确定的值,若没有确定值不能参与运算,否则会出现运算结果数据的混乱,如同下图所示:

图中有两个临时变量,分别为Temp1和Temp2.从程序中可发现,对于Temp1在用于后面的运算时,可知道他的值是由两个输入变量相加后的结果,它时一个确定的指。而对于Temp2这个临时变量,在进行加法运算时,并不知道他的值时多少,所以它不是一个确定的值,那么在程序执行后,Result1可得到一个正确的结果,而Result2得不到一个正确的结果。
六、如何选择变量类型


下面以一个简单的例子为例来说明如何选择变量类型,如:假设有多台空压机,要求当压力小于下限设定压力时,启动空压机电机,当压力高于上限压力设定时,关闭空压机电机。压力通过压力传感器进行检测。
分析:
(1)由于空压机的启动方式是相同的,但上下限压力设定以及传感器的输出信号和检测范围都不同,所以在编写程序是,可考虑建立一个带参数的功能块,然后把这些参数作为实参赋值到该子程序的形参上。
(2)当前压力的计算,当前压力的计算可使用西门子提供的模拟量转换库,也可自己根据公式编写,这里我们自己编写一个这个功能块的程序。
模拟量采集换算的计算公式如所示,其中ISl和ISH分布表示的是转换后的数字量范围,OSH和OSl表示的是传感器检测范围。
程序编写时,必须全部转换为同一数据类型进行使用,在该公式中不同变量的数据类型如下:

Ov:Real

Osh/Osl:Real
Iv:INT
Ish/Isl:INT

从这个公式中我们可以OSL和OSH,ISL和OISL以及IV都是我们需要从外围给入到这个计算的子程序中,所以这些变量在建立的时候建立为IN的类型。

公式中的“OSH-OSL”、“IV-ISL”和“ISH-ISL”以及把整数的数据类型转换为实数的数据类型等,这些计算结果都需要进行暂存,所以可建立TEMP的变量来存储。

对于输出结果OV,在这个公式中是一个输出的结果,是一个可写的变量,但后续还需要用于与设定的上下限值做比较,因此还需要去读取他的值,那么该变量也是一个可读的变量,所以建立时可建立为IN_OUT变量。

对于电机的运行标志位,在低压下限设定值时启动,高于上限设定值时停止,在两个限制值之间时需要进行自保持,所以需要用到他的触点进行自锁,这也是一个可读可写的变量,同样建为IN_OUT的变量类型。

对于空压机电机的启动信号,电机运行标志位为1就输出,为0就断开,程序中只需要用到该变量的输出线圈即可,所以在建立时建立OUT类型的变量。

七、编写带参数的子程序


(1)程序编写及变量表的建立,按照上述分析对该程序中需要用到的变量表进行建立,并对每个变量,分配好对应的数据类型,变量表的建立和变量数据类型的分配入下图所示:

(2)限制值程序的编写,对采集到的数值进行范围的限制,保证该参加值的范围是在采集值的上下限之间的数值。

(3)根据计算公式的要求进行计算程序的编写,同时把不同的数据类型转换为相同的数据类型做运算,然后根据计算的采集值的大小与设定的上下限制做比较实现对电机的启停控制。

八、带参数子程序的调用


多次调用带参数的子程序,给其赋予不同的实参,这样可是实现对多台电机的启停控制,如下图所示,假设第一台空压机的上下限设置频率为0.2MP和0.8MP,传感器的检测输出信号为4到20mA,检测范围为0到1MP,第二台电机的上下限设置频率为0.5MP和1.2MP,传感器的检测输出信号为0到10V,检测范围为0到1.5MP,程序的调用及实参的分配如下图所示:

九、总结和注意事项


(1)变量类型的选择,可根据在程序的应用中是对该变量需要执行写的操作还是读的操作来决定该变量的类型的选择,另外对于临时变量在子程序中不出现地址,所以在用于暂存中间结果的时候,可建立TEMP的变量类型
(2)由于该子程序的调用条件用SM 0.0去调用,所以当子程序在一个扫描周期内多次调用时,子程序中不能用到沿脉冲指令,因为在200系列的PLC中,沿的状态时由系统自行存储的,对此调用时九会出现混乱的情况
(3)定时器和计数器指令不存在对定时器或计数器地址的变量寻址,所以当子程序在一个扫描周期内多次调用时,子程序内部也不能使用定时器和计数器。

(0)

相关推荐