Saturday, 4 January 2020

Introduction: Simulink Modeling

Contents

Train system

In this example, we will consider a toy train consisting of an engine and a car. Assuming that the train only travels in one dimension (along the track), we want to apply control to the train so that it starts and comes to rest smoothly, and so that it can track a constant speed command with minimal error in steady state.
The mass of the engine and the car will be represented by $M_1$ and $M_2$, respectively. Furthermore, the engine and car are connected via a coupling with stiffness $k$. In other words, the coupling is modeled as a spring with a spring constant $k$. The force $F$ represents the force generated between the wheels of the engine and the track, while $\mu$ represents the coefficient of rolling friction.

Free-body diagram and Newton's second law

The first step in deriving the mathematical equations that govern a physical system is to draw the free-body diagram(s) representing the system. This is done below for our train system.
From Newton's second law, we know that the sum of the forces acting on a body is equal to the product of the mass of the body and its acceleration. In this case, the forces acting on the engine $(M_1)$ in the horizontal direction are the spring force, the rolling resistance, and the force generated at the wheel/track interface. The forces acting on the train car $(M_2)$ in the horizontal direction are the spring force and the rolling resistance. In the vertical direction, the weight forces are balanced by the normal forces applied by the ground $(N = mg)$. Therefore, there will be no acceleration in the vertical direction.
We will model the spring as generating a force that is linearly proportional to the deformation of the spring, $k(x_1 - x_2)$, where $x_1$ and $x_2$ are the displacements of the engine and car, respectively. Here it is assumed that the spring is undeformed when $x_1$ and $x_2$ equal zero. The rolling resistance forces are modeled as being linearly proportional to the product of the corresponding velocities and normal forces (which are equal to the weight forces).
Applying Newton's second law in the horizontal direction based on the above free-body diagrams leads to the following governing equations for the train system.
(1)$$ \Sigma F_1 = F - k(x_1 - x_2) - \mu M_1 g \dot{x}_1 = M_1 \ddot{x}_1 $$
(2)$$ \Sigma F_2 = k(x_1 - x_2) - \mu M_2 g \dot{x}_2 = M_2 \ddot{x}_2 $$

Constructing the Simulink model

