Как избежать литералов в случае меток в CCW с использованием структурированного текста?
Я использую 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;
Когда я использую переменные для меток, я получаю ошибку компиляции:
Ошибка 1 STATE_A: неожиданный оператор
Есть ли способ избежать явных чисел для разных случаев?
1 ответ
Один из вариантов - использовать перечисления. Сначала вам нужно определить перечисление как тип. Это перечисление может, в свою очередь, быть любым примитивным типом данных, который вы хотите. Если вы добавите прагму "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.
Использование этого в switch-case в программе или функциональном блоке сделало бы его похожим на это:
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