Можно создать запускаемую подсистему, выполнение которой определяется логикой, внутренней для C MEX S-функции, а не значением сигнала. Сконфигурированная таким образом подсистема называется подсистемой функционального вызова. Для реализации подсистемы вызова функций:
В блоке Trigger выберите function-call в качестве параметра Trigger type.
В S-функции используйте и ssEnableSystemWithTid для включения или отключения запускаемой подсистемы и ssDisableSystemWithTid для вызова инициируемой подсистемы. ssCallSystemWithTid
В модели подключите выход блока S-Function непосредственно к порту триггера.
Примечание
Соединения с функциональным вызовом могут выполняться только на первом выходном порту.
Подсистемы вызова функций не выполняются непосредственно модулем Simulink ®; скорее S-функция определяет, когда выполнять подсистему. Когда подсистема завершает выполнение, управление возвращается к S-функции. На этом рисунке показано взаимодействие между подсистемой вызова функции и S-функцией.

На этом рисунке ssCallSystemWithTid выполняет подсистему функционального вызова, которая подключена к первому элементу выходного порта. ssCallSystemWithTid возвращает 0, если ошибка возникает при выполнении подсистемы вызова функции или если выход не подключен. После выполнения подсистемы вызова функции управление возвращается к S-функции.
Подсистемы вызова функций могут быть подключены только к S-функциям, которые были правильно сконфигурированы для их принятия.
Конфигурирование S-функции для вызова подсистемы вызова функции:
В mdlInitializeSizes, задайте тип данных первого выходного порта S-функции как function-call, указав
ssSetOutputPortDataType(S, 0, SS_FCN_CALL);
Укажите элементы, которые должны выполнять подсистему вызова функции в mdlInitializeSampleTimes. Например:
ssSetCallSystemOutput(S,0); /* call on first element */ ssSetCallSystemOutput(S,1); /* call on second element */
Указать в mdlInitializeSampleTimes должна ли S-функция включать или отключать подсистему вызова функций. Только S-функции, которые явно включают и отключают подсистему вызова функции, могут сбрасывать состояния и выходы подсистемы, как определено блоками триггера и исходящего порта подсистемы вызова функции. Например, код
ssSetExplicitFCSSCtrl(S, 1);
в mdlInitializeSampleTimes указывает, что S-функция может включать и отключать подсистему вызова функции. В этом случае S-функция должна вызывать ssEnableSystemWithTid перед выполнением подсистемы с помощью ssCallSystemWithTid.
Выполните подсистему в соответствующем mdlOutputs или mdlUpdate Подпрограмма S-функции. Например:
static void mdlOutputs(...)
{
if (((int)*uPtrs[0]) % 2 == 1) {
if (!ssCallSystemWithTid(S,0,tid)) {
/* Error occurred, which will be reported by */
/*the Simulink engine*/
return;
}
} else {
if (!ssCallSystemWithTid(S,1,tid)) {
/* Error occurred, which will be reported by */
/*the Simulink engine*/
return;
}
}
...
}
Посмотрите sfun_fcncall.c для примера, который выполняет подсистему вызова функции на первом и втором элементах первого вывода S-функции. Следующая модель Simulink (sfcndemo_sfun_fcncall) использует эту S-функцию.

Первая подсистема вызова функций обеспечивает синусоидальный выход. Вторая подсистема функционального вызова представляет собой простой контур обратной связи, содержащий блок единичной задержки.


Когда генератор импульсов выдает свое верхнее значение, запускается подсистема вызова функции, подключенная к первому элементу первого выходного порта S-функции. Аналогично, когда генератор импульсов излучает меньшее значение, запускается подсистема вызова функций, подключенная ко второму элементу. Выходные данные моделирования показаны в следующей области.

Подсистемы вызова функций являются мощной конструкцией моделирования. Можно настроить блоки Stateflow ® для выполнения подсистем вызова функций, расширяя тем самым возможности блоков. Дополнительные сведения см. в документации Stateflow.
ssCallSystemWithTid | ssDisableSystemWithTid | ssEnableSystemWithTid