This set of system equations can now be represented graphically without further manipulation. Specifically, we will construct two copies (one for each mass) of the general expression $\Sigma F = ma$ or $a = (\Sigma F)/m$. First, open Simulink and open a new model window. Then drag two Sum blocks (from the Math Operations library) into your model window and place them approximately as shown in the figure below.
The outputs of each of these Sum blocks represents the sum of the forces acting on each mass. Multiplying each output signal by $1/M$ will give us the corresponding acceleration of each mass. Now drag two Gain blocks (from the Math Operations Library) into your model and attach each one with a line from the output of one of the Sum blocks. Label these two signals as "Sum_F1" and "Sum_F2" in order to make your model more clear. This is accomplished by double-clicking in the space above each of the two signal lines and entering the desired label.
These Gain blocks should contain $1/M$ for each of the masses. We will define the variables M1 and M2 in the MATLAB workspace, so we can just enter the corresponding variable names in each of the Gain blocks. Double-click on the upper Gain block and enter "1/M1" into the Gain field. Similarly, enter "1/M2" in the Gain field of the second Gain block.
You will notice that the gains did not appear in the image of the Gain blocks, rather the blocks display a value of -K-. This is because the blocks are too small on the screen to show the full variable name inside the triangle. The blocks can be resized so that the actual gain value can be seen. To resize a block, select it by clicking on it once. Small squares will appear at the corners. Drag one of these squares to stretch the block. Your model should appear as below.
The outputs of these gain blocks are the accelerations of each of the masses (the train engine and car). The governing equations we derived above depend on the velocities and displacements of the masses. Since velocity can be determined by integrating acceleration, and position can be determined by integrating velocity, we can generate these signals employing integrator blocks. Drag a total of four Integrator blocks from the Continuous library into your model, two for each of our two accelerations. Connect these blocks and label the signals as shown below. Specifically, the first integrator takes the acceleration of mass 1 ("x1_ddot") as an input and generates the velocity of mass 1 ("x1_dot"). The second integrator then takes this velocity and outputs the displacement of the first mass ("x1"). The same pattern holds for the integrators for the second mass.
Now, drag two Scopes from the Sinks library into your model and connect them to the outputs of these integrators. Label them "x1" and "x2".
Now we are ready to add the forces acting on each mass. First, we need to adjust the inputs on each Sum block to represent the proper number of forces (we will worry about the signs later). Since there is a total of three forces acting on mass 1, double-click on the corresponding Sum block and change the List of signs field to "|+++". The symbol "|" serves as a spacer. There are only 2 forces acting on mass 2, therefore, we can leave that Sum block alone for now.
The first force acting on mass 1 is just the input force, $F$. Drag a Signal Generator block from the Sources library and connect it to the uppermost input of the corresponding Sum block. Label this signal as "F".
The next force acting on mass 1 is the rolling resistance force. Recall that this force is modeled as follows.
(3)$$ F_{rr,1} = \mu g M_1 \dot{x}_1 $$
To generate this force, we can tap off the velocity signal and multiply by an appropriate gain. Drag a Gain block into your model window. Tap off the "x1_dot" signal and connect it to the input of this new Gain block (draw this line in several steps if necessary). Connect the output of the Gain block to the second input of the Sum block. Double-click the Gain block and enter "mu*g*M1" into the Gain field. The rolling resistance force, however, acts in the negative direction. Therefore, change the list of signs of the Sum block to "|+-+". Next, resize the Gain block to display the full gain and label the output of the Gain block "Frr1". Your model should now appear as follows.
The last force acting on mass 1 is the spring force. Recall that this force is equal to the following.
(4)$$ F_s = k(x_1-x_2) $$
Therefore, we need to generate a signal $(x_1-x_2)$ which we can then be multiplied by a gain $k$ to create the force. Drag a Subtraction block (or a Sum block or an Addition block) below the rest of your model. In order to change the direction of this block, right-click on the block and choose Rotate & Flip > Flip block from the resulting menu. Alternatively, you can select the block then hit Ctrl-I. Now, tap off the "x2" signal and connect it to the negative input of the Subtract block. Also, tap off the "x1" signal and connect it to the positive input. This will cause signal lines to cross. Lines may cross, but they are only actually connected where a small circle appears (such as at a tap point).
Now, we can multiply this difference by the spring constant to generate the spring force. Drag a Gain block into your model to the left of the Subtraction block. Change the value of the Gain block to "k" and connect the output of the Subtract block to its input. Then connect the output of the Gain block to the third input of the Sum block for mass 1 and label the signal "Fs". Since the spring force acts on mass 1 in the negative direction, it is necessary to again change the list of signs of the Sum block to "|+--". Your model should appear as follows.
We can now apply forces to mass 2. For the first force, we will use the same spring force we just generated, except that it is applied to mass 2 in the positive direction. Simply tap off the spring force signal "Fs" and connect it to the first input of the Sum block for mass 2.
The last force applied to mass 2 is its rolling resistance force. This force is generated in an analogous manner to the rolling resistance force applied to mass 1. Tap off the signal "x2_dot" and multiply it by a Gain block with value "mu*g*M2". Then connect the output of the Gain block to the second input of the corresponding Sum block and label the signal "Frr2". Changing the second input of the Sum block to be negative will lead to the following model.
Now the model is complete. We simply need to supply the proper input and define the output of interest. The input to the system is the force $F$ generated by the engine. Within the Simulink model, we have already defined the force $F$ to be the output of a Signal Generator block. The output of the system, which we will observe and ultimately try to control, will be the velocity of the train engine. Add another Scope block to your model from the Sinks library. Tap a line from the "x1_dot" signal and connect it to the Scope block. Label this scope as "x1_dot" and your model should appear as in the following.
Now, the model is complete and should be saved. You can also download the completed model by right-clicking here and then selecting Save link as ....

Running the model

Before running the model, we need to assign numerical values to each of the variables used in the model. For the train system, we will employ the following values.
  • $M_1$ = 1 kg
  • $M_2$ = 0.5 kg
  • $k$ = 1 N/sec
  • $F$ = 1 N
  • $\mu$ = 0.02 sec/m
  • $g$ = 9.8 m/s^2
