Запись нелинейной 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.

Похожие темы