Как избежать литералов в случае меток в CCW с использованием структурированного текста? - PullRequest
0 голосов
/ 01 мая 2018

Я использую 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 Ответ

0 голосов
/ 01 мая 2018

Один из вариантов - использовать перечисления. Сначала вам нужно определить перечисление как тип. Это перечисление может, в свою очередь, быть любым примитивным типом данных, который вы хотите. Если вы добавите прагму «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
...