Writing S-Functions | ![]() ![]() |
Example - Discrete State S-Function
Simulink includes a function called dsfunc.m
, which is an example of a discrete state system modeled in an S-function. This function is similar to csfunc.m
, the continuous state S-function example. The only difference is that mdlUpdate
is called instead of mdlDerivative
. mdlUpdate
updates the discrete states when the flag = 2
. Note that for a single-rate discrete S-function, Simulink calls the mdlUpdate
, mdlOutput
, and mdlGetTimeOfNextVarHit
(if needed) routines only on sample hits. Here is the code for the M-file S-function.
function [sys,x0,str,ts] = dsfunc(t,x,u,flag) % An example M-file S-function for defining a discrete system. % This S-function implements discrete equations in this form: % x(n+1) = Ax(n) + Bu(n) % y(n) = Cx(n) + Du(n) % % Generate a discrete linear system: A=[-1.3839 -0.5097 1.0000 0]; B=[-2.5559 0 0 4.2382]; C=[ 0 2.0761 0 7.7891]; D=[ -0.8141 -2.9334 1.2426 0]; switch flag, case 0 sys = mdlInitializeSizes(A,B,C,D); % Initialization case 2 sys = mdlUpdate(t,x,u,A,B,C,D); % Update discrete states case 3 sys = mdlOutputs(t,x,u,A,B,C,D); % Calculate outputs case {1, 4, 9} % Unused flags sys = []; otherwise error(['unhandled flag = ',num2str(flag)]); % Error handling end % End of dsfunc. %============================================================== % Initialization %============================================================== function [sys,x0,str,ts] = mdlInitializeSizes(A,B,C,D) % Call simsizes for a sizes structure, fill it in, and convert it % to a sizes array. sizes = simsizes; sizes.NumContStates = 0; sizes.NumDiscStates = 2; sizes.NumOutputs = 2; sizes.NumInputs = 2; sizes.DirFeedthrough = 1; % Matrix D is non-empty. sizes.NumSampleTimes = 1; sys = simsizes(sizes); x0 = ones(2,1); % Initialize the discrete states. str = []; % Set str to an empty matrix. ts = [1 0]; % sample time: [period, offset] % End of mdlInitializeSizes. %============================================================== % Update the discrete states %============================================================== function sys = mdlUpdates(t,x,u,A,B,C,D) sys = A*
x + B*
u; % End of mdlUpdate. %============================================================== % Calculate outputs %============================================================== function sys = mdlOutputs(t,x,u,A,B,C,D) sys = C*
x + D*
u; % End of mdlOutputs.
The above example conforms to the simulation stages discussed earlier in chapter 1. The system discrete state equations are of the form
x(n+1) = Ax(n) + Bu(n) y(n) = Cx(n) + Du(n)
so that very general sets of difference equations can be modeled using dsfunc.m
. This is similar to the built-in Discrete State-Space block. You can use dsfunc.m
as a starting point for modeling discrete state-space systems with time-varying coefficients.
![]() | Examples of M-File S-Functions | Example - Hybrid System S-Functions | ![]() |