Ermittelt Operationen auf Variablen des Datentyps Enumeration. Zuweisungen sind erlaubt.
Begründung: Enumerationen sollten nicht als normale Integer-Werte verwendet werden. Alternativ kann man einen Alias-Datentyp definieren oder einen Subrange-Typ verwenden.
Wichtigkeit: Mittel
Ausnahme: Wenn eine Enumeration mit dem Attribut {attribute 'strict'}
gekennzeichnet ist, dann meldet bereits der Compiler eine solche Operation.
???STIMMT DAS AUCH NOCH??? Wenn eine Enumeration durch das Pragma {attribute 'flags'}
als Flag deklariert ist, wird für AND
-, OR
-, NOT
- oder XOR
-Operationen kein Fehler ausgegeben.
Beispiel
TYPE My_Enum : ( red := 1, blue := 2, green := 3, black := 4 ); END_TYPE PROGRAM PLC_PRG VAR iTemp1 : INT; abc : My_Enum; END_VAR iTemp1 := iTemp1 + INT#1; abc := My_Enum.red; // OK iTemp1 := My_Enum.black / My_Enum.blue; // SA0058 iTemp1 := My_Enum.green / My_Enum.red; // SA0058 --> SA0058: Operation auf Enumerationsvariablen
Beispiel mit Pragma {attribute 'flags'}
{attribute 'flags'} // declaring the enumeration as a "flag" TYPE Flags : ( Unknown := 16#00000001, Stopped := 16#00000002, Running := 16#00000004 ) DWORD; END_TYPE PROGRAM PLC_PRG VAR iTemp1 : INT; abc : Flags; batate : BYTE; dwFlags : DWORD; dwState : DWORD; END_VAR // OK for the following IF (dwFlags AND Flags.Unknown) <> DWORD#0 THEN dwState := dwState AND Flags.Unknown; ELSIF (dwFlags OR Flags.Stopped) <>DWORD#0 THEN dwState := dwState OR Flags.Running; END_IF