Если вы управляете данными моделями во внешних файлах, можно использовать скрипты, чтобы передать данные между файлом данных и моделью Simulink ®. В этом примере показано, как считать данные блочного параметра из и записать данные параметра в файл данных Excel ®. В частности, пример предоставляет функции, которые считывают и записывают данные параметра Mapped SI Engine. Можно настроить функции для чтения и записи параметров для дополнительных блоков.
Откройте блок Mapped Двигателя с искровым зажиганием в гибридном электрическом транспортном средстве P2 примера готовых узлов.
workDir = pwd; autoblkHevP2Start; cd(workDir);
Установите переменную, равную пути блока.
bp = 'SiMappedEngine/Mapped SI Engine'; % block path
В HevP2ReferenceApplication
моделировать, переходить к Passenger Vehicle
> Ideal Mapped Engine
> SiMappedEngine
. Откройте блок Mapped SI Engine. Переменные Точек по оси Х для командного крутящего момента, Точки по оси Х для скорости вращения двигателя входа, Количество цилиндров, Обороты Кривошипа на степень штриха и Общий перемещенный объем заданы как переменные рабочей области.
Функции в примере перезаписывают переменные рабочей области значениями в файле данных.
Во-первых, укажите имя файла. Этот файл примера 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');
Обновите блок Mapped SI Engine до значений, заданных в файле данных.
Используйте этот код, чтобы считать файл данных и обновить параметры блоков Mapped SI Engine.
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
В HevP2ReferenceApplication
моделировать, переходить к Passenger Vehicle
> Ideal Mapped Engin
e > SiMappedEngine
. Откройте блок Mapped SI Engine. Значения параметров Breakpoints for commanded torque, Breakpoints for скорости вращения двигателя входа, Number of cylinders, Crank rovtions per степени штриха и Total displaced volume заданы в значениях, заданных в файле данных. Подтвердите, что параметры карты момента привода и карты расхода топлива
совпадают со значениями, заданными в файле данных.
В блоке Mapped SI Engine измените Количество цилиндров, параметр NCyl с 6 до 8. Нажмите Применить. Сохраните модель.
Также используйте этот код, чтобы обновить параметр и сохранить модель.
set_param(bp,'Ncyl','8'); save_system('SiMappedEngine');
Сначала создайте копию файла данных. Запишите измененные данные параметра в копию файла данных.
copyfile('SiEngineData.xlsx','SiEngineDataCopy.xlsx','f'); fileName = 'SiEngineDataCopy.xlsx';
Затем используйте этот код, чтобы записать Mapped Двигателя с искровым зажиганием block Breakpoints для командного крутящего момента, Breakpoints для скорости вращения двигателя входа, Number of cylinders, Crank rovtions per степени штриха, Total displaced volume, Момент привода map и параметры карты расхода топлива в файл данных.
% 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
.