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

Инструкции по преобразованию Level-1 C MEX S-Functions в Level-2

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)ssGetInputPortSignalPtrs(S, порт), ssGetInputPortSignal(S,port)
ssGetY(S)ssGetOutputPortRealSignal(S, порт)
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 является зарегистрированным товарным знаком The Open Group в США и других странах.