Level-2 S-функции были введены в Simulink® версии 2.2. Level-1 S-функции относятся к S-функциям, которые были написаны для работы с Simulink версии 2.1 и предыдущими релизами. Level-1 S-функции совместимы с Simulink версии 2.2 и последующими релизами; можно использовать их в новых моделях, не внося никаких изменений в код. Однако, чтобы воспользоваться новыми возможностями в S-функциях, Level-1 S-функции должны быть обновлены до Level-2 S-функций. Вот некоторые рекомендации:
Начните, глядя на simulink/src/sfunctmpl_doc.c
. Этот файл шаблона S-функции кратко результирует Level-2 S-функции.
В верхней части файла 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
. The ssGetX
макрос удален.
Доступ к дискретным состояниям с помощью ssGetRealDiscStates(S)
. The ssGetX
макрос удален.
Для смешанных непрерывных и дискретных состояний S-функций вектор состояния больше не состоит из непрерывных состояний, за которыми следуют дискретные состояния. Состояния сохраняются в отдельных векторах и, следовательно, могут не быть смежными в памяти.
The 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
не передаются явно в Level-2 S-функции, вы должны использовать
ssGetInputPortSignal
для доступа к входам
ssGetOutputPortSignal
для доступа к выходам
ssGetContStates
или ssGetRealDiscStates
для доступа к состояниям
The 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
макросы. Полный список устаревших макросов см. в разделе Устаревшие макросы.
При преобразовании Level-1 S-функций в Level-2 S-функции вы должны создать свои S-функции с полным (то есть самым высоким) уровнем предупреждения. Для примера, если у вас есть gcc
в UNIX®[1] system, используйте эти опции с mex
утилита.
mex CC=gcc CFLAGS=-Wall sfcn.c
Если в вашей системе есть Lint, используйте этот код.
lint -DMATLAB_MEX_FILE -I<matlabroot>/simulink/include -Imatlabroot/extern/include sfcn.c
На ПК для использования наивысших уровней предупреждения необходимо создать файл проекта в интегрированной среде разработки (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 является зарегистрированным товарным знаком The Open Group в США и других странах.