Выполните любые действия, требуемые при завершении моделирования
Да
C, C++
void mdlTerminate(SimStruct *S)
S
SimStruct, представляющий Блок s-function.
Этот метод выполняет любые действия, такие как освобождение от памяти, которая должна быть выполнена, когда моделирование отключено или когда Блок s-function уничтожается (e. g., когда это удалено из модели). Этот метод называется в конце каждого моделирования в режиме Fast Restart.
В S-функциях MEX C метод mdlTerminate
называется после моделирования (mdlStart
называется).
Кроме того, если опция SS_OPTION_CALL_TERMINATE_ON_EXIT
будет установлена для данной S-функции, и если mdlInitializeSizes
будет назван, то пользователю гарантируют, тот Симулинк вызовет mdlTerminate
. Одна причина установить опцию SS_OPTION_CALL_TERMINATE_ON_EXIT
состоит в том, чтобы выделить память в mdlInitializeSizes
, а не ожидать до mdlStart
.
Обратите внимание на то, что Симулинк вызывает mdlInitializeSizes
при многих обстоятельствах, включая компиляцию и моделирование. Симулинк также вызовет 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)); } } }