Задайте специфичные для экземпляра значения параметров для допускающей повторное использование модели, на которую ссылаются,

Когда вы используете ссылку модели, чтобы повредить большую систему на компоненты, каждый компонент является отдельной моделью. Можно снова использовать компонент путем обращения к нему с блоками многоуровневой модели. Каждый блок Model является экземпляром компонента. Можно затем сконфигурировать параметры блоков (такие как параметр Gain блока Gain), чтобы использовать или то же значение или различное значение для каждого экземпляра компонента. Чтобы использовать различные значения, создайте и используйте образцовый аргумент, чтобы установить значение параметров блоков.

Когда вы генерируете код от иерархии модели, которая использует образцовые аргументы, аргументы появляются в коде, когда формальные параметры образцовой точки входа, на которую ссылаются, функционируют, такие как вывод (step) функция. Сгенерированный код затем передает специфичные для экземпляра значения параметров, которые вы задаете в каждом блоке Model к соответствующим вызовам функции.

Используете ли вы или не используете образцовые аргументы, можно использовать классы памяти, чтобы сконфигурировать параметры блоков, чтобы появиться в сгенерированном коде как настраиваемые глобальные переменные. Можно также использовать классы памяти, чтобы сгенерировать настраиваемые образцовые значения аргументов, которые сгенерированный код хранит в памяти и передает вызовам функции. Можно затем изменить значения во время выполнения.

Передайте данные о параметре образцовым функциям точки входа, на которые ссылаются, в качестве аргументов

Сконфигурируйте модель, на которую ссылаются, чтобы принять данные о параметре через формальные параметры сгенерированной образцовой функции точки входа. Этот метод позволяет вам задать различное значение параметров для каждого экземпляра (блок Model) модели, на которую ссылаются.

Сконфигурируйте модель, на которую ссылаются, чтобы использовать образцовые аргументы

Создайте модель ex_arg_code_ref. Эта модель представляет допускающий повторное использование алгоритм.

open_system('ex_arg_code_ref')

В модели выберите View> Model Data Editor.

В Model Data Editor, в таблице данных, используют столбец Data Type, чтобы установить тип данных блока Inport к single. Из-за наследования типа данных, другие сигналы в модели используют совпадающий тип данных.

Выберите вкладку Parameters.

В модели выберите блок Gain.

В Model Data Editor используйте столбец Value, чтобы установить значение параметра Gain к gainArg.

Рядом с gainArg кликните по кнопке действий и выберите Create.

В диалоговом окне Create New Data, набор Value к Simulink.Parameter и Location к Model Workspace. Нажмите Create.

В диалоговом окне свойства, набор Value к номеру, например, 3.17. Нажмите OK.

Используйте Model Data Editor, чтобы установить параметр Numerator при помощи объекта Simulink.Parameter под названием coeffArg, значением которого является 1.05. Как с gainArg, сохраните объект параметра в рабочем пространстве модели.

В Model Data Editor нажмите кнопку Show/refresh additional information.

Используйте поле Filter contents, чтобы найти каждый объект параметра (gainArg и coeffArg). Для каждого объекта установите флажок в столбце Argument.

Сохраните модель ex_arg_code_ref.

Также в командной строке, можно использовать эти команды, чтобы сконфигурировать блоки и объекты параметра:

set_param('ex_arg_code_ref/In1','OutDataTypeStr','single')

set_param('ex_arg_code_ref/Gain','Gain','gainArg')
modelWorkspace = get_param('ex_arg_code_ref','ModelWorkspace');
assignin(modelWorkspace,'gainArg',Simulink.Parameter(3.17));

set_param('ex_arg_code_ref/Discrete Filter','Numerator','coeffArg')
assignin(modelWorkspace,'coeffArg',Simulink.Parameter(1.05));

set_param('ex_arg_code_ref','ParameterArgumentNames','coeffArg,gainArg')

save_system('ex_arg_code_ref')

Задайте специфичные для экземпляра значения параметров в блоках Model

Создайте модель ex_arg_code_ref. Эта модель использует несколько экземпляров (блоки Model) допускающего повторное использование алгоритма.

open_system('ex_arg_code')

В модели откройте вкладку Model Data Editor Parameters (View> Model Data Editor). Model Data Editor показывает четыре строки, которые соответствуют образцовым аргументам, coeffArg и gainArg, который можно задать для этих двух блоков Model.

Используйте Model Data Editor, чтобы установить значения для образцовых аргументов. Например, используйте значения в фигуре.

Также в командной строке, можно использовать эти команды, чтобы установить значения:

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('coeffArg','0.98','gainArg','2.98'))

set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('coeffArg','1.11','gainArg','3.34'))

Сгенерируйте код от топ-модели.

rtwbuild('ex_arg_code')

