Невстроенная S-функция является C или S-функцией C++ MEX, которая обработана тождественно механизмом Simulink® и сгенерированным кодом. Вы реализуете свой алгоритм однажды согласно API S-функции. Код двигателя Simulink и сгенерированный код вызывают стандартные программы S-функции (например, mdlOutputs
) во время образцового выполнения.
Невстроенные S-функции идентифицированы отсутствием файла
для вашей S-функции. Имя файла отличается в зависимости от вашей платформы. Например, в 64-битной системе Microsoft® Windows®, именем файла является sfunction.tlc
. В Командном окне MATLAB® введите sfunction.mexw64
mexext
, чтобы видеть, какое расширение ваша система использует.
Файл 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")
Когда вы будете готовы сгенерировать код, обеспечьте генератор кода, чтобы восстановить топ-модель. Для получения дополнительной информации смотрите Регенерацию Управления Кода Топ-модели.
Параметры к невстроенным 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
.