Замена функции интерполяционной таблицы кода

Можно сконфигурировать алгоритм для операций поиска по таблице и поисков по индексу, чтобы лучше удовлетворить требования кода приложения. Используйте вкладку 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({ui, uf,}... ut, un...)y1 – вывод
ui, uf является индексом и дробной парой на размерность
ut – табличные данные
un – табличные длины размерности

Явные значения
y1 = lookup1D(u1, u2, u3, u4)

y1 – вывод
u1 – входной параметр
u2 – установите точки останова данные
u3 – табличные данные
u4 – табличная длина размерности

Даже разрядка
y1 = lookup1D(u1, u2, u3, u4, u5)

y1 – вывод
u1 – входной параметр
u2 – первая точка данных о точке останова
u3 – интервал точек останова
u4 – табличные данные
u5 – табличная длина размерности

Явные значения
y1 = lookup2D(u1, u2, u3, u4, u5, u6, u7)

y1 – вывод
u1, u2 – входной параметр
u3, u4 – установите точки останова данные
u5 – табличные данные
u6, u7 – табличные длины размерности

Даже разрядка
y1 = lookup2D(u1, u2, u3, u4, u5, u6, u7, u8, u9)

y1 – вывод
u1, u2 – входной параметр
u3, u5 – первая точка данных о точке останова
u4, u6 – интервал точек останова
u7 – табличные данные
u8, u9 – табличные длины размерности

Явный интервал
y1 = lookup3D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10)

y1 – вывод
u1, u2, u3 – входной параметр
u4, u5, u6 – установите точки останова данные
u7 – табличные данные
u8, u9, u10 – табличные длины размерности

Даже разрядка
y1 = lookup3D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13)

y1 – вывод
u1, u2, u3 – входной параметр
u4, u6, u8 – первая точка данных о точке останова
u5, u7, u9 – интервал точек останова
u10 – табличные данные
u11, u12, u13 – табличные длины размерности

Явные значения
y1 = lookup4D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13)

y1 – вывод
u1, u2, u3, u4 – входной параметр
u5, u6, u7, u8 – установите точки останова данные
u9 – табличные данные
u10, u11, u12, u13 – табличные длины размерности

Даже разрядка
y1 = lookup4D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17)

y1 – вывод
u1, u2, u3, u4 – входной параметр
u5, u7, u9, u11 – первая точка данных о точке останова
u6, u8, u10, u12 – интервал точек останова
u13 – табличные данные
u14, u15, u16, u17 – табличные длины размерности

Явные значения
y1 = lookup5D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16)

y1 – вывод
u1, u2, u3, u4, u5 – входной параметр
u6, u7, u8, u9, u10 – установите точки останова данные
u11 – табличные данные
u12, u13, u14, u15, u16 – табличные длины размерности

Даже разрядка
y1 = lookup5D(u1, u2, u3, u4, u5, u6, u7, u8, u9, u10, u11, u12, u13, u14, u15, u16, u17, u18, u19, u20, u21)

y1 – вывод
u1, u2, u3, u4, u5 – входной параметр
u6, u8, u10, u12, u14 – первая точка данных о точке останова
u7, u9, u11, u13, u15 – интервал точек останова
u16 – табличные данные
u17, u18, u19, u20, u21 – табличные длины размерности

Явные значения
y1 = lookupND(un,..., ub,..., ut, un...)

y1 – вывод
un, введенный на размерность
ub, установите точки останова на размерность
ut – табличные данные
un – табличные длины размерности

Даже разрядка
y1 = lookupND(un,..., {ufn, usn,}... ut, un...)

y1 – вывод
un – введите на размерность
ufn – первая точка данных о точке останова на размерность
usn – интервал точки останова на размерность
ut – табличные данные
un – табличные длины размерности
y1 = lookupND_Direct(u1, u2,...ui, ui+1)y1 – вывод
u1...ui – входной параметр
ui+1 – табличные данные