Файл ex_arg_code_ref.c задает образцовую функцию точки входа, на которую ссылаются, ex_arg_code_ref. Функция имеет два формальных параметра, rtp_coeffArg и rtp_gainArg, которые соответствуют образцовым аргументам, coeffArg и gainArg. Формальные параметры используют тип данных real32_T, который соответствует типу данных single в Simulink®.

/* Output and update for referenced model:
   'ex_arg_code_ref' */
void ex_arg_code_ref(const real32_T *rtu_In1, 
                     real32_T *rty_Out1,
                     DW_ex_arg_code_ref_f_T *localDW, 
                     real32_T rtp_coeffArg,
                     real32_T rtp_gainArg)

Файл ex_arg_code.c содержит определение функции точки входа топ-модели ex_arg_code. Это вызовы функции, образцовая точка входа, на которую ссылаются, функционирует ex_arg_code_ref и использование образцовые значения аргументов, которые вы задали (такие как 1.11 и 3.34) как значения rtp_coeffArg и rtp_gainArg.

  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw), 0.98F, 2.98F);

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw), 1.11F, 3.34F);

Формальные параметры используют тип данных real32_T (single).

  • Параметры блоков в ex_arg_code_ref определяют свои типы данных через внутренние правила. Например, в диалоговом окне блока Gain, на вкладке Parameter Attributes, Parameter data type установлен в Inherit: Inherit via internal rule (значение по умолчанию). В этом случае внутреннее правило выбирает совпадающий тип данных в качестве сигналов ввода и вывода, single.

  • Образцовые аргументы в рабочем пространстве модели используют контекстно-зависимый ввод данных, потому что значение свойства DataType установлено к auto (значение по умолчанию). С этой установкой образцовые аргументы используют совпадающий тип данных в качестве параметров блоков, single.

  • Формальные параметры в сгенерированном коде используют совпадающий тип данных в качестве образцовых аргументов, single.

Сгенерируйте настраиваемые значения аргументов

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

В топ-модели ex_arg_code выберите вкладку Model Data Editor Parameters.

Используйте Model Data Editor, чтобы установить значения образцовых аргументов согласно этой фигуре.

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('coeffArg','coeffForInst1','gainArg','gainForInst1'))
set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('coeffArg','coeffForInst2','gainArg','gainForInst2'))

Просмотрите содержимое рабочего пространства модели ex_arg_code_ref в Model Explorer путем выбора View> Model Explorer> Model Explorer.

Скопируйте gainArg и coeffArg от рабочего пространства модели ex_arg_code_ref до базового рабочего пространства.

Переименуйте gainArg как gainForInst1. Переименуйте coeffArg как coeffForInst1.

gainForInst1 = getVariable(modelWorkspace,'gainArg');
gainForInst1 = copy(gainForInst1);
coeffForInst1 = getVariable(modelWorkspace,'coeffArg');
coeffForInst1 = copy(coeffForInst1);

Скопируйте gainForInst1 и coeffForInst1 как gainForInst2 и coeffForInst2.

gainForInst2 = copy(gainForInst1);
coeffForInst2 = copy(coeffForInst1);

Установите специфичные для экземпляра значения параметров при помощи свойства Value объектов параметра в базовом рабочем пространстве.

gainForInst1.Value = 2.98;
coeffForInst1.Value = 0.98;

gainForInst2.Value = 3.34;
coeffForInst2.Value = 1.11;

В Model Data Editor для топ-модели ex_arg_code нажмите кнопку Show/refresh additional information.

Установите Change view выпадающий список на Code.

Для новых объектов параметра, установленных значение в столбце Storage Class к ExportedGlobal. Эта установка заставляет объекты параметра появляться в сгенерированном коде как настраиваемые глобальные переменные.

gainForInst1.StorageClass = 'ExportedGlobal';
coeffForInst1.StorageClass = 'ExportedGlobal';
gainForInst2.StorageClass = 'ExportedGlobal';
coeffForInst2.StorageClass = 'ExportedGlobal';

Сгенерируйте код от топ-модели.

rtwbuild('ex_arg_code')

ex_arg_code.c файла задает глобальные переменные, которые соответствуют объектам параметра в базовом рабочем пространстве.

/* Exported block parameters */
real32_T coeffForInst1 = 0.98F;        /* Variable: coeffForInst1
                                        * Referenced by: '<Root>/Model'
                                        */
real32_T coeffForInst2 = 1.11F;        /* Variable: coeffForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */
real32_T gainForInst1 = 2.98F;         /* Variable: gainForInst1
                                        * Referenced by: '<Root>/Model'
                                        */
real32_T gainForInst2 = 3.34F;         /* Variable: gainForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */

