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:
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!
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.
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.
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
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:
***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:
If Action Subsystem:
***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:
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.
- Category:
- Code Generation,
- Signals,
- Simulink Tips,
- Stateflow
Comments
To leave a comment, please click here to sign in to your MathWorks Account or create a new one.