Явные значения
y1, y2 = prelookup(u1, u2, u3)

y1 – индекс
y2 – часть
u1 – входной параметр
u2 – установите точки останова данные
u3 – количество точек останова

Равномерно распределенный
y1, y2 = prelookup(u1, u2, u3, u4)

y1 – индекс
y2 – часть
u1 – входной параметр
u2 – первая точка данных о точке останова
u3 – интервал точек останова
u4 – количество точек останова

При определении записи таблицы программно, вы можете также должны быть изменить значения необходимых (первичных) и дополнительных параметров алгоритма.

  • Установите значения для обязательных параметров, чтобы достигнуть замены кода.

  • Если вы не устанавливаете значение для дополнительного параметра, программное обеспечение параметра алгоритма применяет don't care. Заменяющее программное обеспечение кода игнорирует параметр при поиске соответствий.

Искать информацию о параметре алгоритма для функции интерполяционной таблицы:

  1. Создайте запись таблицы для функции.

    tableEntry = RTW.TflCFunctionEntry;
    
  2. Идентифицируйте функцию интерполяционной таблицы в записи таблицы. Используйте параметр записи таблицы Key в вызове setTflCFunctionEntryParameters. Следующий пример идентифицирует запись для функции prelookup.

    setTflCFunctionEntryParameters(tableEntry, ...
        'Key', 'prelookup', ...
        'Priority', 100, ...
        'ImplementationName', 'myPrelookup');
    
  3. Установите параметр алгоритма для записи с вызовом 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]
  4. Исследуйте информацию, доступную для каждого параметра.

    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 сконфигурирован в модели в качестве примера.

Составьте заменяющую таблицу кода

  1. В командной строке введите crtool, чтобы открыть Заменяющий Инструмент Кода.

  2. Добавьте новую таблицу, выберите ту таблицу и добавьте новую функциональную запись.

  3. На вкладке Mapping Information выберите Custom для параметра Function.

  4. Ищите подпись вызова и информацию о параметре алгоритма для функции интерполяционной таблицы, которую вы хотите обновить с заменой алгоритма. Смотрите Подписи Функции Интерполяционной таблицы.

    В данном примере вы заменяете алгоритм для концептуальной функции, сопоставленной с 1D блоком Lookup Table. Подпись для этой функции:

    y1 = lookup1D(u1, u2, u3, u4)

    Аргументы u1, u2, u3, u4 представляет вход, устанавливают точки останова данные, табличные данные и табличную длину размерности, соответственно. Функция возвращает выходной параметр к y1.

  5. Справа от Function выпадающий список, в текстовом поле имени функции, вводят имя функции интерполяционной таблицы Simulink. В данном примере введите имя lookup1D. Введите имя точно, как это появляется в зарегистрированной подписи, включая символьное преобразование регистра. Нажмите Enter.

    Инструмент отображает настройки параметра алгоритма, которые инициировали достойный 1D блока Lookup Table в модели в качестве примера. Обязательные параметры появляются только с одним значением. В данном примере не изменяйте значения. Дополнительные параметры появляются с несколькими значениями. Изменения в дополнительных параметрах не влияют на процесс соответствия.

  6. Задайте концептуальные аргументы. Под полем списка Conceptual arguments нажмите +, чтобы добавить аргументы, которые находятся в зарегистрированной функциональной подписи. Функция lookup1D берет один выходной аргумент и четыре входных параметра. Нажмите + пять раз.

    Инструмент задает выходной аргумент y1 и четыре входных параметра u1, u2, u3 и u4. По умолчанию эти четыре аргумента являются скалярами типа double.

    Можно настроить концептуальные свойства аргумента. В данном примере вы не вносите изменения для y1 и u1. Однако, когда диалоговое окно параметров блоков для модели в качестве примера показывает, необходимо настроить свойства аргумента для точки останова и табличных аргументов данных.

    Настройте концептуальные свойства аргумента при помощи следующей таблицы. Нажмите Apply.

    Имя аргумента подписиКонцептуальное имя аргументаТип данныхТип ввода-выводаТип аргументаБолее низкая область значенийВерхняя область значений
    yy1doubleOUTPUTScalarНе применяетсяНе применяется
    u1u1doubleINPUTScalarНе применяетсяНе применяется
    bp1u2doubleINPUTMatrix[0 0][Inf Inf]
    tableu3doubleINPUTMatrix[0 0][Inf Inf]
    tdlu4uint32INPUTScalarНе применяетсяНе применяется
  7. Введите информацию для заменяющего прототипа функции. Прототип для функции, взятой в качестве примера:

    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.

  8. Задайте аргументы для заменяющей функции. Под полем списка Function arguments нажмите + пять раз, чтобы добавить пять аргументов реализации.

    Вы можете должны быть настроить свойства аргумента функции. Когда заменяющая подпись функции показывает, настройте свойства аргумента для точки останова, табличных данных и табличных аргументов длины размерности. Для u2 (точки останова) и u3 (таблица), установите флажок Const. Для u4, набор Data type к uint32.

    Функциональный предварительный просмотр подписи должен появиться можно следующим образом:

    double my_Lookup1D_Repl(double u1, const double* u2, const double* u3, uint32 u4)
  9. Установите соответствующие атрибуты реализации. Используйте настройки по умолчанию.

  10. Подтвердите запись. Если ошибки отчетов инструмента, зафиксируйте их и повторите валидацию. Повторите процедуру, пока инструмент не сообщит об ошибках.

  11. Сохраните заменяющую таблицу кода в своей рабочей папке как my_lookup_replacement_table.m.

