Чтение нескольких пронумерованных переменных данных из рабочей области - PullRequest
2 голосов
/ 15 апреля 2020

Для чтения временных переменных данных из рабочей области Matlab в Simulink (для временной и экстраполяции на основе времени) типичным решением является использование блока From Workspace, например, путем предоставления переменных входных данных var в следующий формат структуры:

var.time=[nx1]
var.signals.dimensions=m
var.signals.values=[nxm]

для предоставления данных m переменных с n выборками на основе времени. Поскольку данные переменных хранятся в одной матрице, подразумевается, что все переменные должны иметь одинаковое (количество) временных отметок.

Если это не так, решением может быть использование несколько блоков From Workspace и соответствующие переменные структуры входных данных (например, varA, varB, varC, et c.), например:

multiple vars from workspace

Однако это решение требует, чтобы число переменных было зафиксировано для всех симуляций. В моем случае переменные нумеруются (а не именуются), и количество переменных может не совпадать от одного моделирования к другому. Таким образом, для целей обобщения я хотел бы найти решение, не меняя файл моделирования. Первым шагом в этом направлении является использование массива struct (т.е. var(1), var(2), var(3), et c.), Который работает:

multiple from workspace

Затем следующим шагом будет использование For Iterator для l oop over N переменных (а затем для назначения и объединения выходных данных в некотором выходном массиве, что, как я знаю, может быть выполнено и здесь не фокус):

for iterator from workspace

Проблема здесь в том, что индекс id не может быть передан в блок From Workspace! Я столкнулся с идентичной проблемой при попытке решить проблему с помощью блока таблицы поиска. Как решить эту проблему чтения нескольких, но различного количества переменных данных из рабочей области с разными (числом) отметками времени? Решения, которые не используют блок From Workspace или таблицу поиска, также приветствуются.

Вот эквивалентный код для запуска всего этого в Matlab вместо Simulink:

% DEFINED IN MATLAB:
% Examplary input of variable data with different time stamps, according to
% Simulink structure conventions (.time, .signals etc)
N=3; % number of variables
for id=N:-1:1
    var(id).time = linspace(0,2,id*2+2)';
    var(id).signals.dimensions = 1;
    var(id).signals.values = sin((var(id).time-id)*pi/2)';
end

% TO BE EXECUTED IN SIMULINK:
% the simulink clock time:
t = 1.234; % random time
for id=N:-1:1
var_t(id) = interp1(var(id).time,var(id).signals.values,t);
end

А вот рисунок для иллюстрации результатов:

result-matlab-script

% Figure code:
figure(1),clf
colors=lines(N);
for id=1:N
plot(var(id).time,var(id).signals.values,'*-','color',colors(id,:)),hold on
plot(t,var_t(id),'o','color',colors(id,:))
end
xlabel('time'),ylabel('variable data')
...