Попросите механизм Simulink пропустить непрерывную проверку согласованности состояний
void ssSetSkipContStatesConsistencyCheck(SimStruct *S,boolean_T v)
S
SimStruct, представляющий блок s-function.
v
Логическое значение (boolean_T
) рассказывая Simulink® чтобы пропустить непрерывную проверку согласованности состояний.
Используйте этот макрос, чтобы попросить Simulink пропустить непрерывные проверки согласованности состояний для правильно написанной S-функции. Правильно написанная S-функция является той, которая использует ssSetSolverNeedsReset
макрос, когда он изменяет свое собственное непрерывное состояние во время основных временных шагов.
По умолчанию Simulink контролирует непрерывные изменения состояния в S-функциях. Он выдает предупреждения об изменениях, когда вы не используете ssSetSolverNeedsReset
макрос. Если вы используете ssSetSolverNeedsReset
макрос правильно, вы не должны иметь Simulink контролировать непрерывные изменения состояния в S-функциях и поэтому можете ускорить S-функцию и улучшить эффективность симуляции. Чтобы сказать Simulink, чтобы остановить мониторинг непрерывных изменений состояния, используйте ssSetSkipContStatesConsistencyCheck
макрос. Используйте этот макрос, если S-функция:
Никогда не меняет состояние.
Изменяет состояние, но использует ssSetSolverNeedsReset
макрос для сброса решателя.
Чтобы пропустить проверки, используйте ssSetSkipContStatesConsistencyCheck(S,1)
в mdlInitializeSizes
способ.
Примечание
По причинам производительности непрерывная проверка согласованности состояний выполняется только в симуляциях режима normal и Accelerator. В частности, Simulink не выполняет непрерывные проверки согласованности состояний для:
S-функции внутри блока Model, который находится в режиме Accelerator
Любая S-функция, если модель работает в режиме Rapid Accelerator
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); } }