Запись нелинейной S-функции

Нелинейная S-функция является S-функцией C или C++ MEX, которая обрабатывается идентично Simulink® движком и сгенерированным кодом. Вы реализуете свой алгоритм один раз согласно S-функции API. Механизм Simulink и сгенерированный код вызывают S-функцию стандартных программ (для примера, mdlOutputs) во время выполнения модели.

Неинлинфицированные S-функции идентифицируются отсутствием sfunction.tlc файл для вашей S-функции. Имя файла изменяется в зависимости от вашей платформы. Например, на 64-разрядной версии Microsoft® Windows® система, имя файла sfunction. mexw64. В MATLAB® Командное окно, введите mexext чтобы увидеть, какое расширение использует ваша система.

Инструкции по записи неинлинфицированных S-функций

  • Файл MEX не может вызвать функции MATLAB.

  • Если файл MEX использует функции в библиотеках внешнего интерфейса MATLAB, включите заголовочный файл cg_sfun.h вместо mex.h или simulink.c. Для файла заголовка cg_sfun.h, в конце вашей S-функции, включите следующие линии:

    #ifdef MATLAB_MEX_FILE /* Is this file being compiled as a MEX-file? */
    #include "simulink.c"  /* MEX-file interface mechanism */
    #else
    #include "cg_sfun.h"   /* Code generation registration function */
    #endif
  • Используйте только функцию MATLAB API, которую поддерживает генератор кода. Поддерживаемые функции API:

    • mxGetEps

    • mxGetInf

    • mxGetM

    • mxGetN

    • mxGetNaN

    • mxGetPr

    • mxGetScalar

    • mxGetString

    • mxIsEmpty

    • mxIsFinite

    • mxIsInf

  • Вызовы библиотеки MEX не поддерживаются в сгенерированном коде. Чтобы использовать такие вызовы в файле MEX, а не в сгенерированном коде, добавьте следующее условие:

    #ifdef MATLAB_MEX_FILE
    #endif
  • Используйте только полные матрицы, которые содержат только действительные данные.

  • Не указывайте значение возврата для вызовов mxGetString. Если вы задаете возврат значение, Файл MEX не компилируется. Вместо этого используйте второй входной параметр функции, который возвращает указатель на вектор символов.

  • Используйте правильный # define s-function_name оператор. Заданное имя S-функции должно совпадать с именем файла S-функции.

  • При возможности используйте типы данных real_T и int_T вместо double и int. Типы данных real_T и int_T являются более обобщенными и могут использоваться в нескольких окружениях.

  • Предоставьте процессу сборки имена модулей, используемых для создания S-функции. Используйте файл создания шаблона, set_param function, или S-function modules поле диалогового окна параметров блоков S-Function. Например, предположим, что вы создаете свою S-функцию с помощью этой команды:

    mex sfun_main.c sfun_module1.c sfun_module2.c

    Затем можно использовать следующий вызов для set_param для включения необходимых модулей:

    set_param(sfun_block, "SFunctionModules","sfun_module1 sfun_module2")

    Когда вы готовы сгенерировать код, заставьте генератор кода перестроить верхнюю часть модели. Для получения дополнительной информации смотрите Регенерация управления верхней части модели.

Нелинейные ограничения типа параметра S-функции

Параметры для нелинейных S-функций могут быть только следующих типов:

  • Двойная точность

  • Символы в скалярах, векторах или 2-D матрицах

Для большей гибкости в типе параметров, которые вы можете предоставить S-функциям или операциям в S-функции, встройте свою S-функцию и рассмотрите использование mdlRTW Стандартная программа S-функций.

Использование других функций из matrix.h MATLAB API или другие MATLAB API, такие как mex.h и mat.h, не поддерживаются. Если вы вызываете неподдерживаемые API из исходного файла S-функции, возникают ошибки компилятора. Для получения дополнительной информации о поддерживаемых функциях MATLAB API, смотрите файлы matlabroot/ rtw/c/src/rt_matrx.h и matlabroot/ rtw/c/src/rt_matrx.c

Если вы используете mxGetPr на пустой матрице функция не возвращается NULL. Это возвращает случайное значение. Поэтому необходимо защитить вызовы на mxGetPr при помощи mxIsEmpty.

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте