PLC結構化文字(ST)——AND_THEN & OR_ELSE

J_Sheng發表於2024-09-11

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

相關文章