Можно создать инициированную подсистему, выполнение которой определяется логикой, внутренней к S-функции MEX C вместо значением сигнала. Подсистема, так сконфигурированная, называется подсистемой вызова функций. Реализовывать подсистему вызова функций:
В блоке Trigger выберите вызов функции как Триггерный параметр типа.
В S-функции используйте
и ssEnableSystemWithTid
, чтобы включить или отключить инициированную подсистему и ssDisableSystemWithTid
макрос
, чтобы вызвать инициированную подсистему. ssCallSystemWithTid
В модели соедините Блок s-function вывод непосредственно к триггерному порту.
Связи вызова функции могут только быть выполнены на первом выходном порте.
Подсистемы вызова функций не выполняются непосредственно механизмом Simulink®; скорее S-функция определяет, когда выполнить подсистему. Когда подсистема завершает выполнение, управление возвращается к S-функции. Эта фигура иллюстрирует взаимодействие между подсистемой вызова функций и S-функцией.
В этой фигуре ssCallSystemWithTid
выполняет подсистему вызова функций, которая соединяется с первым элементом выходного порта. ssCallSystemWithTid
возвращается 0, если ошибка происходит при выполнении подсистемы вызова функций или если вывод не связан. После того, как подсистема вызова функций выполняется, управление возвращено в вашу S-функцию.
Подсистемы вызова функций могут только быть соединены с S-функциями, которые были правильно сконфигурированы, чтобы принять их.
Сконфигурировать S-функцию, чтобы вызвать подсистему вызова функций:
В mdlInitializeSizes
, набор тип данных S-функции первый выходной порт к вызову функции путем определения
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
или стандартной программе S-функции mdlUpdate
. Например:
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-функцию.
Первая подсистема вызова функций предоставляет синусоиде вывод. Вторая подсистема вызова функций является простой обратной связью, содержащей блок Unit Delay.
Когда Импульсный Генератор испускает свое верхнее значение, подсистема вызова функций, соединенная с первым элементом первого выходного порта S-функции, инициирована. Точно так же, когда Импульсный Генератор испускает свое нижнее значение, подсистема вызова функций, соединенная со вторым элементом, инициирована. Симуляцию вывод показывают на следующем Осциллографе.
Подсистемы вызова функций являются мощным построением моделирования. Можно сконфигурировать блоки Stateflow®, чтобы выполнить подсистемы вызова функций, таким образом, расширив возможности блоков. Для получения дополнительной информации см. документацию Stateflow.
ssCallSystemWithTid
| ssDisableSystemWithTid
| ssEnableSystemWithTid