曾经最初学习PLC STL编程的时候,发现很多老外的程序最后都喜欢加上SET/SAVE/CLR 这样的指令,一直也没搞懂为啥,心想可能就是各人习惯吧,没啥影响。但是今天的一个小CASE,让我顿时醒悟,到底什么叫严谨,且让我慢慢道来。
如图1所示,客户程序希望实现的功能是,当M0.0=0,跳转指令不执行,则对M0.2置位;M0.0=1, 跳转指令执行,则M0.2保持复位状态。我们在程序的开始编写逻辑,监控结果如图1,可以看到逻辑没有问题。但是,我们的逻辑如果处于程序的中间位置,那会是什么情况呢,我们来看看。如图2,网络1中只是加了一条指令,但是在网络2中我们可以看到,此时无论M0.0是0还是1,M0.2都处于置位状态,也就是说跳转指令根本不执行,这是为什么呢?

图1

图2
首先,我们看一下“JC”指令,“JC”指令跳转的条件是RLO=1,RLO存储的是逻辑运算的结果,如图3,我们通过监控可以看到,当前,M0.0虽然为1,但是RLO位仍然是0。网络1和网络2虽然处于不同的网络,但是逻辑运算并没有因此结束,也就是说一系列的与或非运算没有结束前,不会开始一个新的逻辑运算(我们从状态字的第一位 /FC,也可以判断, /FC=0,表示逻辑运算结束,从下一个逻辑指令开始一次新的逻辑运算,如图3)。所以此时RLO位的结果不光取决于M0.0,还取决于网络1中的M20.0的状态, 这当然不是我们希望实现的了。

图3
那我们该如何避免这种情况呢?也就是说要M0.0和 之前的逻辑运算脱离关系呢?其实,我们的好多指令,都有这样的功能,比如 SET/R/=/CLR等,这些指令执行后,都会结束当前的逻辑运算,从下个逻辑指令开始新的逻辑运算,/FC=0,如图4所示,这样就可以避免网络1的影响。

图4
所以说,细节决定成败啊,尤其是对我们初次接触STL编程来说,该注意的东西还是很多的!小小的跳转指令里还是有好多智慧的!