Уровень 2 S-функции были начаты с версии 2.2 Simulink®. Уровень 1 S-функции относятся к S-функциям, которые были записаны, чтобы работать с версией 2.1 Simulink и предыдущими релизами. Уровень 1 S-функции совместимы с версией 2.2 Simulink и последующими версиями; можно использовать их в новых моделях, не внося изменений кода. Однако, чтобы использовать в своих интересах новые возможности в S-функциях, S-функции Уровня 1 должны быть обновлены к S-функциям Уровня 2. Вот некоторые инструкции:
Запустите путем рассмотрения simulink/src/sfunctmpl_doc.c c. Этот шаблонный S-функциональный-файл кратко обобщает S-функции Уровня 2.
Наверху вашего S-функционального-файла добавьте, что это задает:
#define S_FUNCTION_LEVEL 2
Обновите содержимое mdlInitializeSizes. В частности, добавьте следующую обработку ошибок для количества S-параметров-функции:
ssSetNumSFcnParams(S, NPARAMS); /*Number of expected parameters*/
if (ssGetNumSFcnParams(S) != ssGetSFcnParamsCount(S)) {
/* Return if number of expected != number of actual parameters */
return;
}
Set up the inputs using:
if (!ssSetNumInputPorts(S, 1)) return; /*Number of input ports */
ssSetInputPortWidth(S, 0, width); /* Width of input
port one (index 0)*/
ssSetInputPortDirectFeedThrough(S, 0, 1); /* Direct feedthrough
or port one */
ssSetInputPortRequiredContiguous(S, 0);
Set up the outputs using:
if (!ssSetNumOutputPorts(S, 1)) return;
ssSetOutputPortWidth(S, 0, width); /* Width of output port
one (index 0) */
Если ваша S-функция имеет непустой mdlInitializeConditions, обновите ее к следующей форме:
#define MDL_INITIALIZE_CONDITIONS
static void mdlInitializeConditions(SimStruct *S)
{
}
В противном случае удалите функцию.
Доступ к непрерывным состояниям с помощью ssGetContStates. Макрос ssGetX был удален.
Доступ к дискретным состояниям с помощью ssGetRealDiscStates(S). Макрос ssGetX был удален.
Для смешанных S-функций непрерывного и дискретного состояния вектор состояния больше не состоит из непрерывных состояний, сопровождаемых дискретными состояниями. Состояния сохранены в отдельных векторах и следовательно не могут быть непрерывными в памяти.
Прототип mdlOutputs изменился от
static void mdlOutputs( real_T *y, const real_T *x, const real_T *u, SimStruct *S, int_T tid)
к
static void mdlOutputs(SimStruct *S, int_T tid)
Начиная с y x и u явным образом не передаются в S-функциям Уровня 2, необходимо использовать
ssGetInputPortSignal, чтобы получить доступ к входным параметрам
ssGetOutputPortSignal, чтобы получить доступ к выходным параметрам
ssGetContStates или ssGetRealDiscStates, чтобы получить доступ к состояниям
Прототип функции mdlUpdate изменился от
void mdlUpdate(real_T *x, real_T *u, Simstruct *S, int_T tid)
к
void mdlUpdate(SimStruct *S, int_T tid)
Если ваша S-функция имеет непустой mdlUpdate, обновите ее к этой форме:
#define MDL_UPDATE
static void mdlUpdate(SimStruct *S, int_T tid)
{
}
В противном случае удалите функцию.
Если ваша S-функция имеет непустой mdlDerivatives, обновите ее к этой форме:
#define MDL_DERIVATIVES
static void mdlDerivatives(SimStruct *S)
{
}
В противном случае удалите функцию.
Замените все устаревшие макросы SimStruct. Смотрите Устаревшие Макросы для полного списка устаревших макросов.
При преобразовании S-функций Уровня 1 в S-функции Уровня 2 необходимо создать S-функции с полным (i. e., самый высокий) предупреждение уровней. Например, если у вас есть gcc в системе UNIX® [1], используйте эти опции с утилитой mex.
mex CC=gcc CFLAGS=-Wall sfcn.c
Если ваша система имеет Линт, используйте этот код.
lint -DMATLAB_MEX_FILE -I<matlabroot>/simulink/include
-Imatlabroot/extern/include sfcn.c
На PC, чтобы использовать самые высокие уровни предупреждения, необходимо создать файл проекта в интегрированной среде разработки (IDE) для компилятора, который вы используете. В файле проекта задайте MATLAB_MEX_FILE и добавьте
matlabroot/simulink/include matlabroot/extern/include
к пути (убедиться создать с набором выравнивания к 8).
Следующие макросы являются устаревшими. Замените каждый устаревший макрос на макрос, заданный в следующей таблице.
Уровень 2 S-функция MATLAB | Функция MATLAB | S-функция | Разработчик S-функции
[1] UNIX является зарегистрированной торговой маркой Open Group в Соединенных Штатах и других странах.