# Guy and Seth on Simulink

## Continuous sample time inside For Each Subsystem

Back in 2010, I wrote a post explaining how to apply a scalar algorithm to a vector using the For Each subsystem. At that time, only discrete algorithms could be vectorized that way. In R2011b, the For Each subsystem now supports continuous sample times.

Let's look at a simple example.

Filtering sensors data

In multiple occasions in the past I ended up acquiring the signal of a slow rate sensor and using this signal into a fast rate controller. In order avoid feeding a discontinuous signal to my controller, I used to insert a Transfer Function block to filter the slow rate signal. A simplified version of this processing look like this:

The problem is that often the sensors do not provide a scalar value, but a vector. For example, a vision system can return the three components of a Cartesian position. In that case, I had to separate the components and filter them individually:

For a vector of three elements, this is not too bad. But I have seen models where hundreds of signals had to be separated and recombined. In R2011b, all you have to do is to put the Transfer Function block inside the For Each Subsystem, and it will adapt automatically to the number of elements of the input signal.

In addition to making the model easier to edit, it also speeds up the model initialization and generate more efficient code, because the model contains less blocks.

Now it's you turn

For a more complex example, I recommend looking at the demo titled Modeling Objects with Identical Dynamics using For Each Subsystem.

How are you going to take advantage of the continuous sample time support inside the For Each Subsystem? Modeling a farm of wind turbines? Multiple planes flying together? An army of identical robots? Leave a comment here.

### 7 Responses to “Continuous sample time inside For Each Subsystem”

1. Sean replied on :

I would like to make a plug for supporting the FOR-EACH subsystem in the HDL Coder. It seems like it should be relatively straight forward to map the FOR loop to an HDL FOR-GENERATE statement. That would add a significant amount of power to the product.

Just a thought.

2. Michael replied on :

Thank you for point this out. The way I previously solved the problem was by constructing the filter using “primitive blocks”: gain, integration and summation (as a state block diagram). This method has one advantage in that the resulting transfer function can be different for each element of the vector by using a diagonal matrix for the gain block.

3. Guy Rouleau replied on :

@Sean:

As you can guess, determining what will be the next feature supported by Simulink HDL coder is a question of prioritization.

I recommend contacting technical support with a description of your use case if this enhancement could have a significant effect on your application.

4. Guy Rouleau replied on :

@Michael:

You are bringing up an important point. Many Simulink blocks (like Gain, Sum and Integrator) support vectorization and do not need to be placed inside the For Each subsystem.

The For Each subsystem becomes useful when your algorithm requires blocks that do not support vectorization. Unfortunately, this is currently not possible to pass different sets of parameters to each iterations of the For Each. We are aware of this need and are looking into improving this in a future release.

5. Paul J. replied on :

Excellent addition! I was surprised that this feature wasn’t supported when the ForEachSubsystem was originally introduced, but glad to see it now. Does this block now support hybrid subsystems with continuous blocks and discrete blocks with different sample times? I see also that the block can support a Model Reference. Are there any constraints on the Model Reference other than that it can’t be running in Normal mode? I assume that just like other blocks, there is no way use different model arguments to the different iterations of the Model Reference?

Also, the link at the top of the post to the relevant page in the doc is pointing to the R2011A documentation.

6. Guy Rouleau replied on :

@Paul:

- Yes the For Each subsystem now supports hybrid systems containing multiple sample times, discrete and continuous.
- You are right when mentioning that you cannot pass different arguments or parameters for different iterations, this is something we are looking to improve in the future.
- Thanks you for mentioning the wrong link, it should be fixed now.

7. vinayaga murugan replied on :

is there simulink block to get signal from fuzzy logic output to a parallel signal to output help me sir

regards
vinayaga murugan

 Name (required) E-mail (required, will not be published) Website (optional) Spam protection (required): What is 1 + 7 ?

Wrap code fragments inside <pre> tags, like this:

<pre class="code">
a = magic(3);
sum(a)
</pre>


If you have a "<" character in your code, either follow it with a space or replace it with "&lt;" (including the semicolon).

Guy Rouleau and Seth Popinchalk are Application Engineers for MathWorks. They write here about Simulink and other MathWorks tools used in Model-Based Design.

These postings are the author's and don't necessarily represent the opinions of MathWorks.