SA0058 : Opérations sur les variables d'énumération
Détecte les opérations sur les variables du type de données d'énumération. Les affectations sont autorisées.
Justification : Les énumérations ne doivent pas être utilisées comme des valeurs entières ordinaires. Alternativement, un type de données alias pourrait être défini ou un type de sous-plage pourrait être utilisé.
Importance : Moyenne
Exception : si une énumération est taguée avec le pragma {attribute 'strict'}
, le compilateur signale déjà ce type d'opération.
Si une énumération est déclarée comme flag par le pragma {attribute 'flags'}
, aucune erreur n'est émise pour AND
, OR
, NOT
, ou sur commande XOR
opérations.
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
Sortie dans le messages voir:
SA0058 : Opérations sur les variables d'énumération
{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