Documentation

This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English verison of the page.

Note: This page has been translated by MathWorks. Please click here
To view all translated materals including this page, select Japan from the country navigator on the bottom of this page.

Function-Call Subsystems and S-Functions

You can create a triggered subsystem whose execution is determined by logic internal to a C MEX S-function instead of by the value of a signal. A subsystem so configured is called a function-call subsystem. You cannot trigger a function-call subsystem from a Level-2 MATLAB® S-function. To implement a function-call subsystem:

  • In the Trigger block, select function-call as the Trigger type parameter.

  • In the S-function, use the ssEnableSystemWithTid and ssDisableSystemWithTid to enable or disable the triggered subsystem and the ssCallSystemWithTid macro to call the triggered subsystem.

  • In the model, connect the S-Function block output directly to the trigger port.

      Note   Function-call connections can only be performed on the first output port.

Function-call subsystems are not executed directly by the Simulink® engine; rather, the S-function determines when to execute the subsystem. When the subsystem completes execution, control returns to the S-function. This figure illustrates the interaction between a function-call subsystem and an S-function.

In this figure, ssCallSystemWithTid executes the function-call subsystem that is connected to the first output port element. ssCallSystemWithTid returns 0 if an error occurs while executing the function-call subsystem or if the output is unconnected. After the function-call subsystem executes, control is returned to your S-function.

Function-call subsystems can only be connected to S-functions that have been properly configured to accept them.

To configure an S-function to call a function-call subsystem:

  • In mdlInitializeSizes, set the data type of the S-function first output port to function-call by specifying

    ssSetOutputPortDataType(S, 0, SS_FCN_CALL); 

  • Specify the elements that are to execute the function-call subsystem in mdlInitializeSampleTimes. For example:

    ssSetCallSystemOutput(S,0);  /* call on first element */
    ssSetCallSystemOutput(S,1);  /* call on second element */
    
  • Specify in mdlInitializeSampleTimes whether you want the S-function to be able to enable or disable the function-call subsystem. Only S-functions that explicitly enable and disable the function-call subsystem can reset the states and outputs of the subsystem, as determined by the function-call subsystem's Trigger and Outport blocks. For example, the code

    ssSetExplicitFCSSCtrl(S, 1);
    

    in mdlInitializeSampleTimes specifies that the S-function can enable and disable the function-call subsystem. In this case, the S-function must invoke ssEnableSystemWithTid before executing the subsystem using ssCallSystemWithTid.

  • Execute the subsystem in the appropriate mdlOutputs or mdlUpdate S-function routine. For example:

    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;
          }
        }
        ...
    }
    

See sfun_fcncall.c for an example that executes a function-call subsystem on the first and second elements of the first S-function output. The following Simulink model (sfcndemo_sfun_fcncall) uses this S-function.

The first function-call subsystem provides a sine wave output. The second function-call subsystem is a simple feedback loop containing a Unit Delay block.

When the Pulse Generator emits its upper value, the function-call subsystem connected to the first element of the first S-function output port is triggered. Similarly, when the Pulse Generator emits its lower value, the function-call subsystem connected to the second element is triggered. The simulation output is shown on the following Scope.

Function-call subsystems are a powerful modeling construct. You can configure Stateflow® blocks to execute function-call subsystems, thereby extending the capabilities of the blocks. For more information, see the Stateflow documentation.

Was this topic helpful?