Преобразуйте S-функции уровня 1 C MEX

Инструкции для преобразования S-функций уровня 1 C MEX к уровню 2

Уровень 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)ssGetInputPortSignalPtrs(S,port), ssGetInputPortSignal (S,port)
ssGetY(S)ssGetOutputPortRealSignal(S,port)
ssGetX(S)ssGetContStates(S), ssGetRealDiscStates(S)
ssGetStatus(S) Обычно не используемый, но ssGetErrorStatus(S) доступно.
ssSetStatus(S,msg) ssSetErrorStatus(S,msg)
ssGetSizes(S) Определенный призыв к требуемому элементу (т.е. ssGetNumContStates(S))
ssGetMinStepSize(S)Больше поддерживаемый
ssGetPresentTimeEvent(S,sti)ssGetTaskTime(S,sti)
ssGetSampleTimeEvent(S,sti)ssGetSampleTime(S,sti)
ssSetSampleTimeEvent(S,t)ssSetSampleTime(S,sti,t)
ssGetOffsetTimeEvent(S,sti)ssGetOffsetTime(S,sti)
ssSetOffsetTimeEvent(S,sti,t)ssSetOffsetTime(S,sti,t)
ssIsSampleHitEvent(S,sti,tid) ssIsSampleHit(S,sti,tid)
ssGetNumInputArgs(S) ssGetNumSFcnParams(S)
ssSetNumInputArgs(S, numInputArgs)ssSetNumSFcnParams(S,numInputArgs)
ssGetNumArgs(S)ssGetSFcnParamsCount(S)
ssGetArg(S,argNum)ssGetSFcnParam(S,argNum)
ssGetNumInputsssGetNumInputPorts(S) и ssGetInputPortWidth(S,port)
ssSetNumInputsssSetNumInputPorts(S,nInputPorts) и ssSetInputPortWidth(S,port,val)
ssGetNumOutputsssGetNumOutputPorts(S) и ssGetOutputPortWidth(S,port)
ssSetNumOutputsssSetNumOutputPorts(S,nOutputPorts) и ssSetOutputPortWidth(S,port,val)

Смотрите также

| | |

Похожие темы


[1]  UNIX является зарегистрированной торговой маркой Open Group в Соединенных Штатах и других странах.