本帖最后由 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,上升沿指令没有输出,这样就造成了程序混乱。
那么这个问题怎样处理呢?
首先我们可以使用“笨”方法,将子程序多复制几个,分别调用就可以了,
但是,我们也可以使用更“聪明”的方法去处理,下面就说一种最简单的办法(附程序)
|