Перечисляемые данные - это данные, которые ограничены конечным множеством значений. Перечисленный тип данных является 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
.
The enumeration
раздел задает три перечисленных значения.
Перечисленное значение | Перечисленное имя | Базовое целое число |
---|---|---|
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 и связанный сгенерированный код используют значение по умолчанию перечисления для инициализации перечисленных данных с наземным значением, когда вы не предоставляете другого начального значения. Например, перечисленный сигнал внутри условно выполненной подсистемы, который еще не выполнен, имеет значение по умолчанию перечисления. Сгенерированный код использует значение по умолчанию перечисления, если безопасное приведение не удается, как описано в Type Casting for Enumerations (Simulink Coder).
Если вы не задаете обратное, значение по умолчанию для перечисления является первым значением в определении класса перечисления. Чтобы задать другое значение по умолчанию, добавьте свое getDefaultValue
метод к methods
раздел. Следующий код показывает интерпретатор для getDefaultValue
метод:
function retVal = getDefaultValue() % GETDEFAULTVALUE Specifies the default enumeration member. % Return a valid member of this enumeration class to specify the default. % If you do not define this method, Simulink uses the first member. retVal = ThisClass.EnumName; end
Чтобы настроить этот метод, задайте значение для
который задает требуемое значение по умолчанию.ThisClass.EnumName
ThisClass
должно быть именем класса, в котором существует метод.
EnumName
должно быть именем перечисляемого значения, заданным в этом классе.
Для примера:
classdef BasicColors < Simulink.IntEnumType enumeration Red(0) Yellow(1) Blue(2) end methods (Static) function retVal = getDefaultValue() retVal = BasicColors.Blue; end end end
Этот пример определяет значение по умолчанию как BasicColors.Blue
. Если этот метод не отображается, значение по умолчанию будет BasicColors.Red
, поскольку это первое значение, перечисленное в определении перечисляемого класса.
Кажущаяся избыточной спецификация ThisClass
внутри определения этого же класса необходимо, потому что getDefaultValue
возвращает образец перечисляемого по умолчанию значения, а не только имя значения. Поэтому метод нуждается в полной спецификации того, что экземпляр. Дополнительные сведения см. в разделе Создание экземпляров перечислений.
Перечисление можно задать в файле MATLAB.
Имя файла определения должно точно совпадать с именем перечисления, включая регистр. Для примера - определение перечисления 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. Модели, которые связаны со словарем, могут использовать перечисление. Для получения дополнительной информации см. Перечисления в Data Dictionary.
Рассмотрим следующее определение класса перечисления - BasicColors
с перечисленными значениями Red
, Yellow
, и Blue
, с Blue
как значение по умолчанию:
classdef BasicColors < Simulink.IntEnumType enumeration Red(0) Yellow(1) Blue(2) end methods (Static) function retVal = getDefaultValue() retVal = BasicColors.Blue; end end end
Если это определение класса известно MATLAB, можно использовать перечисление в Simulink и Stateflow® модели. Информация, относящаяся к перечислениям в Stateflow, появляется в Перечисленных данных (Stateflow). В следующей модели Simulink используется перечисление, заданное выше:
Выход модели выглядит следующим образом:
Блок Data Type Conversion OrigToInt задает Выход тип данных int32
и Целочисленный режим округления: Floor
таким образом, блок преобразует выход Sine Wave блока, который появляется в верхнем графику отображения Scope, в цикл целых чисел: 1
, 2
, 1
, 0
, 1
, 2
, 1
. Data Type Conversion блока IntToColor использует эти значения для выбора цветов из перечисленного типа BasicColors
путем ссылки на их базовые целые числа.
Результатом является цикл цветов: Yellow
, Blue
, Yellow
, Red
, Yellow
, Blue
, Yellow
, как показано на среднем графике. Блок Enumerated Constant EnumConst выводит Yellow
, который появляется во втором графике как прямая линия. Блок Relational Operator сравнивает постоянную Yellow
к каждому значению в цикле цветов. Это выводит 1
(true
) когда Yellow
меньше текущего цвета, и 0
(false
) в противном случае, как показано на третьем графике.
Порядок сортировки, используемый при сравнении, является числовым порядком базовых целых чисел сравниваемых значений, а не лексическим порядком, в котором перечисленные значения появляются в определении перечисленного класса. В этом примере два порядков являются одинаковыми, но они не должны быть. Дополнительные сведения см. в разделе «Задайте перечисления как типы данных и перечисленные значения в Расчет».
Как только вы задаете перечисление, вы можете использовать его, как любой другой тип данных. Поскольку перечисление является классом, а не образцом, необходимо использовать префикс? или Enum:
при указании перечисления как типа данных. Необходимо использовать префикс ?
в Командном Окне MATLAB. Однако можно использовать любой префикс в модели Simulink. Enum:
имеет тот же эффект что и ?
префикс, но Enum:
является предпочтительным, поскольку он является более объяснительным в контексте графического интерфейса пользователя.
В зависимости от контекста вводите Enum:
далее следует имя перечисления или выберите Enum: <class name>
из меню (для примера, для Выхода данных введите параметры блоков) и замените <class name>
.
Чтобы использовать Data Type Assistant, установите в режиме значение Enumerated
, затем введите имя перечисления. Для примера в предыдущей модели Data Type Conversion блок IntToColor, который выводит сигнал типа BasicColors
, имеет следующую спецификацию выходного сигнала:
Вы не можете задать минимальное или максимальное значение для сигнала, заданного как перечисление, потому что концепции минимум и максимум не относятся к цели перечислений. Если вы измените минимум или максимум для сигнала перечисления из значения по умолчанию []
ошибка возникает при обновлении модели. Смотрите Перечисленные значения в Расчетах для получения дополнительной информации.
Функции enumeration
и Simulink.data.getEnumTypeInfo
возвращает информацию о перечисленных типах данных.
Используйте функцию enumeration
кому:
Верните массив, который содержит все значения перечисления для класса перечисления в Командном окне MATLAB
Получите значения перечисления программно
Предоставьте значения параметру блока Simulink, который принимает массив или вектор перечисленных значений, таких как параметр условия блока Switch Case
Используйте функцию Simulink.data.getEnumTypeInfo
для возврата информации о классе перечисления, например:
Перечисление по умолчанию представитель
Имя файла заголовка, который определяет тип сгенерированного кода
Тип данных, используемый в сгенерированном коде, для хранения целочисленных значений, лежащих в основе представителей перечисления
По возможности Simulink отображает значения перечисления по имени, а не по базовому целому значению. Однако базовые целые числа могут влиять на отображение значений в Scope и Floating Scope блоках.
Блокируйте... | Влияние на отображение значения... |
---|---|
Scope | При отображении перечисленного сигнала имена перечисленных значений появляются как метки на оси Y. Имена появляются в порядке, заданном их базовыми целыми числами с самым низким значением внизу. |
Floating Scope | При отображении сигналов, которые имеют одно и то же перечисление, имена появляются на оси Y, так же как для блока Scope. Если блок Floating Scope отображает смешанные типы данных, имена не появляются, и любые перечисленные значения представляются базовыми целыми числами. |
Более одного значения в перечислении может иметь то же базовое целое значение, как описано в разделе «Задайте перечисления как типы данных». Когда это происходит, значение на оси Scope блока или в Display блоке всегда является первым значением, перечисленным в определении перечисленного класса, которое имеет общее базовое целое число. Для примера:
Хотя блок Enumerated Constant выводит True
, оба On
и True
иметь то же базовое целое число, и On
определяется сначала в определении класса enumeration
раздел. Поэтому в Display блоке показаны On
. Точно так же ось Scope будет показана только On
, никогда True
, независимо от того, какое из двух значений входа к блоку Scope.
Прежде чем вы сможете использовать перечисление, необходимо создать его экземпляр. Можно создать экземпляр перечисления в MATLAB, в модели Simulink или на диаграмме Stateflow. Синтаксис одинаковый во всех контекстах.
Чтобы создать экземпляр перечисления в MATLAB, введите ClassName
. EnumName
в Командном Окне MATLAB. Образец создается в базовом рабочем пространстве. Для примера, если BasicColors
определяется как в Create Simulink Enumeration Class, можно вводить:
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
как значение в диалоговом окне. Для примера рассмотрим следующую модель:
Блок Enumerated Constant EnumConst, который выводит перечисленное значение Yellow
, определяет это значение следующим образом:
Можно ввести любое допустимое выражение MATLAB, которое вычисляет перечисленное значение, включая массивы и переменные рабочей области. Для примера можно ввести BasicColors(1)
, или если вы ранее выполнили bcy = BasicColors.Yellow
в Командном Окне MATLAB можно было ввести bcy
. В качестве другого примера можно ввести массив, такой как [BasicColors.Red, BasicColors.Yellow, BasicColors.Blue]
.
Можно использовать блок Constant для вывода перечисленных значений. Однако в этом блоке отображаются параметры, которые не применяются к перечисляемым типам, таким как Output Minimum и Output Maximum.
Если вы создаете Simulink.Parameter
объект как перечисление, необходимо задать параметр Value как представитель перечисления и Data type с Enum:
или? префикс, как объяснено в разделе «Задайте перечисления как типы данных».
Вы не можете задать целочисленное значение представителя перечисления для параметра Value. Смотрите Перечисленные значения в Расчетах для получения дополнительной информации. Таким образом, следующее прекращает работать, хотя целое значение для BasicColors.Yellow
является 1
.
Тот же синтаксис и факторы применяются в Stateflow. Дополнительные сведения см. в разделе Перечисленные данные (Stateflow).
По проекту Simulink препятствует использованию перечисленных значений в качестве числовых значений в математических расчетах, хотя перечисленный класс является подклассом MATLAB int32
класс. Таким образом, перечисленный тип не функционирует как числовой тип, несмотря на существование его базовых целых чисел. Для примера вы не можете ввести перечисленный сигнал непосредственно в блок Gain.
Можно использовать блок преобразования типа данных для преобразования в любом направлении между целым типом и перечисленным типом или между двумя перечисленными типами. То есть можно использовать блок Данных Type Conversion, чтобы преобразовать перечисленный сигнал в целочисленный сигнал (состоящий из базовых целых чисел перечисляемых значений сигналов) и ввести полученный целочисленный сигнал в блок Gain. Смотрите Приведение перечисленных сигналов для получения дополнительной информации.
Перечисленные типы в Simulink предназначены для представления состояний программы и управления логикой программы в блоках, таких как блок Relational Operator и блок Switch. Когда блок Simulink сравнивает перечисленные значения, сравниваемые значения должны быть того же перечисленного типа. Блок сравнивает перечисленные значения на основе их базовых целых чисел, а не их порядка в определении перечисленного класса.
Когда блок, такой как блок switch или блок Multiport Switch, выбирает среди нескольких сигналов данных, и любой сигнал данных имеет перечисленный тип, все сигналы данных должны быть того же перечисленного типа. Когда блок вводит сигналы управления и данные, как это делают Switch и Multiport Switch, тип сигнала управления не должен совпадать с типом сигнала данных.
Можно использовать блок преобразования типа данных, чтобы привести перечисленный сигнал к сигналу любого числового типа при условии, что базовые целые числа всех перечисленных значений, входящих в блок, находятся в области значений числового типа. В противном случае ошибка возникает во время симуляции.
Точно так же можно использовать блок преобразования типа данных, чтобы привести сигнал любого целого типа к перечисляемому сигналу при условии, что каждое значение, введенное в блок преобразования типа данных, является базовым целым числом некоторого значения в перечисляемом типе. В противном случае ошибка возникает во время симуляции.
Вы не можете использовать блок преобразования типа данных, чтобы привести числовой сигнал любого нецелочисленного типа данных к перечисляемому типу. Для пример модели, используемой в Simulate with Enumerations, потребовалось два блока Преобразования данных (Data Conversion), чтобы преобразовать синусоиду в перечисленные значения.
Первый блок отливает double
на int32
, и второй блок отливает int32
на BasicColors
. Вы не можете направить комплексный сигнал перечисляемому типу независимо от типов данных его действительной и мнимой частей.
Вы не можете привести параметры блоков любого типа числовых данных к перечисленному типу данных. Например, предположим, что блок Enumerated Constant задает Значение 2
и тип выходных данных Enum: BasicColors
:
Ошибка возникает из-за неявного приведения спецификаций к double
значение для перечисляемого типа. Ошибка возникает, хотя числовое значение арифметически соответствует одному из перечисленных значений в перечисленном типе.
Вы не можете привести параметры блоков перечисления к любому другому типу данных. Например, предположим, что блок Constant задает Постоянное значение BasicColors.Blue
и тип выходных данных int32
.
Ошибка возникает из-за того, что спецификации неявно приводят перечисленное значение к числовому типу. Ошибка возникает, хотя базовое целое число перечисленного значения является допустимым int32
.
enumeration
| Simulink.data.getEnumTypeInfo
| Simulink.defineIntEnumType