Включите подсистему вызова функций, соединенную с этой S-функцией
int_T ssEnableSystemWithTid(SimStruct *S, int_T element, int_T tid)
S
SimStruct, представляющий Блок s-function.
element
Индекс элемента выходного порта, соответствующего подсистеме вызова функций.
tid
ID задачи.
int_T
1
если успешный; в противном случае,
0
.
Используйте в mdlOutputs
включить подсистему вызова функций, соединенную с S-функцией. Синтаксис вызова
if (!ssEnableSystemWithTid(S, element, tid)) { /* Error occurred which will be reported by the Simulink engine*/ return; }
Примечание
Прежде, чем вызвать эту функцию, S-функция, должно быть, указала, что это явным образом включает и отключает подсистемы вызова функций, которые это вызывает. Смотрите ssSetExplicitFCSSCtrl
для получения дополнительной информации. Если S-функция не сделала этого, вызов ssEnableSystemWithTid
результаты по ошибке.
Эффект вызова этой функции зависит от установки Штатов при включении параметра блока Trigger подсистемы вызова функций. Если параметр устанавливается на reset
, эта функция вызывает подсистему вызова функций, инициализируют метод и затем разрешать метод. Подсистема инициализирует и включает методы, в свою очередь вызывают инициализирование и включают методы любых блоков в подсистеме, которые имеют эти методы. Инициализируйте методы, сбрасывает состояния блоков, которые имеют состояния, например, блоки Integrator, к их начальным значениям. Таким образом, если состояния блока Trigger при включении опции установлены в reset
, вызов этой функции эффективно сбрасывает состояния подсистемы вызова функций. Если состояния блока Trigger при включении опции установлены в held
, эта функция просто вызывает подсистему, включают метод, не вызывая инициализировать метод и следовательно не сбрасывая его состояния.
C, C++
В этом примере показано, как сконфигурировать S-функцию, чтобы сбросить состояния подсистемы вызова функций, она вызывает. Код ниже показов макросы необходим в двух коллбэках.
коллбэк сначала указывает, что S-функция явным образом включает и отключает подсистему вызова функций. mdlInitializeSampleTimes
коллбэк затем обрабатывает фактическое включение и отключение подсистемы вызова функций для того, чтобы сбросить состояния.mdlOutputs
Следующий код в mdlInitializeSampleTimes
использование ssSetExplicitFCSSCtrl
позволять S-функции явным образом включить и отключить подсистему вызова функций. ssSetCallSystemOutput
затем указывает, что подсистема вызова функций вызывается первым элементом первого выходного порта S-функции.
static void mdlInitializeSampleTimes(SimStruct *S) { ssSetSampleTime(S, 0, 0.1); ssSetOffsetTime(S, 0, 0.0); /* Explicitly enable/disable function-call subsystem */ ssSetExplicitFCSSCtrl(S,1); /* Call function-call subsystem on first element */ ssSetCallSystemOutput(S,0); ssSetModelReferenceSampleTimeDefaultInheritance(S); } /* End mdlInitializeSampleTimes */
mdlOutputs
коллбэк показывают ниже. Это сначала использует ssEnableSystemWithTid
включить подсистему вызова функций в начале симуляции. Подсистема вызова функций должна быть включена, прежде чем она сможет быть названа с помощью ssCallSystemWithTid
. После того, как симуляция запустилась в течение 10 секунд, mdlOutputs
коллбэк вызывает ssDisableSystemWithTid
отключить подсистему вызова функций. Путем вызова ssEnableSystemWithTid
снова, подсистема вызова функций повторно включена, и состояния сбрасываются.
static void mdlOutputs(SimStruct *S, int_T tid) { real_T *x = ssGetRealDiscStates(S); real_T *y = ssGetOutputPortRealSignal(S,1); time_T t = ssGetT(S); /* Simulation time */ /* Enable function-call subsystem at start of simulation */ if (t==0) { if (!ssEnableSystemWithTid(S,0,tid)) { return; } } /* Call function-call subsystem */ if (!ssCallSystemWithTid(S,0,tid)) { return; } /* Disable/re-enable function-call subsystem when time = 10 */ if (t==10) { if (!ssDisableSystemWithTid(S,0,tid)) { return; } if (!ssEnableSystemWithTid(S,0,tid)) { return; } } y[0] = x[0]; } /* End mdlOutputs */
ssCallSystemWithTid
, ssDisableSystemWithTid
, ssSetExplicitFCSSCtrl