保存特定的模拟时间

时间:2015-09-09 14:27:54

标签: matlab storage simulink

我有一个在simulink中实现的双轨模型。为了控制速度,我使用PID控制器,这样速度的输出如下:

simulink

现在我想实现一个MATLAB函数或simulink块,它跟踪速度达到稳态行为的时间并将其放入某种存储器中。我尝试通过以下MATLAB函数和MATLAB-function-block实现类似的东西:

function y = fcn(t,v,dv,tv)
  %#codegen
  if (v==tv+0.01) & (dv<0)
  y=t
end

t是时钟信号,v是速度,dv是速度的第一个推导,而tv是目标速度。关于这个函数的问题是在某些执行路径上没有定义&#34;和#34;。你有任何想法如何使这项工作?

3 个答案:

答案 0 :(得分:4)

simulink

我使用simulink块 birthday name 0 2016-02-12 David 1 2017-02-12 David 2 2018-02-12 David 3 2016-04-03 Jane 4 2017-04-03 Jane 5 2018-04-03 Jane 6 2016-01-01 John 7 2017-01-01 John 8 2018-01-01 John 9 2016-02-03 Max 10 2017-02-03 Max 11 2018-02-03 Max 及其data store memory&amp;来解决了没有MATLAB函数的问题。 read阻止。从右下方进入的信号是瞬时速度。 write语句是

if

由于simulink正在使用时间步长且瞬时速度永远不会完全(u1 >= 22.2) & (u1<=22.3) & (u2<0) ,因此您无法使用22.2

答案 1 :(得分:3)

function y = fcn(t,v,dv,tv)
  %#codegen
y = zeros(length(t),1); % Initialise the array
for ii = 1:length(t)
  if (v==tv+0.01) & (dv<0)
  y(ii)=t;
  else
  y(ii)=0;
  end
end
y(y==0)=[];
end

两个更改:在y=t之后添加分号以强制它在每次设置时不打印它。第二,您的问题else y=[];,这意味着如果您不遵守y声明,if将是一个空矩阵。

每次不遵守0声明时,它会存储if。行y(y==0)=[];删除所有零,如果您希望y与输入变量的长度相同,请对此行进行注释。

function y = fcn(t,v,dv,tv)
  %#codegen
y = zeros(length(t),1); % Initialise the array
ii=1;
while exist(t)
  if (v==tv+0.01) & (dv<0)
  y(ii)=t;
  else
  y(ii)=0;
  end
ii = ii+1;
end
y(y==0)=[];
end

答案 2 :(得分:3)

在SimuLink中为您的函数添加第二个输出和第五个输入。然后使用该新输出作为函数的反馈。

function [y, output] = fcn(t,v,dv,tv,input)
y = 0;
output = input;
if (v == tv + 0.01) && (dv < 0)
    y = t;
    if (input == -1)
        output = t;
    end
end

output附加到IC块,将input初始值设置为-1或您想要使用的任何值。然后将IC块附加到函数的inputoutput将通过该功能不断反馈。一旦它被设定,它将永远地重新获得它的价值。