Преобразуйте 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)
    

    Начиная с yX, и 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, порт), ssGetInputPortSignal(S,port)
ssGetY(S)ssGetOutputPortRealSignal(S, порт)
ssGetX(S)ssGetContStatesS, ssGetRealDiscStatesS
ssGetStatus(S) Обычно не используемый, но ssGetErrorStatusS доступно.
ssSetStatus(S,msg) ssSetErrorStatus(S, сообщение)
ssGetSizes(S) Определенный призыв к требуемому элементу (i.e., ssGetNumContStatesS)
ssGetMinStepSize(S)Больше поддерживаемый
ssGetPresentTimeEvent(S,sti)ssGetTaskTime(S, sti)
ssGetSampleTimeEvent(S,sti)ssGetSampleTime(S, sti)
ssSetSampleTimeEvent(S,t)ssSetSampleTime(S, stiT)
ssGetOffsetTimeEvent(S,sti)ssGetOffsetTime(S, sti)
ssSetOffsetTimeEvent(S,sti,t)ssSetOffsetTime(S, stiT)
ssIsSampleHitEvent(S,sti,tid) ssIsSampleHit(S, stiTID )
ssGetNumInputArgs(S) ssGetNumSFcnParamsS
ssSetNumInputArgs(S, numInputArgs)ssSetNumSFcnParams(S, numInputArgs)
ssGetNumArgs(S)ssGetSFcnParamsCountS
ssGetArg(S,argNum)ssGetSFcnParam(S, argNum)
ssGetNumInputsssGetNumInputPortsS и ssGetInputPortWidth(S, port)
ssSetNumInputsssSetNumInputPorts(S, nInputPorts) и ssSetInputPortWidth(S, port, val)
ssGetNumOutputsssGetNumOutputPortsS и ssGetOutputPortWidth(S, port)
ssSetNumOutputsssSetNumOutputPorts(S, nOutputPorts) и ssSetOutputPortWidth(S, port, val)

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

| | |

Похожие темы


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