Реализуйте варианты размерности для размеров массивов в сгенерированном коде

Варианты размерности

Используйте символьные размерности, чтобы моделировать различные наборы выбора размерности, не регенерируя код для каждого набора. Настройте свою модель с размерностями, которые вы задаете как символы в блоках и объектах данных. Эти символы распространяют в модели во время симуляции, и затем входят в сгенерированный код. Моделирование ограничений для символов во время симуляции (например, 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, чтобы показать, как реализовать символьные размерности. Эта модель имеет четыре шаблона моделирования включающие векторы и матрицы.

  1. Чтобы показать имена блока, в Меню отображения, отмена выбора Скрывает Автоматические Имена.

  2. Откройте Model Explorer. Выберите панель базового рабочего пространства.

  3. В базовом рабочем пространстве существует четыре объекта Simulink.Parameter для определения символьных размерностей. Эти объекты Simulink.Parameter имеют имена A, B, C и D.

  4. Выберите объект Simulink.Parameter A. Рассмотрите информацию в Simulink. Диалоговое окно Parameter. A имеет класс памяти CompilerFlag.

  5. Повторите, что Шаг 4 для каждого Simulink.Parameter возражает B, C и D.

  6. Для объектов 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).

Задайте символьные размерности для блоков и объектов данных

  1. Откройте диалоговое окно Source Block Parameters Блока Inport In2. Во вкладке Signal Attributes поле Port Dimensions содержит объект Simulink.Parameter A. Для блоков Inport вы задаете символьные размерности в поле Port Dimensions.

  2. Откройте диалоговое окно Source Block Parameters блока Inport In3. Во вкладке Signal Attributes поле Port Dimensions содержит объект Simulink.Parameter B.

  3. В базовом рабочем пространстве выберите объект 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.

  4. Откройте диалоговое окно Block Parameters блока 1-D Lookup Table1. Табличное поле данных содержит Simulink.Parameter, PT. Поле Breakpoints 1 содержит Simulink.Parameter, PB.

  5. В базовом рабочем пространстве просмотрите информацию в Simulink. Диалоговые окна параметра для PB и PT. Эти параметры содержат вектор символов '[1,D]' в их поле Dimensions и являются массивами, состоящими из 15 значений. Размерность D сопоставима с размерностью PB и параметров PT, потому что D имеет значение 15.

  6. Моделируйте модель. Simulink распространяет размерности символически в схеме. Во время распространения Simulink устанавливает ограничения моделирования среди символов. Simulink затем проверяет на непротиворечивость с этими ограничениями на основе текущих числовых присвоений. Одним ограничением моделирования для rtwdemo_dimension_variants является тот C=A+B. Диагностическое Средство просмотра производит предупреждение для любых нарушений ограничений.

  7. Измените спецификацию размерности на различную настройку и моделируйте модель снова.

Хотя не показанный в этом примере, можно задать 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.

  1. Откройте модель.

    rtwdemo_dimension_variants

  2. В командной строке осмотрите начальные значения Data и C. Значение Data является вектором целых чисел от 1 до C.

    Data.Value
    
    ans =
    
         1     2     3     4     5
    C.Value
    ans =
    
         5

  3. В синтаксисе кода MATLAB® значением Data является 1:C. Чтобы сохранить это отношение между объектами параметра, установите значение Data при помощи функции slexpr.

    Data.Value = slexpr('1:C');

  4. Чтобы предотвратить ошибки распространения типа данных, установите тип данных Data явным образом к double, который является типом данных, который получил параметр, прежде чем вы установите значение параметров на выражение.

    Data.DataType = 'double';

  5. Установите значение C к различному номеру, такому как 6. Из-за ограничений размерности в модели, необходимо установить значение другого символа размерности, A, к 3.

    C.Value = 6;
    A.Value = 3;

  6. Моделируйте модель. Блок-схема показывает, что значение 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.gainsmyMaskParam
    myStruct является структурой с полевой иерархией myStruct.subStruct.gains. Поле gains использует символьные размерности.myStruct.subStructmyMaskParam.gains
    myStructs является массивом структур. Каждая структура имеет поле gains, которое использует символьные размерности.myStructs(2)myMaskParam.gains

    В этих случаях вы не можете сгенерировать код из модели. Как обходное решение, выберите один из этих методов:

    • Используйте целую структуру (myStruct) или массив структур (myStructs) как значение параметра маски. Под маской сконфигурируйте параметры блоков, чтобы разыменовать целевое поле от параметра маски при помощи выражения, такого как myMaskParam.subStruct.gains.

    • Используйте литеральные размерности вместо символьных размерностей для целевого поля (gains).

    Это ограничение также применяется, когда вы используете поле структуры или подмножество структур в массиве структур как значение образцового аргумента в блоке Model.

Похожие темы