Активизация подсистемы вызова функции, подключенной к этой S-функции
int_T ssEnableSystemWithTid(SimStruct *S, int_T element, int_T tid)
SSimStruct представляет S-функциональный блок.
elementИндекс элемента выходного порта, соответствующего подсистеме функционального вызова.
tidИдентификатор задачи.
Один 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 приводит к ошибке.
Эффект вызова этой функции зависит от установки состояний при включении параметра триггерного блока подсистемы function-call. Если параметр имеет значение reset, эта функция вызывает метод инициализации подсистемы вызова функций, а затем его метод разрешения. Методы инициализации и включения подсистемы, в свою очередь, вызывают методы инициализации и включения любых блоков в подсистеме, имеющих эти методы. Методы инициализации сбрасывают состояния блоков, которые имеют состояния, например блоков интегратора, до их начальных значений. Таким образом, если для параметра «Состояния триггерного блока при включении» установлено значение reset, вызов этой функции эффективно сбрасывает состояния подсистемы вызова функции. Если для параметра Состояния триггерного блока при включении установлено значение 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 */