Guy and Seth on Simulink
June 25th, 2012
Creating Your Own Block With Continuous States (MATLAB S-Function)
In a previous post, I showed an example of a MATLAB S-Function with a discrete state
This week, we continue in the same direction and implement an S-Function with a continuous state.
To begin, let's go back to the question posted on MATLAB Answers by K E:
What are continuous and discrete states in Simulink?
and see what Kaustubha Govind mentionned about continuous states:
With continuous states however, Simulink asks the block to provide a derivative (dx/dt) of the state in the Derivatives() method and uses its ODE solver to compute the integral of dx/dt to obtain 'x'. This 'x' can then be accessed in the Outputs() function. For example, to implement an Integrator block...
Let's stop here and see how to implement an Integrator block step by step.
In an S-Function, the continuous states are declared in the setup method:
Continuous states can not be hidden, like discrete states. There are many reason for this, for example, they are used by the Simulink solver to compute steps taken by the variable time-step solver.
For details on the DirectFeedthrough flag, look at the previous post about discrete states.
Like the discrete state, you need to initialize continuous states:
In the Outputs method, you can read the value of the continuous state and assign it to the output port:
Here is the most important part. When you have continuous states, you are not supposed to write to block.ContStates.Data, except for initialization. Instead, you specify the derivative of the states and write that to block.Derivatives.Data. For an Integrator block, the input is the derivative of the output:
The next time the output method will be called, the solver will have integrated the value specified in block.Derivatives.Data and stored the result in block.ContStates.Data.
The important thing to realize about continuous states is that the block provides the derivative of the states to the solver. The solver takes care of the integration and gives back to the block the result of the integration.
For an example like that, look at the demo model msfcndemo_limintm.mdl
Now it's your turn
Share your S-Function experiences by leaving a comment here.
Leave a Reply