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

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

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

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

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

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

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

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

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

Рабочий процесс, чтобы задать класс перечисления Simulink

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

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

  • Задайте класс как подкласс Simulink.IntEnumType. Можно также основывать перечислимый тип на одном из этих встроенных целочисленных типов данных: int8uint8int16uint16, и 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) для получения дополнительной информации.

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

Настройте перечисление 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 команда.

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

  • Функции 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. Модели, которые соединены со словарем, могут использовать перечисление. Для получения дополнительной информации смотрите Перечисления в Словаре Данных.

Симулируйте с перечислениями

Рассмотрите следующее определение класса перечисления — 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, как показано в среднем графике. EnumConst блока Enumerated Constant выходные параметры Yellow, который появляется во втором графике как прямая линия. Блок Relational Operator сравнивает постоянный Yellow к каждому значению в цикле цветов. Это выходные параметры 1 TRUE) когда Yellow меньше текущего цвета и 0 ложь) в противном случае, как показано в третьем графике.

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

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

Если вы задаете перечисление, можно использовать его во многом как любой другой тип данных. Поскольку перечисление является классом, а не экземпляром, необходимо ли использовать префикс? или 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 отображает перечислимые величины по наименованию, не базовым целочисленным значением. Однако базовые целые числа могут влиять на отображение значения в блоках Floating Scope и 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 задан, когда в Создают Класс Перечисления Simulink, можно ввести:

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

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

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

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

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

Вы не можете задать целочисленное значение члена перечисления для параметра Value. Смотрите Перечисляемые значения в Расчете для получения дополнительной информации. Таким образом, следующие сбои даже при том, что целочисленное значение для 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.

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

| |

Похожие темы