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