Для чтения временных переменных данных из рабочей области 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.), например:
Однако это решение требует, чтобы число переменных было зафиксировано для всех симуляций. В моем случае переменные нумеруются (а не именуются), и количество переменных может не совпадать от одного моделирования к другому. Таким образом, для целей обобщения я хотел бы найти решение, не меняя файл моделирования. Первым шагом в этом направлении является использование массива struct (т.е. var(1)
, var(2)
, var(3)
, et c.), Который работает:
Затем следующим шагом будет использование For Iterator для l oop over N
переменных (а затем для назначения и объединения выходных данных в некотором выходном массиве, что, как я знаю, может быть выполнено и здесь не фокус):
Проблема здесь в том, что индекс 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
А вот рисунок для иллюстрации результатов:
% 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')