回复:欢迎拍砖。再论沿指令,实例还原真相

winter938

  • 帖子

    1550
  • 精华

    33
  • 被关注

    41

论坛等级:至圣

注册时间:2005-06-09

黄金 黄金 如何晋级?

发布于 2018-02-01 15:34:59

65楼

展开查看
以下是引用yanxiao在2018-02-01 09:29:25的发言 >64楼

44楼 看雪001 的例子非常典型,有必要再解释一下。


先把要用到的200smart的沿指令特点写一下:

1、第一次扫描,沿指令把输入信号存下来,然后输出0;

2、后续的扫描,沿指令把输入信号和前次扫描存下的数据作比较,输出结果,然后把当前的输入数据再保存下来。

3、上升沿的比较规则:若当前输入 设为 AC,前次扫描保存下的数据 设为 AP,那么输出 OUT=(!AP) and AC。


看雪001的子程序内,含有一个上升沿指令,作用是对输入管脚signal上的信号取上升沿,然后从rising管脚上输出。


先看图中下面的调用,输出rising管脚上的M0.0是什么值?此时的沿指令,前一次调用保存的值是图上面的调用1,也就是CPU_输入0(I0.0),本次调用的输入是CPU_输入1,根据运算规则,输出 M0.0=(!I0.0) and I0.1。如此简单。效果同下面的语句相同:

LDN I0.0

A I0.1

= M0.0

(I0.0和I0.1来自同一扫描周期).


那么第一次调用的输出M0.0又是什么呢?假设对这个子程序的调用只有图示的两次。

CPU程序是个大循环。调用1时的沿指令,保存的前次扫描值,是调用2时留下的,即I0.1。按上面的分析,调用1的输出,除了每一次扫描时输出0,后续扫描的输出逻辑是:

M0.0 = (!I0.1) and I0.0

相当于:

LDN I0.1

A I0.0

= M0.0

但是,I0.1和I0.0来自两个相邻的扫描周期!


绕了一大圈,其实得到的结果很简单。

没有出现 逻辑 混乱。

以下是引用看雪001在2018-01-31 10:27:07的发言 >44楼:这个例子如果换成用...

引用44楼详细内容:

这个例子如果换成用P指令,那么,效果等同于:

 就是说在重用子程序时,将沿指令的地址用成了一个地址,逻辑结果就会混乱。

1、第一次扫描,沿指令把输入信号存下来,然后输出0;

2、后续的扫描,沿指令把输入信号和前次扫描存下的数据作比较,输出结果,然后把当前的输入数据再保存下来。

3、上升沿的比较规则:若当前输入 设为 AC,前次扫描保存下的数据 设为 AP,那么输出 OUT=(!AP) and AC。

就是这一段的第一条,这个第一次扫描沿指令是如何得知的呢?难道还需要一个寄存器来记录这个“第一次扫描”的状态吗?除了那个上一次扫描时的输入状态寄存器岂不是一个沿检测就至少需要两个寄存器了?300的PLC沿检测上次扫描状态寄存器是用户分配的,它的初始化应当也是由用户编程处理的从而规避了这个问题。不只是沿指令,只要用到寄存器都有上电后初始化的问题,这也是相当值得讨论的一个话题,即使你有意或无意地完成了这个初始化。是否应该象L寄存器一样我们应遵循“先赋值后使用”的原则从而确保程序是按我们期望的那样运行,避免所谓的不可靠?

工控爱好者
评论
编辑推荐: 关闭

请填写推广理由:

本版热门话题

SIMATIC S7-200 SMART

共有8943条技术帖

相关推荐

热门标签

相关帖子推荐

guzhang

恭喜,你发布的帖子

评为精华帖!

快扫描右侧二维码晒一晒吧!

再发帖或跟帖交流2条,就能晋升VIP啦!开启更多专属权限!

  • 分享

  • 只看
    楼主

top
您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。