Попросите Simulink Engine пропустить проверку согласованности непрерывного состояния
void ssSetSkipContStatesConsistencyCheck(SimStruct *S,boolean_T v)
SSimStruct представляет S-функциональный блок.
vЛогическое значение (boolean_T) указание Simulink ® пропустить проверку согласованности непрерывного состояния.
Используйте этот макрос, чтобы попросить Simulink пропустить непрерывные проверки согласованности состояний для правильно записанной S-функции. Правильно записанная S-функция использует ssSetSolverNeedsReset макро при изменении собственного непрерывного состояния во время основных временных шагов.
По умолчанию Simulink отслеживает непрерывные изменения состояния S-функций. Он выдает предупреждения об изменениях, когда вы не используете ssSetSolverNeedsReset макро. Если вы используете ssSetSolverNeedsReset макрос правильно, вам не нужно, чтобы Simulink отслеживал непрерывные изменения состояния в S-функциях и, следовательно, может ускорить S-функцию и повысить производительность моделирования. Чтобы сообщить Simulink прекратить мониторинг постоянных изменений состояния, используйте ssSetSkipContStatesConsistencyCheck макро. Используйте этот макрос, если функция S:
Никогда не меняет состояние.
Изменяет состояние, но использует ssSetSolverNeedsReset для сброса решателя.
Чтобы пропустить проверки, используйте ssSetSkipContStatesConsistencyCheck(S,1) в mdlInitializeSizes способ.
Примечание
По причинам производительности непрерывная проверка непротиворечивости состояния выполняется только при моделировании в обычном и ускорительном режиме. В частности, Simulink не выполняет непрерывную проверку непротиворечивости состояний для:
S-функции внутри блока модели, находящегося в режиме ускорителя
Любая S-функция, если модель работает в режиме быстрого ускорения
C, C++
В следующем примере этот макрос используется для запроса модуля Simulink на пропуск проверки согласованности, поскольку S-функция правильно реализовала изменение состояния в своем mdlOutputs способ.
static void mdlInitializeSizes(SimStruct *S)
{
:
: <snip>
: ssSetSkipContStatesConsistencyCheck(SimStruct S,1);
:
: <snip>
:
static void mdlOutputs(SimStruct *S, int_T tid)
} /* end mdlInitializeSizes */
static void mdlOutputs(SimStruct *S, int_T tid)
{
/* Change states in major time step only */
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);
}
}