Stream Logging Data to Disk - MATLAB & Simulink (original) (raw)
Main Content
When you log simulation data, you can either store the data in a workspace variable, or stream the data to a temporary file on disk and have the workspace variable point to that temporary file. In either case, you interact with the logged simulation data through the simulation log variable.
Saving data to the workspace consumes memory. Streaming logged data to disk significantly increases the data logging capacity, because you are no longer limited by the system memory.
To enable streaming data to disk for all models, on the MATLAB® Toolstrip, click . In the left pane of the Settings dialog box, select Simscape, then select the Stream data to temporary disk directory check box.
When this setting is turned on, the simulation data, in the form of asimlog
object generated during simulation, is stored in a file in a temporary folder under your user name. The workspace variable of typesimscape.logging.Node
, named as specified by the Workspace variable name configuration parameter, gets created, but instead of storing all the simulation data it references the simlog
object in the temporary file. The temporary file persists as long as there is a logging variable name in the workspace that references it.
You view and analyze logged simulation data by accessing the simulation log variable, exactly the same way as if the simulation data was stored inside it. All the interaction between the workspace variable and the stored object happens behind the scenes. Therefore, you can use the Simscape™ Results Explorer, as well as all the methods associated with the simscape.logging.Node and simscape.logging.Series classes to query, plot, and analyze logged simulation data.
The following limitations apply when streaming data to disk:
- The Limit data points and Data history (last N steps) configuration parameters are ignored. However, you can use theDecimation parameter to limit the number of logged data points. For more information, see Data Logging Options.
- When you pause model simulation and step back and then forward, all the time points are logged on disk. This is different from storing the data directly in the workspace variable, where the log data is rolled back in this case.
Streaming to Disk and parfor
Loop
If you have a Parallel Computing Toolbox™ license, then, when you simulate a model inside theparfor
loop, the temporary file is generated within the address space of the worker threads. To access the simulation data outside the parfor
loop, export the data and then import the exported file outside theparfor
loop.
parfor i=1:2 model = 'my_dcmotor' load_system(model); set_param(model, 'SimulationMode', 'normal'); set_param(model, 'SimscapeLogType', 'all', 'SimscapeLogName', 'simlog'); simOut = sim(model, 'ReturnWorkspaceOutputs', 'on');
% save to a different file by appending the index file = ['fileName_' num2str(i) '.mldatx']; simscape.logging.export(simOut.get('simlog'), file); end
% import the exported files var = simscape.logging.import('fileName_1.mldatx'); ...
Streaming to Disk with parsim
If you have a Parallel Computing Toolbox license, simulating a model with the parsim
command provides additional functionality, compared to using the parfor
loop. The following example shows how you can use the parsim
command when streaming logged simulation data to disk.
Before running the script, make sure that streaming to disk is enabled: open the Settings dialog box, select Simscape, then select the Stream data to temporary disk directory check box.
model = 'my_dcmotor'; % Create array of inputs to run multiple simulations num = 10; in(1:num) = Simulink.SimulationInput(model);
% Specify any directory where the MLDATX files will be created for every run logDir=fullfile(cd, 'tmp'); % current directory mkdir(logDir) for i = 1:num % This will only work with local pools in(i).PostSimFcn = @(x) locHandleSimscapeLTF(model, x, logDir, i); end
out = parsim(in);
for idx = 1:numel(out) simlog = simscape.logging.import(out(idx).SimscapeFileName); sscexplore(simlog); end
function newOut = locHandleSimscapeLTF(model, out, dirName, runId) % All the logged variables along with simlog should be part of 'newOut' object loggedVars = out.who; newOut = struct; for i = 1 : numel(loggedVars) loggedData = out.(loggedVars{i}); if isa(loggedData, 'simscape.logging.Node') % Specify any file name with .mldatx extension filename = [model 'simlog_file' num2str(runId) '.mldatx']; simscapeFileName = fullfile(dirName, filename);
% Export simlog to MLDATX file
simscape.logging.export(loggedData, simscapeFileName);
newOut.SimscapeFileName = simscapeFileName;
else
newOut.(loggedVars{i}) = out.(loggedVars{i});
end
end
end