200smart编程:在重复调用的子程序中,使用上升沿和下降沿
本帖最后由 phoenix 于 2023-2-16 12:51 编辑先说结论:程序中如果多次调用同一个子程序,子程序中不能使用|P|或|N|命令,需要另辟蹊径。
下面跟大家探讨下,子程序中使用边沿检测的处理方法。我们编程时,会把一些固定的功能编写成带参数的子程序,以便在执行重复任务的时候,可以反复调用。
S7-200Smart的子程序相当于Step7中的FC功能块,不带背景数据,也就没有了静态数据存储区,所以重复调用的话,很多功能是受到限制的,例如不能使用定时器、计数器、边沿检测等等。(以上限制只针对同一个子程序的重复调用,如果只调用一次或者将子程序复制多个单独调用,是没有限制的。)
先说下不能这样做的原因,这涉及到边沿检测程序执行的原理:
边沿检测:程序会将上一次的输入状态存储到一个存储器位中,执行时,比较本次输入状态和上次输入状态的差异,来判断是否执行输出动作。
在step7或者博图中,边沿检测是需要我们关联一个BOOL变量的,这个变量的作用就是存储上次输入状态;
在200Smart中,由程序自动分配这个存储位,简化了编程,但带来了更多的麻烦。
在Step7或TIA中,如果我们在FC中使用上升沿指令,只需要将这个状态存储位分配给IN-OUT参数,调用时关联一个外部变量就可以。
重复调用FC的时候只要分配不同的变量,就没有问题。
看到这里我们就明白了,为什么在200Smart中,不能这样做:
我们没有办法给200smart状态存储器关联不同的变量,如果调用两次子程序,这两次程序执行时,状态位使用的是同一个!
举个例子,状态位初始=0,两次子程序执行时上升沿输入都=1,这样执行第一次子程序后,上升沿指令输出=1,状态位=1;
执行第二次子程序时,由于输入=1,状态位=1,上升沿指令没有输出,这样就造成了程序混乱。
那么这个问题怎样处理呢?
首先我们可以使用“笨”方法,将子程序多复制几个,分别调用就可以了,
但是,我们也可以使用更“聪明”的方法去处理,下面就说一种最简单的办法(附程序)
我们可以自己编写一个带状态存储位的边沿检测的功能块,直接调用就可以。
这是一个边沿检测的梯形图程序,很简单的就可以实现上升沿下降沿功能。
Signal是输入信号,P/N是输出信号,Signal_LAST就是我们的状态存储位使用时直接在子程序中调用这个功能块就可以,注意Signal_LAST需要分配给不同变量。
页:
[1]