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 mdlDerivatives
. mdlUpdate
updates the discrete states when flag = 2
. Note that for a single-rate discrete S-function, Simulink calls the mdlUpdate
, mdlOutputs
, 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
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.
![]() | Simple M-File S-Function Example | Example - Hybrid System S-Function | ![]() |