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
也是如此。一切要以自身程式需求來判斷使用合適的運算子。