exponenta event banner

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

Неинлинная S-функция - это C или C++ MEX S-функция, которая обрабатывается одинаково механизмом Simulink ® и сгенерированным кодом. Алгоритм реализуется один раз в соответствии с API S-функции. Механизм 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 функции или S-function modules в диалоговом окне «S-Function block parameters». Например, предположим, что вы создаете 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-функции.

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

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