exponenta event banner

Встроенные S-функции с TLC

timesN Обзор учебного пособия

Цель: Понять, как работает TLC с S-функцией.

Папка: matlabroot/toolbox/rtw/rtwdemos/tlctutorial/timesN (открыто)

В этом учебном пособии вы создадите версии кода C для существующей S-функции timesN.

Учебное пособие включает следующие шаги:

  1. Создание неинлинированного кода - через SimStructs и общий API

  2. Зачем использовать TLC для встроенных S-функций? - Преимущества встраивания

  3. Создание встроенной S-функции - с помощью пользовательского кода TLC

В более позднем учебном пособии содержится информация и практические рекомендации по «свертыванию» S-функций.

Создание неинлинированного кода

Папка учебного пособия tlctutorial/timesN в рабочей папке содержится S-функция Simulink ® timesN.c.

В этом упражнении мы создадим неинлинный код из модели sfun_xN.

  1. Найти файл rename_timesN.tlc в tlctutorial/timesN. Переименовать этот файл в timesN.tlc. Это позволяет создавать код.

  2. В окне команд MATLAB ® создайте файл MEX для функции S:

    mex timesN.c

    Это позволяет избежать выбора версии, поставляемой с Simulink.

  3. Открытие модели sfun_xN, которая использует timesN S-функция. Блок-схема выглядит следующим образом.

  4. Откройте диалоговое окно Параметры конфигурации (Configuration Parameters) и выберите панель Решатель (Solver).

  5. Установить время остановки на 10.0.

  6. Задайте опции решателя.

    • Введите для Fixed-step

    • Решатель для Discrete (no continuous states)

    • Фиксированный размер шага до 0.01

  7. Выберите панель Оптимизация (Optimization) и убедитесь, что для параметра Поведение по умолчанию (Default parameter behavior) задано значение Tunable.

  8. Выберите панель «Создание кода» > «Комментарии» и обратите внимание, что по умолчанию установлен флажок «Включить комментарии».

  9. Выберите панель Создание кода (Code Generation) и установите флажок Только генерировать код (Generate code only).

    Нажмите кнопку «Применить».

  10. Нажмите Ctrl + B, чтобы создать код C для модели.

  11. Открыть результирующий файл sfun_xN_grt_rtw/sfun_xN.c и просмотрите sfun_xN_output часть, показанная ниже.

/* Model output function */
static void sfun_xN_output(int_T tid)
{
  /* Sin: '<Root>/Sin' */
  sfun_xN_B.Sin = sin(sfun_xN_M->Timing.t[0] * sfun_xN_P.Sin_Freq +
                      sfun_xN_P.Sin_Phase) * sfun_xN_P.Sin_Amp +
    sfun_xN_P.Sin_Bias;

  /* S-Function Block: <Root>/S-Function */
  /* Multiply input by 3.0 */
  sfun_xN_B.timesN_output = sfun_xN_B.Sin * 3.0;

  /* Outport: '<Root>/Out' */
  sfun_xN_Y.Out = sfun_xN_B.timesN_output;
  UNUSED_PARAMETER(tid);
}

Комментарии появляются в коде, поскольку на панели «Создание кода» > «Комментарии» диалогового окна «Параметры конфигурации» по умолчанию выбран параметр «Включить комментарии».

Зачем использовать TLC для встроенных S-функций?

Генератор кода включает общий API, который можно использовать для вызова написанных пользователем алгоритмов и драйверов. API включает в себя различные функции обратного вызова - для инициализации, вывода, производных, завершения и т.д., а также структуры данных. После кодирования они создаются в памяти и вызываются во время выполнения посредством непрямых вызовов функций. Каждый вызов включает в себя кадры стека и другие служебные данные, которые увеличивают время выполнения.

В среде реального времени, особенно когда задействовано множество шагов решения, общие вызовы API могут быть недопустимо медленными. Генератор кода может ускорить S-функции в автономных приложениях, которые он генерирует, встраивая написанные пользователем алгоритмы в автоматически сгенерированные функции, а не косвенно вызывая S-функции через общий API. Эта форма оптимизации называется встроением. TLC встроен в S-функции, что приводит к более быстрому, оптимизированному коду.

Следует понимать, что TLC не является заменой для записи S-функций кода C. Для вызова пользовательских блоков в Simulink по-прежнему необходимо записывать S-функции в C (или в виде файлов MATLAB), поскольку моделирование не использует файлы TLC. Однако можно подготовить TLC-файлы, которые встроены в определенные S-функции, чтобы сделать целевой код намного более эффективным.

