我有一个在simulink中实现的双轨模型。为了控制速度,我使用PID控制器,这样速度的输出如下:
现在我想实现一个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;。你有任何想法如何使这项工作?
答案 0 :(得分:4)
我使用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
块附加到函数的input
。 output
将通过该功能不断反馈。一旦它被设定,它将永远地重新获得它的价值。