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

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

Для получения основной концептуальной информации о перечислениях в Simulink®, см. «Перечисления Simulink».

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

Задайте перечисления Simulink

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

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

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

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

Рабочий процесс для определения класса перечисления 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.

The 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 и связанный сгенерированный код используют значение по умолчанию перечисления для инициализации перечисленных данных с наземным значением, когда вы не предоставляете другого начального значения. Например, перечисленный сигнал внутри условно выполненной подсистемы, который еще не выполнен, имеет значение по умолчанию перечисления. Сгенерированный код использует значение по умолчанию перечисления, если безопасное приведение не удается, как описано в Type Casting for Enumerations (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), который определяет существующий код С.

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

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

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

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

Рассмотрим следующее определение класса перечисления - 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 используется перечисление, заданное выше:

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

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

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

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

Задайте перечисления как типы данных

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

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

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

Вы не можете задать минимальное или максимальное значение для сигнала, заданного как перечисление, потому что концепции минимум и максимум не относятся к цели перечислений. Если вы измените минимум или максимум для сигнала перечисления из значения по умолчанию []ошибка возникает при обновлении модели. Смотрите Перечисленные значения в Расчетах для получения дополнительной информации.

Получение информации о перечисленных типах данных

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

Получение информации о представителях перечисления

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

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

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

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

Получение информации о перечисляемом классе

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

  • Перечисление по умолчанию представитель

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

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

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

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

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

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

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

Хотя блок Enumerated Constant выводит True, оба On и True иметь то же базовое целое число, и On определяется сначала в определении класса enumeration раздел. Поэтому в Display блоке показаны On. Точно так же ось Scope будет показана только On, никогда True, независимо от того, какое из двух значений входа к блоку Scope.

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

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

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

Чтобы создать экземпляр перечисления в MATLAB, введите ClassName. EnumName в Командном Окне MATLAB. Образец создается в базовом рабочем пространстве. Для примера, если BasicColors определяется как в Create Simulink Enumeration Class, можно вводить:

bcy = BasicColors.Yellow

bcy = 

    Yellow

Заполнение клавишей Tab работает для перечислений. Для примера, если вы вводите:

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 как значение в диалоговом окне. Для примера рассмотрим следующую модель:

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

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

Можно использовать блок Constant для вывода перечисленных значений. Однако в этом блоке отображаются параметры, которые не применяются к перечисляемым типам, таким как Output Minimum и Output Maximum.

Если вы создаете Simulink.Parameter объект как перечисление, необходимо задать параметр Value как представитель перечисления и Data type с Enum: или? префикс, как объяснено в разделе «Задайте перечисления как типы данных».

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

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

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

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

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

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

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

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

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

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

Вы не можете использовать блок преобразования типа данных, чтобы привести числовой сигнал любого нецелочисленного типа данных к перечисляемому типу. Для пример модели, используемой в Simulate with Enumerations, потребовалось два блока Преобразования данных (Data Conversion), чтобы преобразовать синусоиду в перечисленные значения.

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

Перечисленные Параметры блоков

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

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

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

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

См. также

| |

Похожие темы