Care must be taken about the precedence of operators in Plain English programming to achieve expected results.
The following PE program was created with the intent of monitoring how long a point has been in alarm and unacknowledged
The user intent was to have the program increment ‘TimeInALM’ for every minute the point has been in alarm without an ACK
WaitOneMin: IfTS > 59 then Goto CheckALM CheckALM: TimeInALM = TimeInALM + PSS\ACX2.48\Num1 Alarm1 = On and PSS\ACX2.48\Num1 AckTransToOffNorm <> 255 IfTimeInALM > 4 thenGotoAlertGuard ElseGotoWaitOneMin AlertGuard: TimeInALM = 0 GotoWaitOneMin
Instead of incrementing as was the intent, ‘TimeInALM’ kept toggling between 0 and 1.
- Continuum Cyberstation
- Continuum (All CXs)
- Continuum Plain English
The rules of precedence dictate that the + is done first then the AND. So this is what happens:
TimeInALM = TimeInALM + PSS\ACX2.48\Num1 Alarm1 = On and PSS\ACX2.48\Num1 AckTransToOffNorm <> 255
- We start with TimeInALM = 0
- PSS\ACX2.48\Num1 Alarm1 evaluates to 1 and so does PSS\ACX2.48\Num1 AckTransToOffNorm
- So we have
0+1 = 1 ANDed with 1 = 1
- Now TimeInALM = 1, so second pass is
1+1=2 ANDed with 1 = 0
- So TimeInALM is now zero and the cycle repeats
Use parentheses to enforce the order of operations. This resolves potential ambiguities.
TimeInALM = TimeInALM + (PSS\ACX2.48\Num1 Alarm1 = On and PSS\ACX2.48\Num1 AckTransToOffNorm <> 255)
Here is the complete PE Operator Order of Precedence for reference.