Повторно используйте данные параметра из внешнего кода в сгенерированном коде

В этом примере показано, как сгенерировать код, который импортирует значение параметров из вашего внешнего кода.

Создание файлов внешнего кода

Предположим, ваш внешний код определяет параметр вектора myGains с тремя элементами. Сохраните определение в текущей папке в файле с именем ex_vector_import_src.c.

#include "ex_vector_import_decs.h"

my_int8 myGains[3] = {
    2,
    4,
    6
}; 

Сохраните объявление в текущей папке в файле с именем ex_vector_import_decs.h.

#include "ex_vector_import_cust_types.h"

extern my_int8 myGains[3];  

Сохраните определение типов my_int8 в текущей папке в файле с именем ex_vector_import_cust_types.h.

typedef signed char my_int8;

Импорт Значения параметров для симуляции

В текущей папке щелкните правой кнопкой мыши файл ex_vector_import_src.c и выберите Импортировать данные.

В диалоговом окне Import установите значение Output Type равным Numeric Matrix.

Установите имя сгенерированного переменного MATLAB равным tempVar.

Выберите только значения параметров (2, 4, и 6) для импорта.

Импортировать данные можно нажав на зеленую галочку. Область Переменного MATLAB tempVar появляется в базовом рабочем пространстве.

Также используйте командную строку для создания tempVar.

tempVar = [2;4;6];

В командной строке создайте Simulink.Parameter объект, который представляет myGains.

myGains = Simulink.Parameter(tempVar);

Создайте и сконфигурируйте модель

Создайте модель ex_vector_import.

open_system('ex_vector_import')

Откройте приложение Embedded Coder.

На вкладке Моделирование (Modeling) щелкните Редактор данных модели (Model Data Editor).

В Model Data Editor смотрите вкладку Параметры.

Используйте столбец Value, чтобы задать значение параметра Gain в блоке Gain равным myGains.

Нажмите кнопку Показать/обновить дополнительные сведения. Таблица данных теперь содержит строку, которая представляет объект параметра, myGains.

Используйте столбец Data Type, чтобы задать тип данных myGains на my_int8.

Для другой строки (которая представляет параметр Gain блока Gain) установите Тип данных равным Inherit: Inherit from 'Gain'. При помощи этой настройки параметр Gain наследует тип данных my_int8 от myGains.

Установите выпадающий список Изменить представление на Code.

Установите эти свойства для myGains:

  • Класс памяти, к ImportFromFile

  • Заголовочный файл для ex_vector_import_decs.h

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

set_param('ex_vector_import/Gain','Gain','myGains',...
    'ParamDataTypeStr','Inherit: Inherit from ''Gain''')
myGains.DataType = 'my_int8';
myGains.CoderInfo.StorageClass = 'Custom';
myGains.CoderInfo.CustomStorageClass = 'ImportFromFile';
myGains.CoderInfo.CustomAttributes.HeaderFile = 'ex_vector_import_decs.h';

В командной строке создайте Simulink.AliasType объект для представления пользовательского типа данных my_int8. Установите DataScope и HeaderFile свойства для импорта определения типа из внешнего кода.

my_int8 = Simulink.AliasType('int8');
my_int8.DataScope = 'Imported';
my_int8.HeaderFile = 'ex_vector_import_cust_types.h';

Установите параметр конфигурации модели Исходные файлы в ex_vector_import_src.c.

set_param('ex_vector_import','CustomSource','ex_vector_import_src.c')

Сгенерируйте и смотрите код

Сгенерируйте код.

slbuild('ex_vector_import')
### Starting build procedure for: ex_vector_import
### Successful completion of build procedure for: ex_vector_import

Build Summary

Top model targets built:

Model             Action                       Rebuild Reason                                    
=================================================================================================
ex_vector_import  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 9.6498s

Сгенерированный файл ex_vector_import.h включает внешние заголовочные файлы ex_vector_import_decs.h и ex_vector_import_cust_types.h, которые содержат объявление переменной параметра (myGains) и пользовательское определение типа (my_int8).

file = fullfile('ex_vector_import_ert_rtw','ex_vector_import.h');
rtwdemodbtype(file,'#include "ex_vector_import_cust_types.h"',...
    '#include "ex_vector_import_cust_types.h"',1,1)
rtwdemodbtype(file,'/* Includes for objects with custom storage classes. */',...
    '#include "ex_vector_import_decs.h"',1,1)
#include "ex_vector_import_cust_types.h"

/* Includes for objects with custom storage classes. */
#include "ex_vector_import_decs.h"

Сгенерированный код в модели step функция в сгенерированном файле ex_vector_import.c использует myGains для расчетов.

file = fullfile('ex_vector_import_ert_rtw','ex_vector_import.c');
rtwdemodbtype(file,'/* Model step function */','/* Model initialize function */',1,0)
/* Model step function */
void ex_vector_import_step(void)
{
  /* Outport: '<Root>/Out1' incorporates:
   *  Gain: '<Root>/Gain'
   *  Inport: '<Root>/In1'
   */
  rtY.Out1[0] = (real_T)myGains[0] * rtU.In1;
  rtY.Out1[1] = (real_T)myGains[1] * rtU.In1;
  rtY.Out1[2] = (real_T)myGains[2] * rtU.In1;
}

Сгенерированный код не определяет (выделяет память для) или инициализирует глобальную переменную myGains поскольку возможности данных соответствующего объекта параметра импортированы.

Когда вы симулируете модель в Simulink, модель использует значение, сохраненное в Value свойство объекта параметра. Однако, если вы используете симуляцию режима external mode, внешний исполняемый файл начинает симуляцию с использованием значения из вашего кода. Смотрите факторы для других целей моделирования.

Похожие темы