Попросите механизм Simulink сбросить решатель
void ssSetSolverNeedsReset(SimStruct *S)
S
SimStruct, представляющий блок S-Function или Simulink® модель.
Используйте ssSetSolverNeedsReset
макрос, когда происходит изменение в динамике S-функции, которое может повлиять на решатель ОДУ. Примером изменения является разрыв в непрерывном состоянии S-функции или разрыв в его выходе, который управляет другими непрерывными блоками. S-функция должна изменять свой непрерывный вектор состояния только в основном временном шаге. Не изменяйте значения непрерывного состояния в незначительных временных шагах.
Разрыв в состоянии или выходе непрерывной S-функции может сделать недействительными кэшированное состояние и информацию производной в решателе ОДУ. Используйте ssSetSolverNeedsReset
макрос, чтобы решатель ОДУ повторно инициализировал кэшированную информацию на следующем шаге интегрирования. Непрерывные изменения состояния без сбросов решателя небезопасны. Изменение непрерывных состояний без использования ssSetSolverNeedsReset
макрос может привести к неправильным результатам, поскольку решатель ОДУ может игнорировать эти изменения для защиты внутренней согласованности своих данных и результатов интегрирования. Только инициализируйте состояния в основные временные шаги. Алгоритмы интегрирования не ожидают изменения векторов состояния в течение незначительных временных шагов.
Примечание
При использовании этого макроса, для эффективности проблем, рассмотрите также использование ssSetSkipContStatesConsistencyCheck(S,1)
в mdlInitializeSizes
способ. ssSetSkipContStatesConsistencyCheck
отключает мониторинг непрерывных состояний S-функции со стороны Simulink, улучшая эффективность симуляции.
Примечание
Когда симуляция многопоточна, она пропускает сброс решателя и игнорирует использование этого макроса.
C, C++
Следующий пример использует этот макрос, чтобы попросить механизм Simulink сбросить решатель.
static void mdlOutputs(SimStruct *S, int_T tid) { : : <snip> : if ( ssIsMajorTimeStep(S) && YourConditionsForStateChange ) { double *x = ssGetContStates(S); /* reset the states */ for (i=0; i<nContStates; i++) { x[i] = 0.0; } /* Ask the Simulink engine to reset the solver. */ ssSetSolverNeedsReset(S); } }
Также см. исходный код изменяющейся во времени непрерывной передаточной функции (stvctf.c
) для примера, где и как использовать этот макрос.