Используйте MAT-файлы для передачи данных на входные блоки для быстрых симуляций

В этом примере показов, как опция генератора кода RSim -i позволяет вам использовать MAT-файл в качестве источника входных данных для блоков Inport для быстрых симуляций. Данные в таком MAT-файле могут быть представлены в следующих форматах:

  • Одна переменная, которая задает матрицу времени/входных данных с двойными значениями.

  • Одна переменная, которая задает структуру, которая использует комбинацию типов данных Simulink ®.

  • Несколько переменных, каждая из которых определяет структуру, которая использует комбинацию типов данных Simulink ®.

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

Чтобы быстро запустить несколько симуляций в окружение Simulink, рассмотрите использование быстрого ускорителя вместо RSim. Смотрите, что такое ускорение?.

Подготовка модели

Откройте модель и сохраните копию в месте с возможностью записи. Затем откройте приложение Simulink Coder. Установите параметр конфигурации модели * Системный целевой файл на rsim.tlc.

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

mdlName = 'rtwdemo_rsim_i';
open_system(mdlName);
cs = getActiveConfigSet(mdlName);
cs.switchTarget('rsim.tlc',[]);

Сконфигурируйте блоки Inport

Как использовать -i RSim опция, необходимо правильно сконфигурировать каждый блок Inport. Можно дважды кликнуть блок Inport, чтобы просмотреть его свойства. По умолчанию блоки Inport наследуют свои свойства от нисходящих блоков. Прежде чем вы сможете импортировать данные из внешних MAT-файлов, необходимо задать параметры каждого блока Inport, чтобы соответствовать данным в файле MAT. В большинстве случаев должны быть установлены эти параметры блока Inport:

  • Интерполяция данных

  • Размерности портов

  • Тип данных

  • Тип сигнала

Для получения дополнительной информации об этих параметрах нажмите кнопку «Справка». Эта модель включает три блока Inport. Требование для примера состоит в том, чтобы Inport 1 и Inport 2 интерполировались между данными, и чтобы Inport 3 не интерполировался. Размерность блоков Inport составляет 2, 1 и 2, соответственно. Сигналы действительны. Настройки следующие:

for i =1:3
    portName      =['/In', num2str(i)];
    Interp        = get_param(strcat(mdlName,portName),'Interpolate');
    PortDimension = get_param(strcat(mdlName,portName),'PortDimensions');
    DataType      = get_param(strcat(mdlName,portName),'OutDataTypeStr');
    SignalType    = get_param(strcat(mdlName,portName),'SignalType');
end
  • Для входных портов In1 и In2, выбрана интерполяция. Для входных In3, интерполяция очищена.

  • Для входных портов In1 и In3, размерность порта устанавливается равным 2. Для входных In2, размерность порта устанавливается равным 1.

  • Для входных портов In1, In2, и In3, тип данных double и тип сигнала real.

Построение модели

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

evalc('slbuild(mdlName)');

Идентифицируйте сигналы для файла данных

После настройки блока Inport подготовьте файл данных на основе блоков Inport. Этот рисунок показывает входные сигналы, которые будут использоваться.

t=[0:0.01:2*pi]';
s1 = [2*sin(t) 2*cos(t)];
s2 = sin(2*t);
s3 = [0.5*sin(3*t) 0.5*cos(3*t)];
figure;
plot(t, [s1 s2 s3]);

Figure contains an axes. The axes contains 5 objects of type line.

Этот рисунок отображает входные сигналы.

Подготовка MAT-файла

Обычно можно создать MAT-файл из переменной рабочей области. RSim -i опции поддерживает три формата файлов данных:

Одна переменная в TU матричном формате с двойной точностью

Для этого формата первый столбец является временным вектором, а остальные столбцы являются входными векторами. Количество столбцов в матрице TU равняется сумме размерностей корневых блоков Inport плюс 1. Этот код MATLAB ® генерирует MAT-файл, содержащий одну переменную, var_matrix в формате TU matrix. Использовать этот формат можно только в том случае, если входные порты в модели имеют совпадающий тип данных.

