Overview of S-Functions
What Is an S-Function?
Using S-Functions in Models
Passing Parameters to S-Functions
When to Use an S-Function
How S-Functions Work
Mathematics of Simulink Blocks
Simulation Stages
S-Function Callback Methods
Implementing S-Functions
M-File S-Functions
MEX-File S-Functions
MEX-File Versus M-File S-Functions
S-Function Concepts
Direct Feedthrough
Dynamically Sized Arrays
Setting Sample Times and Offsets
S-Function Examples
M-File S-Function Examples
C S-Function Examples
Fortran S-Function Examples
C++ S-Function Examples
Ada S-Function Examples
Writing M S-Functions
Introduction
S-Function Arguments
S-Function Outputs
Defining S-Function Block Characteristics
Processing S-Function Parameters
Examples of M-File S-Functions
Simple M-File S-Function Example
Example - Continuous State S-Function
Example - Discrete State S-Function
Example - Hybrid System S-Function
Example - Variable Sample Time S-Function
Writing S-Functions in C
Introduction
Creating C MEX S-Functions
Building S-Functions Automatically
Deploying the Generated S-Function
How the S-Function Builder Builds an S-Function
S-Function Builder Dialog Box
Initialization Pane
Number of discrete states
Discrete states IC
Number of continuous states
Continuous states IC
Sample mode
Sample time value
Input port width
Output port width
Number of parameters
Data Properties Pane
Input Ports Pane
Port name
Dimensions
Row
Column
Complexity
Frame
Output Ports Pane
Port name
Dimensions
Row
Column
Complexity
Frame
Specifies whether this port accepts frame-based signals generated by the Digital and Signal Proce...
Parameters Pane
Parameter name
Complexity
Libraries Pane
Library/Object/Source files
Includes
External function declarations
Outputs Pane
Code for the mdlOutputs function
Inputs are needed in the output function
Continuous Derivatives Pane
Discrete Update Pane
Build Info Pane
Compilation diagnostics
Show compile steps
Create a debuggable MEX-file
Generate wrapper TLC
Save code only
Setting the Include Path
Example of a Basic C MEX S-Function
Defines and Includes
Callback Implementations
mdlInitializeSizes
mdlInitializeSampleTimes
mdlOutputs
mdlTerminate
Simulink/Real-Time Workshop Interface
Building the Timestwo Example
Templates for C S-Functions
S-Function Source File Requirements
Statements Required at the Top of S-Functions
Statements Required at the Bottom of S-Functions
The SimStruct
Compiling C S-Functions
How Simulink Interacts with C S-Functions
Process View
Calling Structure for the Real Time Workshop
Alternate Calling Structure for External Mode
Data View
Accessing Signals Using Pointers
Accessing Contiguous Input Signals
Accessing Input Signals of Individual Ports
Writing Callback Methods
Converting Level 1 C MEX S-Functions to Level 2
Obsolete Macros
Creating C++ S-Functions
Source File Format
Making C++ Objects Persistent
Building C++ S-Functions
Creating Ada S-Functions
Introduction
Ada S-Function Source File Format
Ada S-Function Specification
Ada S-Function Body
Writing Callback Methods in Ada
Callbacks Invoked by Simulink
Implementing Callbacks
Omitting Optional Callback Methods
SimStruct Functions
Building an Ada S-Function
Ada Compiler Requirements
Example of an Ada S-Function
Timestwo Package Specification
mdlInitializeSizes
mdlOutputs
Building the Timestwo Example
Creating Fortran S-Functions
Introduction
Level 1 Versus Level 2 S-Functions
Creating Level 1 Fortran S-Functions
The Fortran MEX Template File
Example
Inline Code Generation Example
Creating Level 2 Fortran S-Functions
Template File
C/Fortran Interfacing Tips
Mex Environment
Compiler Compatibility
Symbol Decorations
Fortran Math Library
CFortran
Obtaining a Fortran Compiler
Constructing the Gateway
Simple Case
Code with States
Setup Code
SUBROUTINE Versus PROGRAM
Arguments to a SUBROUTINE
Arguments to a FUNCTION
Interfacing to COMMON blocks
Example C-MEX S-Function Calling Fortran Code
Porting Legacy Code
Find the States
Sample Times
Multiple Instances
Use Flints If Needed
Considerations for Real Time
Implementing Block Features
Dialog Parameters
Tunable Parameters
Tuning Parameters in External Mode
Run-Time Parameters
Creating Run-Time Parameters
Creating Run-Time Parameters All at Once
Creating Run-Time Parameters Individually
Updating Run-Time Parameters
Updating All Parameters at Once
Updating Parameters Individually
Creating Input and Output Ports
Creating Input Ports
Initializing Input Port Dimensions
Sizing an Input Port Dynamically
Creating Output Ports
Scalar Expansion of Inputs
Masked Multiport S-Functions
Custom Data Types
Sample Times
Block-Based Sample Times
Specifying the Number of Sample Times in mdlInitializeSizes
Setting Sample Times and Specifying Function Calls in mdlInitializeSampleTimes
Example: mdlInitializeSampleTimes
Specifying Port-Based Sample Times
Specifying Inherited Sample Time for a Port
Specifying Constant Sample Time for a Port
Configuring Port-Based Sample Times for Use in Triggered Subsystems
Hybrid Block-Based and Port-Based Sample Times
Multirate S-Function Blocks
Example of Defining a Sample Time for a Continuous Block
Example of Defining a Sample Time for a Hybrid Block
Synchronizing Multirate S-Function Blocks
Work Vectors
Work Vectors and Zero Crossings
Example Involving a Pointer Work Vector
Memory Allocation
Function-Call Subsystems
Handling Errors
Exception Free Code
ssSetErrorStatus Termination Criteria
Checking Array Bounds
S-Function Examples
Example of a Continuous State S-Function
matlabroot/simulink/src/csfunc.c
Example of a Discrete State S-Function
matlabroot/simulink/src/dsfunc.c
Example of a Hybrid System S-Function
matlabroot/simulink/src/mixedm.c
Example of a Variable-Step S-Function
matlabroot/simulink/src/vsfunc.c
Example of a Zero Crossing S-Function
matlabroot/simulink/src/sfun_zc_sat.c
Example of a Time-Varying Continuous Transfer Function
matlabroot/simulink/src/stvctf.c
Writing S-Functions for Real-Time Workshop
Introduction
Classes of Problems Solved by S-Functions
Types of S-Functions
Noninlined S-Functions
Wrapper S-Functions
Fully Inlined S-Functions
Basic Files Required for Implementation
Noninlined S-Functions
S-Function Module Names for Real-Time Workshop Builds
Writing Wrapper S-Functions
MEX S-Function Wrapper
TLC S-Function Wrapper
How to Inline
The Inlined Code
Fully Inlined S-Functions
Multiport S-Function Example
Fully Inlined S-Function with the mdlRTW Routine
S-Function RTWdata
The Direct-Index Lookup Table Algorithm
The Direct-Index Lookup Table Example
Error Handling
User Data Caching
mdlRTW Usage
Example Model
matlabroot/simulink/src/sfun_directlook.c
matlabroot/simulink/src/lookup_index.c
matlabroot/toolbox/simulink/blocks/tlc_c/sfun_directlook.tlc
Creating Code-Reuse-Compatible S-Functions
S-Function Callback Methods
mdlCheckParameters
mdlDerivatives
mdlGetTimeOfNextVarHit
mdlInitializeConditions
mdlInitializeSampleTimes
mdlInitializeSizes
mdlOutputs
mdlProcessParameters
mdlRTW
mdlSetDefaultPortComplexSignals
mdlSetDefaultPortDataTypes
mdlSetDefaultPortDimensionInfo
mdlSetInputPortComplexSignal
mdlSetInputPortDataType
mdlSetInputPortDimensionInfo
mdlSetInputPortFrameData
mdlSetInputPortSampleTime
mdlSetInputPortWidth
mdlSetOutputPortComplexSignal
mdlSetOutputPortDataType
mdlSetOutputPortDimensionInfo
mdlSetOutputPortSampleTime
mdlSetOutputPortWidth
mdlSetWorkWidths
mdlStart
mdlTerminate
mdlUpdate
mdlZeroCrossings
SimStruct Functions
Introduction
Language Support
The SimStruct
SimStruct Macros and Functions Listed by Usage
Miscellaneous
Error Handling and Status
I/O Port
Dialog Box Parameters
Run-Time Parameters
Sample Time
State and Work Vector
Simulation Information
Function Call
Data Type
Real-Time Workshop
Macro Reference
ssCallExternalModeFcn
ssCallSystemWithTid
ssGetAbsTol
ssGetBlockReduction
ssGetContStateAddress
ssGetContStates
ssGetDataTypeId
ssGetDataTypeName
ssGetDataTypeSize
ssGetDataTypeZero
ssGetDiscStates
ssGetDTypeIdFromMxArray
ssGetDWork
ssGetDWorkComplexSignal
ssGetDWorkDataType
ssGetDWorkName
ssGetDWorkRTWIdentifier
ssGetDWorkRTWStorageClass
ssGetDWorkRTWTypeQualifier
ssGetDWorkUsedAsDState
ssGetDWorkWidth
ssGetdX
ssGetErrorStatus
ssGetInlineParameters
ssGetInputPortBufferDstPort
ssGetInputPortComplexSignal
ssGetInputPortConnected
ssGetInputPortDataType
ssGetInputPortDimensions
ssGetInputPortDirectFeedThrough
ssGetInputPortFrameData
ssGetInputPortNumDimensions
ssGetInputPortOffsetTime
ssGetInputPortOverWritable
ssGetInputPortRealSignal
ssGetInputPortRealSignalPtrs
ssGetInputPortRequiredContiguous
ssGetInputPortReusable
ssGetInputPortSampleTime
ssGetInputPortSampleTimeIndex
ssGetInputPortSignal
ssGetInputPortSignalAddress
ssGetInputPortSignalPtrs
ssGetInputPortWidth
ssGetIWork
ssGetIWorkValue
ssGetModelName
ssGetModeVector
ssGetModeVectorValue
ssGetNonsampledZCs
ssGetNumContStates
ssGetNumDataTypes
ssGetNumDiscStates
ssGetNumDWork
ssGetNumInputPorts
ssGetNumIWork
ssGetNumModes
ssGetNumNonsampledZCs
ssGetNumOutputPorts
ssGetNumParameters
ssGetNumRunTimeParams
ssGetNumPWork
ssGetNumRWork
ssGetNumSampleTimes
ssGetNumSFcnParams
ssGetOutputPortBeingMerged
ssGetOutputPortComplexSignal
ssGetOutputPortDataType
ssGetOutputPortDimensions
ssGetOutputPortFrameData
ssGetOutputPortNumDimensions
ssGetOutputPortOffsetTime
ssGetOutputPortRealSignal
ssGetOutputPortReusable
ssGetOutputPortSampleTime
ssGetOutputPortSignal
ssGetOutputPortSignalAddress
ssGetOutputPortWidth
ssGetParentSS
ssGetPath
ssGetPlacementGroup
ssGetPortBasedSampleTimeBlockIsTriggered
ssGetPWork
ssGetPWorkValue
ssGetRealDiscStates
ssGetRootSS
ssGetRunTimeParamInfo
ssGetRWork
ssGetRWorkValue
ssGetSampleTimeOffset
ssGetSampleTimePeriod
ssGetSFcnParam
ssGetSFcnParamsCount
ssGetSimMode
ssGetSolverMode
ssGetSolverName
ssGetStateAbsTol
ssGetStopRequested
ssGetT
ssGetTaskTime
ssGetTFinal
ssGetTNext
ssGetTStart
ssGetUserData
ssIsContinuousTask
ssIsFirstInitCond
ssIsMajorTimeStep
ssIsMinorTimeStep
ssIsSampleHit
ssIsSpecialSampleHit
ssIsVariableStepSolver
ssPrintf
ssRegDlgParamAsRunTimeParam
ssRegAllTunableParamsAsRunTimeParams
ssRegisterDataType
ssSampleAndOffsetAreTriggered
ssSetBlockReduction
ssSetCallSystemOutput
ssSetDataTypeSize
ssSetDataTypeZero
ssSetDWorkComplexSignal
ssSetDWorkDataType
ssSetDWorkName
ssSetDWorkRTWIdentifier
ssSetDWorkRTWStorageClass
ssSetDWorkRTWTypeQualifier
ssSetDWorkUsedAsDState
ssSetDWorkWidth
ssSetErrorStatus
ssSetExternalModeFcn
ssSetInputPortComplexSignal
ssSetInputPortDataType
ssSetInputPortDimensionInfo
ssSetInputPortDirectFeedThrough
ssSetInputPortFrameData
ssSetInputPortMatrixDimensions
ssSetInputPortOffsetTime
ssSetInputPortOverWritable
ssSetInputPortRequiredContiguous
ssSetInputPortReusable
ssSetInputPortSampleTime
ssSetInputPortSampleTimeIndex
ssSetInputPortVectorDimension
ssSetInputPortWidth
ssSetIWorkValue
ssSetModeVectorValue
ssSetNumContStates
ssSetNumDiscStates
ssSetNumDWork
ssSetNumInputPorts
ssSetNumIWork
ssSetNumModes
ssSetNumNonsampledZCs
ssSetNumOutputPorts
ssSetNumPWork
ssSetNumRunTimeParams
ssSetNumRWork
ssSetNumSampleTimes
ssSetNumSFcnParams
ssSetOffsetTime
ssSetOptions
ssSetOutputPortComplexSignal
ssSetOutputPortDataType
ssSetOutputPortDimensionInfo
ssSetOutputPortFrameData
ssSetOutputPortMatrixDimensions
ssSetOutputPortOffsetTime
ssSetOutputPortReusable
ssSetOutputPortSampleTime
ssSetOutputPortVectorDimension
ssSetOutputPortWidth
ssSetParameterName
ssSetParameterTunable
ssSetPlacementGroup
ssSetPWorkValue
ssSetRWorkValue
ssSetRunTimeParamInfo
ssSetSampleTime
ssSetSFcnParamNotTunable
ssSetSFcnParamTunable
ssSetSolverNeedsReset
ssSetStopRequested
ssSetTNext
ssSetUserData
ssSetVectorMode
ssUpdateAllTunableParamsAsRunTimeParams
ssUpdateRunTimeParamData
ssUpdateDlgParamAsRunTimeParam
ssUpdateRunTimeParamInfo
ssWarning
ssWriteRTW2dMatParam
ssWriteRTWMx2dMatParam
ssWriteRTWMxVectParam
ssWriteRTWParameters
ssWriteRTWParamSettings
ssWriteRTWScalarParam
ssWriteRTWStr
ssWriteRTWStrParam
ssWriteRTWStrVectParam
ssWriteRTWVectParam
ssWriteRTWWorkVect
Index