При управлении данными модели во внешних файлах можно использовать сценарии для передачи данных между файлом данных и моделью Simulink ®. В этом примере показано, как считывать данные параметров блоков и записывать их в файл данных Excel ®. В частности, в этом примере представлены функции, которые считывают и записывают данные параметра Mapped SI Engine. Функции можно адаптировать к параметрам чтения и записи для дополнительных блоков.
Откройте блок «Mapped SI Engine» в приложении двухполосных ссылок на изменения.
workDir = pwd; vdynblksDblLaneChangeStart; cd(workDir);
Задайте переменную, равную пути блока.
bp = 'SiMappedEngineV/Mapped SI Engine'; % block path
В DLCReferenceApplication модель, перейдите к Passenger Vehicle > Ideal Mapped Engine > SiMappedEngineV. Откройте блок Сопоставленный механизм СИ. Для параметров «Точки останова» для управляемого крутящего момента, «Точки останова» для входного значения частоты вращения двигателя, «Число цилиндров», «Обороты кривошипа на силовой ход» и «Общий смещенный объем» устанавливаются переменные рабочего пространства.

Функции в примере заменяют переменные рабочей области значениями в файле данных.
Сначала укажите имя файла. Этот пример файла SiEngineData.xlsx содержит три листа. Первый лист содержит скалярные значения для командных точек останова крутящего момента, точек останова для входных точек останова частоты вращения двигателя, количества цилиндров, оборотов кривошипа и общего смещенного объема. Второй лист содержит табличные значения для карты тормозного момента. Третий лист содержит табличные значения для карты крутящего момента топлива.
fileName = 'SiEngineData.xlsx';Обратите внимание, что первый лист в файле определяет число цилиндров, параметр Ncyl как 6.

Затем определите конфигурационные данные подсистемы двигателя. В этом примере задается конфигурация для двойных переменных размера скаляра, вектора или массива 2D.
Скалярная структура данных определяет данные на первом листе.
Векторная структура данных определяет данные на втором листе.
Структура данных массива определяет данные на третьем листе.
engData = struct(); % engine parameter data % Scalar data engData.Ncyl = struct('xlSheet','Main', 'xlRange','C7:C7', 'slBlockPath',bp, 'slBlockParam','Ncyl'); engData.Cps = struct('xlSheet','Main', 'xlRange','C8:C8', 'slBlockPath',bp, 'slBlockParam','Cps'); engData.Vd = struct('xlSheet','Main', 'xlRange','C9:C9', 'slBlockPath',bp, 'slBlockParam','Vd'); % Vector data engData.t_bpt = struct('xlSheet','Main', 'xlRange','C3:R3', 'slBlockPath',bp, 'slBlockParam','f_tbrake_t_bpt'); engData.n_bpt = struct('xlSheet','Main', 'xlRange','C4:R4', 'slBlockPath',bp, 'slBlockParam','f_tbrake_n_bpt'); % 2D array data engData.torque = struct('xlSheet','Brake Torque', 'xlRange','B2:Q17', 'slBlockPath',bp, 'slBlockParam','f_tbrake'); engData.fuel = struct('xlSheet','Fuel Map', 'xlRange','B2:Q17', 'slBlockPath',bp, 'slBlockParam','f_fuel');
Обновите блок сопоставленного модуля СИ до значений, указанных в файле данных.
Этот код используется для чтения файла данных и обновления параметров блока «Сопоставленный механизм СИ».
f = fields(engData); for idx = 1:length(f) try var = getfield(engData, f{idx}); % read value from Excel val = readmatrix(fileName, 'Sheet',var.xlSheet, 'Range',var.xlRange); % open Simulink model mdl = fileparts(var.slBlockPath); open_system(mdl); % set parameter value and save model set_param(var.slBlockPath, var.slBlockParam, mat2str(val)); save_system(mdl); catch ME % return any error info disp(getReport(ME, 'extended', 'hyperlinks', 'on')) fprintf('\nContinuing to next variable...\n\n'); end end fprintf('Done writing values to Simulink\n')
Done writing values to Simulink
В DLCReferenceApplication модель, перейдите к Passenger Vehicle > Ideal Mapped Engine > SiMappedEngineV. Откройте блок Сопоставленный механизм СИ. Значения «Точки останова» для заданного крутящего момента, «Точки останова» для входного значения частоты вращения двигателя, «Число цилиндров», «Обороты кривошипа на силовой ход» и «Общий объем перемещений» устанавливаются в значения, указанные в файле данных. Подтвердить, что параметры карты тормозного момента и карты расхода топлива совпадают со значениями, указанными в файле данных.

В блоке Сопоставленный механизм СИ измените значение параметра Количество цилиндров NCyl с 6 кому 8. Нажмите кнопку «Применить». Сохраните модель.

Этот код можно также использовать для обновления параметра и сохранения модели.
set_param(bp,'Ncyl','8'); save_system('SiMappedEngineV');
Создайте копию файла данных. Запишите измененные данные параметров в копию файла данных.
copyfile('SiEngineData.xlsx','SiEngineDataCopy.xlsx','f'); fileName = 'SiEngineDataCopy.xlsx';
Затем используйте этот код, чтобы записать точки останова отображенного блока двигателя SI для командного крутящего момента, точки останова для входного значения частоты вращения двигателя, число цилиндров, обороты кривошипа на силовой ход, общий смещенный объем, карту крутящего момента тормоза и параметры карты расхода топлива в файл данных.
% Read data from Simulink model then write to Excel f = fields(engData); for idx = 1:length(f) try var = getfield(engData, f{idx}); % open Simulink model mdl = fileparts(var.slBlockPath); open_system(mdl); % read value from Simulink val = str2num(get_param(var.slBlockPath, var.slBlockParam)); % write value to Excel writematrix(val, fileName, 'Sheet',var.xlSheet, 'Range',var.xlRange); catch ME % return any error info disp(getReport(ME, 'extended', 'hyperlinks', 'on')) fprintf('\nContinuing to next variable...\n\n'); end end fprintf('Done writing values to Excel\n')
Done writing values to Excel
Откройте файл с измененными данными. Убедитесь, что в файле данных указано количество цилиндров 8.
