Импорт данных параметра с условно скомпилированной длиной размерности

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

Для получения дополнительной информации о символьных размерностях смотрите Реализация вариантов измерения для размеров массивов в Сгенерированном коде.

Похожие темы