exponenta event banner

Использование перечисляемых данных в моделях Simulink

Перечисляемые данные - это данные, которые ограничены конечным набором значений. Перечисляемый тип данных - это класс MATLAB ®, который определяет набор перечисляемых значений. Каждое перечисляемое значение состоит из перечисляемого имени и базового целого числа, которое программное обеспечение использует внутри и в сгенерированном коде.

Основные концептуальные сведения о перечислениях в Simulink ® см. в разделе Перечисления Simulink.

Сведения о создании кода с перечислениями см. в разделе Использование перечисляемых данных в сгенерированном коде (Simulink Coder).

Определение перечислений Simulink

Чтобы определить перечисляемый тип данных, который можно использовать в моделях Simulink, используйте один из следующих методов.

  • Определение класса перечисления с помощью classdef блок в файле MATLAB.

  • Используйте функцию Simulink.defineIntEnumType. Для определения типа не требуется файл сценария. Дополнительные сведения см. на странице справки по функциям.

  • Используйте функцию Simulink.importExternalCTypes для создания представления Simulink перечисляемого типа данных (enum), который определяет внешний код C.

Рабочий процесс для определения класса перечисления Simulink

Создать класс перечисления Simulink

Чтобы создать класс перечисления Simulink, в определении класса:

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

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

Рассмотрим следующий пример:

classdef BasicColors < Simulink.IntEnumType
  enumeration
    Red(0)
    Yellow(1)
    Blue(2) 
  end
end 

Первая строка определяет целочисленное перечисление, производное от встроенного класса Simulink.IntEnumType. Перечисление основано на целых числах, поскольку IntEnumType является производным от int32.

enumeration раздел задает три перечисляемых значения.

Перечисляемое значениеПеречисляемое имяБазовое целое число
Red(0)Red0
Yellow(1)Yellow1
Blue(2)Blue2

При определении класса перечисления для использования в среде Simulink необходимо учитывать следующее:

  • Имя класса перечисления должно быть уникальным среди имен типов данных и имен переменных базовой рабочей области и учитывать регистр.

  • Базовые целочисленные значения в enumeration раздел не обязательно должен быть уникальным внутри класса и между типами.

  • Часто базовые целые числа набора перечисляемых значений являются последовательными и монотонно увеличивающимися, но они не обязательно должны быть последовательными или упорядоченными.

  • Для моделирования базовым целым числом может быть любое int32 значение. Использование функций MATLAB intmin и intmax чтобы получить лимиты.

  • Для генерации кода каждое нижележащее целое значение должно быть представлено как целое число на целевом оборудовании, которое может накладывать различные ограничения. Дополнительные сведения см. в разделе Настройка целевого системного файла (Simulink Coder).

Дополнительные сведения о суперклассах см. в разделе Преобразование в значение суперкласса. Сведения о том, как обрабатываются классы перечисления при наличии нескольких имен для базового значения, см. в разделе Как псевдонимировать имена перечислений.

Настройка перечисления Simulink

Сведения об адаптации перечисления Simulink.  Перечисление Simulink можно настроить путем реализации определенных статических методов в определении класса. При определении этих методов с использованием соответствующего синтаксиса можно изменить поведение класса во время моделирования и в сгенерированном коде.

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

Статический методЦельЗначение по умолчанию без внедрения методаНастраиваемое значение возвратаКонтекст использования
getDefaultValueЗадает элемент перечисления по умолчанию для класса.Первый элемент, указанный в определении перечисленияВектор символов, содержащий имя элемента перечисления в классе (см. раздел «» Экземпляры перечислений «»)Моделирование и создание кода
getDescriptionЗадает описание класса перечисления.''Символьный вектор, содержащий описание типаСоздание кода
getHeaderFileЗадает имя файла заголовка. Метод getDataScope определяет значимость файла.''Вектор символов, содержащий имя файла заголовка, определяющего перечисляемый типСоздание кода
getDataScopeУказывает, будет ли созданный код экспортировать или импортировать определение перечисляемого типа данных. Используйте метод getHeaderFile для указания созданного или включенного файла заголовка, определяющего тип.'Auto'Один из: 'Auto', 'Exported', или 'Imported'Создание кода
addClassNameToEnumNamesУказывает, следует ли префиксировать имя класса в сгенерированном коде.falsetrue или falseСоздание кода

