Неинлинная S-функция - это C или C++ MEX S-функция, которая обрабатывается одинаково механизмом Simulink ® и сгенерированным кодом. Алгоритм реализуется один раз в соответствии с API S-функции. Механизм Simulink и сгенерированный код вызывают подпрограммы S-функции (например ,mdlOutputs) во время выполнения модели.
Неинлинные S-функции идентифицируются отсутствием файл для вашей S-функции. Имя файла зависит от платформы. Например, в 64-разрядной системе Microsoft ® Windows ® имя файла: sfunction.tlc. В окне команд MATLAB ® введитеsfunction.mexw64mexext для просмотра внутреннего номера, используемого системой.
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-функции должно совпадать с именем файла S-функции.s-function_name
По возможности используйте типы данных 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-функций могут быть только следующих типов:
Двойная точность
Символы в скалярах, векторах или 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.hmatlabroot/rtw/c/src/rt_matrx.c
Если вы используете mxGetPr на пустой матрице функция не возвращает NULL. Возвращает случайное значение. Поэтому необходимо защитить вызовы для mxGetPr с помощью mxIsEmpty.