Перечислимые данные являются данными, которые ограничиваются конечным множеством значений. Перечислимый тип данных является классом MATLAB®, который задает набор перечисляемых значений. Каждое перечисляемое значение состоит из перечислимого имени и базового целого числа, которое программное обеспечение использует внутренне и в сгенерированном коде.
Дополнительные сведения о перечислениях в Simulink® см. в Перечислениях Simulink.
Для получения информации о генерации кода с перечислениями смотрите Использование Перечислимые Данные в Сгенерированном коде (Simulink Coder).
Чтобы задать перечислимый тип данных, который можно использовать в моделях Simulink, используйте один из этих методов:
Задайте класс перечисления с помощью блока classdef
в файле MATLAB.
Используйте функциональный Simulink.defineIntEnumType
. Вам не нужен файл скрипта, чтобы задать тип. Для получения дополнительной информации смотрите страницу ссылки на функцию.
Используйте функциональный Simulink.importExternalCTypes
, чтобы создать представление Simulink перечислимого типа данных (enum
), который задает ваш внешний код С.
Опционально, постоянно сохраните определение перечисления в словаре данных 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) | Red | 0 |
Yellow(1) | Yellow | 1 |
Blue(2) | Blue | 2 |
При определении класса перечисления для использования в окружении Simulink рассмотрите следующее:
Имя класса перечисления должно быть уникальным среди имен типов данных и имен переменных базового рабочего пространства, и является чувствительным к регистру.
Базовые целочисленные значения в разделе enumeration
не должны быть уникальными в классе и через типы.
Часто, базовые целые числа набора перечисляемых значений последовательны и монотонно увеличение, но они не должны быть или последовательными или упорядочены.
Для симуляции базовое целое число может быть любым значением int32
. Используйте функции MATLAB intmin
и intmax
, чтобы получить пределы.
Для генерации кода каждое базовое целочисленное значение должно быть представимым как целое число на целевом компьютере, который может наложить различные ограничения. Смотрите Конфигурируют Системный Конечный файл (Simulink Coder) для получения дополнительной информации.
Для получения дополнительной информации о суперклассах смотрите, Преобразовывают в Значение Суперкласса (MATLAB). Для получения информации о том, как обработаны классы перечисления, когда существует больше чем одно имя для базового значения, смотрите, Как Исказить Имена Перечисления (MATLAB).
Об Индивидуальных настройках Перечисления Simulink. Можно настроить перечисление Simulink путем реализации определенных статических методов в определении класса. Если вы задаете эти методы с помощью соответствующего синтаксиса, можно изменить поведение класса во время симуляции и в сгенерированном коде.
Таблица показывает методы, которые можно реализовать, чтобы настроить перечисление.
Статический метод | Цель | Значение по умолчанию, не реализовывая метод | Пользовательское возвращаемое значение | Контекст использования |
---|---|---|---|---|
getDefaultValue | Задает участника перечисления по умолчанию для класса. | Первый участник задан в определении перечисления | Вектор символов, содержащий имя участника перечисления в классе (см., Инстанцирует Перечислений), | Симуляция и генерация кода |
getDescription | Задает описание класса перечисления. | '' | Вектор символов, содержащий описание типа | Генерация кода |
getHeaderFile | Задает имя заголовочного файла. Метод getDataScope определяет значение файла. | '' | Вектор символов, содержащий имя заголовочного файла, который задает перечислимый тип | Генерация кода |
getDataScope | Задает, экспортирует ли сгенерированный код или импортирует определение перечислимого типа данных. Используйте метод getHeaderFile , чтобы задать сгенерированный или включенный заголовочный файл, который задает тип. | 'Auto' | Один из: 'Auto' , 'Exported' или 'Imported' | Генерация кода |
addClassNameToEnumNames | Задает, снабдить ли префиксом имя класса в сгенерированном коде. | false | 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.
Имя файла определения должно совпадать с именем перечисления точно, включая случай. Например, определение перечисления BasicColors
должно находиться в файле с именем BasicColors.m
. В противном случае MATLAB не найдет определение.
Необходимо задать каждое определение класса в отдельном файле.
Сохраните каждый файл определения на пути поиска файлов MATLAB. MATLAB ищет путь, чтобы найти определение при необходимости.
Чтобы добавить файл или папку к пути поиска файлов MATLAB, введите
в подсказке команды MATLAB. Для получения дополнительной информации смотрите то, Что Путь поиска файлов MATLAB? (MATLAB), addpath pathname
addpath
и savepath
.
Вы не должны выполнять определение класса перечисления, чтобы использовать перечисление. Единственное требование, как обозначено в предыдущем маркере, то, что файл определения находится на пути поиска файлов MATLAB.
Можно изменить определение перечисления, редактируя и сохранив файл, который содержит определение. Вы не должны сообщать MATLAB, что определение класса изменилось. 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) и доступ к Переменным Пользовательского кода и Функциям в диаграммах Stateflow (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, введите 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, можно ввести ClassName
.EnumName
как значение в диалоговом окне. Например, рассмотрите следующую модель:
Блок Enumerated Constant EnumConst, который выводит перечисляемое значение 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
.
Simulink.data.getEnumTypeInfo
| Simulink.defineIntEnumType
| enumeration