Попросите, чтобы механизм 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
.
По причинам производительности непрерывная проверка на непротиворечивость состояния выполняется только в моделированиях режима Accelerator и нормальном. В частности, Simulink не выполняет непрерывные проверки на непротиворечивость состояния для:
S-функции в Блоке модели, который находится в Режиме Accelerator
Любая S-функция, если модель запускается в Быстром Режиме 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); } }