Wednesday, October 30, 2013

Global variables

Just the other day I was running a program in Simulink and I found a problem with global variables. The solution finally was really easy but I wanted to share it with you.

First of all, in order to initializate global variables, we can go to my previous post 'Clock Pulses Counter' where I explained how to do  it in detail.

Back to the problem, I wanted to create an array of global variables in a Matlab function block. I realized that in order to do it, I just had to initializate the Data Store Memory into an array:
Array initialization Data Store Memory
Now, this global variable behaviours as an array.

Other thing I had to face was write and read a global variable out of a Matlab function block (in order to debug the code). Then I found some really interesting blocks: Data Store Read and Data Store Write, that allow us to read and write into the global variable.
Data Store Read
Data Store Write




With that, I wanted to implement an example with both combinations: write and read global variables in a Matlab function block and write and read the same global variables with the Data Store Read and Data Store Write blocks.

The example I thought was to generate a 3-array and the values will be incremented by 1 or by 5 depending on the block reading and writing the global variables. The result was the following:
Example: General Block Diagram
Then, inside the 'Increment counter with Matlab function block' we can find the following blocks:



Matlab function block
By including the Trigger block or Enable block inside a subsystem we make the subsystem triggered or enabled by the outside. The code inside the block was:

function fcn

global counter_array;
global index;

if index < 3
    counter_array(index) = counter_array(index) + 5; %add 5 to the value 
    index = index +1;
else
    counter_array(index) = counter_array(index) + 5; %last index value
    index = 1;    
end

Inside the 'Increment counter reading and writing global variable' we can found the following blocks:
Increment counter reading and writing global variable block

Now, inside the 'Index < 3' block:
Index < 3 block
Here, depending on if the index is 1 or 2 we will develop different performances. 
In the case of Index ==1:

Enable Add1

The value inside array(1) will be increased by 1 and also the index:
Index++

In the case of index different from 1, we want to keep the array(1) and array(3) values, since we are changing index = 2, so the diagram block will be:

Enable Add~1

In the case of 'Enable Add 2' and 'Enable Add~2' is the same as the blocks before but changing array(1) to array(2). 
Nevertheless, in the case Index = 3, the block diagram will be the following:
Index = 3
And inside index = 1 block is just as simple as write a constant = 1 inside the Data Store Variable.
Index = 1

Finally, the theoretical result of that example should be:
Index = 1     Array[3] = [0,0,0]
Index = 2     Array[3] = [5,0,0]
Index = 3     Array[3] = [5,1,0]
Index = 1     Array[3] = [5,1,5]
Index = 2     Array[3] = [6,1,5]
Index = 3     Array[3] = [6,6,5]
Index = 1     Array[3] = [6,6,6]
Index = 2     Array[3] = [11,6,6]
Index = 3     Array[3] = [11,7,6]
...

And the simulation we got was the following:
Example: Final Simulation
It can be seen that it is as expected.

Notice that is much more complicated read/write global variables with the 'Data Store Read' and 'Data Store Write' blocks than with the 'Matlab function' block. However, they are very useful in order to debug our code.

Hope this is useful and any comments with problems or recommendations are welcome!! See you soon!

Licencia Creative Commons

5 comments :

  1. I am facing this error, with my simulink model,, i have used data store memory block for my global variable,,,,
    The data type of Data Store Memory 'beta' used by a MATLAB Function Block cannot be set to 'auto' and must be known prior to type propagation. Please explicitly enter the data type in the Data Store Memory dialog.

    ReplyDelete
    Replies
    1. Hello!

      This is a typical error. It is because you need to initilize in the 'block parameters: Data Store Memory' the field 'Data Type'. By default it is set to 'auto' and you need to change it into double or int8 or the one you need it. There is an image upload in this post: 'Array initialization Data Store Memory' (the first picture) where you could see the field initialized.

      Hope this fixes your error! Thank you for your question!

      Delete
  2. Hi,
    I am facing a problem with dynamic array, actually the problem is I want to take signal data in to array with size of 200 and I have to update the array data for each cycle, please if one can help me it would be great.
    Thanks in advance
    Naveen

    ReplyDelete
  3. Hi,

    Thank you for your tutorials. It helped me a lot with Simulink. Have you ever encountered problem with multiple serial ports interfacing in Simulink.
    For me need to read from 3 sensors simultaneously and based on the input from the sensors I need to control the robotic end-effector. Individually all the sensors and end-effector are interfaced with simulink and I can read data accurately.

    However, when I run simulink model with two or more sensors simultaneously, there is a problem of data loss and inconsistent data. Simply if we have two sensors in the model, simulink can read only one sensor data accurately and the data read/ written to other sensor isn't reliable.

    I will appreciate your guidance. Thank you.

    ReplyDelete
  4. some years later but thanks for your post !

    ReplyDelete