exponenta event banner

Группировать аргументы нескольких моделей в единую структуру

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

Настройка ссылочной модели для использования аргументов модели, сгруппированных в структуру

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

Замена значений параметров структурами для ex_model_arg_ref и ex_model_argвыполните следующие действия.

Открытая модель ex_model_arg_ref. Эта модель представляет многократно используемый алгоритм.

open_system('ex_model_arg_ref')

Создайте структуру, содержащую одно поле для каждого из объектов параметров, существующих в ex_model_arg_ref рабочее пространство. Укажите значение для каждого поля.

structForInst1.gain = 3.17;
structForInst1.coeff = 1.05;

Сохранение структуры в Simulink.Parameter объект.

structForInst1Param = Simulink.Parameter(structForInst1);

Копировать Simulink.Parameter объект в ex_model_arg_ref рабочее пространство модели. В этом примере следует назвать копию объекта structArg.

modelWorkspace = get_param('ex_model_arg_ref','ModelWorkspace');
assignin(modelWorkspace,'structArg',copy(structForInst1Param));

Настроить structArg как единственный аргумент модели.

set_param('ex_model_arg_ref','ParameterArgumentNames','structArg')

В ex_model_arg_ref модель, задайте для параметра «Усиление» блока «Усиление» значение structArg.gain и задайте для параметра Numerator блока дискретного фильтра значение structArg.coeff.

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

Копировать существующую структуру как structForInst2Param.

structForInst2Param = copy(structForInst1Param);

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

structForInst1Param.Value.coeff = 0.98;
structForInst1Param.Value.gain = 2.98;
structForInst2Param.Value.coeff = 1.11;
structForInst2Param.Value.gain = 3.34;

Открытая модель ex_model_arg. Эта модель представляет системную модель, использующую несколько экземпляров многократно используемого алгоритма.

open_system('ex_model_arg')

Для экземпляра модели Model, установить structArg в structForInst1Param. Для экземпляра модели Model1, установить structArg в structForInst2Param.

instSpecParamsStruct = get_param('ex_model_arg/Model','InstanceParameters');
instSpecParamsStruct1 = get_param('ex_model_arg/Model1','InstanceParameters');

instSpecParamsStruct(1).Value = 'structForInst1Param';
instSpecParamsStruct1(1).Value = 'structForInst2Param';

set_param('ex_model_arg/Model','InstanceParameters',instSpecParamsStruct);
set_param('ex_model_arg/Model1','InstanceParameters',instSpecParamsStruct1);

Использование объекта шины в качестве типа данных структур

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

Чтобы задать тип данных структур для объектов шины, выполните следующие действия.

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

Simulink.Bus.createObject(structForInst1Param.Value);

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

myParamStructType = copy(slBus1);

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

structForInst1Param.DataType = 'Bus: myParamStructType';
structForInst2Param.DataType = 'Bus: myParamStructType';

Для structArg объект, установка DataType кому Bus: myParamStructType.

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

Связанные темы