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

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

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

  1. Чтобы показать имена блока, на вкладке Debug, в информационном меню Overlays, очищают Скрывать Автоматический параметр Имен блока.

  2. Откройте приложение Embedded Coder. Во вкладке C Code выберите Code Interface> Individual Element Code Mappings.

  3. В редакторе Отображений Кода, на вкладке Parameters, нажимают кнопку Обновить. Семь Simulink.Parameter объекты появляются. Четыре из этих объектов для определения символьных размерностей. Они Simulink.Parameter объекты имеют имена ABC, и 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.

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

  1. Нажмите Inport Block In2. На Property Inspector, на вкладке Parameters, поле Port Dimensions содержит Simulink.Parameter объект A. Для блоков Inport вы задаете символьные размерности в поле Port Dimensions.

  2. Кликните по блоку Inport In3. Поле Port Dimensions содержит Simulink.Parameter объект B.

  3. Кликните по блоку Constant. Параметр Постоянного значения имеет значение Data. В редакторе Отображений Кода, на вкладке Parameters, нажимают Simulink.Parameter объект Data. На Property Inspector поле Dimension имеет вектор символов '[1,C]' , который эквивалентен '[1,5]' потому что C имеет значение 5. Поле Value содержит массив с 5 значения, который сопоставим с его размерностями. Размерности объекта данных должны быть сопоставимы со значением Simulink.Parameter объект, который находится в поле Dimensions. Заметьте, что Data имеет Класс памяти ImportedExtern.

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

  5. В редакторе Отображений Кода нажмите 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';
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 файл, символьные размерности участвуют в связанных вычислениях цикла, размере массивов и вычислениях смещения индекса и параметрированной служебной функции (например, блок 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 = 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.

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

    rtwdemo_dimension_variants

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

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

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

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

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

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

Похожие темы