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
无论这个表达式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()
表达式。如果指针不为空,两个判断条件均执行,并且不会出现空指针异常。
总结
合理使用OR
、AND
、OR_ELSE
、AND_THEN
运算符,而且OR
和OR_ELSE
并不是可以随意替换使用的,同理AND
和AND_THEN
也是如此。一切要以自身程序需求来判断使用合适的运算符。