代码编织梦想

一、双线圈问题

两个触点"xInput1"、"xInput2"同时控制一个输出"xOutput".

当"xInput1"置TRUE时,理论上来说"xOutput"也会置TRUE,但实际上没有输出。

通过观察示波器波形也可以看到,"xOutput"是没有输出的。

这是由于PLC扫描顺序是从上到下,从左到右。PLC会将这个周期内所有元件的状态统一存储在输出状态寄存器中,然后统一进行输出刷新。

所以,虽然上面的程序"xInput1"置TRUE触发了"xOutput"置TRUE,但是下面的程序"xInput2"是FALSE的状态,也会将"xOutput"置FALSE。

最终,PLC本周期输出刷新的时候,"xOutput"就会输出FALSE的状态。

反过来看,如果将"xInput2"置TRUE,结果又会是怎样呢?

根据PLC扫描原理,输出刷新最后一条程序的元件状态,那么"xOutput"就会输出TRUE。

二、需要明白一个点

在PLC中,触点控制一般线圈时,触点的状态会直接影响线圈的状态。

当AA导通时,D1和D2就是导通的状态。

当AA不导通时,D1和D2就是不导通的状态。

所以"AA"置TRUE和置FALSE,是两种状态,对应的输出也是两种状态。

而不是大家之前理解的,AA不导通,后面程序就不执行。

三、双线圈问题在程序中的深层理解

这是一个简单的两段程序,上面就是利用AA控制D1和D2两盏灯。

下面是利用BLINK指令、ROR指令和BYTE_AS_BIT指令实现1s移位一次,灯从D8-D1依次闪烁。

灯1-灯8全部与指令的B0-B7关联起来。

我们登录下载程序,观察8个灯依次移位循环...但问题是:

上面的"AA"没有置TRUE,下面循环移位,D8-D3都可以点亮,但D2-D1就不能被点亮。

通过监控D1和D2的波形可以发现,两个灯其实有一个4ms的上升。

原因:这就是由于扫描刷新和双线圈问题导致的。

程序从上向下扫描,D1和D2先FALSE,然后根据移位指令又被置TRUE,所有波形能看到上升沿。但程序循环执行,这两个灯又被理解FALSE掉了,所以肉眼是观察不到灯亮的。

那要是两段程序反过来会出现什么结果呢?

D1和D2两盏灯还是灭的,但波形上已经没有4ms的上升沿了。

原因:程序最后刷新的就是D1和D2被置FALSE,所以不论是实际看到的效果还是抓到的波形,都没有变化。

四、如何解决双线圈的问题

大家发现,如果我将D1和D2改成置位线圈或者复位线圈后,没有将"AA"置TRUE,但实际D1和D2两盏灯就可以正常移位闪亮了。

波形也可以正常输出,说明这个问题就得到了解决。

为什么改成置位/复位线圈就可以了呢?

在PLC中,相当于"AA"置TRUE,才执行后面的置位/复位程序;"AA"置FALSE,不执行后面的置位/复位程序,这样就不会存在双线圈的问题了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/viixin/article/details/127991478