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