子程序是整个程序的一个片段。根据编程者的需求,把一部分程序归入到一个子程序里面,完成相关的功能。整个子程序可以根据用户程序的逻辑选择调用或者不调用。调用的话就按照扫描次序扫描一次子程序,然后回到调用处。不调用的话就等于程序没有了这部分片段。在其他地方再次出现调用这个子程序的话,子程序又得到一次运行。PLC并没有限制用户调用子程序的次数,只不过调用一次就要增加一点扫描时间。必要时候就调用,没必要的时候调用了也不产生什么效益。
偶尔会看见论坛上有人在问:有几个数据需要求平均值。PLC有没有求平均的指令啊?
不好意思,200 SMART PLC没有计算平均指令。还是好好地编程写吧。
下面我试试用两种方式的子程序完成这个多个值的累加。至于除法求平均就不介绍了。现以4个字变量计算总和为例介绍。
程序要求:VW0、VW2、VW4、VW6四个值求和,结果放在VW100中。
看看先用比较简单的方法,先完成要求的功能,如图1所示。
图1程序
在子程序里面就是几个很简单的加法指令。而在主程序调用子程序的前后,加上了一些简单的传送指令。
先看子程序。子程序中三个加法指令把四个MW累加到MW8中。前面四个MW中并没有什么值。累加之后的结果MW8也没有什么实际意义。
再看主程序。题目要求的四个已知值,在调用子程序之前就传到了子程序使用的MW地址。此时调用子程序,这些MW就有了指定值。经过子程序的运算,结果就放置在MW8。然后回到调用处,再把子程序的值传到题目要求的地方,完成题目的要求。
在这个例子中,主程序的这个网络可以多次使用。在需要的地方就按照上面例子的方法使用子程序就可以再次实现求和的作用。子程序只是作为一个计算法则,而这个法则又是很简单的几个计算。当遇到比较复杂的算法的时候,并且又有机会多次调用。不妨可以试试这个程序结构。这个结构有一个优势,就是任何品牌的PLC都可以互通。哪怕就是20年前的PLC也一样可以用这个方法。不过当今的200 SMART PLC显然不推荐使用这样的方式了。这个方式的编程,只是用于说明带参数子程序的一部分参数传递原理,将在日后详细介绍。
这种调用方式存在一些问题:
-
调用子程序的前后,需要把参数传送到指定的地址,供子程序使用。
这些地址成为了这一个子程序的专用地址。
每次调用子程序都要做这个事情。
-
子程序占用了公共资源。
当一个程序有很多个子程序的时候,消耗在这两方面的工作和资源就会很多。当一个子程序工作需要很多个参数的时候,要写很多MOV指令,也要占用很多公共资源M地址。对于200 SMART PLC,M区只有32个字节,如果需要32字节以上的区域,那就只能在比较大的V区找地方了。而当子程序很多,或者子程序是不同编程者的话,就可能会有不同子程序使用到了相同的区域。这样必然需要修改一些地址,使地址不发生重复。
假如有办法解决上述两个问题,将是一个非常美满的结果。办法是有的。先不说这个。
现在,再用现在的方式写一个子程序完成求和的功能。四个步骤就可以创建一个带参数的子程序。
步骤一
新建一个子程序。在子程序属性里面编好子程序名称和块编号(子程序号),如图2所示。这里要求不严格,主要是编程者自己容易分辨就好。当然如果是要做成库,最好把块编号设置大些,以便于调用时不会冲突。
图2 设置块属性
第二步
如图3所示,打开变量表。
图3 变量表
第三步
向变量表填入需要的输入输出参数,如图4所示。
图4 设置参数
变量表的各个列的意思是:
地址:变量对应L区的绝对地址。这个地址由系统分配,不能由编程者输入。每增加一个变量或者插入一行,地址自动改变。并且如果编程当前正在用符号名编程的时候,增删行导致的地址变更,不会影响编程关系。相反,如果正在用地址编程,而你又增删过行,那么程序地址将会混乱。
符号:这个是变量的名字。如果正在用地址编程的时候,此时修改名字,不会影响已写好的程序。相反,如果正在用符号编程,此时修改名字,那么程序符号立即红色报错,程序已找不到这个名字了。
变量类型:无法修改。输入参数填写在IN行。输入/输出参数填写在IN_OUT行。输出参数填写在OUT行。临时变量在最后TEMP。填写完毕会自动增加新行。
IN类型表示子程序运行的数据来源,就像上述例子的4个加数。
OUT类型表示经过子程序的运算,得到的结果。输出在这个位置。
IN/OUT类型,组合两种类型,先输入给子程序再运算得到结果输出到相同的位置。
TEMP类型,这个类型既不输入也不输出,仅仅在子程序中充当过渡用的中间变量。
数据类型:这个参数是一个点位还是一个字节还是一个浮点数等等的性质。这个下拉选择将会影响地址栏的分配跨度。因为不同的类型占用不同的位长。
注释:给自己看的一些关于本行变量的备忘信息。
到此,一个带参数的子程序就已经完成了。虽然并没开始编写子程序的内容,但是你已经可以观察一下由主程序调用这个子程序的样子。如图5所示。
图5 子程序调用
网络1是当子程序没有填写变量表的时候的样子,它不带任何参数。网络2是刚才建立了变量表的求和子程序。此时的子程序未确定任何实质性的参数地址。点击每个问号地方,按照题目要求左侧输入VW0;VW2;VW4;VW6,右侧输入VW100,调用基本就完成了。
子程序输入输出参数的排序会按照你刚才填写变量表的先后顺序布置。在实际程序中,你最好在向子程序编程之前先确认一下这个外观效果,每一个输入输出参数是否能够按照使用的习惯排列所有参数。例如我们表达一个长方体的尺寸的时候通常都说“长宽高”,没有人会说“高长宽”的次序的。这个就是习惯。当参数很多的时候,尽量按照有关习惯填写变量表的顺序。可以用插入删除行的方法编辑次序。
第四步
对子程序编程。
子程序内的加法过程的编程在此就省略了。其实就是图1的子程序。只不过是将全部的MW改写成LW就可以了。
好了,一个带参数的子程序就完整建立完毕了。它将会出现在指令树里面项目的程序块里面。它因为本身就是一个子程序,所以也是显示为一个子程序。
后面的内容更精彩。可能不是你想象的那回事哦。——带参数子程序的参数传递过程
编辑:黄飞
评论
查看更多