mdlTerminate

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

Необходимый

Да

Языки

C, C++

Синтаксис

void mdlTerminate(SimStruct *S)

Аргументы

S

SimStruct, представляющий Блок s-function.

Описание

Этот метод выполняет любые действия, такие как освобождение от памяти, которая должна быть выполнена, когда симуляция отключена или когда Блок s-function уничтожается (например, когда это удалено из модели). Этот метод называется в конце каждой симуляции в режиме Fast Restart.

В 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 во время редактирования моделей, если вы выполните операцию, такую как установка параметров.

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

UNUSED_ARG(S)

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

Примечание

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

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

Оператор define делает метод mdlTerminate доступным только для файла MEX MATLAB®. Если 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