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

Откройте диалоговое окно блока Table1. Блок относится к переменным, T1Data и T1Break, в базовом рабочем пространстве. Эти переменные хранят интерполяционную таблицу и устанавливают точки останова данные о наборе с 11 элементами.
В командной строке преобразуйте переменные в Simulink.Parameter объекты.
T1Data = Simulink.Parameter(T1Data); T1Break = Simulink.Parameter(T1Break);
Сконфигурируйте объекты импортировать определения данных из вашего внешнего кода.
T1Data.CoderInfo.StorageClass = 'Custom'; T1Data.CoderInfo.CustomStorageClass = 'ImportFromFile'; T1Data.CoderInfo.CustomAttributes.HeaderFile = 'ex_vec_symdim_decs.h'; T1Break.CoderInfo.StorageClass = 'Custom'; T1Break.CoderInfo.CustomStorageClass = 'ImportFromFile'; T1Break.CoderInfo.CustomAttributes.HeaderFile = 'ex_vec_symdim_decs.h';
В командной строке создайте 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_basicsc','AllowSymbolicDim','on')
Установите Параметры конфигурации> Генерация кода> Пользовательский код> Дополнительная информация о сборке> Исходные файлы к ex_vec_symdim_src.c.
set_param('rtwdemo_basicsc','CustomSource','ex_vec_symdim_src.c')
Сгенерировать код с пользовательскими классами памяти, такими как ImportFromFile, необходимо использовать основанный на ERT системный конечный файл. Установите Параметры конфигурации> Генерация кода> Системный конечный файл к ert.tlc.
set_param('rtwdemo_basicsc','SystemTargetFile','ert.tlc')
Сгенерируйте код из модели.
rtwbuild('rtwdemo_basicsc')
### Starting build procedure for model: rtwdemo_basicsc ### Successful completion of build procedure for model: rtwdemo_basicsc
Алгоритм сгенерированного кода находится в модели step функция в сгенерированном файле rtwdemo_basicsc.c. Алгоритм передает T1Break, T1Data, и bpLen как значения аргументов к функции, которая выполняет поиск по таблице. В этом случае, bpLen управляет верхней границей двоичного поиска, который использует функция.
file = fullfile('rtwdemo_basicsc_ert_rtw','rtwdemo_basicsc.c'); rtwdemodbtype(file,'.X = look1_iflf_binlx','bpLen - 1U',1,1)
rtwdemo_basicsc_DW.X = look1_iflf_binlx(rtwdemo_basicsc_U.input2,
(&(T1Break[0])), (&(T1Data[0])), bpLen - 1U) * 2.0F;
Для получения дополнительной информации о символьных размерностях, смотрите Варианты Размерности Реализации для Размеров Массивов в Сгенерированном коде.