Используйте символьные размерности, чтобы симулировать различные наборы выбора размерности, не регенерируя код для каждого набора. Настройте свою модель с размерностями, которые вы задаете как символы в блоках и объектах данных. Эти символы распространяют в модели в процессе моделирования, и затем входят в сгенерированный код. Моделируя ограничения для символов в процессе моделирования (например, C=A+B
) выводятся как условные выражения препроцессора в любом model.h
или model
_
types.h
файл.
Можно непосредственно указать информацию размерности как символ или числовую константу для этих блоков и объектов данных:
Inport
Выходной порт
Спецификация сигнала
Память хранилища данных
Интерпретированная функция MATLAB
Simulink.Signal
Simulink.Parameter
Simulink.BusElement
AUTOSAR.Parameter
Память Хранилища данных и Интерпретированные блоки MATLAB function также поддерживают переменные сигналы размерности. Для этих блоков символьные размерности управляют максимальным позволенным размером.
Необходимо предоставить код инициализации для Simulink.Parameter
объекты, которые содержат символьные размерности. Чтобы препятствовать тому, чтобы сгенерированный код инициализировал эти параметры, вы должны также:
Сконфигурируйте параметры, чтобы использовать класс памяти с набором свойств осциллографа Данных к Imported
, такой как ImportedExtern
или ImportedExternPointer
встроенные классы памяти.
Сконфигурируйте параметры, чтобы использовать класс памяти с набором свойств инициализации Данных к None
.
Вы используете Simulink.Parameter
объекты указать информацию размерности как символы. Для получения дополнительной информации о размерностях сигнала смотрите, Определяют Размерности Сигнала.
Необходимо зафиксировать символьные значения размерности во время компиляции. Вы не можете разрешить символьную размерность к другой переменной и затем варьироваться она во время времени выполнения, потому что вы задаете поведение в процессе моделирования.
Примечание: функция вариантов размерности включена по умолчанию. Можно выключить эту функцию путем очистки Позволения символьного параметра спецификации размерности в диалоговом окне Configuration Parameters.
Задайте символьные размерности
Этот пример использует модель rtwdemo_dimension_variants
показать, как реализовать символьные размерности. Эта модель имеет четыре шаблона моделирования включающие векторы и матрицы.
Чтобы показать имена блока, на вкладке Debug, в информационном меню Overlays, очищают Скрывать Автоматический параметр Имен блока.
Откройте приложение Embedded Coder. Во вкладке C Code выберите Code Interface> Individual Element Code Mappings.
В редакторе Отображений Кода, на вкладке Parameters, нажимают кнопку Обновить. Семь Simulink.Parameter
объекты появляются. Четыре из этих объектов для определения символьных размерностей. Они Simulink.Parameter
объекты имеют имена A
B
C
, и D
. Заметьте, что эти параметры имеют класс памяти CompilerFlag
.
Использовать Simulink.Parameter
объект для спецификации размерности, это должно быть задано в базовом рабочем пространстве и иметь один из этих классов памяти:
Define
или ImportedDefine
с заданным заголовочным файлом
CompilerFlag
Пользовательский пользовательский класс памяти, который задает данные как макрос в заданном заголовочном файле
Для Simulink.Parameter
объекты с ImportedDefine
пользовательский класс памяти, обеспечьте заголовочный файл на пути MATLAB. Вставьте имя заголовочного файла в поле HeaderFile в диалоговом окне Simulink.Parameter.
Можно использовать выражения MATLAB, чтобы задать символьные размерности. Для списка поддерживаемых выражений MATLAB смотрите раздел Operators и Operands in Variant Condition Expressions in Introduction to Variant Controls.
Задайте символьные размерности для блоков и объектов данных
Нажмите Inport Block In2
. На Property Inspector, на вкладке Parameters, поле Port Dimensions содержит Simulink.Parameter
объект A
. Для Inport блоков вы задаете символьные размерности в поле Port Dimensions.
Кликните по Inport блоку In3
. Поле Port Dimensions содержит Simulink.Parameter
объект B
.
Кликните по блоку Constant. Параметр Постоянного значения имеет значение Data
. В редакторе Отображений Кода, на вкладке Parameters, нажимают Simulink.Parameter
объект Data
. На Property Inspector поле Dimension имеет вектор символов '[1,C]'
, который эквивалентен '[1,5]'
потому что C
имеет значение 5
. Поле Value содержит массив с 5
значения, который сопоставим с его размерностями. Размерности объекта данных должны быть сопоставимы со значением Simulink.Parameter
объект, который находится в поле Dimensions. Заметьте, что Data
имеет Класс памяти ImportedExtern
.
Откройте 1-D Lookup Table1
диалоговое окно параметров блоков. Табличное поле данных содержит Simulink.Parameter
, PT
. Поле Breakpoints 1 содержит Simulink.Parameter
, PB
.
В редакторе Отображений Кода нажмите 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]'
). Чтобы сохранить многомерную информацию, необходимо задать n-D выражение размерности с каждой размерностью, что вы хотите сохранить быть символом.
Сгенерируйте код для модели с вариантами размерности
Если вы проверили технические требования размерности посредством симуляции модели, сгенерируйте код для 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 12.358s
Просмотрите сгенерированный код. В 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
файл, символьные размерности участвуют в связанных вычислениях цикла, размере массивов и вычислениях смещения индекса и параметрированной служебной функции (например, блок 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]; 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 = look1_binlx(Data[ForEach_itr], PB, PT, (uint32_T) ((uint32_T)D - 1U)) + rtb_VectorConcatenate[ForEach_itr]; /* 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
toc
.
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.Parameter
объекты задать размерности, это может быть несовместимо с вариантами размерности. Вот два общих сценария:
Только подмножество блоков принимает символьные технические требования размерности. Если блок не совместим с символьными размерностями, он вызывает ошибку схемы обновления.
Simulink.Parameter
объекты, которые вы используете, чтобы задать символьные размерности или иметь символьные размерности, должны иметь один из классов памяти, описанных в этом примере. Если этим техническим требованиям не выполняют, процедура сборки для сбоев модели во время генерации кода.
Можно решить эти проблемы обратной совместимости путем выполнения следующего:
Выключите функцию вариантов размерности путем очистки параметра Allow symbolic dimension specification в диалоговом окне Configuration Parameters.
Обновите Simulink.Parameter
объекты, которые задают символьные размерности или имеют символьные технические требования размерности.
Обновите модель так, чтобы только поддерживаемые блоки имели символьные размерности или распространили символьные размерности.
Для списка поддерживаемых блоков смотрите Block Support Table. Чтобы получить доступ к информации в этой таблице, введите showblockdatatypetable
в командной строке MATLAB. Неподдерживаемые блоки (например, MATLAB Function) могут все еще работать в модели, содержащей символьные размерности, пока эти блоки непосредственно не взаимодействуют с символьными размерностями.
В следующих случаях поддерживаемые блоки не распространяют символьные размерности.
Для Assignment и блоков Selector, вы устанавливаете Block Parameters> параметр Index Option к Index vector (dialog)
. Для Selector и блоков Assignment, если вы задаете символьную размерность для параметра индекса, генератор кода не соблюдает символьную размерность в сгенерированном коде.
Для блока Product вы задаете значение 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
сигнал, который имеет символьные размерности.
Для блоков Lookup Table, на вкладке 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 в качестве языка действия
Физическое моделирование
Дискретно-событийная симуляция
Структурируйте данные
Функции 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 распространяет символьные размерности для целой структуры или матрицы, но не для части структуры или матрицы. Например, 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
) как значение параметра маски. Под маской сконфигурируйте параметры блоков, чтобы разыменовать целевое поле от параметра маски при помощи выражения, такого как myMaskParam.subStruct.gains
.
Используйте литеральные размерности вместо символьных размерностей для целевого поля (gains
).
Это ограничение также применяется, когда вы используете поле структуры или подмножество структур в массиве структур как значение аргумента модели в блоке Model.