Невстроенная 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 не компилирует. Вместо этого используйте второй входной параметр функции, которая возвращает указатель на вектор символов.
Используйте правильный #define
оператор. S-имя-функции, которое вы задаете, должно совпадать с именем S-файла-функции.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-функцию и рассмотрите использование mdlRTW
Стандартная программа S-функции.
Использование других функций от matrix.h
MATLAB 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
.