Уровень 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
. Этот 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-функции с полным (т.е. самый высокий) предупреждение уровней. Например, если у вас есть 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 в Соединенных Штатах и других странах.