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