2016-12-28 59 views
0

我在Simulink中有一个动态系统的模型(我不能改变编程框架)。它可以被描述为受周期性振荡影响的振荡器。我试图控制它的运动,特别是为了最大限度地发挥它的作用(用于发电)。当锁定控制(一种常用的控制策略)时,其想法是在设备速度为0的情况下,在预定义时间内“锁定”,即锁定设备,然后释放它直到其速度再次达到0。保持恒定信号

所以,我需要在Simulink做的是输出信号1一旦速度信号达到(或接近)0,拿着它固定的时间段(在1),然后松开(信号变成0),并且一旦速度再次达到0就重复该过程。

我找到了一个好博客上Simulink中保持信号不变: http://blogs.mathworks.com/simulink/2014/08/06/how-do-you-hold-the-value-of-a-signal/

然而,在我的情况,我有确定信号两个条件:速度的幅度和时间周期内的时间。现在,问题是,只要周期结束并释放设备(信号= 0),速度仍然很小,如​​果使用if循环,可能会导致信号错误1

我认为使用S函数可能是最好的解决方案,但是接下来我将不得不使用固定的时间步长。有没有针对这个问题的任何Simulink原生解决方案?

+0

保持时间总是一样吗?如果保持速度仍然很小,您如何确定保持期不应该再次开始? (顺便说一句,你为什么认为S函数会迫使你使用固定的步骤?这是非常不可能的。) –

+0

保持时间总是相同的。这是因为激振力是振荡的。结果,锁定或保持将在正向位移时发生一次,而在每个波周期中位移为负向时会发生一次。 –

+0

我感觉使用S函数需要一个固定的步骤,因为我打算使用呼叫数来确定持久存储器的持续时间。 –

回答

0

我最终使用Matlab函数作为临时解决方案,它非常有效。我从https://uk.mathworks.com/matlabcentral/answers/11323-hold-true-value-for-finite-length-of-time获得灵感 u是速度信号。

function y = fcn(u,nlatch) 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 
% This function is used to determine the latching signal. 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 

% Using persistent memory: 
persistent tick started sign; 
% Initialize variables: 
if isempty(tick) 
    tick = 0; 
    started = 0; 
    sign = (u>0); 
end 
U=0;  % no latching   
s=(u>0); 

if s~=sign 
    started = 1; 
end 

if started 
    if tick<nlatch 
     tick=tick+1; 
     U = 1; 
    else 
     tick = 0; 
     started = 0; 
     sign = s; 
    end 
end 

y = U; 

end 

然而,正如我所说的,我必须使用固定的步长求解器,这也没什么大不了的我,但它可能会产生问题给其他用户。

如果有人有更多的“Simulink本机”解决方案,请让我知道!

编辑 我现在已经修改了功能:锁定现在被应用时存在符号变化的速度信号,而不是在一个小幅度更早地看着上(abs(u)<0.005),这是太病例具体。

我的同事也发现一个Simulink的天然溶液: Simulink model 然而,Matlab的功能是当采用相同的时间步长更快(计算较不密集)。也许最少的计算密集型解决方案是C S函数。

+0

这样对吗?考虑'tick> = nlatch'的第一步,但假设'abs(u)'仍然是'<0.005'的情况。你的输出将是'0'。你真的不希望它成为'1'(并且让定时器重新开始)。 –

+0

这是真的。但是,对于1)我的时间步长,2)我的动态模型的响应是0.005。因此,它是量身定做的。这就是我寻找连续的Simulink原生解决方案的原因。 –

+0

我的一位同事通过建议使用以下块来解决问题:碰撞交叉,可变时间延迟和记忆。 –