恭喜,你发布的帖子
发布于 2018-02-01 15:34:59
65楼
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来自两个相邻的扫描周期!
绕了一大圈,其实得到的结果很简单。
没有出现 逻辑 混乱。
1、第一次扫描,沿指令把输入信号存下来,然后输出0;
2、后续的扫描,沿指令把输入信号和前次扫描存下的数据作比较,输出结果,然后把当前的输入数据再保存下来。
3、上升沿的比较规则:若当前输入 设为 AC,前次扫描保存下的数据 设为 AP,那么输出 OUT=(!AP) and AC。
就是这一段的第一条,这个第一次扫描沿指令是如何得知的呢?难道还需要一个寄存器来记录这个“第一次扫描”的状态吗?除了那个上一次扫描时的输入状态寄存器岂不是一个沿检测就至少需要两个寄存器了?300的PLC沿检测上次扫描状态寄存器是用户分配的,它的初始化应当也是由用户编程处理的从而规避了这个问题。不只是沿指令,只要用到寄存器都有上电后初始化的问题,这也是相当值得讨论的一个话题,即使你有意或无意地完成了这个初始化。是否应该象L寄存器一样我们应遵循“先赋值后使用”的原则从而确保程序是按我们期望的那样运行,避免所谓的不可靠?
请填写推广理由:
分享
只看
楼主