Simulink - Change continuous state value at a given time point

Hello, I have a model with a Level-2 MATLAB S-Function simulating continuous states. At a given time point I want one of the continuous state values to increase by a given value. It is even not really important, that the value changes on exactly that time point.
I tried to solve it with a signal, that changes from 0 to the value at the time point and then used the Difference, or the Memory block to get the signal to only be the value at one timestep, otherwise 0. Then added the value to the continuous state in the s-function output. But with this method the value is somehow integrated and the increase of the continuous state much too high.
I am glad for any help.

 Accepted Answer

If you want to generate a "jump" in your continuous state, you must reset the block. This can be done in many ways. For example placing your block in an Enabled subsystem and turning it off for one sample and then on again. That way you should be able to reset your state to a desired value, for example coming from an input port or any other computation.

3 Comments

Thanks a lot Guy.
I am trying to use your recommended method.
As I understood it the trick about your method is, that the 'InitializeConditions' function of the S-Function block is called again. To do this I would set the "Output when disabled" parameter of the enabled subsystem to "held" and the "States when enabling" parameter to "reset". Since I assume, that the latter is necessary to call the 'InitializeConditions' method?
Then I would use the Dwork vector, as explained in the "mdlInitializeConditions"-documentation, together with (block.CurrentTime || 0), to indicate whether 'InitializeConditions' has been called again at a time>0 and initialize the continuous states in the output function.
My question is now, whether the continuous state values are still saved in the continuous state vector, after the s-function is "reset" this way?
I tried it now and it works as I explained. One has to make sure the input signal to the enabled subsystem with the s-function has to have the value to change the continuous state one time step ahead of disabling the subsystem.
Hello, I am struggeling with a similar problem and the given solution is generally working in my model as well. Thank you very much for that.
However, it seems that after re-enabling the subsystem, the solver continues running with larger time steps than it did when the simulation initially started. This causes in some cases too large gradients and a "crash" of my simulation.
I have found out that there is the "ssSetSolverNeedsReset"-function for CS-functions to reset the solver. Is there something similar for Matlab S-functions?
Thanks for any help.

Sign in to comment.

More Answers (1)

I'm curious about why you chose to use continuous states instead of discrete states if you do not need the state to be integrated. See my answer here for a brief explanation of continuous and discrete states in Simulink.

2 Comments

The continuous states are just usual continuous states. But the value that is added to one of the continuous states is "backpropagated?" by the solver. Since, when I use Euler instead of ode54, the value is added correctly.
The continuous states are integrated to answer your question.

Sign in to comment.

Categories

Find more on Simulink in Help Center and File Exchange

Products

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!