Create a new m-file and enter the following commands.
M1 = 1;
M2 = 0.5;
k  = 1;
F  = 1;
mu = 0.02;
g  = 9.8;
Execute your m-file in the MATLAB command window to define these values. Simulink will recognize these MATLAB variables for use in the model.
Now, we need to give an appropriate input to the engine. Double-click on the Signal Generator block (outputs "F"). Select square from the Wave form drop-down menu and set the Frequency field to equal "0.001". You may leave the Units as the default Hertz. Also enter "-1" into the Amplitude field (positive amplitude steps negative before stepping positive).
The last step before running the simulation is to select an appropriate simulation time. To view one cycle of the 0.001 Hz square wave, we should simulate the model for 1000 seconds. Select Model Configuration Parameters from the Simulation menu at the top of the model window and change the Stop Time field to "1000". Close the dialog box.
Now, run the simulation and open the "x1_dot" scope to examine the velocity output. The input was a square wave with two steps, one positive and one negative. Physically, this means that the engine first went forward, then backward. The velocity output reflects this.
In this page we derived the mathematical model for the train system from first principles and then represented the derived equations within Simulink. An alternative option that is now available is to represent a dynamic system employing the physical modeling tool Simscape. Simscape is an addition to Simulink that allows a user to model a system employing blocks that represent physical quantities (and objects) such as inertias and joints, or resistors and inductors. Employing Simscape allows the user to simulate a physical system without deriving the governing mathematical equations.
Continuing on to the Introduction: Simulink Control page, we will employ the model derived in this page to demonstrate how to use Simulink to design the control for our train system.

Friday, 3 January 2020

Simulink Basics Tutorial

Simulink Basics Tutorial

Simulink is a graphical extension to MATLAB for modeling and simulation of systems. One of the main advantages of Simulink is the ability to model a nonlinear system, which a transfer function is unable to do. Another advantage of Simulink is the ability to take on initial conditions. When a transfer function is built, the initial conditions are assumed to be zero.

Contents

In Simulink, systems are drawn on screen as block diagrams. Many elements of block diagrams are available, such as transfer functions, summing junctions, etc., as well as virtual input and output devices such as function generators and oscilloscopes. Simulink is integrated with MATLAB and data can be easily transfered between the programs. In these tutorials, we will apply Simulink to the examples from the MATLAB tutorials to model the systems, build controllers, and simulate the systems. Simulink is supported on Unix, Macintosh, and Windows environments; and is included in the student version of MATLAB for personal computers. For more information on Simulink, please visit the MathWorks home.
The idea behind these tutorials is that you can view them in one window while running Simulink in another window. System model files can be downloaded from the tutorials and opened in Simulink. You will modify and extend these system while learning to use Simulink for system modeling, control, and simulation. Do not confuse the windows, icons, and menus in the tutorials for your actual Simulink windows. Most images in these tutorials are not live - they simply display what you should see in your own Simulink windows. All Simulink operations should be done in your Simulink windows.

Starting Simulink

Simulink is started from the MATLAB command prompt by entering the following command:
simulink
Alternatively, you can hit the Simulink button at the top of the MATLAB window as shown here:
When it starts, Simulink brings up a single window, entitled Simulink Start Page which can be seen here.
Once you click on Blank Model, a new window will appear as shown below.

Model Files

In Simulink, a model is a collection of blocks which, in general, represents a system. In addition to creating a model from scratch, previously saved model files can be loaded either from the File menu or from the MATLAB command prompt. As an example, download the following model file by right-clicking on the following link and saving the file in the directory you are running MATLAB from.
Open this file in Simulink by entering the following command in the MATLAB command window. (Alternatively, you can load this file using the Open option in the File menu in Simulink, or by hitting Ctrl-O in Simulink).
simple
The following model window should appear.
A new model can be created by selecting New from the File menu in any Simulink window (or by hitting Ctrl-N).

Basic Elements

There are two major classes of items in Simulink: blocks and lines. Blocks are used to generate, modify, combine, output, and display signals. Lines are used to transfer signals from one block to another.
Blocks
There are several general classes of blocks within the Simulink library:
  • Sources: used to generate various signals
  • Sinks: used to output or display signals
  • Continuous: continuous-time system elements (transfer functions, state-space models, PID controllers, etc.)
  • Discrete: linear, discrete-time system elements (discrete transfer functions, discrete state-space models, etc.)
  • Math Operations: contains many common math operations (gain, sum, product, absolute value, etc.)
  • Ports & Subsystems: contains useful blocks to build a system
