exponenta event banner

Создание кода для перечислений

Перечисления представляют фиксированный набор именованных значений. Перечисления помогают сделать код MATLAB ® и сгенерированный код C/C + + более читаемым. Например, сгенерированный код может проверять равенство с кодом, таким какif (x == Red) вместо использования strcmp. Для создания кода C/C + + необходимо наличие Coder™ Simulink ® .

При использовании перечислений в MATLAB Function блокировать, придерживаться следующих ограничений:

Определение перечислений для функциональных блоков MATLAB

Перечисления для функциональных блоков MATLAB можно определить двумя способами:

  • Для импорта внешнего перечисления используйте Simulink.defineIntEnumType функция. См. раздел Импорт перечислений, определенных внешне в MATLAB.

  • В файле определения класса определите перечисляемый тип. Например:

    classdef PrimaryColors < Simulink.IntEnumType
        enumeration
            Red(1),
            Blue(2),
            Yellow(4)
        end
    end

При определении перечисляемого типа в файле определения класса класс должен быть производным от одного из следующих базовых типов: Simulink.IntEnumType, int8, uint8, int16, uint16, или int32. Затем можно обмениваться перечисленными данными между функциональными блоками MATLAB и другими блоками Simulink в модели.

При использовании Simulink Coder для создания кода C/C + + можно использовать базовый тип класса перечисления для управления размером перечисляемого типа в сгенерированном коде C/C + +. Вы можете:

  • Представление перечисляемого типа в виде целого числа фиксированного размера, переносимого на другие целевые объекты.

  • Сократите использование памяти.

  • Интерфейс с устаревшим кодом.

  • Соответствие стандартам компании.

Базовый тип определяет представление перечисляемого типа в сгенерированном коде C/C + +.

Если базовый тип Simulink.IntEnumTypeгенератор кода создает тип перечисления C. Рассмотрим следующее определение перечисляемого типа MATLAB:

classdef LEDcolor < Simulink.IntEnumType
    enumeration
        GREEN(1),
        RED(2)
    end
end

Это определение перечисляемого типа приводит к следующему коду C:

typedef enum {
  GREEN = 1,                          
  RED
} LEDcolor;
Для встроенных целочисленных базовых типов генератор кода создает typedef оператор для перечисляемого типа и #define операторов для перечисленных значений. Рассмотрим следующее определение перечисляемого типа MATLAB:
classdef LEDcolor < int16
    enumeration
        GREEN(1),
        RED(2)
    end
 end
Это определение перечисляемого типа приводит к следующему коду C:
typedef int16_T LEDcolor;

#define GREEN                          ((LEDcolor)1)             
#define RED                            ((LEDcolor)2)

Чтобы настроить код, созданный для перечисляемого типа, см. раздел Настройка перечисления Simulink.

Разрешенные операции с перечислениями

Для создания кода доступны только операции с перечислениями, перечисленными в этой таблице.

ОперацияПримерПримечания

оператор назначения: =

xon = LEDcolor.GREEN
xoff = LEDcolor.RED

реляционные операторы: < > <= >= == ~=

xon == xoff

Создание кода не поддерживает использование == или ~= для проверки равенства между элементом перечисления и строковым массивом, символьным массивом или массивом ячеек символьных массивов.

операция литья

double(LEDcolor.RED)

преобразование в символьный массив или строку

y = char(LEDcolor.RED);
y1 = cast(LEDcolor.RED,'char');
y2 = string(LEDcolor.RED);

  • Можно преобразовать только скалярные перечисления времени компиляции. Например, этот код запускается в MATLAB, но приводит к ошибке при создании кода:

    y2 = string(repmat(LEDcolor.RED,1,2));
  • Генератор кода сохраняет имена перечислений, если входы преобразования являются константами. Например, рассмотрим следующее определение перечисляемого типа:

    classdef AnEnum < int32
        enumeration
            zero(0),
            two(2),
            otherTwo(2)
        end
    end

    Сгенерированный код создает "two" для

    y = string(AnEnum.two)
    и "otherTwo" для
    y = string(AnEnum.otherTwo)

операция индексирования

m = [1 2]
n = LEDcolor(m)
p = n(LEDcolor.GREEN)

операторы потока управления: if, switch, while

if state == sysMode.ON
    led = LEDcolor.GREEN;
else
    led = LEDcolor.RED;
end

Функции панели инструментов MATLAB, поддерживающие перечисления

Для создания кода можно использовать перечисления со следующими функциями панели инструментов MATLAB:

Связанные темы