Присвоить векторы из рабочего пространства MATLAB (структура) Simulink Model - PullRequest
0 голосов
/ 28 мая 2018

Мне нужна помощь в запуске модели Simulink с данными из рабочей области MATLAB, содержащимися в структурах.Ниже приведен очень упрощенный пример использования того, что я хотел бы сделать

Вариант использования:

У меня есть структура в рабочем пространстве MATLAB, называемая «data_in», и она имеет два поля x, иу, которые являются векторами.У меня есть модель Simulink с двумя Inports с именами x и y.

Это то, что я хотел бы:

a.Прочитайте название Inports от Simlunk Model.В этом случае это были бы x и y

b.Программно назначьте данные из структуры - "data_in" для портов "x" и "y" в модели Simulink.Структура «data_in» содержит два вектора «x» и «y», которые должны быть сопоставлены с Simulink Inports

Приведенный выше вариант использования является очень упрощенным сценарием.Модель, которую я намереваюсь использовать, может иметь 100 входных данных, и поэтому я не хочу использовать блок «Из рабочего пространства», так как было бы нецелесообразно добавлять 100 из них

Как я могу справиться с такимСитуация в Симулинке.Я немного больше, чем новичок в MATLAB и Simulink.Так что подробный ответ мне очень поможет

1 Ответ

0 голосов
/ 29 мая 2018

Если я правильно понял ваш вопрос, а входные данные являются переменными времени, вы можете использовать From Workspace и вызвать ваш скрипт инициализации по InitFcn в Callbacks.

при условии, что у вас есть скрипт инициализации с именем init_script:

, вставленный в InitFcn this: init_script;поэтому при запуске Simulink этот сценарий запускается первым.

предположим, что это ваши временные ряды в init_script:

ts = timeseries(randn(10,2),'Name','TS');

, введите ts в From Workspace: enter image description here

Но если это не вариативные по времени векторы, сделайте то же самое и используйте вместо этого блок constant, в его поле значения введите имя вектора и снова поместите скрипт, содержащий эти векторы, в InitFcnв Callbacks:

X = randi(10,6,1); 
Y = randi(10,6,1);

затем выполните необходимые операции: enter image description here

, поэтому блок To Workspace с именем simout даст вам:

simout.Data(:,:,1)
ans =

14
 9
16
16
10
 3

и, наконец, если у вас много этих векторов и компонентов, вы можете легко создать их из Matlab Workspace:

my_struct.x = randn(6,1);my_struct.y = randn(6,1);
new_system('myModel')
open_system('myModel')
pos = [10   10   20   30]
for i =1:10
    add_block('built-in/Inport',['myModel' '/In1'],'Position',pos);
    add_block('built-in/Constant',['myModel' strcat('/Cx', num2str(i))],'Position',pos+2);
    add_block('built-in/Constant',['myModel' strcat('/Cy', num2str(i))],'Position',pos+i);
    pos = pos + 1;
    X_vector = my_st.x
    set_param(strcat('myModel/Cx', num2str(i)),'Value', X_vector)
    Y_vector = my_st.x
    set_param(strcat('myModel/Cy', num2str(i)),'Value', Y_vector)
....

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

...