Уровень 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).
Следующие макросы являются устаревшими. Замените каждый устаревший макрос на макрос, заданный в следующей таблице.
Устаревший макрос | Замените на |
---|---|
ssGetU(S), ssGetUPtrs(S) | , ssGetInputPortSignal (S,port ) |
ssGetY(S) |
|
ssGetX(S) |
|
ssGetStatus(S) | Обычно не используемый, но доступно. |
ssSetStatus(S,msg) |
|
ssGetSizes(S) | Определенный призыв к требуемому элементу (т.е. ) |
ssGetMinStepSize(S) | Больше поддерживаемый |
ssGetPresentTimeEvent(S,sti) |
|
ssGetSampleTimeEvent(S,sti) |
|
ssSetSampleTimeEvent(S,t) |
|
ssGetOffsetTimeEvent(S,sti) |
|
ssSetOffsetTimeEvent(S,sti,t) |
|
ssIsSampleHitEvent(S,sti,tid)
|
|
ssGetNumInputArgs(S)
|
|
ssSetNumInputArgs(S, numInputArgs) |
|
ssGetNumArgs(S) |
|
ssGetArg(S,argNum) |
|
ssGetNumInputs | и
|
ssSetNumInputs | и
|
ssGetNumOutputs | и
|
ssSetNumOutputs | и
|
Level-2 MATLAB S-Function | MATLAB Function | S-Function | S-Function Builder
[1] UNIX является зарегистрированной торговой маркой Open Group в Соединенных Штатах и других странах.