Дополнительные примеры этих методов, применяемых при создании кода, см. в разделе Настройка перечисляемого типа данных (Simulink Coder).

Укажите перечисляемое значение по умолчанию.  Simulink и связанный сгенерированный код используют значение перечисления по умолчанию для инициализации перечисляемых данных в режиме «земля-значение» при отсутствии других начальных значений. Например, перечислимый сигнал внутри условно выполненной подсистемы, которая еще не выполнена, имеет значение по умолчанию перечисления. Сгенерированный код использует значение перечисления по умолчанию в случае сбоя безопасного приведения, как описано в разделе Приведение типа для перечислений (Simulink Coder).

Если не указано иное, значение по умолчанию для перечисления является первым значением в определении класса перечисления. Чтобы указать другое значение по умолчанию, добавьте собственное getDefaultValue метод к methods раздел. Следующий код показывает оболочку для getDefaultValue способ:

    function retVal = getDefaultValue()
      % GETDEFAULTVALUE Specifies the default enumeration member.
      % Return a valid member of this enumeration class to specify the default.
      % If you do not define this method, Simulink uses the first member.
      retVal = ThisClass.EnumName;
    end

Чтобы настроить этот метод, укажите значение для ThisClass.EnumName который определяет требуемое значение по умолчанию.

  • ThisClass должно быть именем класса, в котором существует метод.

  • EnumName должно быть именем перечисляемого значения, определенного в этом классе.

Например:

classdef BasicColors < Simulink.IntEnumType
  enumeration
    Red(0)
    Yellow(1)
    Blue(2) 
  end
  methods (Static)
    function retVal = getDefaultValue()
      retVal = BasicColors.Blue;
    end
  end
end 

В этом примере определяется значение по умолчанию как BasicColors.Blue. Если этот метод не отображается, значением по умолчанию будет BasicColors.Red, поскольку это первое значение, указанное в определении перечисляемого класса.

Кажущаяся избыточной спецификация ThisClass внутри определения того же класса, потому что getDefaultValue возвращает экземпляр перечисляемого значения по умолчанию, а не только имя значения. Таким образом, метод нуждается в полной спецификации для создания экземпляра. Дополнительные сведения см. в разделе Перечисления экземпляров.

Сохранение перечисления в файле MATLAB

Перечисление можно определить в файле MATLAB.

  • Имя файла определения должно точно соответствовать имени перечисления, включая регистр. Например, определение перечисления BasicColors должен находиться в файле с именем BasicColors.m. В противном случае MATLAB не найдет определение.

  • Необходимо определить каждое определение класса в отдельном файле.

  • Сохраните каждый файл определения в пути поиска MATLAB. MATLAB выполняет поиск пути для поиска определения при необходимости.

    Чтобы добавить файл или папку в путь поиска MATLAB, введите addpath pathname в командной строке MATLAB. Дополнительные сведения см. в разделе Что такое путь поиска MATLAB?, addpath, и savepath.

  • Для использования перечисления нет необходимости выполнять определение класса перечисления. Единственное требование, как указано в предыдущем маркере, состоит в том, чтобы файл определения находился в пути поиска MATLAB.

Изменить и перезагрузить классы перечисления

Определение перечисления можно изменить путем редактирования и сохранения файла, содержащего определение. Нет необходимости информировать MATLAB об изменении определения класса. При сохранении файла MATLAB автоматически считывает измененное определение. Однако изменения определения класса не вступают в полную силу, если существуют экземпляры класса (перечисляемые значения), которые отражают предыдущее определение класса. Такие экземпляры могут существовать в базовой рабочей области или кэшироваться.