Blocks have zero to several input terminals and zero to several output terminals. Unused input terminals are indicated by a small open triangle. Unused output terminals are indicated by a small triangular point. The block shown below has an unused input terminal on the left and an unused output terminal on the right.
Lines
Lines transmit signals in the direction indicated by the arrow. Lines must always transmit signals from the output terminal of one block to the input terminal of another block. On exception to this is a line can tap off of another line, splitting the signal to each of two destination blocks, as shown below (right-click here and then select Save link as ... to download the model file called split.slx).
Lines can never inject a signal into another line; lines must be combined through the use of a block such as a summing junction.
A signal can be either a scalar signal or a vector signal. For Single-Input, Single-Output (SISO) systems, scalar signals are generally used. For Multi-Input, Multi-Output (MIMO) systems, vector signals are often used, consisting of two or more scalar signals. The lines used to transmit scalar and vector signals are identical. The type of signal carried by a line is determined by the blocks on either end of the line.

Simple Example

The simple model consists of three blocks: Step, Transfer Function, and Scope. The Step is a Source block from which a step input signal originates. This signal is transferred through the line in the direction indicated by the arrow to the Transfer Function Continuous block. The Transfer Function block modifies its input signal and outputs a new signal on a line to the Scope. The Scope is a Sink block used to display a signal much like an oscilloscope.
There are many more types of blocks available in Simulink, some of which will be discussed later. Right now, we will examine just the three we have used in the simple model.
Modifying Blocks
A block can be modified by double-clicking on it. For example, if you double-click on the Transfer Function block in the Simple model, you will see the following dialog box.
This dialog box contains fields for the numerator and the denominator of the block's transfer function. By entering a vector containing the coefficients of the desired numerator or denominator polynomial, the desired transfer function can be entered. For example, to change the denominator to
(1)$$
s^2 + 2s + 4
$$
enter the following into the denominator field
[1 2 4]
and hit the close button, the model window will change to the following,
which reflects the change in the denominator of the transfer function.
The Step block can also be double-clicked, bringing up the following dialog box.
The default parameters in this dialog box generate a step function occurring at time = 1 sec, from an initial level of zero to a level of 1 (in other words, a unit step at t = 1). Each of these parameters can be changed. Close this dialog before continuing.
The most complicated of these three blocks in the Scope block. Double-clicking on this brings up a blank oscilloscope screen.
When a simulation is performed, the signal which feeds into the scope will be displayed in this window. Detailed operation of the scope will not be covered in this tutorial.

Running Simulations

