How to code a time delay specified by a value saved in a parameter structure in a Matlab block?

8 views (last 30 days)
Ryan Wilson
Ryan Wilson on 12 Apr 2022
Commented: Ryan Wilson on 20 Apr 2022
I'm having an issue trying to go about coding a time delay within a matlab block.
Say I have a matlab block function for basic mass balance, such as:
function [X1,Y1] = fcn(Z1)
% Set transfer function value(s).
A1 = 0.8;
% Calculate the products.
X1 = Z1*A1;
Y1 = Z1*(1-A1);
But I need the outputs [X1,Y1] to be delayed by a certain length of time (NOT paused) specified by a value in a parameter structure in the base workspace, such as:
% Example parameter structure index for time delay value.
myParams.dt(1) = 24.8
I've been looking into other feeds for using persistent variables, but my Matlab skills are not yet very advanced. This needs to be coded in for my purposes and not looking to use a predefined simulink block (e.g. transport delay, triggered subsystems, etc.).
Could someone please help me with this seemingly simple piece of code?
Thanks so much in advance!

Answers (1)

Fangjun Jiang
Fangjun Jiang on 13 Apr 2022
In the MATLAB Function block editor, click the "edit data" button, then add parameter. Define the "myParams" in base workspace as the parameter of the MATLAB Function block and then you will be able to use it. I am not sure if a structure has anything special, you could try a regular variable first.
Ryan Wilson
Ryan Wilson on 20 Apr 2022
Thanks for your continued input.
But I'm still confused - I don't think I need a rolling buffer because the arbitrary time is not changing during the simulation.
Going back to my original example, could I not insert the param structure as a parameter to the matlab function block (as you explained above), and use the called time parameter to modify the delay code? Something like:
function [X1,Y1] = fcn(Z1, myParams)
persistent Z1_d;
if isempty(Z1_d)
Z1_d = cast(myParams.dt(1), 'like', Z1)
% Set transfer function value(s).
A1 = 0.8;
% Calculate the products.
X1 = Z1_d*A1;
Y1 = Z1_d*(1-A1);
If I still need to calculate N=delayTime/simulationStepTime in my initialization routine, how do I go about doing that? My delayTime would be my 'myParams.dt(1)', but I'm not sure how to access the simulationStepTime...
Thanks again for your time!

Sign in to comment.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by