Как избежать литералов в метках case в 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;

Когда я использую переменные для меток case, я получаю ошибку компиляции:

Ошибка 1 STATE_A: непредвиденная инструкция

Есть ли способ избежать явных чисел для разных случаев?


person Sparkler    schedule 01.05.2018    source источник


Ответы (1)


Один из вариантов — использовать вместо этого перечисления. Сначала вам нужно определить перечисление как тип. Это перечисление, в свою очередь, может быть любым примитивным типом данных, который вы хотите. Если вы добавите прагму «qualified_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
person Jakob    schedule 01.05.2018
comment
Вы также можете удалить определение перечисления {attribute 'qualified_only'}from. При этом префикс E_State можно забыть и можно использовать значения A, B, C.. вместо E_State.A. - person Quirzo; 02.05.2018