PLC结构化文本(ST)——AND_THEN & OR_ELSE

PLC Structured Text Object Oriented Programming

PLC结构化文本(ST)——AND_THEN & OR_ELSE

特殊机制

运算符AND_THENOR_ELSE与我们常用的ANDOR功能相同却有点区别。

IF FALSE AND calculate() THEN
    Auto.Run();
END_IF

假如IF前一个条件一直为FALSE那么后一个条件calculate()仍然会继续执行,得出结果。当然Auto.Run()不会继续执行。

IF TRUE OR calculate() THEN
    Auto.Run();
END_IF

假如IF前一个条件一直为TRUE那么后一个条件calculate()仍然会继续执行,返回BOOL值得出结果。

上述这两种情况,对于IF条件语句使用运算符AND来说,只要有一个条件是FALSE整条判断语句结果就为FALSE,同样对于使用运算符OR来说,只要有一个条件为TRUE整条判断语句结果就为TRUE。后一个条件就没必要继续运行判断直接执行下一个语句即可。

把上面程序中的运算符ANDOR替换成AND_THENOR_ELSE

IF FALSE AND_THEN calculate() THEN
    Auto.Run();
END_IF

由于IF条件语句第一个条件是FALSE所以使用AND_THEN运算符后calculate()方法/函数/程序并不会进入执行,也就是说当检测到第一个条件为FALSE时条件判断提前返回结果FALSE

IF TRUE OR_ELSE calculate() THEN
    Auto.Run();
END_IF

同理,条件语句使用的是OR_ELSE运算符,结果提前返回TRUE,并且calculate()不参与执行。

如何使用

既然我们已经了解运算符AND_THEN & OR_ELSE的特殊机制。是否可以用来简化代码?提高计算机运行效率?

  • 简化代码
IF bCondition1 THEN // 条件1
    IF bCondition2 THEN // 条件2
        IF bCondition3 THEN // 条件3
            Auto.Run();
        END_IF
    END_IF
END_IF
  • 使用AND
IF bCondition1 AND bCondition2 AND bCondition3 THEN
    Auto.Run();
END_IF
  • 使用AND_THEN
IF bCondition1 AND_THEN bCondition2 AND_THEN bCondition3 THEN
    Auto.Run();
END_IF

多个IF条件嵌套使用,代码结构复杂,使用AND_THEN简化之后在同一行形成一个IF条件,代码清晰简洁。

IF ptrMachine <> 0 THEN // ptrMachine 是一个指针
    IF NOT ptrMachine^.IsAutoRun() THEN
        Auto.Run();
    END_IF
END_IF
  • 不能使用AND运算符简化
// 这是一个错误示例
IF ptrMachine <> 0 AND NOT ptrMachine^.IsAutoRun() THEN
    Auto.Run();
END_IF

无论这个表达式ptrMachine <> 0结果是什么,后面的表达式ptrMachine^.IsAutoRun()都会被执行,如果指针是空引用则会导致指针空引用异常

IF ptrMachine <> 0 AND_THEN NOT ptrMachine^.IsAutoRun() THEN
    Auto.Run();
END_IF

如果指针(ptrMachine)为空(null),IF的第一个条件ptrMachine <> 0不成立返回FALSE判断直接退出不执行ptrMachine^.IsAutoRun()表达式。如果指针不为空,两个判断条件均执行,并且不会出现空指针异常。

总结

合理使用ORANDOR_ELSEAND_THEN运算符,而且OROR_ELSE不是可以随意替换使用的,同理ANDAND_THEN也是如此。一切要以自身程序需求来判断使用合适的运算符。