Реализуйте подсистемы вызова функций с S-функциями

Можно создать триггируемую подсистему, выполнение которой определяется логикой внутренней функции MEX S на C вместо значения сигнала. Сконфигурированная подсистема называется подсистемой вызова функций. Для реализации подсистемы вызова функций:

  • В блоке Trigger выберите function-call в качестве параметра Trigger type.

  • В S-функции используйте ssEnableSystemWithTid и ssDisableSystemWithTid чтобы включить или отключить триггируемую подсистему и ssCallSystemWithTid макрос для вызова триггируемой подсистемы.

  • В модели соедините выход блока S-Function непосредственно с портом триггера.

    Примечание

    Function-call соединения могут выполняться только для первого выходного порта.

Подсистемы вызова функций не выполняются непосредственно 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-функции, которые явно включают и отключают подсистему вызова функций, могут сбрасывать состояния и выходы подсистемы, определяемые блоками 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.

См. также

| |

Похожие темы