- https://www.mathworks.com/help/releases/R2019b/simulink/slref/set_param.html
- https://www.mathworks.com/help/releases/R2019b/simulink/slref/get_param.html
- https://www.mathworks.com/help/releases/R2019b/matlab/ref/timer-class.html
Actualizacion de datos en GUI
2 views (last 30 days)
Show older comments
Buenos días, soy estudiente de ingenieria en automatizacion industrial y estoy realizando mi proyecto de final de carrera.
Se trata de un sistema de control con comandos a traves del GUIDE de MatLab/Simulink. Se me presenta el problema de intercambiar datos en forma continua entre el GUI y el Simulink sin tener que tocar ningun button en el GUI.
Hay una serie de parametros que deben ser mostrados en el GUI que se actualizan en forma continua y por otro lado del GUI debo ingresar cambios en variables del Simulink, pero todas estas interacciones deben ser realizadas sin comandos de confirmacion en el GUI.
Por favor solicito me aconsejen como utilizar algun tipo de reloj en el GUI para disparar en forma independiente las lecturas de los datos del Simulink, sin dejar de atender los ingresos de datos desde el GUI.
Gracias
0 Comments
Answers (1)
Kanishk
on 2 Sep 2024
Hi Jose,
I understand that you are trying to exchange data between GUI and Simulink. For creating GUI, I am using App Designer in which I have added a button, Numeric Field and UI Axes.
In the Simulink side I have created a simple model using Sine Wave and a gain block. To fetch data from Simulink, enable Signal Logging for the output Signal using Property Inspector.
In the App Designer, I am using ‘set_param’ to set the value of ‘Gain’ block in Simulink.
function GainValueEditFieldValueChanged(app, event)
gainValue = app.GainValueEditField.Value;
set_param('simpleModel/Gain', 'Gain', string(gainValue));
end
To start capturing the output from Simulink and plot it in real time I am using the 'ButtonPushedFcn' Callback.
function StartStopButtonPushed(app, event)
if app.simRunning
% Stop simulation
stop(app.simTimer);
app.simRunning = false;
app.StartStopButton.Text = 'Start Capture';
else
% Start simulation
app.simRunning = true;
app.StartStopButton.Text = 'Stop Capture';
set_param('simpleModel/Gain', 'Gain', string(app.GainValueEditField.Value));
app.plotHandle = plot(app.UIAxes, nan,nan);
% Start a timer to update the plot
app.simTimer = timer('ExecutionMode', 'fixedRate','Period', 0.5, 'TimerFcn', @(~,~) app.updatePlot());
start(app.simTimer);
end
end
The timer calls the 'updatePlot' function periodically which updates the plot after fetching data from Simulink.
function updatePlot(app)
runID = Simulink.sdi.getCurrentSimulationRun('simpleModel');
runObj = Simulink.sdi.getRun(runID.id);
signalID = runObj.getSignalIDByIndex(1);
signalObj = Simulink.sdi.getSignal(signalID);
set(app.plotHandle, 'XData', signalObj.Values.Time, 'YData', signalObj.Values.Data);
if length(signalObj.Values.Time) > 1
xlim([max(signalObj.Values.Time) - 100, max(signalObj.Values.Time)]); % 86400 seconds in a day
end
end
Please go through the following documentation pages to learn more about ‘set_param’, ‘get_param’ and ‘timer’:
I hope this helps!
Thanks
0 Comments
See Also
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!