Simulink — Обновление параметра структуры из обратного вызова инициализации

#matlab #simulink

Вопрос:

Я создал библиотечный блок Simulink для двигателя постоянного тока с «Маской» для настройки параметра двигателя. Механическая часть реализована с помощью Simscape в подблоке. Подблок также имеет маску с одним параметром для структуры, хранящей (сложную) конфигурацию simscape. Этот параметр добавляется в родительскую маску. Структура данных конфигурации Simscape находится в базовой рабочей области. Этот подход работает.

Теперь я попытался расширить библиотечный блок для конкретных моделей двигателей (например,ModelA, ModelB,…). Поэтому я реализовал в «обратном вызове инициализации блока» переключатель/случай. По одному футляру для каждой модели. В инструкции case конкретные данные загружаются из файла *.mat, и параметры блока обновляются следующим образом:

 cfg = load( 'modelA' );
set_param( blk, 'elec_R', num2str( cfg.elec.R ) );
set_param( blk, 'elec_L', num2str( cfg.elec.L ) );
 

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

 set_param( blk, 'mech_sims', 'cfg.sims' );
 

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

 Simulink.Evaluate( 'myDCMotorBlk' )
 

Ответ №1:

Что ж, я нашел решение. Я храню структуру simscape в блоках пользовательских данных:

 set_param( blk, 'UserData', cfg.sims );
 

Параметр mech_smi устанавливается следующим образом:

 set_param( blk, 'mech_smi', [ 'get_param(''' blk ''',''UserData'')' ] );
 

Поэтому во время оценки необходимые данные загружаются из параметра данных конкретного пользователя блока.