Simulink Control Design 

This example shows how to model computational delay and sampling effect using Simulink Control Design.
On this page… 

Simulating using Discrete and Continuous Controllers Designing the Compensator in the Discrete Domain Accounting for the Delays and Sampling Continuous Time Domain 
Computational delays and sampling effects can critically effect the performance of a control system. Typically, the closedloop responses of a system become oscillatory and unstable if these factors are not taken into account. Therefore, when modeling a control system, you should include computational delays and sampling effects to accurately design and simulate a closedloop system.
There are two approaches for designing compensators with the effects of computational delay and sampling. The first approach is to design a controller in the discrete domain to capture the effects of sampling by discretizing the plant. The second approach is to design a controller in the continuous domain. This approach is sometimes more convenient, but in this case you need to account for the effects of computational delay and sampling. In this example, you apply both approaches to redesign a control system using Simulink Control Design.
Simulating using Discrete and Continuous Controllers
In the following example model, the initial compensator has the following gains from the compensator in the example "Single Loop Feedback/Prefilter Design":
P = 0.0018222
I = 0.0052662
The first model has a discrete implementation of the control system.
mdl = 'scdspeed_compdelay';
open_system(mdl);
In this model, the block scdspeed_compdelay/Computational Delay models the effects of the computational delay. The delay is equal to the sample time of the controller, which is the worst case. A zero order hold block scdspeed_compdelay/ZeroOrder Hold models the effect of sampling on the response of the system. Finally, the speed controller (implemented with the PID Controller block) is discretized using a Forward Euler sampling method.
You can see the effect of the sampling by simulating the response of the system.
First, discretize the controller at Ts = 0.1:
Ts = 0.1; sim(mdl); T2 = simout.time; Y2 = simout.signals.values;
Next, discretize the controller at a increased sample time Ts = 0.25 seconds:
Ts = 0.25; sim(mdl); T3 = simout.time; Y3 = simout.signals.values;
The second model is a continuous model.
mdl_continuous = 'scdspeed_contcomp';
open_system(mdl_continuous);
Simulate the response of the continuous model:
sim(mdl_continuous); T1 = simout.time; Y1 = simout.signals.values;
Plot the simulation of both the discrete and continuous models. Note that the response becomes more oscillatory as the sample time is increased.
plot(T1,Y1,'k',T2,Y2,'r',T3,Y3,'g') xlabel('Time (sec.)') ylabel('Engine Speed Response'); legend('Continuous Controller','Ts = 0.1','Ts = 0.25'); grid
Designing the Compensator in the Discrete Domain
To remove the oscillatory effects of the closedloop system with the slowest sample time of Ts = 0.25, you need to redesign the compensator. First, redesign using a discretized version of the plant. You can redesign the compensator in a fashion similar to the example entitled "Single Loop Feedback/Prefilter Design". The tuned compensator has the following gains:
P = 0.00066155
I = 0.0019118795
set_param('scdspeed_compdelay/PID Controller','P','0.00066155'); set_param('scdspeed_compdelay/PID Controller','I','0.0019118795');
Simulate the resulting closedloop system with a sample time Ts = 0.25. You examine these results later in this example.
Ts = 0.25; sim(mdl); Td = simout.time; Yd = simout.signals.values;
Accounting for the Delays and Sampling Continuous Time Domain
As a second approach, redesign the controller with the continuous equivalents of the unit delay and zero order hold.
Set the zero order hold dynamics
on the block scdspeed_compdelay/ZeroOrder Hold by right clicking on the block and select Linear Analysis>Specify Linearization. The following block dialog opens to specify the zeroorder hold dynamics.
Also, specify the linearization as a zero order hold scdspeed_compdelay/ZeroOrder Hold with continuous representation. The following code is equivalent to entering these specifications into the specification dialog.
zohblk = 'scdspeed_compdelay/ZeroOrder Hold'; set_param(zohblk,'SCDEnableBlockLinearizationSpecification','on'); rep = struct('Specification','(1ss(1,''InputDelay'',Ts))*ss(0,1,1,0)/Ts',... 'Type','Expression',... 'ParameterNames','',... 'ParameterValues',''); set_param(zohblk,'SCDBlockLinearizationSpecification',rep);
Specify the linearization of the delay block scdspeed_compdelay/Computational Delay with a continuous transport delay.
Use these commands to specify the block linearization:
delayblk = 'scdspeed_compdelay/Computational Delay'; set_param(delayblk,'SCDEnableBlockLinearizationSpecification','on'); rep = struct('Specification','ss(1,''InputDelay'',Ts)',... 'Type','Expression',... 'ParameterNames','',... 'ParameterValues',''); set_param(delayblk,'SCDBlockLinearizationSpecification',rep);
The analysis of the controller design then remains in the continuous domain. Now, linearize the model with delays of Ts = 0.1 and 0.25. First, set the linearization I/O points:
io(1) = linio('scdspeed_compdelay/PID Controller',1,'input'); io(2) = linio('scdspeed_compdelay/ZeroOrder Hold',1,'openoutput');
Linearize the model at Ts = 0.1:
Ts = 0.1; sys2 = linearize(mdl,io);
Linearize the model at Ts = 0.25:
Ts = 0.25; sys3 = linearize(mdl,io);
Finally, linearize the model without the effects of sampling and the computational delay:
io(1) = linio('scdspeed_contcomp/PID Controller',1,'input'); io(2) = linio('scdspeed_contcomp/rad//s to rpm',1,'openoutput'); sys1 = linearize(mdl_continuous,io);
You can use the linear models of the engine to examine the effects of the computational delay on the frequency response. In this case, the phase response of the system is significantly reduced due to the delay introduced by sampling.
p = bodeoptions('cstprefs'); p.Grid = 'on'; p.PhaseMatching = 'on'; bodeplot(sys1,'k',sys2,'r',sys3,'g', {1e2,1e2},p); legend('Continuous Model','Ts = 0.1','Ts = 0.25','Location','SouthWest');
Using the model with the slowest sample time, redesign the compensator using the techniques in the example "Single Loop Feedback/Prefilter Design". This gives the following PI Gains:
set_param('scdspeed_compdelay/PID Controller','P','0.00065912'); set_param('scdspeed_compdelay/PID Controller','I','0.001898342');
Simulate the resulting closed loop system with a sample time Ts = 0.25:
sim(mdl); Tc = simout.time; Yc = simout.signals.values;
Plot the responses of the design. The redesign of the control system using both approaches yields similar controllers. This example shows the effects of the computational delay and discretization. These effects reduce the stability margins of the system, but when you properly model a control system you can achieve the desired closedloop behavior.
plot(T1,Y1,'k',T3,Y3,'b',Td,Yd,'m',Tc,Yc,'r') xlabel('Time (sec.)') ylabel('Engine Speed Response'); h = legend('cont. compensator (orig)','disc. compensator (orig)', ... 'disc. compensator (disc. redesign)',... 'disc. compensator (cont. redesign)',... 'Location','SouthEast'); grid bdclose('scdspeed_contcomp') bdclose('scdspeed_compdelay')