Когда вы логгируете данные моделирования, можно либо хранить данные в переменной рабочей области, либо потоковать данные во временный файл на диске и иметь переменную рабочей области, указывающую на этот временный файл. В любом случае вы взаимодействуете с записанными данными моделирования через переменную журнала симуляции.
Сохранение данных в рабочей области потребляет память. Потоковая передача записанных данных на диск значительно увеличивает емкость логгирования данных, поскольку вы больше не ограничены системной памятью.
Чтобы включить потоковую передачу данных на диск для всех моделей, на 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