t=[0:0.1:2*pi]';
Ina1 = [2*sin(t) 2*cos(t)];
Ina2 = sin(2*t);
Ina3 = [0.5*sin(3*t) 0.5*cos(3*t)];
var_matrix = [t Ina1 Ina2 Ina3];
save rsim_i_matrix.mat var_matrix;

MAT-файлы rsim_i_matrix.mat содержит одну переменную var_matrix в формате матрицы TU.

Одна переменная в формате структуры

Для этого формата переменная должна содержать два поля: время и сигналы. Если вы устанавливаете параметрам блоков Interpolate данные для одного из блоков Inport, поле времени переменной не должно быть пустым вектором, и ширина сигналов должна равняться общей ширине блоков Inport. Этот код генерирует MAT-файл, который содержит одну переменную var_matrix в формате структуры сигнальной переменной. Этот формат более гибок, чем формат матрицы TU, поскольку он может поддерживать входные порты с различными типами данных.

t= [0:0.1:2*pi]';
var_single_struct.time = t;
var_single_struct.signals(1).values(:,1) = 2*sin(t);
var_single_struct.signals(1).values(:,2) = 2*cos(t);
var_single_struct.signals(2).values = sin(2*t);
var_single_struct.signals(3).values(:,1) = 0.5*sin(3*t) ;
var_single_struct.signals(3).values(:,2) = 0.5*cos(3*t) ;
v=[var_single_struct.signals(1).values var_single_struct.signals(2).values ...
    var_single_struct.signals(3).values ];
save rsim_i_single_struct.mat var_single_struct;

MAT-файлы rsim_i_single_struct.mat содержит одну переменную var_single_struct в struct формат.

Несколько переменных в формате структуры

Для этого формата количество переменных равняется количеству блоков Inport. Различные переменные могут иметь различные временные векторы. Этот код генерирует MAT-файл, который содержит несколько переменных, каждая в формате структуры. Это самый гибкий формат, потому что он позволяет каждому блоку Inport иметь свой собственный временной вектор.

t= [0:0.1:2*pi]';
Inb1.time = t;
Inb1.signals.values(:,1) = 2*sin(t);
Inb1.signals.values(:,2) = 2*cos(t);
t= [0:0.2:2*pi]';
Inb2.time = t;
Inb2.signals.values(:,1) = sin(2*t);
t= [0:0.1:2*pi]';
Inb3.time =  t;
Inb3.signals.values(:,1) = 0.5*sin(3*t);
Inb3.signals.values(:,2) = 0.5*cos(3*t);
save rsim_i_multi_struct.mat Inb1;
save rsim_i_multi_struct.mat Inb2 -append;
save rsim_i_multi_struct.mat Inb3 -append;

MAT-файлы rsim_i_multi_struct.mat содержит три переменные Inb1, Inb2, и Inb3 в struct формат. Используйте save команда со -append опция сохранения порядка переменных в сгенерированном MAT-файле.

Запуск симуляций RSim и результатов построения графиков

Для симуляции пакетного режима можно использовать опции RSim -i. Подготовьте различные MAT-файлы и запустите с ними исполняемый файл программы RSim.

В этой части примера показаны три графика. На каждом графике показаны результаты симуляции для MAT-файла с другим форматом переменной. Модель компилируется один раз.

figure
fileName = ({'rsim_i_matrix', 'rsim_i_single_struct', 'rsim_i_multi_struct'});
for i=1:3
    % bang out and run a simulation using new parameter data
    name = fileName(i);
    runstr = ['.', filesep, 'rtwdemo_rsim_i -i ',char(name),'.mat', ' -v'];
    evalc('system(runstr)');
    pause(0.5);
    % load simulation data into MATLAB(R) for plotting.
    load rtwdemo_rsim_i.mat;
    subplot(3,1,i);
    axis([0,6, -5, 5]);
    plot(rt_tout, rt_yout);
    hold on
end

Figure contains 3 axes. Axes 1 contains 3 objects of type line. Axes 2 contains 3 objects of type line. Axes 3 contains 3 objects of type line.

close_system(mdlName, 0);