今天在看生产线上的程序的时候发现了一个程序的漏洞,拿来和大学分享一下。 (本来想插入梯形图的,但是我发不了图,只能STL了)
A(
A I0.0
L S5T#200MS
SD T 0
NOP 0
NOP 0
NOP 0
A T 0
)
L S5T#200MS
SS T 1
NOP 0
NOP 0
NOP 0
A T 1
= M 100.0
上面这点程序本来是想用来滤波的,I0.0是热金属检测器的数字量输入信号,串了一个通电延时和断电延时,两个时间继电器的延时时间都是200MS,M100.0是滤波后的信号,本来想法是即使当输入有瞬间信号丢失时M100.0也是不会跟着输入丢失的。但其实这个程序并不能真正实现滤波,当I0.0瞬间丢失信号(假如小于200MS),M100.0也是会跟着丢失的,并不能达到滤波的效果,原因是通电延时放在前面,当丢失信号再次为1的时候,还要200MS才能使断电延时的输入端得电,但在这之前其实M100.0已为0,M100.0也相当于没有滤去I0.0瞬间的信号丢失。
想达到滤波的方法有两种方法:一是,把断电延时的时间改得比通电延时的时间长;二是把断电延时放在通电延时前面,这样即使两个时间继电器的时间一样,也会有滤波的作用。程序如下
A(
A i0.0
L S5T#200MS
SS T 1
NOP 0
NOP 0
NOP 0
A T 1
)
L S5T#200MS
SD T 0
NOP 0
NOP 0
NOP 0
A T 0
= M 100.0
这个生产线的程序还是做过很多生产线的老师写的,可见一不注意还是很容易出现漏洞。这也让我们在写程序时必须进行调试,有时候理论上看起来行得通,但实际上却不行。