Потоковое логгирование данных на диск

Когда вы логгируете данные моделирования, можно либо хранить данные в переменной рабочей области, либо потоковать данные во временный файл на диске и иметь переменную рабочей области, указывающую на этот временный файл. В любом случае вы взаимодействуете с записанными данными моделирования через переменную журнала симуляции.

Сохранение данных в рабочей области потребляет память. Потоковая передача записанных данных на диск значительно увеличивает емкость логгирования данных, поскольку вы больше не ограничены системной памятью.

Чтобы включить потоковую передачу данных на диск для всех моделей, на MATLAB® Панель инструментов, нажмите Preferences. На левой панели диалогового окна Настройки установите флажок Simscape, а затем установите флажок Stream data to temporary disk directory.

Когда этот выбор включён, данные моделирования, в форме simlog объект, сгенерированный во время симуляции, хранится в файле MLDATX во временной папке под вашим именем пользователя. Переменная рабочей области типа simscape.logging.Node, названный как заданный параметром конфигурации Workspace variable name, создается, но вместо хранения всех данных моделирования он ссылается на simlog объект во временном файле. Временный файл сохраняется до тех пор, пока в рабочей области есть имя переменной регистрации, которая ссылается на него.

Вы просматриваете и анализируете записанные данные моделирования путем доступа к переменной журнала симуляции, точно так же, как если бы данные моделирования хранились в ней. Все взаимодействие между переменной рабочей области и хранимым объектом происходит за кадром. Поэтому можно использовать Simscape™ Results Explorer, а также все методы, связанные с simscape.logging.Node и simscape.logging.Series классы для запроса, построения и анализа записанных данных моделирования.

При потоковой передаче данных на диск применяются следующие ограничения:

  • Limit data points и Data history (last N steps) параметров конфигурации игнорируются. Однако можно использовать параметр Decimation, чтобы ограничить количество записанных точек данных. Для получения дополнительной информации см. раздел «Опции ведения журнала данных».

  • Когда вы останавливаете симуляцию модели и шагаете назад, а затем вперед, все время точек регистрируются на диске. Это отличается от хранения данных непосредственно в переменной рабочей области, где данные журнала откатываются в этом случае.

Потоковая передача на диск и parfor Цикл

Если у вас есть лицензия Parallel Computing Toolbox™, то, когда вы симулируете модель внутри parfor цикл, временный файл MLDATX генерируется в адресном пространстве рабочих потоков. Для доступа к данным моделирования за пределами parfor цикл, экспортировать данные и затем импортировать экспортированный файл за пределы parfor цикл.

parfor i=1:2 
   model = 'ssc_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');
...
 

Потоковая передача на диск с parsim

Если у вас есть лицензия Parallel Computing Toolbox, симулируйте модель с parsim команда обеспечивает дополнительные функциональные возможности по сравнению с использованием parfor цикл. В следующем примере показано, как вы можете использовать parsim команда при потоковой передаче записанных данных моделирования на диск.

Перед запуском скрипта убедитесь, что потоковая передача на диск включена: откройте диалоговое окно Preferences, выберите Simscape, затем установите флажок Stream data to temporary disk directory.

model = 'ssc_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
 

Похожие темы