我在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原生解决方案?
答案 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原生解决方案: 但是,当采用相同的时间步长时,Matlab功能更快(计算密集度更低)。也许计算密集程度最低的解决方案是C S函数。