作为用户程序,只要上级程序把参数放置到位,又在子程序里面存取对应的L地址,中间怎么从上级传达到下级是无需做任何事情的。这个过程由系统代劳了。但不等于不用理解这个过程。你不知道的事情可能恰恰就在这里。做以下的程序实验一下。
图4
建立三个子程序,各自就只有变量表填写了一行参数,如图4所示。子程序里面无任何用户程序。主程序编辑这样的调用逻辑。把程序下载到PLC,看看执行会怎样?
PLC运行后,由于程序存在QB0和M0.0,没有任何用到的其他地址了,我们的焦点就关注着这两个地方,而QB0更是Zui容易看见。此时输出点还是熄灭的。用状态表把M0.0写入1,QB0也显示2#10010000(注意硬件的灯高位在右侧,书写二进制高位在左侧。)把M0.0写入0,此时QB0变成显示2#11001100。我们把M0.0写入1之后QB0显示2#10010000。
为什么输出点会有这样的三种状态呢?用户程序完全没有对输出点做过逻辑和赋值,而子程序里面也没有任何程序。能够有动作的只能是系统的动作了。究竟会是什么时候使输出点得到了一些值?程序里面唯一跟QB0有点关系的就是SBR2子程序了。为什么SBR0、SBR1两个子程序的值会到了SBR2子程序里面去的?那么就要理一理参数传递的中间过程了。
运行初期,网络1不接通,网络2没产生边沿信号。前两个子程序都没有调用。唯独第三个子程序SBR2一直在调用。
接通M0.0,SBR0得到了执行。在进入子程序后,运行子程序用户指令之前,系统把引脚上的IN参数值复制到了LB0。执行子程序的用户程序,由于没有程序可运行,退出了子程序。
网络2没有执行子程序。网络3一直在执行。SBR2子程序没有输入参数,没有子程序内容,离开子程序之前,系统必须要给一个值到输出参数。系统的这个动作不会因为程序中有没有内容或者说程序执行的怎么样,而不去做这个传送,它是必然会做这个动作的。那么这个时候,LB0到底是一个什么值呢?我们就要追溯到这个LB0Zui后赋值的是什么地方。之前由于执行SBR0输入参数使LB0曾经有过2#10010000这个值。这个值由于遵从多重赋值的原因,这个值在当时产生,一直搁置到现在,被SBR2捞上来了,就给了QB0。当M0.0恢复到0时,SBR1前的上升沿发生了,调用了一次。就这一次,把LB0写入了2#11001100。在没有什么地方再给LB0写入值的情况下,LB0将不会改变。(当一个子程序不调用的时候,并不会由此使得某些线圈、某些地址自动复位为零,仍有不少的人有这样的错觉。)大家也可以参考M0.0,编程软件写入了的值可以一直保持住的。你没有去更改它,还有谁去修改它?把一个值写入到某地址之后,就可以一直保持住,SBR2也就可以输出2#11001100这个值。
手册并没有说明局部储存区的值是从何而来,手册上面有一段话,如图5所示。
图 5
当手册没有清楚说明的情况下,我会假设一种较为合理的假设,在日后的编程中一直证实这个假设,并使用这种假设,一直关注着这个问题。假如一直使用都没有明确显示这种假设不成立,将认为这是真的,继续使用。我总觉得PLC只会按照有限的法则以固定的方法实施一些运算。既然一个假设一直没有被推翻,那么这个假设可能永远也不会被推翻