Создание встроенной S-функции

TLC создает встроенную S-функцию всякий раз, когда она обнаруживает .tlc с тем же именем, что и S-функция. Предполагая .tlc файл имеет ожидаемую форму, он направляет построение кода, который функционально дублирует внешнюю S-функцию без дополнительных затрат API. Чтобы узнать, как работает этот процесс, выполните следующие действия.

  1. Если вы еще не сделали этого, найдите файл rename_timesN.tlc в tlctutorial/timesN. Переименовать этот файл в timesN.tlc, чтобы вы могли использовать его для создания кода. Исполняемая часть файла:

    %implements "timesN" "C"
    
    %% Function: Outputs ===========================================================
    %%
    %function Outputs(block, system) Output
      %assign gain =SFcnParamSettings.myGain
      /* %<Type> Block: %<Name> */
      %%
      /* Multiply input by %<gain> */
      %assign rollVars = ["U", "Y"]
      %roll idx = RollRegions, lcv = RollThreshold, block, "Roller", rollVars
        %<LibBlockOutputSignal(0, "", lcv, idx)> = \
        %<LibBlockInputSignal(0, "", lcv, idx)> * %<gain>;
      %endroll
    
    %endfunction
  2. Создайте встроенную версию S-функции.

    1. На панели Оптимизация (Optimization) диалогового окна Параметры конфигурации (Configuration Parameters) задайте для параметра Поведение по умолчанию (Default parameter behavior Inlinedи нажмите кнопку «Применить».

    2. Изменение метки схемы с model: sfun_xN кому model: sfun_xN_ilp.

    3. Сохранить модель как sfun_x2_ilp.

    4. Нажмите Ctrl + B. Исходные файлы создаются в новой подпапке с именемsfun_xN_ilp_grt_rtw.

    5. Проверка кода в созданном файле sfun_xN_ilp.c:

      /* Model output function */
      static void sfun_xN_ilp_output(int_T tid)
      {
        /* Sin: '<Root>/Sin' */
        sfun_xN_ilp_B.Sin = sin(sfun_xN_ilp_M->Timing.t[0]);
      
        /* S-Function Block: <Root>/S-Function */
        /* Multiply input by 3.0 */
        sfun_xN_ilp_B.timesN_output = sfun_xN_ilp_B.Sin * 3.0;
      
        /* Outport: '<Root>/Out' */
        sfun_xN_ilp_Y.Out = sfun_xN_ilp_B.timesN_output;
        UNUSED_PARAMETER(tid);
      }

      Примечание

      Когда генератор кода создает код и строит исполняемые файлы, он создает или использует определенную подпапку (называемую папкой построения) для хранения исходного файла, объекта и создания файлов. По умолчанию папка построения называется model_grt_rtw.

      Обратите внимание, что для параметра «Поведение по умолчанию» задано значение Inlined не изменил код. Это происходит потому, что TLC встроен в S-функции.

  3. Продолжите упражнение, создав автономное моделирование.

    1. На панели Создание кода (Code Generation) диалогового окна Параметры конфигурации (Configuration Parameters) снимите флажок Только генерировать код (Generate only) и нажмите кнопку Применить (Apply).

    2. На панели Импорт/экспорт данных (Data Import/Export) диалогового окна Параметры конфигурации (Configuration Parameters) установите флажок Вывод (Output).

      Эта спецификация приводит к регистрации выходных данных модели в рабочей области MATLAB.

    3. Нажмите Ctrl + B, чтобы создать код, скомпилировать и связать модель с исполняемым файлом с именемsfun_xN_ilp.exe (или в системах UNIX ® ,sfun_xN_ilp).

    4. Подтвердите, что timesN.tlc создает ожидаемые выходные данные путем запуска автономного исполняемого файла. Для ее выполнения в окне команд MATLAB введите

      !sfun_xN_ilp

      Появится следующий ответ:

      ** starting the model **
      ** created sfun_xN_ilp.mat **
    5. Просмотр или печать содержимого sfun_xN_ilp.mat файл для проверки того, что автономная модель генерирует синусоидальные выходные данные в диапазоне от -3 до + 3. В окне команды MATLAB введите

      load sfun_xN_ilp.mat
      plot (rt_yout)

Совет

Для платформ UNIX запустите исполняемую программу в окне команд с синтаксисом !./executable_name. При необходимости запустите исполняемую программу из оболочки ОС с синтаксисом ./executable_name. Дополнительные сведения см. в разделе Запуск внешних команд, сценариев и программ.

Связанные темы