В следующей таблице описаны параметры удаления экземпляров перечисления из базовой рабочей области и кэша.

Если в базовой рабочей области...Если в кэше...

Выполните одно из следующих действий:

  • Найдите и удалите определенные устаревшие экземпляры.

  • Удалить все из рабочей области с помощью clear команда.

  • Удалите устаревшие экземпляры, закрыв все модели, обновленные или смоделированные во время действия предыдущего определения класса.

  • Очистить функции и закрыть модели, которые кэшируют экземпляры класса.

Аналогично, если класс перечисления определен с помощью Simulink.defineIntEnumType, можно переопределить этот класс, используя ту же функцию, даже если экземпляры существуют. Однако вы не можете изменить StorageType для класса, пока существуют экземпляры.

Дополнительные сведения о применении изменений перечисления см. в разделе Автоматическое обновление измененных классов.

Импорт перечислений, определенных извне, в MATLAB

Если для MATLAB определены внешние перечисления, которые необходимо импортировать для использования в среде Simulink, это можно сделать программно с помощью вызовов одной из следующих функций:

  • Simulink.defineIntEnumType - определяет перечисление, которое можно использовать в MATLAB, как если бы оно было определено файлом определения класса. Помимо указания имени и значений класса перечисления, каждый вызов функции может указывать:

    • Символьный вектор, описывающий класс перечисления.

    • Какое из значений перечисления является значением по умолчанию.

    Для создания кода можно указать:

    • Файл заголовка, в котором перечисление определено для сгенерированного кода.

    • Применяет ли генератор кода имя класса в качестве префикса к членам перечисления - например, BasicColors_Red или Red.

    В качестве примера рассмотрим следующее определение класса:

    classdef BasicColors < Simulink.IntEnumType
    	enumeration
    		Red(0)
    		Yellow(1)
    		Blue(2)
    	end
    	methods (Static = true)
    		function retVal = getDescription()
    			retVal = 'Basic colors...';
    		end
    		function retVal = getDefaultValue()
    			retVal = BasicColors.Blue;
    		end
    		function retVal = getHeaderFile()
    			retVal = 'mybasiccolors.h'; 
    		end
    		function retVal = addClassNameToEnumNames()
    			retVal = true;
    		end
    	end
    end

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

    Simulink.defineIntEnumType('BasicColors', ... 
         {'Red', 'Yellow', 'Blue'}, [0;1;2],...
         'Description', 'Basic colors', ...
         'DefaultValue', 'Blue', ...
         'HeaderFile', 'mybasiccolors.h', ...
         'DataScope', 'Imported', ...
         'AddClassNameToEnumNames', true);
    
  • Simulink.importExternalCTypes - Создание представлений Simulink перечисляемых типов данных (enum), который определяет ваш существующий код C.

