Данные о параметре повторного использования из внешнего кода в сгенерированном коде

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

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

Предположим, что ваш внешний код задает векторный параметр 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 Data.

В диалоговом окне Import, набор Выходной Тип к 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')

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

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

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

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

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

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

Установите представление Change выпадающий список на 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')

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

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

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

Сгенерированный 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, внешний исполняемый файл начинает симуляцию при помощи значения из вашего кода. Смотрите Факторы для Других Целей Моделирования.

Похожие темы