Используйте символьные размеры для моделирования различных наборов вариантов размеров без регенерации кода для каждого набора. Настройте модель с размерами, заданными как символы в блоках и объектах данных. Эти символы распространяются по всей модели во время моделирования, а затем переходят в созданный код. Ограничения моделирования для символов во время моделирования (например, C=A+B) выводятся как препроцессорные условия либо в model.h или model _types.h файл.
Для этих блоков и объектов данных можно непосредственно указать информацию о размерах в качестве символа или числовой константы:
Inport
Вспомогательный порт
Спецификация сигнала
Память хранилища данных
Интерпретированная функция MATLAB
Simulink.Signal
Simulink.Parameter
Simulink.BusElement
AUTOSAR.Parameter
Блоки памяти хранилища данных и интерпретированной функции MATLAB также поддерживают сигналы переменной размерности. Для этих блоков символические размеры определяют максимально допустимый размер.
Необходимо указать код инициализации для Simulink.Parameter объекты, содержащие символические размеры. Чтобы предотвратить инициализацию этих параметров сгенерированным кодом, необходимо выполнить одно из следующих действий:
Настройте параметры для использования класса хранения со свойством Data scope, имеющим значение Imported, такие как ImportedExtern или ImportedExternPointer встроенные классы хранения.
Настройте параметры для использования класса хранения со свойством инициализации данных, равным None.
Вы используете Simulink.Parameter для указания размерной информации в качестве символов. Дополнительные сведения о размерах сигнала см. в разделе Определение размеров сигнала.
Необходимо зафиксировать значения символьных размеров во время компиляции. Нельзя разрешить символьный размер в другую переменную, а затем изменять его во время выполнения, поскольку поведение определяется во время моделирования.
Примечание.Элемент вариантов размеров включен по умолчанию. Этот элемент можно отключить, сняв флажок Разрешить параметр спецификации символьных размеров (Allow symbolic dimension specification) в диалоговом окне Параметры конфигурации (Configuration Parameters).
Определение символьных размеров
В этом примере используется модель rtwdemo_dimension_variants показать, как реализовать символические размеры. Эта модель имеет четыре шаблона моделирования с использованием векторов и матриц.

