timesN Обзор учебного пособияЦель: Понять, как работает TLC с S-функцией.
Папка:
(открыто)matlabroot/toolbox/rtw/rtwdemos/tlctutorial/timesN
В этом учебном пособии вы создадите версии кода C для существующей S-функции timesN.
Учебное пособие включает следующие шаги:
Создание неинлинированного кода - через SimStructs и общий API
Зачем использовать TLC для встроенных S-функций? - Преимущества встраивания
Создание встроенной S-функции - с помощью пользовательского кода TLC
В более позднем учебном пособии содержится информация и практические рекомендации по «свертыванию» S-функций.
Папка учебного пособия tlctutorial/timesN в рабочей папке содержится S-функция Simulink ® timesN.c.
В этом упражнении мы создадим неинлинный код из модели sfun_xN.
Найти файл rename_timesN.tlc в tlctutorial/timesN. Переименовать этот файл в timesN.tlc. Это позволяет создавать код.
В окне команд MATLAB ® создайте файл MEX для функции S:
mex timesN.c
Это позволяет избежать выбора версии, поставляемой с Simulink.
Открытие модели sfun_xN, которая использует timesN S-функция. Блок-схема выглядит следующим образом.

Откройте диалоговое окно Параметры конфигурации (Configuration Parameters) и выберите панель Решатель (Solver).
Установить время остановки на 10.0.
Задайте опции решателя.
Введите для Fixed-step
Решатель для Discrete (no continuous states)
Фиксированный размер шага до 0.01
Выберите панель Оптимизация (Optimization) и убедитесь, что для параметра Поведение по умолчанию (Default parameter behavior) задано значение Tunable.
Выберите панель «Создание кода» > «Комментарии» и обратите внимание, что по умолчанию установлен флажок «Включить комментарии».
Выберите панель Создание кода (Code Generation) и установите флажок Только генерировать код (Generate code only).
Нажмите кнопку «Применить».
Нажмите Ctrl + B, чтобы создать код C для модели.
Открыть результирующий файл 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);
}Комментарии появляются в коде, поскольку на панели «Создание кода» > «Комментарии» диалогового окна «Параметры конфигурации» по умолчанию выбран параметр «Включить комментарии».
Генератор кода включает общий API, который можно использовать для вызова написанных пользователем алгоритмов и драйверов. API включает в себя различные функции обратного вызова - для инициализации, вывода, производных, завершения и т.д., а также структуры данных. После кодирования они создаются в памяти и вызываются во время выполнения посредством непрямых вызовов функций. Каждый вызов включает в себя кадры стека и другие служебные данные, которые увеличивают время выполнения.
В среде реального времени, особенно когда задействовано множество шагов решения, общие вызовы API могут быть недопустимо медленными. Генератор кода может ускорить S-функции в автономных приложениях, которые он генерирует, встраивая написанные пользователем алгоритмы в автоматически сгенерированные функции, а не косвенно вызывая S-функции через общий API. Эта форма оптимизации называется встроением. TLC встроен в S-функции, что приводит к более быстрому, оптимизированному коду.
Следует понимать, что TLC не является заменой для записи S-функций кода C. Для вызова пользовательских блоков в Simulink по-прежнему необходимо записывать S-функции в C (или в виде файлов MATLAB), поскольку моделирование не использует файлы TLC. Однако можно подготовить TLC-файлы, которые встроены в определенные S-функции, чтобы сделать целевой код намного более эффективным.
TLC создает встроенную S-функцию всякий раз, когда она обнаруживает .tlc с тем же именем, что и S-функция. Предполагая .tlc файл имеет ожидаемую форму, он направляет построение кода, который функционально дублирует внешнюю S-функцию без дополнительных затрат API. Чтобы узнать, как работает этот процесс, выполните следующие действия.
Если вы еще не сделали этого, найдите файл 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Создайте встроенную версию S-функции.
На панели Оптимизация (Optimization) диалогового окна Параметры конфигурации (Configuration Parameters) задайте для параметра Поведение по умолчанию (Default parameter behavior Inlinedи нажмите кнопку «Применить».
Изменение метки схемы с model: sfun_xN кому model: sfun_xN_ilp.
Сохранить модель как sfun_x2_ilp.
Нажмите Ctrl + B. Исходные файлы создаются в новой подпапке с именемsfun_xN_ilp_grt_rtw.
Проверка кода в созданном файле 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-функции.
Продолжите упражнение, создав автономное моделирование.
На панели Создание кода (Code Generation) диалогового окна Параметры конфигурации (Configuration Parameters) снимите флажок Только генерировать код (Generate only) и нажмите кнопку Применить (Apply).
На панели Импорт/экспорт данных (Data Import/Export) диалогового окна Параметры конфигурации (Configuration Parameters) установите флажок Вывод (Output).
Эта спецификация приводит к регистрации выходных данных модели в рабочей области MATLAB.
Нажмите Ctrl + B, чтобы создать код, скомпилировать и связать модель с исполняемым файлом с именемsfun_xN_ilp.exe (или в системах UNIX ® ,sfun_xN_ilp).
Подтвердите, что timesN.tlc создает ожидаемые выходные данные путем запуска автономного исполняемого файла. Для ее выполнения в окне команд MATLAB введите
!sfun_xN_ilp
Появится следующий ответ:
** starting the model ** ** created sfun_xN_ilp.mat **
Просмотр или печать содержимого sfun_xN_ilp.mat файл для проверки того, что автономная модель генерирует синусоидальные выходные данные в диапазоне от -3 до + 3. В окне команды MATLAB введите
load sfun_xN_ilp.mat plot (rt_yout)
Совет
Для платформ UNIX запустите исполняемую программу в окне команд с синтаксисом !./executable_name. При необходимости запустите исполняемую программу из оболочки ОС с синтаксисом ./executable_name. Дополнительные сведения см. в разделе Запуск внешних команд, сценариев и программ.