Если блок MATLAB Function в модели использует перечисляемый тип, настройте параметры конфигурации модели для включения (#include) определение типа из внешнего файла заголовка. См. раздел Управление определениями типов импортированных шин и перечислений.

Постоянное сохранение определения перечисляемого типа

Определяет ли перечисление с помощью файла класса или с помощью функции Simulink.defineIntEnumType, определение перечисления можно постоянно сохранить в словаре данных Simulink. Модели, связанные со словарем, могут использовать перечисление. Дополнительные сведения см. в разделе Перечисления в словаре данных.

Моделирование с перечислениями

Рассмотрим следующее определение класса перечисления - BasicColors с перечисляемыми значениями Red, Yellow, и Blue, с Blue в качестве значения по умолчанию:

classdef BasicColors < Simulink.IntEnumType
  enumeration
    Red(0)
    Yellow(1)
    Blue(2)
  end
  methods (Static)
    function retVal = getDefaultValue()
      retVal = BasicColors.Blue;
    end
  end
end

Как только это определение класса станет известно MATLAB, можно использовать перечисление в моделях Simulink и Stateflow ®. Сведения, относящиеся к перечислениям в файле Stateflow, отображаются в разделе Перечисляемые данные (Stateflow). Следующая модель Simulink использует перечисление, определенное выше:

Выходные данные модели выглядят следующим образом:

Блок преобразования типов данных OrigToInt определяет тип выходных данных int32 и Режим округления целых чисел: Floor, таким образом, блок преобразует вывод блока синусоидальной волны, который появляется на верхнем графике отображения Области, в цикл целых чисел: 1, 2, 1, 0, 1, 2, 1. Блок преобразования типов данных IntToColor использует эти значения для выбора цветов из перечисляемого типа BasicColors путем ссылки на их базовые целые числа.

Результатом является цикл цветов: Yellow, Blue, Yellow, Red, Yellow, Blue, Yellow, как показано на среднем графике. Вывод EnumConst блока перечисляемой константы Yellow, которая появляется на втором графике как прямая линия. Блок реляционного оператора сравнивает константу Yellow каждому значению в цикле цветов. Он выводит 1 (true) когда Yellow меньше текущего цвета, и 0 (false) в противном случае, как показано на третьем графике.

Порядок сортировки, используемый при сравнении, представляет собой числовой порядок базовых целых чисел сравниваемых значений, а не лексический порядок, в котором перечисляемые значения отображаются в определении перечисляемого класса. В этом примере два порядка одинаковы, но не обязательно. Дополнительные сведения см. в разделе Определение перечислений как типов данных и перечисляемых значений в вычислениях.

Указать перечисления как типы данных

После определения перечисления его можно использовать так же, как и любой другой тип данных. Поскольку перечисление является классом, а не экземпляром, необходимо использовать префикс? или Enum: при указании перечисления в качестве типа данных. Необходимо использовать префикс ? в окне команд MATLAB. Однако в модели Simulink можно использовать любой префикс. Enum: имеет тот же эффект, что и ? префикс, но Enum: является предпочтительным, поскольку он является более понятным в контексте графического интерфейса пользователя.

В зависимости от контекста, введите Enum: с последующим именем перечисления или выберите Enum: <class name> из меню (например, для параметра блока Тип выходных данных) и замените <class name>.

Для использования помощника по типам данных установите для параметра Mode значение Enumerated, затем введите имя перечисления. Например, в предыдущей модели блок преобразования типа данных IntToColor, который выдает сигнал типа BasicColors, имеет следующую спецификацию выходного сигнала:

Нельзя задать минимальное или максимальное значение для сигнала, определенного как перечисление, поскольку понятия минимума и максимума не соответствуют назначению перечислений. При изменении минимального или максимального значения для сигнала перечисления из значения по умолчанию []при обновлении модели возникает ошибка. Дополнительные сведения см. в разделе Перечисляемые значения в вычислениях.

Получение сведений о перечисленных типах данных

Функции enumeration и Simulink.data.getEnumTypeInfo возвращает сведения о перечисленных типах данных.

Получение сведений об элементах перечисления

Используйте функцию enumeration кому:

  • Возвращает массив, содержащий все значения перечисления для класса перечисления в окне команд MATLAB

  • Получение значений перечисления программным способом

  • Предоставьте значения параметру блока Simulink, который принимает массив или вектор перечисляемых значений, например параметр Case conditions блока Switch Case

Получение сведений о перечисляемом классе

Используйте функцию Simulink.data.getEnumTypeInfo для возврата информации о классе перечисления, например:

  • Элемент перечисления по умолчанию

  • Имя файла заголовка, определяющего тип создаваемого кода

  • Тип данных, используемый в созданном коде для хранения целых значений, лежащих в основе элементов перечисления

Отображение значения перечисления

Везде, где это возможно, Simulink отображает значения перечисления по имени, а не по базовому целочисленному значению. Однако базовые целые числа могут влиять на отображение значений в блоках Scope и Floating Scope.

Блок...Повлиять на отображение значений...
ОбъемПри отображении перечисляемого сигнала имена перечисляемых значений отображаются как метки на оси Y. Имена отображаются в порядке, заданном их базовыми целыми числами, с наименьшим значением внизу.
Плавающая областьПри отображении сигналов того же перечисления на оси Y появляются имена, как и для блока Scope. Если в блоке «Плавающая область» отображаются смешанные типы данных, имена не отображаются, а все перечисляемые значения представлены их базовыми целыми числами.

Перечисляемые значения с неуникальными целыми числами

Несколько значений в перечислении могут иметь одно и то же базовое целое значение, как описано в разделе Указание перечислений как типов данных. Когда это происходит, значение на оси вывода блока Scope или вывода блока Display всегда является первым значением, перечисленным в определении перечисляемого класса, которое имеет общее базовое целое число. Например:

Хотя блок «Перечисленная константа» выводит данные True, оба On и True имеют одно и то же базовое целое число, и On определяется первым в определении класса enumeration раздел. Поэтому в блоке «Дисплей» отображается On. Аналогично, ось Scope будет показывать только On, никогда Trueнезависимо от того, какое из двух значений вводится в блок Scope.

Экземпляры перечислений

Перед использованием перечисления необходимо создать его экземпляр. Можно создать экземпляр перечисления в MATLAB, в модели Simulink или в диаграмме Stateflow. Синтаксис одинаков во всех контекстах.

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

Для создания экземпляра перечисления в MATLAB введите ClassName.EnumName в окне команд MATLAB. Экземпляр создается в базовой рабочей области. Например, если BasicColors определяется как в «Создать класс перечисления Simulink», можно ввести:

bcy = BasicColors.Yellow

bcy = 

    Yellow

Заполнение табуляции работает для перечислений. Например, при вводе:

bcy = BasicColors.<tab>

MATLAB отображает элементы и методы BasicColors в алфавитном порядке:

Дважды щелкните элемент или метод, чтобы вставить его в том месте, где был нажат <tab>. Дополнительные сведения см. в разделе Предложения и дополнения кода.

Отсчет перечислений в MATLAB

В MATLAB можно привести к перечисленному значению непосредственно из целого числа:

bcb = BasicColors(2)

bcb = 

    Blue   

Можно также преобразовать перечисленное значение в нижележащее целое число:

>> bci = int32(bcb)

bci = 

    2   

В любом случае MATLAB возвращает результат приведения в массив 1x1 соответствующего типа данных.

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

Создание экземпляров перечислений в Simulink (или Stateflow)

Для создания экземпляра перечисления в модели Simulink можно ввести ClassName.EnumName в качестве значения в диалоговом окне. Например, рассмотрим следующую модель:

Блок перечисляемой константы EnumConst, который выводит перечисляемое значение Yellow, определяет это значение следующим образом:

Можно ввести любое допустимое выражение MATLAB, которое вычисляет перечисленное значение, включая массивы и переменные рабочей области. Например, можно ввести BasicColors(1), или если вы ранее выполнили bcy = BasicColors.Yellow в окне команд MATLAB можно ввести bcy. В качестве другого примера можно ввести массив, например: [BasicColors.Red, BasicColors.Yellow, BasicColors.Blue].

Для вывода перечисляемых значений можно использовать блок константы. Однако в этом блоке отображаются параметры, которые не применяются к перечисляемым типам, например «Минимум вывода» и «Максимум вывода».

При создании Simulink.Parameter в качестве перечисления необходимо указать параметр Value в качестве элемента перечисления и тип данных с помощью Enum: или? префикс, как описано в разделе Указание перечислений как типов данных.

Невозможно указать целое значение элемента перечисления для параметра Value. Дополнительные сведения см. в разделе Перечисляемые значения в вычислениях. Таким образом, следующее не удается, даже если целое значение для BasicColors.Yellow является 1.

Тот же синтаксис и соображения применимы и в Stateflow. Дополнительные сведения см. в разделе Перечисляемые данные (поток состояний).

Перечисляемые значения в вычислениях

По конструкции Simulink предотвращает использование перечисляемых значений в качестве числовых в математических вычислениях, даже если перечисляемый класс является подклассом MATLAB. int32 класс. Таким образом, перечисляемый тип не функционирует как числовой, несмотря на существование его базовых целых чисел. Например, невозможно ввести перечисленный сигнал непосредственно в блок усиления.

Блок преобразования типов данных можно использовать для преобразования в любом направлении между целым типом и перечисляемым типом или между двумя перечисляемыми типами. То есть можно использовать блок преобразования типа данных, чтобы преобразовать перечисленный сигнал в целочисленный сигнал (состоящий из базовых целых чисел значений перечисленного сигнала) и ввести результирующий целочисленный сигнал в блок усиления. Дополнительные сведения см. в разделе Приведение перечисляемых сигналов.

Перечислимые типы в Simulink предназначены для представления состояний программы и управления логикой программы в блоках, таких как блок реляционного оператора и блок коммутатора. Когда блок Simulink сравнивает перечисляемые значения, сравниваемые значения должны иметь один и тот же перечисляемый тип. Блок сравнивает перечисляемые значения на основе их базовых целых чисел, а не их порядка в определении перечисляемого класса.

Когда блок, такой как блок коммутатора или блок мультипортового коммутатора, выбирает из множества сигналов данных, и любой сигнал данных имеет перечисленный тип, все сигналы данных должны быть такого же перечисленного типа. Когда блок вводит как управляющие сигналы, так и сигналы данных, как это делают коммутатор и мультипортовый коммутатор, тип управляющего сигнала не обязательно должен соответствовать типу сигнала данных.

Приведение перечислимых сигналов

Блок преобразования типа данных можно использовать для приведения перечисляемого сигнала к сигналу любого числового типа при условии, что базовые целые числа всех перечисляемых значений, вводимых в блок, находятся в диапазоне числового типа. В противном случае во время моделирования возникает ошибка.

Аналогично, можно использовать блок преобразования типа данных для приведения сигнала любого целого типа к перечислимому сигналу при условии, что каждое значение, введенное в блок преобразования типа данных, является базовым целым числом некоторого значения в перечисляемом типе. В противном случае во время моделирования возникает ошибка.

Нельзя использовать блок преобразования типов данных для приведения числового сигнала любого нетегерного типа данных к перечислимому типу. Например, для модели, используемой в Simulate with Enumerations, требовалось два блока преобразования данных для преобразования синусоидальной волны в перечисляемые значения.

Первый блок отливок double кому int32, и второй блок отливает int32 кому BasicColors. Невозможно привести сложный сигнал к перечислимому типу независимо от типов данных его вещественной и мнимой частей.

Приведение параметров перечисляемого блока

Невозможно привести параметр блока любого числового типа данных к перечисляемому типу данных. Например, предположим, что блок Enumerated Constant задает значение 2 и тип выходных данных Enum: BasicColors:

Ошибка возникает, поскольку спецификации неявно приводят double значение для перечисляемого типа. Ошибка возникает, даже если числовое значение соответствует арифметически одному из перечисляемых значений в перечисляемом типе.

Невозможно привести параметр блока перечисления к какому-либо другому типу данных. Например, предположим, что блок Constant задает значение Constant, равное BasicColors.Blue и тип выходных данных int32.

Ошибка возникает, поскольку спецификации неявно приводят перечисленное значение к числовому типу. Ошибка возникает, даже если нижележащее целое число перечисляемого значения является допустимым int32.

См. также

| |

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