Simulink模型“到工作区”输出

时间:2019-07-04 08:19:04

标签: matlab simulink robotics pid-controller

我试图控制电动机转矩,并且在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

2 个答案:

答案 0 :(得分:0)

如果将Save format块中的To Workspace设置为Timeseries,则输出将具有信号尺寸乘以时间步长数。

在您的情况下,我激活了选项Display->Signals & Ports->Signal dimensions,并且模型中的信号尺寸如下所示:

Signal dimensions in Simulink model

因此,您输出到工作区的信号的大小为90。现在,如果我打印size(out.Data)我会得到

ans = 138  90

其中90是信号维度,138是Simulink模型中的时间步数。

您现在可以使用数据的最后一行(长度为90)并将其添加到数组中。

答案 1 :(得分:0)

我编辑您的代码,该代码的输出大小为[21,3]。 (21)来自(t_final * 1 / sample_time + 1)

  • 在您的代码中,时间t应该从0开始。
  • 如果运行模型9秒钟,则
  • Motor_Control.slx模型具有0.1个采样时间,每个文件的输出文件具有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