Используйте символьные размерности, чтобы моделировать различные наборы выбора размерности, не регенерируя код для каждого набора. Настройте свою модель с размерностями, которые вы задаете как символы в блоках и объектах данных. Эти символы распространяют в модели во время симуляции, и затем входят в сгенерированный код. Моделирование ограничений для символов во время симуляции (например, C=A+B
) выводится как условные выражения препроцессора или в model.h
или в файле
model
_
types.h
.
Можно непосредственно указать информацию размерности как символ или числовую константу для этих блоков и объектов данных:
Inport
Выходной порт
Спецификация сигнала
Память хранилища данных
Интерпретированная функция MATLAB
Simulink.Signal
Simulink.Parameter
Simulink.BusElement
AUTOSAR.Parameter
Память Хранилища данных и Интерпретированные блоки MATLAB function также поддерживают переменные сигналы размерности. Для этих блоков символьные размерности управляют максимальным позволенным размером.
Необходимо предоставить код для объектов Simulink.Parameter
, которые содержат символьные размерности. Можно предоставить этот код при помощи ImportedExtern
или ImportedExternPointer
встроенные классы памяти.
Вы используете объекты Simulink.Parameter
указать информацию размерности как символы. Для получения дополнительной информации о размерностях сигнала смотрите Размерности Сигнала (Simulink).
Необходимо зафиксировать символьные значения размерности во время компиляции. Вы не можете разрешить символьную размерность к другой переменной и затем отличаться она во время времени выполнения, потому что вы задаете поведение во время симуляции.
Примечание: функция вариантов размерности включена по умолчанию. Можно выключить эту функцию путем очистки Позволения символьной спецификации размерности (Simulink) параметра в диалоговом окне Configuration Parameters.
Задайте символьные размерности
Этот пример использует модель rtwdemo_dimension_variants
, чтобы показать, как реализовать символьные размерности. Эта модель имеет четыре шаблона моделирования включающие векторы и матрицы.
Чтобы показать имена блока, в Меню отображения, отмена выбора Скрывает Автоматические Имена.
Откройте Model Explorer. Выберите панель базового рабочего пространства.
В базовом рабочем пространстве существует четыре объекта Simulink.Parameter
для определения символьных размерностей. Эти объекты Simulink.Parameter
имеют имена A
, B
, C
и D
.
Выберите объект Simulink.Parameter
A
. Рассмотрите информацию в Simulink. Диалоговое окно Parameter. A
имеет класс памяти CompilerFlag
.
Повторите, что Шаг 4 для каждого Simulink.Parameter
возражает B
, C
и D
.
Для объектов Simulink.Parameter
с ImportedDefine
пользовательский класс памяти обеспечьте заголовочный файл на пути MATLAB. Вставьте имя заголовочного файла в поле HeaderFile в Simulink. Диалоговое окно Parameter.
Использовать Simulink. Объект параметра для спецификации размерности, это должно быть задано в базовом рабочем пространстве и иметь один из этих классов памяти:
Define
или ImportedDefine
с заданным заголовочным файлом
CompilerFlag
Пользовательский пользовательский класс памяти, который задает данные как макрос в заданном заголовочном файле
Можно использовать выражения MATLAB, чтобы задать символьные размерности. Для списка поддерживаемых выражений MATLAB смотрите раздел Operators и Operands in Variant Condition Expressions in Introduction to Variant Controls (Simulink).
Задайте символьные размерности для блоков и объектов данных
Откройте диалоговое окно Source Block Parameters Блока Inport In2
. Во вкладке Signal Attributes поле Port Dimensions содержит объект Simulink.Parameter
A
. Для блоков Inport вы задаете символьные размерности в поле Port Dimensions.
Откройте диалоговое окно Source Block Parameters блока Inport In3
. Во вкладке Signal Attributes поле Port Dimensions содержит объект Simulink.Parameter
B
.
В базовом рабочем пространстве выберите объект Simulink.Parameter
Data
. В Simulink. Диалоговое окно Parameter для Data
, поле Dimension имеет вектор символов '[1,C]'
, который эквивалентен '[1,5]'
, потому что C
имеет значение 5
. Поле Value содержит массив со значениями 5
, таким образом, размерности C
сопоставимы с размерностью объекта Data
. Размерности объекта Data
должны всегда быть сопоставимы со значением объекта Simulink.Parameter
, который находится в поле Dimensions объекта Data
. Data
имеет Класс памяти ImportedExtern
. Объект Simulink.Parameter
, который использует Simulink.Parameter
для символьной спецификации размерности, должен иметь класс памяти или ImportedExtern
или ImportedExternPointer
.
Откройте диалоговое окно Block Parameters блока 1-D Lookup Table1
. Табличное поле данных содержит Simulink.Parameter
, PT
. Поле Breakpoints 1 содержит Simulink.Parameter
, PB
.
В базовом рабочем пространстве просмотрите информацию в Simulink. Диалоговые окна параметра для PB
и PT
. Эти параметры содержат вектор символов '[1,D]'
в их поле Dimensions и являются массивами, состоящими из 15 значений. Размерность D
сопоставима с размерностью PB
и параметров PT
, потому что D
имеет значение 15
.
Моделируйте модель. Simulink распространяет размерности символически в схеме. Во время распространения Simulink устанавливает ограничения моделирования среди символов. Simulink затем проверяет на непротиворечивость с этими ограничениями на основе текущих числовых присвоений. Одним ограничением моделирования для rtwdemo_dimension_variants
является тот C=A+B
. Диагностическое Средство просмотра производит предупреждение для любых нарушений ограничений.
Измените спецификацию размерности на различную настройку и моделируйте модель снова.
Хотя не показанный в этом примере, можно задать n-D выражение размерности с одним или несколькими размерностей, являющихся символом (например, '[A,B,C]'
или '[1,A,3]'
).
Сгенерируйте код для модели с вариантами размерности
Если вы проверили спецификации размерности посредством симуляции модели, сгенерируйте код для rtwdemo_dimension_variants
.
Создайте временную папку для сборки и инспекционного процесса.
currentDir = pwd; [~,cgDir] = rtwdemodir();
Создайте модель.
model='rtwdemo_dimension_variants';
rtwbuild(model)
### Starting build procedure for model: rtwdemo_dimension_variants ### Successful completion of build procedure for model: rtwdemo_dimension_variants
Просмотрите сгенерированный код. В файле rtwdemo_dimension_variants.h
символьные размерности находятся в объявлениях данных.
hfile = fullfile(cgDir,'rtwdemo_dimension_variants_ert_rtw',... 'rtwdemo_dimension_variants.h'); rtwdemodbtype(hfile,'/* External inputs', '/* Real-time', 1, 0);
/* External inputs (root inport signals with default storage) */ typedef struct { real_T In2[A]; /* '<Root>/In2' */ real_T In3[B]; /* '<Root>/In3' */ } ExtU; /* External outputs (root outports fed by signals with default storage) */ typedef struct { real_T Out1[(A + B)]; /* '<Root>/Out1' */ real_T Out2[(A + B)]; /* '<Root>/Out2' */ } ExtY;
Файл rtwdemo_dimension_variants.h
содержит определения данных и условные выражения препроцессора, которые задают ограничения, установленные среди символов во время симуляции. Одно из этих ограничений - то, что значение символьной размерности должно быть больше, чем 1
. Этот файл также включает обеспеченный пользователями заголовочный файл для любых объектов Simulink.Parameter
с ImportedDefine
пользовательский класс памяти.
hfile = fullfile(cgDir,'rtwdemo_dimension_variants_ert_rtw',... 'rtwdemo_dimension_variants.h'); rtwdemodbtype(hfile,'#ifndef A', '/* Macros for accessing', 1, 0);
#ifndef A #error The variable for the parameter "A" is not defined #endif #ifndef B #error The variable for the parameter "B" is not defined #endif #ifndef C #error The variable for the parameter "C" is not defined #endif #ifndef D #error The variable for the parameter "D" is not defined #endif /* * Constraints for division operations in dimension variants */ #if (1 == 0) || (((A+B) % 1) != 0) # error "The preprocessor definition '1' must not be equal to zero and the division of '(A+B)' by '1' must not have a remainder." #endif /* * Registered constraints for dimension variants */ /* Constraint 'C == (A+B)' registered by: * '<Root>/1-D Lookup Table1' */ #if C != (A+B) # error "The preprocessor definition 'C' must be equal to '(A+B)'" #endif #if A <= 1 # error "The preprocessor definition 'A' must be greater than '1'" #endif #if B <= 1 # error "The preprocessor definition 'B' must be greater than '1'" #endif /* Constraint 'D > 1' registered by: * '<Root>/1-D Lookup Table1' */ #if D <= 1 # error "The preprocessor definition 'D' must be greater than '1'" #endif /* Constraint 'C > 1' registered by: * '<S2>/Assignment' */ #if C <= 1 # error "The preprocessor definition 'C' must be greater than '1'" #endif
В файле rtwdemo_dimension_variants.c
символьные размерности участвуют в связанных вычислениях цикла, размере массивов и индексных вычислениях смещения и параметризованной служебной функции (например, блок Lookup Table) вычисление.
cfile = fullfile(cgDir,'rtwdemo_dimension_variants_ert_rtw',... 'rtwdemo_dimension_variants.c'); rtwdemodbtype(cfile,'/* Model step', '/* Model initialize', 1, 0);
/* Model step function */ void rtwdemo_dimension_variants_step(void) { real_T rtb_VectorConcatenate[A + B]; int32_T s2_iter; int32_T ForEach_itr; real_T rtb_VectorConcatenate_m; /* Gain: '<Root>/Gain' incorporates: * Inport: '<Root>/In2' */ for (ForEach_itr = 0; ForEach_itr <= (int32_T)(A - 1); ForEach_itr++) { rtb_VectorConcatenate[ForEach_itr] = 2.0 * rtU.In2[ForEach_itr]; } /* End of Gain: '<Root>/Gain' */ /* Gain: '<Root>/Gain1' incorporates: * Inport: '<Root>/In3' */ for (ForEach_itr = 0; ForEach_itr <= (int32_T)(B - 1); ForEach_itr++) { rtb_VectorConcatenate[(int32_T)(A + ForEach_itr)] = 3.0 * rtU.In3[ForEach_itr]; } /* End of Gain: '<Root>/Gain1' */ /* Outputs for Iterator SubSystem: '<Root>/For Each Subsystem' incorporates: * ForEach: '<S1>/For Each' */ for (ForEach_itr = 0; ForEach_itr <= (int32_T)((int32_T)(A + B) - 1); ForEach_itr++) { /* Sum: '<Root>/Add' incorporates: * Constant: '<Root>/Constant' * Lookup_n-D: '<Root>/1-D Lookup Table1' */ rtb_VectorConcatenate_m = rtb_VectorConcatenate[ForEach_itr] + look1_binlx (Data[ForEach_itr], PB, PT, (uint32_T)((uint32_T)D - 1U)); /* ForEachSliceAssignment: '<S1>/ImpAsg_InsertedFor_Out1_at_inport_0' incorporates: * MATLAB Function: '<S1>/MATLAB Function' */ /* MATLAB Function 'For Each Subsystem/MATLAB Function': '<S3>:1' */ /* '<S3>:1:4' y = 2*u; */ rtY.Out1[ForEach_itr] = 2.0 * rtb_VectorConcatenate_m; /* Sum: '<Root>/Add' */ rtb_VectorConcatenate[ForEach_itr] = rtb_VectorConcatenate_m; } /* End of Outputs for SubSystem: '<Root>/For Each Subsystem' */ /* Outputs for Iterator SubSystem: '<Root>/For Iterator Subsystem' incorporates: * ForIterator: '<S2>/For Iterator' */ /* Constant: '<Root>/Constant1' */ for (s2_iter = 0; s2_iter < ((int32_T)A); s2_iter++) { /* Assignment: '<S2>/Assignment' incorporates: * Constant: '<S2>/Constant' * Outport: '<Root>/Out2' * Product: '<S2>/Product' * Selector: '<S2>/Selector' */ if (s2_iter == 0) { for (ForEach_itr = 0; ForEach_itr <= (int32_T)((int32_T)(A + B) - 1); ForEach_itr++) { rtY.Out2[ForEach_itr] = rtb_VectorConcatenate[ForEach_itr]; } } rtY.Out2[s2_iter] = rtb_VectorConcatenate[s2_iter] * 2.0; /* End of Assignment: '<S2>/Assignment' */ } /* End of Constant: '<Root>/Constant1' */ /* End of Outputs for SubSystem: '<Root>/For Iterator Subsystem' */ }
Закройте отчет генерации кода и модель.
bdclose(model) rtwdemoclean; cd(currentDir)
Когда вы задаете размерности параметра в модели при помощи символа, необходимо убедиться, что значение параметров сопоставимо со значением размерности. Чтобы моделировать различный выбор для значения размерности, необходимо вручную исправить значение параметров.
Например, в модели rtwdemo_dimension_variants
, объект Simulink.Parameter
Data
хранит векторное значение, [1 2 3 4 5]
, и использует символьную размерность C
с начальным значением 5
. Если вы изменяете значение C
, чтобы моделировать модель, необходимо убедиться, что число элементов в векторном значении совпадает с новым значением C
.
Чтобы уменьшать усилие по обслуживанию, когда вы изменяете значение C
, можно установить значение Data
к выражению, включающему C
.
Откройте модель.
rtwdemo_dimension_variants
В командной строке осмотрите начальные значения Data
и C
. Значение Data
является вектором целых чисел от 1
до C
.
Data.Value
ans = 1 2 3 4 5
C.Value
ans = 5
В синтаксисе кода MATLAB® значением Data
является 1:C
. Чтобы сохранить это отношение между объектами параметра, установите значение Data
при помощи функции slexpr
.
Data.Value = slexpr('1:C');
Чтобы предотвратить ошибки распространения типа данных, установите тип данных Data
явным образом к double
, который является типом данных, который получил параметр, прежде чем вы установите значение параметров на выражение.
Data.DataType = 'double';
Установите значение C
к различному номеру, такому как 6
. Из-за ограничений размерности в модели, необходимо установить значение другого символа размерности, A
, к 3
.
C.Value = 6; A.Value = 3;
Моделируйте модель. Блок-схема показывает, что значение Data
теперь имеет шесть элементов.
Для более сложных приложений можно записать собственную функцию MATLAB, которая возвращает значения параметров на основе символов размерности. Установите значение данных о параметре к выражению, которое вызывает вашу функцию.
Для получения общей информации об использовании выражения, чтобы установить значение объекта Simulink.Parameter
, смотрите Установленное Значение переменных при помощи Математического выражения (Simulink).
Когда вы создаете модель с символьными размерностями, знать о следующих факторах оптимизации:
Повторные использования генератора кода буферизуют, только если распространение размерности устанавливает эквивалентность среди буферов.
Два цикла со связанными вычислениями символьного цикла сплавлены вместе, только если они совместно используют эквивалентное символьное выражение.
Оптимизация не устраняет символьное выражение или проверку условия на основе текущего значения символьной размерности.
Если существующая модель использует объекты Simulink.Parameter
задать размерности, это может быть несовместимо с вариантами размерности. Вот два общих сценария:
Только подмножество блоков принимает символьные спецификации размерности. Если блок не совместим с символьными размерностями, он вызывает ошибку схемы обновления.
Simulink.Parameter
возражает, что вы используете, чтобы задать символьные размерности или иметь символьные размерности, должен иметь один из классов памяти, описанных в этом примере. Если этим спецификациям не соответствуют, процедура сборки для сбоев модели во время генерации кода.
Можно решить эти проблемы обратной совместимости путем выполнения следующего:
Выключите функцию вариантов размерности путем очистки параметра Allow symbolic dimension specification в диалоговом окне Configuration Parameters.
Обновите объекты Simulink.Parameter
, которые задают символьные размерности или имеют символьные спецификации размерности.
Обновите модель так, чтобы только поддерживаемые блоки имели символьные размерности или распространили символьные размерности.
Для списка поддерживаемых блоков см. Таблицу Поддержки Блока. Чтобы получить доступ к информации в этой таблице, введите showblockdatatypetable
в подсказке команды MATLAB. Неподдерживаемые блоки (например, функция MATLAB) могут все еще работать в модели, содержащей символьные размерности, пока эти блоки непосредственно не взаимодействуют с символьными размерностями.
В следующих случаях поддерживаемые блоки не распространяют символьные размерности.
Для блоков Unit Delay
вы задаете объект Simulink.Signal
, который имеет символьные размерности для Block Parameters> State Attributes> параметр State name.
Для Присвоения и Селекторных блоков, вы устанавливаете Block Parameters> параметр Index Option к Index vector (dialog)
. Для блоков Селектора и Присвоения, если вы задаете символьную размерность для Индексного параметра, генератор кода не соблюдает символьную размерность в сгенерированном коде.
Для блока Sum вы задаете |+
для Block Parameters> параметр List of signs, и вы устанавливаете Block Parameters> параметр Sum over к Specified dimension
.
Для блока продукта вы задаете значение 1
для Block Parameters> параметр Number of inputs, и вы устанавливаете параметр Multiply over на Specified dimensions
.
Для блока ForEach вы задаете символьную размерность для параметра Partition Width.
Обратите внимание на то, что следующие шаблоны моделирования среди тех, которые моделируют шаблоны, которые могут вызвать Simulink к ошибке:
Для блоков switch, входного сигнала или параметра Threshold имеет символьные размерности, и вы выбираете Allow different data input sizes (Results in variable-size output signal).
Блок Data Store Read выбирает элементы сигнала Simulink.Bus
, который имеет символьные размерности.
Для блоков Интерполяционной таблицы, на вкладке Block Parameters> Algorithm, вы выбираете параметр Use one input port for all input data.
Следующие продукты и программные возможности поддерживают варианты размерности в этом, они действуют на числовое значение символьной размерности. Эти функции не поддерживают распространение символьных размерностей во время симуляции модели и сохранения символьных размерностей в сгенерированном коде.
Замена кода для интерполяционных таблиц
Программное обеспечение в цикле (SIL) и Процессоре в цикле (PIL) симуляции
Акселератор и быстрые режимы симуляции акселератора
Осциллограф и наблюдение симуляции (например, журналирование, SDI, и так далее)
Покрытие модели
Simulink Design Verifier
Fixed-Point Designer
Словарь данных
Simulink PLC Coder
HDL Coder
Следующее не поддерживает варианты размерности:
Системный объект
Stateflow
Физическое моделирование
Дискретно-событийная симуляция
Структурируйте данные
Функции MATLAB
Следующие ограничения также применяются к моделям, которые используют символьные размерности.
Для симуляции размер символьной размерности может равняться 1. Для генерации кода размер символьной размерности должен быть больше, чем 1
.
Если символьная размерность является выражением MATLAB, которое содержит арифметическое выражение и или выражение отношения или логическое выражение, необходимо добавить +0
после реляционной или логической части выражения MATLAB. Если вы не добавляете +0
, образцовые ошибки во время симуляции, потому что вы не можете смешать тип данных boolean
с типы данных double
или целым числом. Добавление +0
преобразовывает тип данных реляционной или логической части выражения от boolean
до double
.
Например, предположите в диалоговом окне параметров блоков Inport, параметр Port dimensions имеет выражение [(C==8)*D+E,3]
. Параметр Data type устанавливается на double
. Поскольку C==8
является выражением отношения, необходимо изменить выражение на [((C==8)+0)*D+E,3]
, чтобы препятствовать тому, чтобы модель произвела ошибку во время симуляции.
Simulink распространяет символьные размерности для целой структуры или матрицы, но не для части структуры или матрицы. Например,
P
Simulink.Parameter
является матрицей 2x3
с символьными размерностями [Dim,Dim1]
.
p=Simulink.Parameter(struct('A',[1 2 3;4 5 6])) p.DataType='Bus:bo' bo=Simulink.Bus bo.Elements(1).Name='A' bo.Elements(1).Dimensions='[Dim,Dim1]' Dim=Simulink.Parameter(2) Dim1=Simulink.Parameter(3) p.CoderInfo.StorageClass='Custom' p.CoderInfo.CustomStorageClass='Define' Dim.CoderInfo.StorageClass='Custom' Dim.CoderInfo.CustomStorageClass='Define' Dim1.CoderInfo.StorageClass='Custom' Dim1.CoderInfo.CustomStorageClass='Define'
Если вы задаете p.A
для параметра размерностей, Simulink распространяет символьные размерности [Dim,Dim1]
. Если вы задаете p.A(1,:)
, Simulink распространяет числовую размерность 3
, но не символьная размерность, Dim1
.
Выражение MATLAB A(:)
не поддерживает символьную информацию о размерности. Используйте A
вместо этого.
Выражение MATLAB P(2:A)
не поддерживает символьную информацию о размерности. Используйте Селекторный блок вместо этого.
P(2,:)
выражения MATLAB не является настраиваемым выражением, таким образом, он не поддерживает символьную информацию о размерности.
Предположим, что вы устанавливаете значение параметра маски, myMaskParam
, при помощи поля структуры или при помощи подмножества структур в массиве структур. Вы храните структуру или массив структур в объекте Simulink.Parameter
так, чтобы можно было использовать объект Simulink.Bus
применить символьные размерности к полям структуры. Под маской вы конфигурируете параметры блоков, чтобы использовать одно из полей, которые имеют символьные размерности. Таблица показывает некоторые случаи в качестве примера.
Описание | Значение параметра маски (myMaskParam ) | Значение параметров блоков |
---|---|---|
myStruct является структурой с полем gains , которое использует символьные размерности. | myStruct.gains | myMaskParam |
myStruct является структурой с полевой иерархией myStruct.subStruct.gains . Поле gains использует символьные размерности. | myStruct.subStruct | myMaskParam.gains |
myStructs является массивом структур. Каждая структура имеет поле gains , которое использует символьные размерности. | myStructs(2) | myMaskParam.gains |
В этих случаях вы не можете сгенерировать код из модели. Как обходное решение, выберите один из этих методов:
Используйте целую структуру (myStruct
) или массив структур (myStructs
) как значение параметра маски. Под маской сконфигурируйте параметры блоков, чтобы разыменовать целевое поле от параметра маски при помощи выражения, такого как myMaskParam.subStruct.gains
.
Используйте литеральные размерности вместо символьных размерностей для целевого поля (gains
).
Это ограничение также применяется, когда вы используете поле структуры или подмножество структур в массиве структур как значение образцового аргумента в блоке Model.