В каждом вызове ex_arg_code_ref алгоритм топ-модели использует глобальные переменные, чтобы установить значения формальных параметров.

  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw), coeffForInst1,
                  gainForInst1);

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw), coeffForInst2,
                  gainForInst2);

Глобальные переменные в сгенерированном коде используют тип данных real32_T (single).

  • Объекты параметра в базовом рабочем пространстве используют контекстно-зависимый ввод данных, потому что свойство DataType установлено в auto (значение по умолчанию). С этой установкой объекты параметра в базовом рабочем пространстве используют совпадающий тип данных в качестве образцовых аргументов, single.

  • Глобальные переменные в сгенерированном коде используют совпадающий тип данных в качестве объектов параметра в базовом рабочем пространстве.

Аргументы многоуровневой модели группы в одну структуру

Используйте Model Explorer, чтобы скопировать gainArg и coeffArg от рабочего пространства модели ex_arg_code_ref в базовое рабочее пространство.

temp = getVariable(modelWorkspace,'gainArg');
gainArg = copy(temp);
temp = getVariable(modelWorkspace,'coeffArg');
coeffArg = copy(temp);

В командной строке объедините эти два объекта параметра в структуру, structArg.

structArg = Simulink.Parameter(struct('gain',gainArg.Value,...
    'coeff',coeffArg.Value));

Используйте Model Explorer, чтобы переместить structArg в рабочее пространство модели.

assignin(modelWorkspace,'structArg',copy(structArg));
clear structArg gainArg coeffArg

В панели Contents сконфигурируйте structArg в качестве единственного образцового аргумента.

set_param('ex_arg_code_ref','ParameterArgumentNames','structArg')

В модели ex_arg_code_ref выберите вкладку Model Data Editor Parameters.

Используйте Model Data Editor, чтобы установить значение параметра Gain к structArg.gain и значение параметра Numerator к structArg.coeff. Сохраните модель.

set_param('ex_arg_code_ref/Gain','Gain','structArg.gain')
set_param('ex_arg_code_ref/Discrete Filter',...
    'Numerator','structArg.coeff')

save_system('ex_arg_code_ref')

В командной строке объедините эти четыре объекта параметра в базовом рабочем пространстве в две структуры. Каждая структура хранит значения параметров для одного экземпляра ex_arg_code_ref.

structForInst1 = Simulink.Parameter(struct('gain',gainForInst1.Value,...
    'coeff',coeffForInst1.Value));

structForInst2 = Simulink.Parameter(struct('gain',gainForInst2.Value,...
    'coeff',coeffForInst2.Value));

В топ-модели ex_arg_code, набор Change view выпадающий список к Design. Используйте Model Data Editor, чтобы установить значения аргументов согласно этой фигуре.

set_param('ex_arg_code/Model','ParameterArgumentValues',...
    struct('structArg','structForInst1'))
set_param('ex_arg_code/Model1','ParameterArgumentValues',...
    struct('structArg','structForInst2'))

Нажмите кнопку Show/refresh additional information.

Для новых объектов параметра structForInst1 и structForInst2, используйте Model Data Editor, чтобы применить класс памяти ExportedGlobal.

structForInst1.StorageClass = 'ExportedGlobal';
structForInst2.StorageClass = 'ExportedGlobal';

В командной строке используйте функциональный Simulink.Bus.createObject, чтобы создать объект Simulink.Bus. Иерархия элементов в объекте совпадает с иерархией полей структуры. Именем по умолчанию объекта является slBus1.

Simulink.Bus.createObject(structForInst1.Value);

Переименуйте объект шины как myParamStructType путем копирования его.

myParamStructType = copy(slBus1);

В Model Data Editor для ex_arg_code, набор Change view к Design. Используйте столбец Data Type, чтобы установить тип данных structForInst1 и structForInst2 к Bus: myParamStructType.

structForInst1.DataType = 'Bus: myParamStructType';
structForInst2.DataType = 'Bus: myParamStructType';

В Model Data Editor для ex_arg_code_ref используйте Model Data Editor, чтобы установить тип данных structArg к Bus: myParamStructType.

temp = getVariable(modelWorkspace,'structArg');
temp = copy(temp);
temp.DataType = 'Bus: myParamStructType';
assignin(modelWorkspace,'structArg',copy(temp));

Сохраните модель ex_arg_code_ref.

save_system('ex_arg_code_ref')

Когда вы используете структуры, чтобы сгруппировать значения параметров, вы не можете использовать в своих интересах контекстно-зависимый ввод данных, чтобы управлять типами данных полей структур (например, полей structForInst1). Однако можно использовать свойства объекта шины управлять полевыми типами данных.

В командной строке, набор тип данных элементов в шине возражают против single. Соответствующие поля в структурах (таких как structForInst1 и structArg) используют совпадающий тип данных.