Для отображения имен блоков на вкладке «Отладка» в меню «Информационные наложения» снимите флажок «Скрыть автоматические имена блоков».
Откройте приложение Embedded Coder. На вкладке C Code выберите Code Interface > Individual Element Code Mappings.
В редакторе сопоставлений кодов на вкладке «Параметры» нажмите кнопку обновления. Семь Simulink.Parameter появятся объекты. Четыре из этих объектов предназначены для задания символьных размеров. Они Simulink.Parameter объекты имеют имена A, B, C, и D. Обратите внимание, что эти параметры имеют класс хранения CompilerFlag.
Использование Simulink.Parameter объект для спецификации измерения должен быть определен в базовой рабочей области и иметь один из следующих классов хранения:
Define или ImportedDefine с указанным заголовочным файлом
CompilerFlag
Пользовательский пользовательский класс хранения, определяющий данные как макрос в указанном файле заголовка
Для Simulink.Parameter объекты с ImportedDefine пользовательский класс хранения, укажите файл заголовка по пути MATLAB. Вставьте имя файла заголовка в поле HeireFile диалогового окна Simulink.Parameter.
Для задания символьных размеров можно использовать выражения MATLAB. Список поддерживаемых выражений MATLAB см. в разделе Операторы и операнды в выражениях условий исполнения в разделе Введение в элементы управления исполнениями.
Задание символьных размеров для блоков и объектов данных
Щелкните Блок ввода (Inport Block) In2. В инспекторе свойств на вкладке «Параметры» поле «Размеры порта» содержит Simulink.Parameter объект A. Для блоков ввода в поле «Размеры порта» указываются символьные размеры.
Щелкните Блок ввода (Inport block) In3. Поле Port Dimensions содержит Simulink.Parameter объект B.
Щелкните на блоке «Константа». Параметр Constant value имеет значение Data. В редакторе «Сопоставления кодов» на вкладке «Параметры» нажмите кнопку Simulink.Parameter объект Data. В инспекторе свойств поле «Размер» имеет символьный вектор '[1,C]' , что эквивалентно '[1,5]' потому что C имеет значение 5. Поле Value содержит массив с 5 значения, которые согласуются с его размерами. Измерения объекта данных должны соответствовать значению Simulink.Parameter в поле «Размеры». Обратите внимание, что Data имеет класс Storage, равный ImportedExtern.
Откройте окно 1-D Lookup Table1 диалоговое окно параметров блока. Поле данных таблицы содержит Simulink.Parameter, PT. Поле Точки останова 1 содержит Simulink.Parameter, PB.
В редакторе сопоставлений кодов щелкните PB и PT и просмотрите их свойства. Эти параметры содержат символьный вектор '[1,D]' в поле «Размеры» и представляют собой массивы, состоящие из 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';
slbuild(model)### Starting build procedure for: rtwdemo_dimension_variants ### Successful completion of build procedure for: rtwdemo_dimension_variants Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================================== rtwdemo_dimension_variants Code generated and compiled Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 15.38s
Просмотр созданного кода. В 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 > 3' registered by: * '<S2>/Assignment' */ #if C <= 3 # error "The preprocessor definition 'C' must be greater than '3'" #endif #if (A+B) <= 3 # error "The preprocessor definition '(A+B)' must be greater than '3'" #endif #if (A-1) <= 0 # error "The preprocessor definition '(A-1)' must be greater than '0'" #endif #if (A+B-1) <= 2 # error "The preprocessor definition '(A+B-1)' must be greater than '2'" #endif #if (D-1) <= 0 # error "The preprocessor definition '(D-1)' must be greater than '0'" #endif #if A >= 11 # error "The preprocessor definition 'A' must be less than '11'" #endif #if B >= 11 # error "The preprocessor definition 'B' must be less than '11'" #endif /* Constraint 'D < 21' registered by: * '<Root>/1-D Lookup Table1' */ #if D >= 21 # error "The preprocessor definition 'D' must be less than '21'" #endif /* Constraint 'C < 11' registered by: * '<S2>/Assignment' */ #if C >= 11 # error "The preprocessor definition 'C' must be less than '11'" #endif #if (A+B) >= 21 # error "The preprocessor definition '(A+B)' must be less than '21'" #endif #if (A-1) >= 10 # error "The preprocessor definition '(A-1)' must be less than '10'" #endif #if (A+B-1) >= 10 # error "The preprocessor definition '(A+B-1)' must be less than '10'" #endif #if (D-1) >= 20 # error "The preprocessor definition '(D-1)' must be less than '20'" #endif
В rtwdemo_dimension_variants.c файл, символьные размеры участвуют в вычислениях границ цикла, вычислениях размера массива и смещения индекса, а также в вычислении параметризованной функции утилиты (например, блока «Таблица подстановки»).
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];
real_T rtb_VectorConcatenate_m;
int32_T ForEach_itr;
int32_T i;
int32_T s2_iter;
/* 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 generated from: '<S1>/Out1' 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' */
ForEach_itr = ((int32_T)A);
if (((int32_T)A) < 0) {
ForEach_itr = 0;
}
/* End of Constant: '<Root>/Constant1' */
for (s2_iter = 0; s2_iter < ForEach_itr; s2_iter++) {
/* Assignment: '<S2>/Assignment' incorporates:
* Constant: '<S2>/Constant'
* Outport: '<Root>/Out2'
* Product: '<S2>/Product'
* Selector: '<S2>/Selector'
*/
if (s2_iter == 0) {
for (i = 0; i <= (int32_T)((int32_T)(A + B) - 1); i++) {
rtY.Out2[i] = rtb_VectorConcatenate[i];
}
}
rtY.Out2[s2_iter] = rtb_VectorConcatenate[s2_iter] * 2.0;
/* End of Assignment: '<S2>/Assignment' */
}
/* 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 5C.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.Parameter объекты для задания размеров могут быть несовместимы с вариантами размеров. Ниже приведены два общих сценария:
Только подмножество блоков принимает спецификации символьных размеров. Если блок несовместим с символьными размерами, это приводит к ошибке схемы обновления.
Simulink.Parameter объекты, используемые для определения символьных размеров или имеющие символические размеры, должны иметь один из классов хранения, описанных в этом примере. Если эти спецификации не выполняются, процедура построения модели не выполняется во время создания кода.
Эти проблемы обратной совместимости можно решить, выполнив следующие действия.
Отключите элемент исполнения размеров, сняв флажок Разрешить параметр спецификации символьных размеров (Allow symbolic dimension specification) в диалоговом окне Параметры конфигурации (Configuration Parameters).
Обновление Simulink.Parameter объекты, определяющие символьные размеры или имеющие спецификации символьных размеров.
Обновите модель таким образом, чтобы только поддерживаемые блоки имели символические размеры или распространяли их.
Список поддерживаемых блоков см. в таблице поддержки блоков. Для доступа к информации в этой таблице введите showblockdatatypetable в командной строке MATLAB. Неподдерживаемые блоки (например, функция MATLAB) по-прежнему могут работать в модели, содержащей символьные размеры, если эти блоки непосредственно не взаимодействуют с символьными размерами.
В следующих случаях поддерживаемые блоки не распространяют символические размеры.
Для блоков назначения и выбора установите для параметра «Параметры блока» > «Параметр индекса» значение Index vector (dialog). Для блоков «Селектор» и «Назначение» при указании символьного размера для параметра «Индекс» генератор кода не учитывает символьный размер в создаваемом коде.
Для блока «Изделие» указывается значение 1 для параметра «Block Parameters > Number of inputs» (Параметры блока > Количество входных данных) задайте для параметра «Multiply over» значение Specified dimensions.
Для блока ForEvery задается символический размер параметра «Ширина секции».
Обратите внимание, что следующие шаблоны моделирования относятся к тем шаблонам моделирования, которые могут привести к ошибкам Simulink:
Для блоков Switch входной сигнал или параметр Threshold имеет символьные размеры, и вы выбираете Разрешить различные размеры ввода данных (Результаты в выходном сигнале переменного размера).
Блок чтения хранилища данных выбирает элементы Simulink.Bus сигнал, имеющий символические размеры.
Для блоков таблицы поиска на вкладке Параметры блока > Алгоритм выберите параметр Использовать один входной порт для всех входных данных.
Следующие продукты и программные возможности поддерживают варианты измерения в том смысле, что они действуют на числовое значение символьного измерения. Эти функции не поддерживают распространение символьных размеров во время моделирования модели и сохранение символьных размеров в создаваемом коде.
Замена кода для таблиц подстановки
Моделирование программного обеспечения в контуре (SIL) и процессора в контуре (PIL)
Режимы моделирования ускорителя и быстрого ускорителя
Наблюдение за объемом и моделированием (например, ведение журнала, SDI и т. д.)
Охват модели
Программа Simulink Design Verifier
Конструктор фиксированных точек
Словарь данных
Кодер Simulink PLC
Кодер HDL
Следующие варианты измерения не поддерживаются:
Системный объект
Диаграммы статусов, использующие MATLAB в качестве языка действий
Физическое моделирование
Моделирование дискретных событий
Данные кадра
Функции MATLAB
Следующие ограничения также применяются к моделям, в которых используются символические размеры.
Для моделирования размер символьного размера может равняться 1. Для создания кода размер символьного измерения должен быть больше 1.
Если символьное измерение является выражением MATLAB, которое содержит арифметическое выражение и реляционное или логическое выражение, необходимо добавить +0 после реляционной или логической части выражения MATLAB. Если вы не добавляете +0, ошибки модели во время моделирования, поскольку нельзя смешать boolean тип данных с целым числом или double типы данных. Добавление +0 преобразует тип данных реляционной или логической части выражения из boolean в double.
Например, предположим, что в диалоговом окне «Параметры блока ввода» параметр «Размеры порта» имеет выражение [(C==8)*D+E,3]. Для параметра Тип данных установлено значение double. С тех пор C==8 является реляционным выражением, необходимо изменить выражение на [((C==8)+0)*D+E,3] для предотвращения возникновения ошибки в модели во время моделирования.
Simulink распространяет символьные размеры для всей структуры или матрицы, но не для части структуры или матрицы. Например, Simulink.Parameter
P является 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) не поддерживает информацию о символьных размерах. Вместо этого используйте блок выбора.
Выражение MATLAB P(2,:) не является настраиваемым выражением, поэтому не поддерживает информацию о символьных измерениях.
Предположим, что задано значение параметра маски, 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) в качестве значения параметра маски. В разделе «Маска» настройте параметр block, чтобы отменить привязку целевого поля к параметру mask с помощью выражения, такого как myMaskParam.subStruct.gains.
Используйте литеральные размеры вместо символьных для целевого поля (gains).
Это ограничение также применяется при использовании поля структуры или подмножества структур в массиве структур в качестве значения аргумента модели в блоке модели.