mdlTerminate

Выполните любые действия, необходимые при прекращении симуляции

Необходимый

Да

Языки

C, C++

Синтаксис

void mdlTerminate(SimStruct *S)

Аргументы

S

SimStruct, представляющий блок S-Function.

Описание

Этот метод выполняет любые действия, такие как освобождение памяти, которые должны выполняться, когда симуляция завершена или когда блок S-Function уничтожен (например, когда он удален из модели). Этот метод вызывается в конце каждой симуляции в режиме быстрого перезапуска.

В S-функциях MEX на C, mdlTerminate метод вызывается после симуляции (mdlStart вызывается).

В сложение, если SS_OPTION_CALL_TERMINATE_ON_EXIT опция устанавливается для заданной S-функции, и если mdlInitializeSizes вызывается, тогда пользователю гарантируется, что Simulink вызовет mdlTerminate. Одна из причин задать SS_OPTION_CALL_TERMINATE_ON_EXIT опция - выделять память в mdlInitializeSizes вместо того, чтобы ждать до mdlStart.

Обратите внимание, что Simulink вызывает mdlInitializeSizes при ряде обстоятельств, включая компиляцию и симуляцию. Simulink также будет звонить mdlInitializeSizes во время редактирования моделей, если вы выполняете операцию, такую как установка параметров.

В C MEX S-функциях используйте UNUSED_ARG макрос, если mdlTerminate функция не выполняет никаких действий, требующих S SimStruct чтобы указать, что S входной параметр требуется, но не используется в теле коллбэка. Для этого вставьте линию

UNUSED_ARG(S)

после любых заявлений в mdlTerminate.

Примечание

Если у вас есть Simulink® Coder™ при генерации кода для неинлинфицированной S-функции C MEX, которая содержит этот метод, убедитесь, что метод не упакован в #if defined(MATLAB_MEX_FILE) оператор. Для примера:

#if defined(MATLAB_MEX_FILE) 
static void mdlTerminate(SimStruct *S) 
{ 
   /* Add mdlTerminate code here *
} 
#endif 

The define оператор делает mdlTerminate метод, доступный только для MATLAB® Файл MEX. Если S-функция не встроена, Simulink Coder не может использовать этот метод, что приводит к ошибкам ссылки или времени выполнения.

Пример

Предположим, ваша S-функция выделяет блоки памяти в mdlStart и сохраняет указатели на блоки в PWork вектор. Следующий фрагмент кода освободит эту память.

{
  int i;
  for (i = 0; i<ssGetNumPWork(S); i++) {
    if (ssGetPWorkValue(S,i) != NULL) {
      free(ssGetPWorkValue(S,i));
    }
  }
}

См. также

ssSetOptions, Terminate

Представлено до R2006a