Выход модели Simulink «в рабочую область»

Я пытаюсь контролировать крутящий момент двигателя и использую переменную рабочей области в Simulink и хочу вывести аналогичную переменную в рабочую область.

У меня есть размер (T_u) = [3, 91], тогда как результат, который я получаю от моделирования, имеет размер [91, 90]

Я не могу понять, почему это так.

Код, который я использую:

load('Motor_Param.mat')

t = 1:0.1:10;
T_o = [0.05*(10-t);0.04*(10-t);0.03*(10-t)];
T_d = zeros(size(T_o));
T_e = (T_d - T_o);
C_PD = pid(100,0,10,100);
T_u = zeros(size(T_e));
for k=1:size(T_e,1)
    T_u(k,:) = lsim(C_PD,T_e(k,:),t);
%T_u(1,:)= -45.0450000000000    -44.5444552724092   -44.0439110892737   -43.5433674500493   -43.0428243541925   -42.5422818011600   -42.0417397904094   -41.5411983213986   -41.0406573935862   -40.5401170064312   -40.0395771593933   -39.5390378519326   -39.0384990835098   -38.5379608535861   -38.0374231616233   -37.5368860070837   -37.0363493894301   -36.5358133081260   -36.0352777626353   -35.5347427524223   -35.0342082769522   -34.5336743356904   -34.0331409281029   -33.5326080536564   -33.0320757118181   -32.5315439020554   -32.0310126238368   -31.5304818766308   -31.0299516599067   -30.5294219731343   -30.0288928157839   -29.5283641873264   -29.0278360872332   -28.5273085149760   -28.0267814700274   -27.5262549518604   -27.0257289599483   -26.5252034937652   -26.0246785527857   -25.5241541364848   -25.0236302443380   -24.5231068758215   -24.0225840304120   -23.5220617075865   -23.0215399068228   -22.5210186275990   -22.0204978693939   -21.5199776316868   -21.0194579139572   -20.5189387156857   -20.0184200363529   -19.5179018754402   -19.0173842324294   -18.5168671068029   -18.0163504980435   -17.5158344056347   -17.0153188290603   -16.5148037678048   -16.0142892213531   -15.5137751891906   -15.0132616708034   -14.5127486656779   -14.0122361733011   -13.5117241931606   -13.0112127247442   -12.5107017675407   -12.0101913210389   -11.5096813847285   -11.0091719580996   -10.5086630406426   -10.0081546318487   -9.50764673120954   -9.00713933821711   -8.50663245236405   -8.00612607314350   -7.50562020004906   -7.00511483257487   -6.50460997021554   -6.00410561246623   -5.50360175882257   -5.00309840878072   -4.50259556183731   -4.00209321748951   -3.50159137523496   -3.00109003457184   -2.50058919499879   -2.00008885601498   -1.49958901712007   -0.999089677814209  -0.498590837598075  0.00190750402718064

    a = sim('Motor_Control','SimulationMode','normal');
    out = a.get('T_l')
end

Ссылка на файлы .mat и .slx: https://drive.google.com/open?id=1kGeA4Cmt8mEeM3ku_C4NtXclVlHsssuw


person Capri    schedule 04.07.2019    source источник
comment
Привет @Capri, так как у меня не установлен Control System Toolbox, не могли бы вы предоставить массивы C_PI, T_u и T_l для k=1?   -  person Axel    schedule 04.07.2019
comment
Я обновил приведенный выше код. C_PI и T_l не используются, поэтому я их удалил.   -  person Capri    schedule 04.07.2019
comment
Я просто написал ответ. Пожалуйста, дайте мне знать, если это поможет!   -  person Axel    schedule 04.07.2019


Ответы (2)


Если вы установите Save format в блоке To Workspace на Timeseries, на выходе будут размеры сигнала, умноженные на количество временных шагов.

В вашем случае я активировал опцию Display->Signals & Ports->Signal dimensions и размеры сигнала в вашей модели выглядят так:

Размеры сигнала в модели Simulink

Таким образом, сигнал, который вы выводите в рабочую область, имеет размер 90. Теперь, если я напечатаю size(out.Data), я получу

ans = 138  90

где 90 — размерность сигнала, а 138 — количество временных шагов в вашей модели Simulink.

Теперь вы можете использовать последнюю строку данных (имеющую длину 90) и добавить ее в свой массив.

person Axel    schedule 04.07.2019
comment
Спасибо, Аксель. Поскольку 90 — это не тот размер, который мне нужен, мне удалось его обойти. - person Capri; 04.07.2019

Я редактирую ваш код, код имеет выходной размер [21,3]. «21» исходит из (t_final*1/sample_time+1)

  • В вашем коде время t должно начинаться с 0.
  • Модель Motor_Control.slx имеет 0,1 шага расчета, если вы запускаете модель в течение 9 секунд, выходной файл имеет 91 образец для каждого сигнала, и поэтому у вас есть выход размером [91, 90]. Я загружаю с вашей ссылки на диск, и эта модель Simulink имеет 2 секунды. моделирование.
  • T_u используется как вход модели Simulink, он не является постоянным, поэтому T_u должен быть временным рядом.

Отредактированный код ниже;

load('Motor_Param.mat')
t = 0:0.1:10;
T_o = [0.05*(10-t);0.04*(10-t);0.03*(10-t)];
T_d = zeros(size(T_o));
T_e = (T_d - T_o);
C_PD = pid(100,0,10,100);
T_u = timeseries(zeros(size(T_e)),t);
for k=1:size(T_e,1)
    T_u.Data(k,:) = lsim(C_PD,T_e(k,:),t);
    a = sim('Motor_Control','SimulationMode','normal');
    out = a.get('T_l')
end
person Emre MEMİŞ    schedule 05.07.2019
comment
Выход I GET IS: 1,0E+295 * 0 0 0 -0,0000 -0,0000 -0,0000 0,0000 0,0000 0,0000 -0,0000 -0,0000 -0,0000 0,0000 0,0000 0,0000 -0,0000 -0,0000 -0,0000 0,0000 0,0000000000.000000000000000000 0,00000000000000000000000000000000000000000000000000 0,000000 0,0000 0,0000 -0,000000 -0,00000000 0,0000 0,0000 -0,000000 -0,000000 0,000000 0,0000 -0,000000 -0,0000 0,000000 0,0000 0,0000 -0,0000 -0,000000 0,00000000. -0,0000 -0,0000 -0,0000 0,0000 0,0000 0,0000 -0,0000 -0,0000 -0,0000 0,0000 0,0000 0,0000 -0,0000 -0,0000 -0,0000 0,0000 0,0000 0,0000 ...... 5,0673 4,0538 3.0404 Я не получаю значения в кучу - person Capri; 10.07.2019