myParamStructType.Elements(1).DataType = 'single';
myParamStructType.Elements(2).DataType = 'single';

Сгенерируйте код от топ-модели ex_arg_code.

rtwbuild('ex_arg_code')

Файл ex_arg_code_types.h задает структуру, вводит myParamStructType, который соответствует объекту Simulink.Bus.

typedef struct {
  real32_T gain;
  real32_T coeff;
} myParamStructType;

В файле ex_arg_code_ref.c образцовая функция точки входа, на которую ссылаются, имеет формальный параметр, rtp_structArg, который соответствует образцовому аргументу structArg.

/* Output and update for referenced model: 
   'ex_arg_code_ref' */
void ex_arg_code_ref(const real32_T *rtu_In1, 
                     real32_T *rty_Out1,
                     DW_ex_arg_code_ref_f_T *localDW, 
                     const myParamStructType *rtp_structArg)

ex_arg_code.c файла задает глобальные переменные структуры, которые соответствуют объектам параметра в базовом рабочем пространстве.

/* Exported block parameters */
myParamStructType structForInst1 = {
  2.98F,
  0.98F
} ;                                    /* Variable: structForInst1
                                        * Referenced by: '<Root>/Model'
                                        */

myParamStructType structForInst2 = {
  3.34F,
  1.11F
} ;                                    /* Variable: structForInst2
                                        * Referenced by: '<Root>/Model1'
                                        */

Алгоритм топ-модели в файле ex_arg_code.c передает адреса переменных структуры к образцовой функции точки входа, на которую ссылаются.

  /* ModelReference: '<Root>/Model' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out1'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out1,
                  &(ex_arg_code_DW.Model_InstanceData.rtdw), &structForInst1);

  /* ModelReference: '<Root>/Model1' incorporates:
   *  Inport: '<Root>/In1'
   *  Outport: '<Root>/Out2'
   */
  ex_arg_code_ref(&ex_arg_code_U.In1, &ex_arg_code_Y.Out2,
                  &(ex_arg_code_DW.Model1_InstanceData.rtdw), &structForInst2);

Управляйте типами данных образцовых аргументов и значений аргументов

Когда вы используете образцовые аргументы, можно применить тип данных к:

  • Параметры блоков, которые используют аргументы (для определенных блоков, таких как те в библиотеке Discrete).

  • Аргументы в рабочем пространстве модели, на которое ссылаются.

  • Значения аргументов, которые вы задаете в блоках Model.

Чтобы сгенерировать эффективный код путем устранения ненужных преобразований типа и сдвигов C, рассмотрите использование наследованного и контекстно-зависимого ввода данных, чтобы совпадать с типами данных.

  • В рабочем пространстве модели используйте переменную MATLAB®, типом данных которой является double или объект параметра, свойство DataType которого установлено в auto. В этом случае переменная или объект используют совпадающий тип данных в качестве параметров блоков.

  • Когда вы устанавливаете значения аргументов в блоках Model, используете в своих интересах контекстно-зависимый ввод данных. Чтобы установить значение аргумента, используйте невведенное значение.

    • Литеральный номер, такой как 15.23. Не используйте введенное выражение, такое как single(15.23).

    • Переменная MATLAB, типом данных которой является double.

    • Объект Simulink.Parameter, свойство DataType которого установлено в auto.

    В этих случаях, номере, переменной или объекте использует совпадающий тип данных в качестве образцового аргумента в рабочем пространстве модели, на которое ссылаются. Если вы также конфигурируете образцовый аргумент, чтобы использовать контекстно-зависимый ввод данных, можно управлять типами данных параметров блоков, аргумента и значения аргумента путем определения типа только для параметров блоков.

Для основной информации об управлении типами данных параметров смотрите Типы данных параметров в Сгенерированном коде.

Используйте образцовый аргумент в контекстах различного типа данных

Если вы используете образцовый аргумент, чтобы установить несколько значений параметров блоков, и типы данных параметров блоков отличаются, вы не можете использовать контекстно-зависимый ввод данных (double или auto) для аргумента в рабочем пространстве модели. Необходимо явным образом задать тип данных для аргумента. Например, если аргумент в рабочем пространстве модели является объектом параметра (таким как Simulink.Parameter), установите свойство DataType на значение кроме auto. Для получения дополнительной информации об этой ситуации, смотрите Данные о Параметре Повторного использования в Контекстах Различного типа данных.

В этом случае можно продолжить использовать в своих интересах контекстно-зависимый ввод данных, чтобы управлять типом данных значений аргументов, которые вы задаете в блоках Model. Каждое значение аргумента использует тип данных, который вы задаете для соответствующего аргумента в рабочем пространстве модели.

Похожие темы