SA0058:列挙変数の操作
データ型列挙型の変数に対する操作を決定します。割り当てが許可されます。
理由: 列挙型は通常の整数値として使用すべきではありません。あるいは、エイリアス データ型を定義したり、サブレンジ型を使用したりすることもできます。
重要性:中
例外:属性を持つ列挙型の場合 {attribute 'strict'}
がマークされている場合、コンパイラはすでにそのような操作を報告しています。
プラグマによる列挙の場合 {attribute 'flags'}
フラグとして宣言されている AND
-、 OR
-、 NOT
- また XOR
-操作はエラーを返しませんでした。
例 68. 例
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: 列挙型変数の操作
例 69. プラグマ {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