Перечислимые данные являются данными, которые ограничиваются конечным множеством значений. Перечислимый тип данных является классом 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) для получения дополнительной информации.
Для получения дополнительной информации о суперклассах смотрите, Преобразуют в Значение Суперкласса. Для получения информации о том, как обработаны классы перечисления, когда существует больше чем одно имя для базового значения, смотрите, Как Исказить Имена Перечисления.
Об Индивидуальных настройках Перечисления 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, введите addpath
в командной строке MATLAB. Для получения дополнительной информации смотрите то, Что Путь поиска файлов MATLAB?, pathname
addpath
, и savepath
.
Вы не должны выполнять определение класса перечисления, чтобы использовать перечисление. Единственное требование, как обозначено в предыдущем маркере, то, что файл определения находится на пути поиска файлов MATLAB.
Можно изменить определение перечисления, редактируя и сохранив файл, который содержит определение. Вы не должны сообщать MATLAB, что определение класса изменилось. MATLAB автоматически читает модифицированное определение, когда вы сохранили файл. Однако изменения определения класса не вступают в полную силу, если какие-либо экземпляры класса (перечисляемые значения) существуют, которые отражают предыдущее определение класса. Такие экземпляры могут существовать в базовом рабочем пространстве или могут кэшироваться.
Следующая таблица объясняет опции для удаления экземпляров перечисления от базового рабочего пространства и кэша.
Если в базовом рабочем пространстве... | Если в кэше... |
---|---|
Выполнить одно из следующих действий:
|
|
Точно так же, если вы задали класс перечисления при помощи Simulink.defineIntEnumType
, можно переопределить тот класс, с помощью той же функции, даже если экземпляры существуют. Однако вы не можете изменить StorageType
для класса, в то время как экземпляры существуют.
Для получения дополнительной информации о применении изменений перечисления, смотрите Автоматические обновления для Модифицированных классов.
Если вам задали перечисления внешне к 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, можно использовать перечисление в моделях Stateflow® и Simulink. Информация, характерная для перечислений в 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, введите ClassName
.EnumName
в командном окне MATLAB. Экземпляр создается в базовом рабочем пространстве. Например, если BasicColors
задан, когда в Создают Класс Перечисления Simulink, можно ввести:
bcy = BasicColors.Yellow bcy = Yellow
Заполнение клавишей Tab работает на перечисления. Например, если вы входите:
bcy = BasicColors.<tab>
MATLAB отображает элементы и методы BasicColors
в алфавитном порядке:
Дважды кликните элемент или метод, чтобы вставить его в положении, где вы нажали <tab>
. Смотрите Предложения Кода и Завершения для получения дополнительной информации.
В MATLAB можно бросить непосредственно от целого числа до перечисляемого значения:
bcb = BasicColors(2) bcb = Blue
Можно также бросить от перечисляемого значения до его базового целого числа:
>> bci = int32(bcb) bci = 2
В любом случае MATLAB возвращает результат броска в 1x1 массив соответствующего типа данных.
Несмотря на то, что кастинг возможен, использование перечислимых величин не устойчиво в случаях, где перечислимые величины и целочисленные эквиваленты, заданные для класса перечисления, могут измениться.
Чтобы инстанцировать перечисления в модели 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
.
enumeration
| Simulink.data.getEnumTypeInfo
| Simulink.defineIntEnumType