Предположим, что ваш внешний код условно выделяет память для и инициализирует интерполяционную таблицу и данные о наборе точки останова на основе длины размерности, которую вы задаете как #define
макрос. В этом примере показано, как сгенерировать код, который импортирует эти внешние глобальные данные.
Сохраните определение данных о наборе точки останова T1Break
и данные об интерполяционной таблице T1Data
в вашей текущей папке в файле под названием ex_vec_symdim_src.c
. Эти глобальные переменные имеют или 9 или 11 элементов в зависимости от значения макро-bpLen
.
#include "ex_vec_symdim_decs.h" #if bpLen == 11 double T1Break[bpLen] = { -5.0, -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0, 5.0 } ; double T1Data[bpLen] = { -1.0, -0.99, -0.98, -0.96, -0.76, 0.0, 0.76, 0.96, 0.98, 0.99, 1.0 } ; #endif #if bpLen == 9 double T1Break[bpLen] = { -4.0, -3.0, -2.0, -1.0, 0.0, 1.0, 2.0, 3.0, 4.0 } ; double T1Data[bpLen] = { -0.99, -0.98, -0.96, -0.76, 0.0, 0.76, 0.96, 0.98, 0.99 } ; #endif
Сохраните объявления переменных и определение макроса в вашей текущей папке в файле ex_vec_symdim_decs.h
.
#define bpLen 11 extern double T1Break[bpLen]; extern double T1Data[bpLen];
Откройте модель rtwdemo_configinterface
в качестве примера.
open_system('rtwdemo_configinterface') set_param('rtwdemo_configinterface/Table1','DataSpecification','Table and breakpoints');
Откройте диалоговое окно блока Table1. Блок относится к переменным, T1Data
и T1Break
, в рабочем пространстве модели. Эти переменные хранят интерполяционную таблицу и устанавливают точки останова данные о наборе с 11 элементами.
В командной строке преобразуйте переменные в Simulink.Parameter
объекты.
mws = get_param('rtwdemo_configinterface','modelworkspace'); T1Data = mws.getVariable('T1Data'); T1Break = mws.getVariable('T1Break'); T1Data = Simulink.Parameter(T1Data); T1Break = Simulink.Parameter(T1Break);
В командной строке создайте Simulink.Parameter
объект представлять пользовательский макро-bpLen
.
bpLen = Simulink.Parameter(11); bpLen.Min = 9; bpLen.Max = 11; bpLen.DataType = 'int32'; bpLen.CoderInfo.StorageClass = 'Custom'; bpLen.CoderInfo.CustomStorageClass = 'ImportedDefine'; bpLen.CoderInfo.CustomAttributes.HeaderFile = 'ex_vec_symdim_decs.h';
Используйте bpLen
установить размерности интерполяционной таблицы и данных о наборе точки останова. Сконфигурируйте модель, чтобы включить символьные размерности путем выбора параметра конфигурации, Позволяют символьную спецификацию размерности.
T1Data.Dimensions = '[1 bpLen]'; T1Break.Dimensions = '[1 bpLen]'; set_param('rtwdemo_configinterface','AllowSymbolicDim','on');
Установите Параметры конфигурации> Генерация кода> Пользовательский код> Дополнительная информация о сборке> Исходные файлы к ex_vec_symdim_src.c
.
set_param('rtwdemo_configinterface','CustomSource','ex_vec_symdim_src.c')
Сконфигурируйте объекты импортировать определения данных из вашего внешнего кода.
mws.assignin('T1Data',T1Data); mws.assignin('T1Break',T1Break); cm = coder.mapping.utils.create('rtwdemo_configinterface'); setDataDefault(cm,'ModelParameters','StorageClass','Default'); setModelParameter(cm,'Table1','StorageClass','Model default'); setModelParameter(cm,'Table2','StorageClass','Model default'); setModelParameter(cm,'T1Data','StorageClass','ImportFromFile','HeaderFile','ex_vec_symdim_decs.h'); setModelParameter(cm,'T1Break','StorageClass','ImportFromFile','HeaderFile','ex_vec_symdim_decs.h');
Сгенерируйте код из модели.
Алгоритм сгенерированного кода находится в модели step
функция в сгенерированном файле rtwdemo_configinterface.c
. Алгоритм передает T1Break
, T1Data
, и bpLen
как значения аргументов к функции, которая выполняет поиск по таблице. В этом случае, bpLen
управляет верхней границей двоичного поиска, который использует функция.
Для получения дополнительной информации о символьных размерностях, смотрите Варианты Размерности Реализации для Размеров Массивов в Сгенерированном коде.