Я использую Connected Components Workbench (CCW), и синтаксис оператора case, приведенного в документации, следующий:
CASE <integer_expression> OF
<value> : <statement1> ;
<statement2> ;
<statementsN>
<value> : <statements> ;
<value>, <value> : <statements>;
...
ELSE
<statements> ;
END_CASE;
Я бы не хотел использовать явные числа (литералы):
CASE STATE OF
STATE_A:
// Some code
STATE_B:
// Some code
ELSE
END_CASE;
Когда я использую переменные для меток case, я получаю ошибку компиляции:
Error 1 STATE_A:unexpected statement
Есть ли способ избежать явных чисел для разных случаев?
Один из вариантов - использовать вместо этого перечисления. Сначала вам нужно определить перечисление как тип. Это перечисление, в свою очередь, может быть любым примитивным типом данных, который вам нужен. Если вы добавите прагму «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
Тело:
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
Вы также можете удалить
{attribute 'qualified_only'}
из определения перечисления. Таким образом можно забыть префиксE_State
и использовать значенияA
,B
,C
.. вместоE_State.A
.