保持恒定信号

时间:2016-12-28 18:36:02

标签: simulink

我在Simulink中拥有动态系统的模型(我无法改变编程框架)。它可以被描述为受周期性振荡影响的振荡器。我试图控制它的运动,特别是最大化它(用于发电)。

使用锁定控制(一种流行的控制策略),我们的想法是“锁定”,即锁定到位,当设备的速度为0预定时间时,然后将其释放直到其速度再次达到0。

所以,我需要在Simulink中做的是在速度信号到达(或接近)1时输出信号0,保持一段时间({{{} 1}}),然后释放它(信号变为1),并在速度再次达到0后重复该过程。

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

然而,在我的情况下,我有两个确定信号的条件:速度的大小和时间段内的时间。现在,问题在于,一旦周期结束,设备被释放(信号= 0),速度仍然非常小,这可能导致0的信号不正确使用了一个if循环。

我认为使用S函数可能是最好的解决方案,但是我必须使用固定的时间步长。是否存在针对此问题的任何Simulink原生解决方案?

1 个答案:

答案 0 :(得分: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-native”解决方案,请告诉我们!

修改 我现在修改了这个功能:当速度信号中的符号发生变化时,现在应用锁存,而不是像之前(abs(u)<0.005)那样看一个小幅度,这过于特定于案例。

我的一位同事也发现了Simulink原生解决方案: Simulink model 但是,当采用相同的时间步长时,Matlab功能更快(计算密集度更低)。也许计算密集程度最低的解决方案是C S函数。