Можно сконфигурировать алгоритм для операций поиска по таблице и поисков по индексу, чтобы лучше удовлетворить требования кода приложения. Используйте вкладку Algorithm блоков интерполяционной таблицы. Например, можно задать интерполяцию, экстраполяцию и методы поиска по индексу.
Если код, сгенерированный для доступных опций алгоритма, не удовлетворяет требования для вашего приложения, создайте заменяющие записи таблицы пользовательского кода, чтобы заменить сгенерированный код алгоритма. Можно создать записи таблицы программно или в интерактивном режиме при помощи Заменяющего Инструмента Кода.
Для получения дополнительной информации об использовании блоков интерполяционной таблицы смотрите Нелинейность (Simulink).
Чтобы создать заменяющие записи таблицы кода для функции, соответствующей алгоритму интерполяционной таблицы, вы должны иметь:
Информация о концептуальной функциональной подписи.
Соответствующие параметры алгоритма.
Следующая таблица предоставляет концептуальную функциональную информацию о подписи.
Концептуальная функциональная подпись | Сводные данные аргумента |
---|---|
y1 = interp1D(u1, u2, u3, u4) | y1 вывод u1 – индексu2 – частьu3 Табличные данныеu4 – табличная длина размерности |
y1 = interp2D(u1, u2, u3, u4, u5, u6, u7) | y1 вывод u1, u3 – индексu2, u4 – частьu5 Табличные данныеu6, u7 – табличные длины размерности |
y1 = interp3D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10) | y1 вывод u1, u3, u5 – индексu2, u4, u6 – частьu7 Табличные данныеu8, u9, u10 – табличные длины размерности |
y1 = interp4D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13) | y1 вывод u1, u3, u5, u7 – индексu2, u4, u6, u8 – частьu9 Табличные данныеu10, u11, u12, u13 – табличные длины размерности |
y1 = interp5D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16) | y1 вывод u1, u3, u5, u7, u9 – индексu2, u4, u6, u8, u10 – частьu11 Табличные данныеu12, u13, u14, u15, u16 – табличные длины размерности |
y1 = interpND ({u | y1 вывод u , u индекс и дробная пара на размерность u Табличные данныеu – табличные длины размерности |
Явные значения | y1 вывод u1 входной параметрu2 – установите точки останова данныеu3 Табличные данныеu4 – табличная длина размерности |
Даже разрядка | y1 вывод u1 входной параметрu2 – первая точка данных о точке остановаu3 – интервал точек остановаu4 Табличные данныеu5 – табличная длина размерности |
Явные значения | y1 вывод u1, u2 входной параметрu3, u4 – установите точки останова данныеu5 Табличные данныеu6, u7 – табличные длины размерности |
Даже разрядка | y1 вывод u1, u2 входной параметрu3, u5 – первая точка данных о точке остановаu4, u6 – интервал точек остановаu7 Табличные данныеu8, u9 – табличные длины размерности |
Явный интервал | y1 вывод u1, u2, u3 входной параметрu4, u5, u6 – установите точки останова данныеu7 Табличные данныеu8, u9, u10 – табличные длины размерности |
Даже разрядка | y1 вывод u1, u2, u3 входной параметрu4, u6, u8 – первая точка данных о точке остановаu5, u7, u9 – интервал точек остановаu10 Табличные данныеu11, u12, u13 – табличные длины размерности |
Явные значения | y1 вывод u1, u2, u3, u4 входной параметрu5, u6, u7, u8 – установите точки останова данныеu9 Табличные данныеu10, u11, u12, u13 – табличные длины размерности |
Даже разрядка | y1 вывод u1, u2, u3, u4 входной параметрu5, u7, u9, u11 – первая точка данных о точке останова u6, u8, u10, u12 – интервал точек остановаu13 Табличные данныеu14, u15, u16, u17 – табличные длины размерности |
Явные значения | y1 вывод u1, u2, u3, u4, u5 входной параметрu6, u7, u8, u9, u10 – установите точки останова данныеu11 Табличные данныеu12, u13, u14, u15, u16 – табличные длины размерности |
Даже разрядка | y1 вывод u1, u2, u3, u4, u5 входной параметрu6, u8, u10, u12, u14 – первая точка данных о точке остановаu7, u9, u11, u13, u15 – интервал точек остановаu16 Табличные данныеu17, u18, u19, u20, u21 – табличные длины размерности |
Явные значения | y1 вывод u , введите на размерностьu , установите точки останова на размерностьu Табличные данныеu – табличные длины размерности |
Даже разрядка | y1 вывод u – введите на размерностьu – первая точка данных о точке останова на размерностьu – интервал точки останова на размерностьu Табличные данныеu – табличные длины размерности |
y1 = lookupND_Direct(u1, u2,...ui, ui+1) | y1 вывод u1...ui входной параметрui+1 Табличные данные |
Явные значения | y1 – индексy2 – частьu1 входной параметрu2 – установите точки останова данныеu3 – количество точек останова |
Равномерно распределенный | y1 – индексy2 – частьu1 входной параметрu2 – первая точка данных о точке остановаu3 – интервал точек остановаu4 – количество точек останова |
При определении записи таблицы программно, вы можете также должны быть изменить значения необходимых (первичных) и дополнительных параметров алгоритма.
Установите значения для обязательных параметров, чтобы достигнуть замены кода.
Если вы не устанавливаете значение для дополнительного параметра, программное обеспечение параметра алгоритма применяет don't care
. Заменяющее программное обеспечение кода игнорирует параметр при поиске соответствий.
Искать информацию о параметре алгоритма для функции интерполяционной таблицы:
Создайте запись таблицы для функции.
tableEntry = RTW.TflCFunctionEntry;
Идентифицируйте функцию интерполяционной таблицы в записи таблицы. Используйте Key
параметр записи таблицы в вызове setTflCFunctionEntryParameters
. Следующий пример идентифицирует запись для prelookup
функция.
setTflCFunctionEntryParameters(tableEntry, ... 'Key', 'prelookup', ... 'Priority', 100, ... 'ImplementationName', 'myPrelookup');
Установите параметр алгоритма для записи с вызовом getAlgorithmParameters
.
algParams = getAlgorithmParameters(tableEntry);
algParams = Prelookup with properties: ExtrapMethod: [1x1 coder.algorithm.parameter.ExtrapMethod] RndMeth: [1x1 coder.algorithm.parameter.RndMeth] IndexSearchMethod: [1x1 coder.algorithm.parameter.IndexSearchMethod] UseLastBreakpoint: [1x1 coder.algorithm.parameter.UseLastBreakpoint] RemoveProtectionInput: [1x1 coder.algorithm.parameter.RemoveProtectionInput]
Исследуйте информацию, доступную для каждого параметра.
algParams.ExtrapMethod
ans = ExtrapMethod with properties: Name: 'ExtrapMethod' Options: {'Linear' 'Clip'} Primary: 1 Value: {'Linear'}
algParams.RndMeth
ans = RndMeth with properties: Name: 'RndMeth' Options: {1x7 cell} Primary: 0 Value: {1x7 cell}
algParams.RndMeth.Value
ans = Columns 1 through 6 'Ceiling' 'Convergent' 'Floor' 'Nearest' 'Round' 'Simplest' Column 7 'Zero'
algParams.IndexSearchMethod
ans = IndexSearchMethod with properties: Name: 'IndexSearchMethod' Options: {'Linear search' 'Binary search' 'Evenly spaced points'} Primary: 0 Value: {'Binary search' 'Evenly spaced points' 'Linear search'}
algParams.UseLastBreakpoint
ans = UseLastBreakpoint with properties: Name: 'UseLastBreakpoint' Options: {'off' 'on'} Primary: 0 Value: {'off' 'on'}
algParams.RemoveProtectionInput
ans = RemoveProtectionInput with properties: Name: 'RemoveProtectionInput' Options: {'off' 'on'} Primary: 0 Value: {'off' 'on'}
В этом примере показано, как задать заменяющую запись таблицы кода для алгоритма интерполяционной таблицы при помощи Заменяющего Инструмента Кода.
Откройте и исследуйте заменяющую функцию в качестве примера
Идентифицируйте или создайте C или заменяющую функцию C++ для алгоритма, который вы хотите использовать вместо алгоритма программного обеспечения Simulink®.
Этот пример использует следующий заменяющий заголовок функции C и исходные файлы, которые находятся в папке matlab/toolbox/rtw/rtwdemos/crl_demo
:
myLookup1D.h
myLookup1D.c
Поместите копию этих файлов в вашей рабочей папке.
Откройте и исследуйте код на myLookup1D.h
.
#include "rtwtypes.h" real_T my_Lookup1D_Repl(real_T u0, const real_T *bp0, const real_T *table, uint32_T tdl);
Откройте и исследуйте код в myLookup1D.c
. Отметьте функциональную подпись. При вводе спецификацию аргумента реализации в Заменяющий Инструмент Кода, задаете свойства аргумента.
#include "myLookup1D.h" real_T my_Lookup1D_Repl(real_T u0, const real_T *bp0, const real_T *table, uint32_T tdl) { real_T y; uint16_T frac; uint32_T bpIdx; uint32_T maxIndex=tdl-1; if (u0 <= bp0[0U]) { bpIdx = 0U; frac = 0U; } else if (u0 < bp0[maxIndex]) { bpIdx = maxIndex >> 1U; while ((u0 < bp0[bpIdx]) && (bpIdx > 0U)) { bpIdx--; } while ((bpIdx < maxIndex - 1U) && (u0 >= bp0[bpIdx + 1U])) { bpIdx++; } frac = (uint16_T)((u0 - bp0[bpIdx]) / (bp0[bpIdx + 1U] - bp0[bpIdx]) * 32768.0); } else { bpIdx = maxIndex; frac = 0U; } if (bpIdx == maxIndex) { y = table[bpIdx]; } else { y = (table[bpIdx + 1U] - table[bpIdx]) * ((real_T)frac * 3.0517578125E-5) + table[bpIdx]; } return y; }
Откройте и исследуйте модель в качестве примера
Этот пример использует модель rtwdemo_crllookup1D, чтобы протестировать вашу заменяющую спецификацию кода. Поместите копию модели в вашей рабочей папке и назовите его my_lookup1d.slx
.
Откройте и исследуйте модель. Отметьте спецификации ввода и вывода и настройки параметров блоков. Чтобы достигнуть соответствия, необходимо задать концептуальные аргументы на основе того, как 1D блок Lookup Table сконфигурирован в модели в качестве примера.
Составьте заменяющую таблицу кода
В командной строке введите crtool
открыть Заменяющий Инструмент Кода.
Добавьте новую таблицу, выберите ту таблицу и добавьте новую функциональную запись.
На вкладке Mapping Information выберите Custom
для параметра Function.
Ищите подпись вызова и информацию о параметре алгоритма для функции интерполяционной таблицы, которую вы хотите обновить с заменой алгоритма. Смотрите Подписи Функции Интерполяционной таблицы.
В данном примере вы заменяете алгоритм для концептуальной функции, сопоставленной с 1D блоком Lookup Table. Подпись для этой функции:
y1 = lookup1D(u1, u2, u3, u4)
Аргументы u1
, u2
, u3
, u4
представляйте вход, установите точки останова данные, табличные данные и табличную длину размерности, соответственно. Функция возвращает выходной параметр к y1
.
Справа от Function выпадающий список, в текстовом поле имени функции, вводят имя функции интерполяционной таблицы Simulink. В данном примере введите имя lookup1D
. Введите имя точно, как это появляется в зарегистрированной подписи, включая символьное преобразование регистра. Нажмите Enter.
Инструмент отображает настройки параметра алгоритма, которые инициировали достойный блока 1-D Lookup Table в модели в качестве примера. Обязательные параметры появляются только с одним значением. В данном примере не изменяйте значения. Дополнительные параметры появляются с несколькими значениями. Изменения в дополнительных параметрах не влияют на процесс соответствия.
Задайте концептуальные аргументы. Под полем списка Conceptual arguments нажмите +, чтобы добавить аргументы, которые находятся в зарегистрированной функциональной подписи. lookup1D
функционируйте берет один выходной аргумент и четыре входных параметра. Нажмите + пять раз.
Инструмент задает выходной аргумент y1
и четыре входных параметра u1
, u2
, u3
, и u4
. По умолчанию эти четыре аргумента являются скалярами типа double
.
Можно настроить концептуальные свойства аргумента. В данном примере вы не вносите изменения для y1
и u1
. Однако, когда диалоговое окно параметров блоков для модели в качестве примера показывает, необходимо настроить свойства аргумента для точки останова и табличных аргументов данных.
Настройте концептуальные свойства аргумента при помощи следующей таблицы. Нажмите Apply.
Имя аргумента подписи | Концептуальное имя аргумента | Тип данных | Тип ввода-вывода | Тип аргумента | Более низкая область значений | Верхняя область значений |
---|---|---|---|---|---|---|
y | y1 | double | OUTPUT | Scalar | Не применяется | Не применяется |
u1 | u1 | double | INPUT | Scalar | Не применяется | Не применяется |
bp1 | u2 | double | INPUT | Matrix | [0 0]
| [Inf Inf] |
table | u3 | double | INPUT | Matrix | [0 0]
| [Inf Inf] |
tdl | u4 | uint32 | INPUT | Scalar | Не применяется | Не применяется |
Введите информацию для заменяющего прототипа функции. Прототип для функции, взятой в качестве примера:
real_T my_Lookup1D_Repl(real_T u0, const real_T *bp0, const real_T *table, uint32_T tdl)
В разделе Replacement function> Function prototype введите имя функции my_Lookup1D_Repl
в текстовом поле Name.
Задайте аргументы для заменяющей функции. Под полем списка Function arguments нажмите + пять раз, чтобы добавить пять аргументов реализации.
Вы можете должны быть настроить свойства аргумента функции. Когда заменяющая подпись функции показывает, настройте свойства аргумента для точки останова, табличных данных и табличных аргументов длины размерности. Для u2
(точки останова) и u3
(таблица), установите флажок Const. Для u4
, установите Data type на uint32
.
Функциональный предварительный просмотр подписи должен появиться следующим:
double my_Lookup1D_Repl(double u1, const double* u2, const double* u3, uint32 u4)
Установите соответствующие атрибуты реализации. Используйте настройки по умолчанию.
Подтвердите запись. Если ошибки отчетов инструмента, зафиксируйте их и повторите валидацию. Повторите процедуру, пока инструмент не сообщит об ошибках.
Сохраните заменяющую таблицу кода в своей рабочей папке как my_lookup_replacement_table.m
.
Укажите информацию сборки
На вкладке Build Information укажите информацию, относящуюся к генерации кода C or C++ и созданию исполняемого файла из модели. Введите myLookup1D.h
для Implementation Header File и myLookup1D.c
для Implementation Source File.
Если вы скопировали файлы в качестве примера в папку кроме рабочей папки, содержащей тестовую модель, lookup1d.slx
, задайте пути к исходному и заголовочному файлу. В противном случае оставьте другой набор параметров Build Information значениям по умолчанию. Нажмите Apply.
Протестируйте запись
Протестировать этот пример:
Укажите заменяющее отображение кода.
Используйте модель rtwdemo_crllookup1D в качестве примера.
Сконфигурируйте модель со следующими настройками:
На панели Solver выберите решатель фиксированного шага.
На панели Code Generation выберите ERT-based system target file.
На Code Generation> панель Interface, выберите заменяющую библиотеку кода, которая содержит вашу запись функции интерполяционной таблицы.
В этом примере показано, как указать, что заменяющие записи таблицы кода для интерполяционной таблицы функционируют программно.
Откройте и исследуйте заменяющую функцию в качестве примера
Идентифицируйте или создайте C или заменяющую функцию C++ для алгоритма, который вы хотите использовать вместо алгоритма программного обеспечения Simulink.
Этот пример использует следующий заменяющий заголовок функции C и исходные файлы, которые находятся в папке matlab/toolbox/rtw/rtwdemos/crl_demo
:
myLookup1D.h
myLookup1D.c
Поместите копию этих файлов в вашей рабочей папке.
Откройте и исследуйте код на myLookup1D.h
.
#include "rtwtypes.h" real_T my_Lookup1D_Repl(real_T u0, const real_T *bp0, const real_T *table, uint32_T tdl);
Откройте и исследуйте код в myLookup1D.c
. Отметьте функциональную подпись. При вводе спецификацию аргумента реализации в Заменяющий Инструмент Кода, задаете свойства аргумента.
#include "myLookup1D.h" real_T my_Lookup1D_Repl(real_T u0, const real_T *bp0, const real_T *table, uint32_T tdl) { real_T y; uint16_T frac; uint32_T bpIdx; uint32_T maxIndex=tdl-1; if (u0 <= bp0[0U]) { bpIdx = 0U; frac = 0U; } else if (u0 < bp0[maxIndex]) { bpIdx = maxIndex >> 1U; while ((u0 < bp0[bpIdx]) && (bpIdx > 0U)) { bpIdx--; } while ((bpIdx < maxIndex - 1U) && (u0 >= bp0[bpIdx + 1U])) { bpIdx++; } frac = (uint16_T)((u0 - bp0[bpIdx]) / (bp0[bpIdx + 1U] - bp0[bpIdx]) * 32768.0); } else { bpIdx = maxIndex; frac = 0U; } if (bpIdx == maxIndex) { y = table[bpIdx]; } else { y = (table[bpIdx + 1U] - table[bpIdx]) * ((real_T)frac * 3.0517578125E-5) + table[bpIdx]; } return y; }
Рассмотрите подпись функции поиска
Ищите информацию о подписи вызова для функции поиска, которую вы хотите обновить с заменой алгоритма. Смотрите Подписи Функции Интерполяционной таблицы.
Замените алгоритм для функции, сопоставленной с 1D блоком Lookup Table. Подпись для этой функции:
y1 = lookup1D(u1, u2, u3, u4)
Аргументы u1
, u2
, u3
, и u4
представляйте вход, установите точки останова данные, табличные данные и табличную длину размерности, соответственно. Функция возвращает выходной параметр к y1
.
Создайте заменяющую запись кода
Создайте заменяющий табличный файл кода как функцию MATLAB®, которая описывает заменяющие записи таблицы функции интерполяционной таблицы кода. Поместите копию файла matlab/toolbox/rtw/rtwdemos/crl_demo/crl_table_lookup1D.m
в вашей рабочей папке. Этот файл задает заменяющую таблицу кода для функции C my_Lookup1D_Repl
.
Открытый crl_table_lookup1D.m
и исследуйте определение.
Создайте табличный файл определения, который содержит функциональное определение. Например:
function hLib = my_lookup_replacement_table
В теле функции составьте таблицу путем вызова функционального RTW.TflTable
.
hLib = RTW.TflTable;
Создайте запись для отображения функции с вызовом RTW.TflCFunctionEntry
функция.
hEnt = RTW.TflCFunctionEntry;
Параметры записи функции множества с вызовом setTflCFunctionEntryParameters
функция. Функциональная клавиша, имя реализации, и заголовок и исходные файлы в вызове функции идентифицируют имя функции интерполяционной таблицы Simulink, lookup1D
, и следующая информация для замены функционирует my_Lookup1D_Repl
:
FunctionName
Заголовочный файл
Исходный файл
Задайте имя функции интерполяционной таблицы Simulink точно, как это появляется в зарегистрированной подписи, включая преобразование регистра символа (см. Подписи Функции Интерполяционной таблицы). Если вы скопировали файлы в качестве примера в папку кроме рабочей папки, которая содержит тестовую модель, rtwdemo_crllookup1D, задайте пути к исходному и заголовочному файлу.
setTflCFunctionEntryParameters(hEnt, ... 'Key', 'lookup1D', ... 'Priority', 100, ... 'ImplementationName', 'my_Lookup1D_Repl', ... 'ImplementationHeaderFile', 'myLookup1D.h', ... 'ImplementationSourceFile', 'myLookup1D.c', ... 'GenCallback', 'RTW.copyFileToBuildDir');
Создайте концептуальные аргументы и добавьте их в запись. Этот пример использует вызовы getTflArgFromString
и addConceptualArg
функции, чтобы создать и добавить аргументы.
Пример задает пять концептуальных аргументов для lookup1D
функция, один выходной аргумент y1
и четыре входных параметра u1
, u2
, u3
, и u4
. Аргументы y1
и u1
заданы как скалярный double
данные. Аргументы u2
и u3
представляйте bp1
и table
в подписи и заданы как 1x10 матрицы double
данные. Аргумент u4
представляет tdl
и задан как скаляр uint32
данные. Это определение инициировало соответствие с моделью в качестве примера.
arg = hEnt.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(hEnt, arg); arg = hEnt.getTflArgFromString('u1','double'); addConceptualArg(hEnt, arg); arg = RTW.TflArgMatrix('u2', 'RTW_IO_INPUT', 'double'); arg.DimRange = [0 0; Inf Inf]; addConceptualArg(hEnt, arg); arg = RTW.TflArgMatrix('u3', 'RTW_IO_INPUT', 'double'); arg.DimRange = [0 0; Inf Inf]; addConceptualArg(hEnt, arg); arg = hEnt.getTflArgFromString('u4','uint32'); addConceptualArg(hEnt, arg);
Рассмотрите информацию о параметре алгоритма для функции поиска, которую вы хотите обновить с заменой алгоритма. Используйте getAlgorithmParameters
функционируйте, чтобы отобразить информацию о параметре.
algParams = getAlgorithmParameters(hEnt)
algParams = Lookup with properties: InterpMethod: [1x1 coder.algorithm.parameter.InterpMethod] ExtrapMethod: [1x1 coder.algorithm.parameter.ExtrapMethod] UseRowMajorAlgorithm: [1x1 coder.algorithm.parameter.UseRowMajorAlgorithm] RndMeth: [1x1 coder.algorithm.parameter.RndMeth] IndexSearchMethod: [1x1 coder.algorithm.parameter.IndexSearchMethod] UseLastTableValue: [1x1 coder.algorithm.parameter.UseLastTableValue] RemoveProtectionInput: [1x1 coder.algorithm.parameter.RemoveProtectionInput] SaturateOnIntegerOverflow: [1x1 coder.algorithm.parameter.SaturateOnIntegerOverflow] SupportTunableTableSize: [1x1 coder.algorithm.parameter.SupportTunableTableSize] BPPower2Spacing: [1x1 coder.algorithm.parameter.BPPower2Spacing]
Исследуйте информацию на каждый параметр. Options
списки свойств возможные значения. Primary
указывает, требуется ли параметр (1) или дополнительный (0). Value
свойство задает текущее значение. Для обязательных параметров, первоначально, Value
установлен в значение по умолчанию для данной функции интерполяционной таблицы.
algParams.InterpMethod
ans = InterpMethod with properties: Name: 'InterpMethod' Options: {'Linear' 'Flat' 'Nearest'} Primary: 1 Value: {'Linear'}
algParams.RndMeth
ans = RndMeth with properties: Name: 'RndMeth' Options: {1x7 cell} Primary: 0 Value: {1x7 cell}
algParams.RndMeth.Options
ans = Columns 1 through 5 'Ceiling' 'Convergent' 'Floor' 'Nearest' 'Round' Columns 6 through 7 'Simplest' 'Zero'
Установите свойства алгоритма для lookup1D
запись таблицы. Присвойте значение каждому параметру. Обновите установки параметров для записи путем вызова функционального setAlgorithmParameters
. Следующие установки параметров инициировали соответствие с моделью в качестве примера.
algParams.InterpMethod = 'Linear'; algParams.ExtrapMethod = 'Clip'; algParams.UseRowMajorAlgorithm: = 'off'; algParams.RndMeth = 'Round'; algParams.IndexSearchMethod = 'Linear search'; algParams.UseLastTableValue = 'Evenly spaced point'; algParams.RemoveProtectionInput = 'off'; algParams.SaturateOnIntegerOverflow = 'off'; algParams.SupportTunableTableSize = 'off'; algParams.BPPower2Spacing = 'off'; setAlgorithmParameters(hEnt, algParams);
Чтобы проверить ваши изменения, вызовите getAlgorithmParameters
установить параметр для записи таблицы. Исследуйте значение каждого параметра.
getAlgorithmParameters(hEnt, algParams); algParams.InterpMethod.Value
ans = 'Linear'
algParams.ExtrapMethod.Value
ans = 'Clip'
algParams.UseRowMajorAlgorithm.Value
ans = 'off' . . .
Создайте аргументы реализации и добавьте их в запись. Этот пример использует вызовы getTflArgFromString
функция, чтобы создать пять аргументов реализации, которые сопоставляют с аргументами в заменяющем прототипе функции: один выходной аргумент y1
и четыре входных параметра u1
, u2
, u3
, и u4
. Удобные методы setReturn
и addArgument
задайте, является ли аргумент возвращаемым значением или аргументом. addArgument
функция также добавляет каждый аргумент в массив записи аргументов реализации.
arg = hEnt.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.setReturn(arg); arg = hEnt.getTflArgFromString('u1','double'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u2','double*'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u3','double*'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u4','uint32'); hEnt.Implementation.addArgument(arg);
Добавьте запись в заменяющую таблицу кода с вызовом addEntry
функция.
addEntry(hLib, hEnt);
Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.
Протестируйте запись
Протестировать этот пример:
Укажите заменяющее отображение кода.
Используйте модель rtwdemo_crllookup1D в качестве примера.
Сконфигурируйте модель со следующими настройками:
На панели Solver выберите решатель фиксированного шага.
На панели Code Generation выберите ERT-based system target file.
На Code Generation> панель Interface, выберите заменяющую библиотеку кода, которая содержит вашу запись функции интерполяционной таблицы.
lookup2D
ФункцияСледующий код показывает заменяющее определение для lookup2D
функция.
function hLib = my_2dlookup_replacement_table hLib = RTW.TflTable; hEnt = RTW.TflCFunctionEntry; setTflCFunctionEntryParameters(hEnt, ... 'Key', 'lookup2D', ... 'Priority', 100, ... 'ImplementationName', 'custom_lookup2d', ... 'ImplementationHeaderFile', 'custom_lookup2d.h', ... 'ImplementationSourceFile', 'custom_lookup2d.c', ... 'GenCallback', 'RTW.copyFileToBuildDir'); % Conceptual Args arg = hEnt.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; addConceptualArg(hEnt, arg); arg = hEnt.getTflArgFromString('u1','double'); addConceptualArg(hEnt, arg); arg = hEnt.getTflArgFromString('u2','double'); addConceptualArg(hEnt, arg); arg = RTW.TflArgMatrix('u3', 'RTW_IO_INPUT', 'double'); arg.DimRange = [1 1; 10 1]; addConceptualArg(hEnt, arg); arg = RTW.TflArgMatrix('u4', 'RTW_IO_INPUT', 'double'); arg.DimRange = [1 1; 10 1]; addConceptualArg(hEnt, arg); arg = RTW.TflArgMatrix('u5', 'RTW_IO_INPUT', 'double'); arg.DimRange = [1 1; 10 1]; addConceptualArg(hEnt, arg); arg = hEnt.getTflArgFromString('u6','uint32'); addConceptualArg(hEnt, arg); arg = hEnt.getTflArgFromString('u7','uint32'); addConceptualArg(hEnt, arg); % Algorithm Parameters addAlgorithmProperty(hEnt, 'ExtrapMethod','Clip'); addAlgorithmProperty(hEnt, 'IndexSearchMethod','Linear search'); addAlgorithmProperty(hEnt, 'InterpMethod','Linear'); addAlgorithmProperty(hEnt, 'RemoveProtectionInput','off'); addAlgorithmProperty(hEnt, 'UseLastTableValue','on'); % Implementation Args arg = hEnt.getTflArgFromString('y1','double'); arg.IOType = 'RTW_IO_OUTPUT'; hEnt.Implementation.setReturn(arg); arg = hEnt.getTflArgFromString('u1','double'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u2','double'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u3','double*'); arg.Type.BaseType.ReadOnly = true; hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u4','double*'); arg.Type.BaseType.ReadOnly = true; hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u5','double*'); arg.Type.BaseType.ReadOnly = true; hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u6','uint32'); hEnt.Implementation.addArgument(arg); arg = hEnt.getTflArgFromString('u7','uint32'); hEnt.Implementation.addArgument(arg); hLib.addEntry(hEnt);