Используйте перечислимые данные в моделях 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.

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

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

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

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

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

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

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

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

Для получения дополнительной информации о суперклассах смотрите, Преобразовывают в Значение Суперкласса (MATLAB). Для получения информации о том, как обработаны классы перечисления, когда существует больше чем одно имя для базового значения, смотрите, Как Исказить Имена Перечисления (MATLAB).

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

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

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

Статический методЦельЗначение по умолчанию, не реализовывая методПользовательское возвращаемое значениеКонтекст использования
getDefaultValueЗадает участника перечисления по умолчанию для класса.Первый участник задан в определении перечисленияВектор символа, содержащий имя участника перечисления в классе (см., Инстанцирует Перечислений),Моделирование и генерация кода
getDescriptionЗадает описание класса перечисления.''Вектор символа, содержащий описание типаГенерация кода
getHeaderFileЗадает имя заголовочного файла. Метод getDataScope определяет значение файла.''Вектор символа, содержащий имя заголовочного файла, который задает перечислимый типГенерация кода
getDataScopeЗадает, импортирует ли экспорт сгенерированного кода или определение перечислимого типа данных. Используйте метод getHeaderFile, чтобы задать сгенерированный или включенный заголовочный файл, который задает тип.'auto'Один из: 'Auto', 'Exported' или 'Imported'Генерация кода
addClassNameToEnumNamesЗадает, снабдить ли префиксом имя класса в сгенерированном коде.ложьtrue или 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 m. В противном случае MATLAB не найдет определение.

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

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

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

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

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

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

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

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

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

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

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

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

  • Функции clear и близкие модели, которые кэшируют экземпляры класса.

Для получения дополнительной информации о применении изменений перечисления, смотрите Автоматические обновления для Модифицированных классов (MATLAB).

Импортируйте перечисления, заданные внешне в 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 или Stateflow® в вашей модели использует перечислимый тип, сконфигурируйте образцовые параметры конфигурации, чтобы включать (#include) определение типа от вашего внешнего заголовочного файла. Смотрите Управление Импортированные Определения Шины и Перечисляемого типа (для блока MATLAB function) и Интегрируйте Пользовательский Код C/C++ для Моделирования (Stateflow) (для графика).

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

Задаете ли вы перечисление при помощи файла класса или при помощи функционального 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 использует перечисление, заданное выше:

Вывод модели выглядит так:

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

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

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

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

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

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

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

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

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

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

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

Используйте функциональный enumeration для:

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

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

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

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

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

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

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

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

Отображение перечислимой величины

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

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

Перечисляемые значения с групповыми Целыми числами

Больше чем одно значение в перечислении может иметь то же базовое целочисленное значение, как описано в Задают Перечисления как Типы данных. Когда это происходит, значение на оси блока Scope вывод, или в блоке Display вывод всегда является первым значением, перечисленным в перечислимом определении класса, которое имеет разделяемое базовое целое число. Например:

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

Инстанцируйте перечислений

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

Инстанцирование перечислений в MATLAB

Чтобы инстанцировать перечисления в MATLAB, введите ClassName.EnumName в Окно Команды MATLAB. Экземпляр создается в базовом рабочем пространстве. Например, если BasicColors задан, когда в Создают Класс Перечисления Simulink, можно ввести:

bcy = BasicColors.Yellow

bcy = 

    Yellow

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

bcy = BasicColors.<tab>

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

Дважды кликните элемент или метод, чтобы вставить его в положении, где вы нажали <tab>. Смотрите Предложения Кода и Завершения (MATLAB) для получения дополнительной информации.

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

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

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

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

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

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

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

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

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

Кастинг перечислимых сигналов

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

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

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

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

Кастинг перечислимых блочных параметров

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

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

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

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

Смотрите также

| |

Похожие темы

Была ли эта тема полезной?