Укажите информацию сборки

На вкладке Build Information укажите информацию, относящуюся к генерации C или Коду С++ и созданию исполняемого файла из модели. Введите myLookup1D.h для Implementation Header File и myLookup1D.c для Implementation Source File.

Если вы скопировали файлы в качестве примера в папку кроме рабочей папки, содержащей тестовую модель, lookup1d.slx, задайте пути к исходному и заголовочному файлу. В противном случае оставьте другой набор параметров Build Information значениям по умолчанию. Нажмите Apply.

Протестируйте запись

Протестировать этот пример:

  1. Укажите заменяющее отображение кода.

  2. Используйте модель rtwdemo_crllookup1D в качестве примера.

  3. Сконфигурируйте модель со следующими настройками:

    • На панели 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 и исследуйте определение.

  1. Создайте табличный файл определения, который содержит функциональное определение. Например:

    function hLib = my_lookup_replacement_table
  2. В теле функции составьте таблицу путем вызова функционального RTW.TflTable.

    hLib = RTW.TflTable;
  3. Создайте запись для отображения функции с вызовом функции RTW.TflCFunctionEntry.

    hEnt = RTW.TflCFunctionEntry;
  4. Параметры записи функции множества с вызовом функции 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');
  5. Создайте концептуальные аргументы и добавьте их в запись. Этот пример использует вызовы 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);
    
  6. Рассмотрите информацию о параметре алгоритма для функции поиска, которую вы хотите обновить с заменой алгоритма. Используйте функцию 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'
  7. Установите свойства алгоритма для записи таблицы 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'
    .
    .
    .
  8. Создайте аргументы реализации и добавьте их в запись. Этот пример использует вызовы функции 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);
  9. Добавьте запись в заменяющую таблицу кода с вызовом функции addEntry.

    addEntry(hLib, hEnt);
  10. Сохраните табличный файл определения. Используйте имя табличной функции определения, чтобы назвать файл.

Протестируйте запись

Протестировать этот пример:

  1. Укажите заменяющее отображение кода.

  2. Используйте модель rtwdemo_crllookup1D в качестве примера.

  3. Сконфигурируйте модель со следующими настройками:

    • На панели 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); 

Похожие темы