В этом примере показано, как сгенерировать код, который импортирует значение параметров из вашего внешнего кода.
Предположим, ваш внешний код определяет параметр вектора 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, внешний исполняемый файл начинает симуляцию с использованием значения из вашего кода. Смотрите факторы для других целей моделирования.