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