经常有人问,这个PLC有没有某某指令,或者,有没有指令可以实现这样那样的功能?
产生这样的疑问,部分原因是不熟悉这款PLC的指令。
部分原因是为了选型,想找到一种PLC能够内置一些功能,使得自己的编程得到简化。
甚至有一些人认为,PLC没有这个指令就是没有这个功能,不能完成某个任务。
如果指令能自己做,那就没有这个问题了。
那我们就试着自己做自己需要的指令。
本系列文章围绕S7-200 SMART PLC为中心,分为三篇讲解如何编写自己需要的指令,编程语言主要以梯形图的方式为主。
注意:前方高能!超长文章,请大家拿着奶茶慢慢看~
梯形图的所有指令一般遵循扫描原则进行执行。
执行一个完整的程序,过程中由于扫描有先后次序,所以必然在一个瞬间只能执行一个指令。
那么当扫描到程序中间的时候,程序前部分的程序先获得扫描并执行过,执行的结果将已经产生影响。
后面部分的程序未曾执行,将来的执行当中所有条件将以最新的形态执行。
首先来看一个例子。
如图1所示:
图1程序
从I0.0 = False(0)之后的某个扫描周期开始看看扫描的过程。
此时,所有变量都没有接通。
当有一个扫描周期I0.0 = True(1)的时候,并且方框处的程序刚刚处理完的时刻,第一段的Q0.0显然跟以前的扫描一样,不接通。
而此时此刻的M0.0已经接通,它将开始影响以后程序的执行。
然后在这个扫描周期结束的时候Q0.1将接通了,但是Q0.0却没有接通。
下一个周期开始,扫描第一个M0.0触点的时候,此时的M0.0才开始影响第一行程序。
所以,扫描到并执行出的结果是影响往后的所有扫描的。
并没有扫描周期之分。
所有执行都基于扫描。
一行程序最左边粗实线是能流的源,这里永远是True(1)。
通过各种触点的True(1)与False(0)组合,能流能到达右侧的线圈指令的话,就可以使线圈置位(1)。
能流不能到达右侧线圈的话线圈就复位(0)。
能扫描到的指令,基本能按照这种意愿执行。
要正确理解能流True(1)与False(0)两种状态对程序的影响,如图2所示。
图2程序
当I0.0 = True(1)的时候,两个指令都得到了能流。
计时器指令按照自己的属性进行计时。
传送指令把源地址数据传送到目的地址,无论目的地址原来有什么值都执行传送更新目的地址。
当I0.0 = False(0)的时候,两个指令都没有了能流。
计时器在没有能流的时候把当前值写成0,把计时器位写成False(0)。
值得注意的是,这个指令在False(0)的时候不是什么都不做的,而是在做False(0)时应该做的事情。
有这样特点的指令还有输出线圈指令等。
传送指令在没有能流的时候不再传送,不再理会目的地址。
大量位于能流最右侧的指令都有这个特点。
不追究这个词的历史背景了。
反正大家都知道在一个程序里面对同一个线圈出现过两次输出线圈就是双线圈。
双线圈不会当作是一种错误程序。
它完全可以按照程序的行为作出解释。
也就是说它没有语法错误,但是可能会导致逻辑执行错误。
如图3所示的例子,可能作者希望自动动作时的三个步骤Q0.0得电。
而且切换到点动的时候又可以控制Q0.0。
结果,由于出现了双线圈,影响了期望的动作。
这是双线圈最显著的错误使用。
图3程序
对于输出点Q,总是按照一个周期中最后一个输出指令刷新输出到物理点的。
下面举一个案例,看看怎么处理比较好?
有一个输出点,根据工艺已经做好了程序并且调试成功。
程序片段如图4所示。
图4程序
突然甲方来了一个要求,要求Q0.0在原来的基础上并联一个现场按钮,无论Q0.0是否动作,现场按钮按下时,Q0.0都要为True(1)。
现场按钮松开时,不影响原来的程序作用。
同时要求,Q0.1不受现场按钮影响。
于是如图5所示做了如下修改。
图5程序
Ok!程序没有问题。
要是改成如图6所示的程序,结果会怎样?同样,这个程序也可以完成上述任务。
图6程序