To run a simulation, we will work with the following model file:
simple2.slx (right-click and then select Save link as ...)
Download and open this file in Simulink following the previous instructions for this file. You should see the following model window.
Before running a simulation of this system, first open the scope window by double-clicking on the scope block. Then, to start the simulation, either select Run from the Simulation menu, click the Play button at the top of the screen, or hit Ctrl-T.
The simulation should run very quickly and the scope window will appear as shown below.
Note that the step response does not begin until t = 1. This can be changed by double-clicking on the step block. Now, we will change the parameters of the system and simulate the system again. Double-click on the Transfer Function block in the model window and change the denominator to:
[1 20 400]
Re-run the simulation (hit Ctrl-T) and you should see the following in the scope window.
Since the new transfer function has a very fast response, it compressed into a very narrow part of the scope window. This is not really a problem with the scope, but with the simulation itself. Simulink simulated the system for a full ten seconds even though the system had reached steady state shortly after one second.
To correct this, you need to change the parameters of the simulation itself. In the model window, select Model Configuration Parameters from the Simulation menu. You will see the following dialog box.
There are many simulation parameter options; we will only be concerned with the start and stop times, which tell Simulink over what time period to perform the simulation. Change Start time from 0.0 to 0.8 (since the step doesn't occur until t = 1.0). Change Stop time from 10.0 to 2.0, which should be only shortly after the system settles. Close the dialog box and rerun the simulation. Now, the scope window should provide a much better display of the step response as shown below.

Building Systems

In this section, you will learn how to build systems in Simulink using the building blocks in Simulink's Block Libraries. You will build the following system.
If you would like to download the completed model, right-click here and then select Save link as ....
First, you will gather all of the necessary blocks from the block libraries. Then you will modify the blocks so they correspond to the blocks in the desired model. Finally, you will connect the blocks with lines to form the complete system. After this, you will simulate the complete system to verify that it works.
Gathering Blocks
Follow the steps below to collect the necessary blocks:
  • Create a new model (New from the File menu or hit Ctrl-N). You will get a blank model window.
  • Click on the Tools tab and then select Library Browser.
  • Then click on the Sources listing in the Simulink library browser.
  • This will bring up the Sources block library. Sources are used to generate signals.
  • Drag the Step block from the Sources window into the left side of your model window.
  • Click on the Math Operations listing in the main Simulink window.
  • From this library, drag a Sum and Gain block into the model window and place them to the right of the Step block in that order.
  • Click on the Continuous listing in the main Simulink window.
  • First, from this library, drag a PID Controller block into the model window and place it to the right of the Gain block.
  • From the same library, drag a Transfer Function block into the model window and place it to the right of the PID Controller block.
  • Click on the Sinks listing in the main Simulink window.
  • Drag the Scope block into the right side of the model window.
Modify Blocks
Follow these steps to properly modify the blocks in your model.
  • Double-click on the Sum block. Since you will want the second input to be subtracted, enter +- into the list of signs field. Close the dialog box.
  • Double-click the Gain block. Change the gain to 2.5 and close the dialog box.
  • Double-click the PID Controller block and change the Proportional gain to 1 and the Integral gain to 2. Close the dialog box.
  • Double-click the Transfer Function block. Leave the numerator [1], but change the denominator to [1 2 4]. Close the dialog box. The model should appear as:
  • Change the name of the PID Controller block to PI Controller by double-clicking on the word PID Controller.
  • Similarly, change the name of the Transfer Function block to Plant. Now, all the blocks are entered properly. Your model should appear as:
Connecting Blocks with Lines
Now that the blocks are properly laid out, you will now connect them together. Follow these steps.
  • Drag the mouse from the output terminal of the Step block to the positive input of the Sum input. Another option is to click on the Step block and then Ctrl-Click on the Sum block to connect the two togther. You should see the following.
  • The resulting line should have a filled arrowhead. If the arrowhead is open and red, as shown below, it means it is not connected to anything.
  • You can continue the partial line you just drew by treating the open arrowhead as an output terminal and drawing just as before. Alternatively, if you want to redraw the line, or if the line connected to the wrong terminal, you should delete the line and redraw it. To delete a line (or any other object), simply click on it to select it, and hit the delete key.
  • Draw a line connecting the Sum block output to the Gain input. Also draw a line from the Gain to the PI Controller, a line from the PI Controller to the Plant, and a line from the Plant to the Scope. You should now have the following.
  • The line remaining to be drawn is the feedback signal connecting the output of the Plant to the negative input of the Sum block. This line is different in two ways. First, since this line loops around and does not simply follow the shortest (right-angled) route so it needs to be drawn in several stages. Second, there is no output terminal to start from, so the line has to tap off of an existing line.
  • Drag a line off the negative portion of the Sum block straight down and release the mouse so the line is incomplete. From the endpoint of this line, click and drag to the line between the Plant and the Scope. The model should now appear as follows.
  • Finally, labels will be placed in the model to identify the signals. To place a label anywhere in the model, double-click at the point you want the label to be. Start by double-clicking above the line leading from the Step block. You will get a blank text box with an editing cursor as shown below.
  • Type an r in this box, labeling the reference signal and click outside it to end editing.
  • Label the error (e) signal, the control (u) signal, and the output (y) signal in the same manner. Your final model should appear as:
To save your model, select Save As in the File menu and type in any desired model name. The completed model can be downloaded by right-clicking here and then selecting Save link as ....
Simulation
Now that the model is complete, you can simulate the model. Select Run from the Simulation menu to run the simulation. Double-click on the _Scope_block to view its output and you should see the following:
Taking Variables from MATLAB
In some cases, parameters, such as gain, may be calculated in MATLAB to be used in a Simulink model. If this is the case, it is not necessary to enter the result of the MATLAB calculation directly into Simulink. For example, suppose we calculated the gain in MATLAB in the variable K. Emulate this by entering the following command at the MATLAB command prompt.
K = 2.5
This variable can now be used in the Simulink Gain block. In your Simulink model, double-click on the Gain block and enter the following the Gain field.
K
Close this dialog box. Notice now that the Gain block in the Simulink model shows the variable K rather than a number.
Now, you can re-run the simulation and view the output on the Scope. The result should be the same as before.
Now, if any calculations are done in MATLAB to change any of the variables used in the Simulink model, the simulation will use the new values the next time it is run. To try this, in MATLAB, change the gain, K, by entering the following at the command prompt.
K = 5
Start the Simulink simulation again and open the Scope window. You will see the following output which reflects the new, higher gain.
Besides variables and signals, even entire systems can be exchanged between MATLAB and Simulink.