Выполните любые действия, требуемые при завершении симуляции
Да
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 называется, затем пользователю гарантируют, тот 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));
}
}
}