How can I write a Level-2 MATLAB S-Function where the input and output might have unknown dimensions, or even be variable-size signals?
5 views (last 30 days)
Show older comments
MathWorks Support Team
on 21 May 2018
Edited: MathWorks Support Team
on 30 Sep 2021
I need to write a Level-2 MATLAB S-Function where the input and/or output dimensions are unknown, and might also change during simulation.
Specifically, I would like to implement the two following scenarios:
A) Input: 1-D array of unknown fixed size. Two outputs: sorted array, and sum of all the elements.
B) Same as A), but the size of the array might vary during simulation.
How can I achieve this?
Accepted Answer
MathWorks Support Team
on 30 Sep 2021
Edited: MathWorks Support Team
on 30 Sep 2021
A)
In the setup function of your MATLAB S-Function, you need to configure port properties to be inherited or dynamic:
>> block.SetPreCompInpPortInfoToDynamic;>> block.SetPreCompOutPortInfoToDynamic;
You can then override the only properties that you known, as for example:
>> block.InputPort(1).DatatypeID = 0;>> block.InputPort(1).Complexity = 'Real';>> block.InputPort(1).DirectFeedthrough = true;
>> block.OutputPort(1).DatatypeID = 0;>> block.OutputPort(1).Complexity = 'Real';>> block.OutputPort(2).Dimensions = 1;>> block.OutputPort(2).DatatypeID = 0;>> block.OutputPort(2).Complexity = 'Real';
Note how the field 'Dimensions' has not been set for InputPort(1) and OutputPort(1).
B)
Similar to A), but the required input and output ports need to be configured so that they can handle variable-size signals:
>> block.InputPort(1).DimensionsMode = 'Variable';>> block.OutputPort(1).DimensionsMode = 'Variable';
In addition, in the Outputs function, you need to set the current dimensions of the output port:
>> block.OutputPort(1).CurrentDimensions = block.InputPort(1).CurrentDimensions;
For further details, please refer to the attached files:
A) matlabSfunUnknownSize.m and simpleTestMsfUnknownSize.slx
B) matlabSfunVarSize.m and simpleTestMsfVarSize.slx
and simulate the models step-by-step.
For more information on:
- how to write your own Level-2 MATLAB S-Function: https://uk.mathworks.com/help/simulink/sfg/writing-level-2-matlab-s-functions.html
- variable-size signals: https://uk.mathworks.com/help/simulink/ug/variable-size-signal-basics.html
- MATLAB and C S-Functions with variable-size signals: https://www.mathworks.com/help/simulink/ug/simulink-models-using-variable-size-signals-demos-modeling-features-variable-size-signals-or-type-varsizedemos.html
0 Comments
More Answers (0)
See Also
Categories
Find more on Configure Block Features for MATLAB S-Functions in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!