Запишите невстроенную S-функцию

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

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

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

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

  • Если функции использования файла MEX в библиотеках MATLAB External Interface, включайте заголовочный файл 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-функцию. Используйте make-файл шаблона, функцию set_param или поле 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")

    Когда вы будете готовы сгенерировать код, обеспечьте генератор кода, чтобы восстановить топ-модель. Для получения дополнительной информации смотрите Регенерацию Управления Кода Топ-модели (Simulink Coder).

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

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

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

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

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

Использование других функций от API matrix.h MATLAB или других API MATLAB, таких как 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.

Похожие темы