exponenta event banner

ssEnableSystemWithTid

Активизация подсистемы вызова функции, подключенной к этой S-функции

Синтаксис

int_T ssEnableSystemWithTid(SimStruct *S, int_T element, int_T tid)

Аргументы

S

SimStruct представляет 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-функцию для сброса состояний вызываемой ею подсистемы вызова функции. Код ниже показывает макросы, необходимые для двух обратных вызовов. mdlInitializeSampleTimes обратный вызов сначала указывает, что S-функция явно включает и отключает подсистему вызова функции. 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 */
Представлен до R2006a