关于300PLC的 SD 指令奇怪现象的讨论
起因源自以下两个主题贴的讨论:
【分享】PLC常见编程问题点总结(S7-300)
【探讨】看了yzs贴后 ,探讨以下300PLC的 SD 指令奇怪现象
为此我做了如下测试:
第一组:
图1:
图2:
图3:
图4:
可以看出,第一组中图1~图4的程序中计数器的输入变量如果是M10.0的话,程序指令排列顺序无论怎样都是可以正确执行的。
第二组:直接使用定时器T0标志位作为计数器的输入变量
图5:
可以看出,图5中程序计数器不工作。
图6:
图6中换一下梯形图排列次序,将计数器程序移至定时器程序之前,计数器工作。
这就是所谓的STEP 7 S7-300的SD指令异常吗,非也。
但这就能说图5是错误的,图6是正确的吗?
不是,只是前者捕捉到定时器标志位电平变化的概率极小,而后者捉到定时器标志位电平变化的概率极大,原因是,由于本程序是实现一个周期振荡的信号,定时器标志位高电平存在的时长极短,在一些情况下无法跨两个扫描周期存在,标志位刚一刷新成高电平,立即就执行了定时器指令又清零了,导致计数器指令如果在定时器指令之后执行的话,就很难能捕捉到定时器标志位的电平变化。
其实两者一样的存在问题,逻辑上的漏洞。
定时器的工作原理还是那样,定时器在使能后可以认为在后台继续运行,并自动更新定时器的标志位。
图7.1
图7.2
如果我们在定时器指令与计数器指令之间插入足够的延时,那计数器是存在捕捉到计数输入信号的电平变化的可能性的,也就是说定时器标志位的刷新因为延时,在同一个扫描周期内,在定时器指令之后而在计数器指令之前的概率大大增加。
我们通过图7.1及图7.2所示的例程中可以看到,计数器可以工作,但不能确保百分之百能捕捉到计数变量的电平变化。
因此最后的结论:我还是推荐第一组的编程方式,放之四海而皆准。但最标准的振荡信号程序应使用两个定时器来搭建,高电平与低电平都需要有一定的时长,而不是某一个电平的时长极短,甚至不能跨两个扫描周期存在。