SA0058: Numaralandırma değişkenleri üzerinde işlemlerPermalink

Numaralandırma veri tipindeki değişkenler üzerindeki işlemleri algılar Atamalara izin verilir.

Gerekçe: Numaralandırmalar sıradan tamsayı değerleri olarak kullanılmamalıdır. Ayrıca bir takma ad veri türü tanımlayabilir veya bir alt aralık türü kullanabilirsiniz.

Önemliymiş: Orta

İstisna: Bir numaralandırma pragma ‎{attribute 'strict'}‎ ile etiketlenmişse, derleyici bu tür bir işlemi zaten bildirir.

Bir numaralandırma ‎{attribute 'flags'}‎ pragması tarafından bir bayrak olarak bildirilirse, ‎AND‎, ‎OR‎, ‎NOT‎ veya oder ‎XOR‎ işlemleri için bir hata verilmez.

Örnek

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: Operations on enumeration variables

Pragma {attribute 'flags'} ile örnek

{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