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

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

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

Похожие темы