Как избежать литералов в случае меток в 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
Другие вопросы по тегам