箝德孜 发表于 3 天前

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

PLC Structured Text Object Oriented Programming

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

特殊机制

运算符AND_THEN和OR_ELSE与我们常用的AND和OR功能相同却有点区别。
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。后一个条件就没必要继续运行判断直接执行下一个语句即可。
把上面程序中的运算符AND和OR替换成AND_THEN和OR_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无论这个表达式ptrMachine0结果是什么,后面的表达式ptrMachine^.IsAutoRun()都会被执行,如果指针是空引用则会导致指针空引用异常。
IF ptrMachine <> 0 AND_THEN NOT ptrMachine^.IsAutoRun() THEN
    Auto.Run();
END_IF如果指针(ptrMachine)为空(null),IF的第一个条件ptrMachine0不成立返回FALSE判断直接退出不执行ptrMachine^.IsAutoRun()表达式。如果指针不为空,两个判断条件均执行,并且不会出现空指针异常。
总结

合理使用OR、AND、OR_ELSE、AND_THEN运算符,而且OR和OR_ELSE并不是可以随意替换使用的,同理AND和AND_THEN也是如此。一切要以自身程序需求来判断使用合适的运算符。

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: PLC结构化文本(ST)——AND_THEN & OR_ELSE