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

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

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

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

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

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

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

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

open_system('ex_arg_code_ref')

На вкладке Modeling нажмите 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 единственный).

  • Параметры блоков в 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. На вкладке Modeling нажмите 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 единственный).

  • Объекты параметра в базовом рабочем пространстве используют контекстно-зависимый ввод данных потому что 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. Каждое значение аргумента использует тип данных, который вы задаете для соответствующего аргумента в рабочем пространстве модели.

Похожие темы