Один из вариантов - использовать перечисления. Сначала вам нужно определить перечисление как тип. Это перечисление может, в свою очередь, быть любым примитивным типом данных, который вы хотите. Если вы добавите прагму «qual_only», вы можете сделать код более элегантным. Например, вы определяете новый тип как:
{attribute 'qualified_only'}
TYPE E_State :
(
A := 0,
B := 1,
C := 2
) USINT;
END_TYPE
То, что вы в основном говорите здесь, это то, что это перечисление будет занимать 1 байт пространства (поскольку базовый тип - USINT), и что если вы хотите использовать перечисление, ему должно предшествовать имя перечисления (в данном случае «E_State»). Обратите внимание, что вам не нужно явно объявлять числа здесь. Если вы не пишете никаких чисел, компилятор автоматически предположит, что первое из них равно нулю, и добавит одно к каждому последующему. Так что это тоже будет работать:
{attribute 'qualified_only'}
TYPE E_State :
(
A,
B,
C
) USINT;
END_TYPE
Вам даже не нужно объявлять базовый тип. Если вы ничего не объявляете (поэтому не пишете USINT выше), компилятор автоматически предположит, что это INT.
Использование этого в коммутаторе в программе или функциональном блоке выглядело бы так:
PROGRAM MAIN
VAR
eState : E_State;
END_VAR
Body:
CASE eState OF
E_State.A :
// Do something A
E_State.B :
// Do something B
E_State.C :
// Do something C
ELSE
// Do something
END_CASE