代码之家  ›  专栏  ›  技术社区  ›  Efim Sturov

Matlab Simulink:带减法的while循环

  •  0
  • Efim Sturov  · 技术社区  · 7 年前

    我希望这里的人能够帮助我解决Simulink/Matlab代码中的一个小问题。这与我之前讨论的问题非常相似,但有点复杂,现在它更像是Simulink问题,而不是Matlab问题。 所以我有一个涡轮机,它的速度是由门的打开来控制的,因此控制电压。通过控制闸门开度,我正在加速涡轮机,在某个时间点,我需要引入饱和效应(因为我现在正在测试代码,它将由外部信号完成)。这种影响不会改变控制电压,但会影响系统的其他组件,因此在相同的控制电压下,涡轮机的速度会上升。但同时,我需要将速度保持在饱和效应之前的相同值(假设是320 rpm)。为此,我需要降低控制电压,并应继续这样做,直到我达到的速度,因为它是以前。无需立即执行(此方法稍后将在硬件中介绍),但在这些合成测试中检查算法将是一件好事。

    所以应该是这样的:

    u2  = 0;
    While speed > 320
    u2 = u2+0.25
    End
    

    u2最初为零,因为我们有一个预定义的初始控制电压。显然,当我们达到低于320的电机速度时,我需要保持u2的最新值(和控制电压)。

    总的来说,这是一个小代码,应该在Simulink中完成(不想在模型中引入任何其他Fcn函数)。我从未在Simulink中使用while和if块,但到目前为止,我提出了这个系统。这是我模型的简化版本,但控制原理是相同的。

    enter image description here

    我们得到的电机速度是350,而不是320(饱和前的速度),如果饱和后的速度更高,我们需要降低控制电压。为了触发while循环块,我决定使用一个简单的开关。同时,while块是: enter image description here

    当然不是最好的实现,但我尝试了很多不同的组合,但没有任何真正的成功。我总是会遇到同样的错误: enter image description here

    我们试图使用阶跃信号而不是常数7来模拟电机的加速度,并且在加速度超过320阈值的时刻得到相同的误差。因此,该方法看起来几乎是正确的,但从数学上讲,它无法找到最合适的解决方案。我试图在while子系统的内存部分实现传输延迟,但在编译过程中一直出现错误。 有没有任何明显的错误?或者从一开始,我就应该选择另一种方法——我真的希望有人能够帮助我。提前谢谢你,祝你度过愉快的一天。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Hazem    7 年前

    我认为你没有正确使用While block。

    这就是我所做的,我使用了“Matlab函数”块而不是“While”块,如下所示,

    enter image description here

    Matlab函数中的函数为

    function u2=fcn(speed,u2d)
    if speed>320
        u2=u2d+0.25;
    else
        u2=u2d;
    end
    

    我得到的结果是范围1

    Scope1

    范围

    Scope

    编辑

    由于您更喜欢无函数模型,下面可能会做同样的事情。

    enter image description here