Включите подсистему вызова функций, подключенное к этой S-функции
int_T ssEnableSystemWithTid(SimStruct *S, int_T element, int_T tid)
S
SimStruct, представляющий блок S-Function.
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
приводит к ошибке.
Эффект вызова этой функции зависит от настройки состояний при включении параметра блока 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 */
The 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 */