Writing S-Functions

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

S-Function Concepts

Direct Feedthrough

Dynamically Sized Arrays

Setting Sample Times and Offsets

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

S-Function Builder Dialog Box

Setting the Include Path

Example of a Basic C MEX S-Function

Defines and Includes

Callback Implementations

Simulink/Real-Time Workshop Interface

Building the Timestwo Example

Templates for C S-Functions

S-Function Source File Requirements

The SimStruct

Compiling C S-Functions

How Simulink Interacts with C S-Functions

Process View

Data View

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

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

Constructing the Gateway

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

Run-Time Parameters

Creating Run-Time Parameters

Updating Run-Time Parameters

Creating Input and Output Ports

Creating Input Ports

Creating Output Ports

Scalar Expansion of Inputs

Masked Multiport S-Functions

Custom Data Types

Sample Times

Block-Based Sample Times

Specifying Port-Based Sample Times

Hybrid Block-Based and Port-Based Sample Times

Multirate S-Function Blocks

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

Example of a Discrete State S-Function

Example of a Hybrid System S-Function

Example of a Variable-Step S-Function

Example of a Zero Crossing S-Function

Example of a Time-Varying Continuous Transfer Function

Writing S-Functions for Real-Time Workshop

Introduction

Classes of Problems Solved by S-Functions

Types of 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

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

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

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

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


 Overview of S-Functions