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

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

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

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

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

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

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

Подготовьте модель

Откройте модель и сохраните копию в перезаписываемое местоположение. Затем откройте приложение 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 должны быть установлены:

  • Интерполируйте данные

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

  • Тип данных

  • Тип сигнала

Для получения дополнительной информации об этих параметрах нажмите кнопку Help. Эта модель в качестве примера включает три блока 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('rtwbuild(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]);

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

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

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

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

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

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.

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

Для этого формата переменная должна содержать два поля: время и сигналы. Если вы устанавливаете параметры блоков, Интерполируют данные для одного из блоков 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 содержит три variables 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

close_system(mdlName, 0);