Guy on Simulink

Simulink & Model-Based Design

How do you hold the value of a signal?

Yesterday, I was giving a training to new hires at MathWorks and one of the attendees asked me how to hold a value in Simulink.

Of course, my answer was that there are many ways to hold a value in Simulink. I made him a few examples that I am sharing today in this post.

The Desired Behavior

I want to create a subsystem with two inputs, u and hold, and one output y. When hold is true, the output y is equal to the input u. When hold is zero, the output y remains constant, holding the last output value.

Here are example input and output signals:

Example Signals

Let's see a few ways to obtain such behavior

Method 1: Switch and Delay

The most common way to hold a value that I observe in customers models is using a Switch and a Unit Delay, or Memory block

Nice, clean and simple!

Holding a signal using a Switch and a Delay block

Method 2: Enabled Subsystem

Personally, my favorite way to hold a the value of a signal is using an Enabled Subsystem, with the Outport property Output when disabled set to held.

Holding a signal using a enabled subsystem

I like this method because it takes virtually no blocks.

Method 3: If Action Subsystems and Delay

This version is similar to the first method, but we replace the Switch by an arrangement of If Action Subsystems and a Merge block.

Holding a signal using If Action Subsystems

Personally, I don't use this syntax very often, mostly because it requires more blocks.

Method 4: Stateflow

Another easy way to obtain the behavior we are looking for is using Stateflow

Holding a signal using Stateflow

What about the generated code?

When choosing an implementation, many factors need to be taken into account. One of my favorite guidelines for was suggested by a reader of this blog: Clearly show the intended functionality. I will let you judge by yourself which implementation most clearly shows the intention of holding a signal.

Another concern that many users have is: What does the code look like?

In this case, all the methods generate similar code. to make the code easier to read for this post, I set the storage class of the three signals or interest (hold, u, y) to ExportedGlobal.

Switch and Delay:

Code for Holding a signal

***Note: To obtain the above code, I enabled inline parameters from the model configuration. Otherwise the threshold of the switch is a tunable parameter.

Enabled Subsystem:

Code for Holding a signal

If Action Subsystem:

Code for Holding a signal

***Note: To obtain the above code, I manually set the Function Packaging option of the If Action Subsystem to Inline. Otherwise, since the two subsystems are identical, the coder generates a reusable function.

Stafelow:

Code for Holding a signal

Now it's your turn

What is your preferred method to hold the value of a signal? Are there other functionalities for which you consider multiple implementations? Let us know by leaving a comment here.

|
  • print

Comments

To leave a comment, please click here to sign in to your MathWorks Account or create a new one.