最新提现记录

  • 恭喜 admin 于 2023-6-6 15:17 成功提现 500元
  • 恭喜 admin 于 2023-5-3 09:45 成功提现 400元

200smart编程:在重复调用的子程序中,使用上升沿和下降沿

[复制链接]
查看7090 | 回复0 | 2023-2-16 12:26:19 | 显示全部楼层 |阅读模式
本帖最后由 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,上升沿指令没有输出,这样就造成了程序混乱。

那么这个问题怎样处理呢?

首先我们可以使用“笨”方法,将子程序多复制几个,分别调用就可以了,

但是,我们也可以使用更“聪明”的方法去处理,下面就说一种最简单的办法(附程序)

本贴包含隐藏内容,向楼主支付10金币,即可查看 购买记录立即购买

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

2

主题

2

帖子

55

积分

注册会员

Rank: 2

积分
55