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

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

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

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

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

На вкладке Modeling нажмите 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: 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.4516s

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

Похожие темы