Попросите, чтобы механизм 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
) для примера где и как использовать этот макрос.