触发梯形模型

Triggered Trapezoid Modelica

提问人:Dahmani Merzaka 提问时间:11/27/2022 最后编辑:Markus A.Dahmani Merzaka 更新时间:11/30/2022 访问量:88

问:

我在Modelica逻辑块中使用触发梯形块。 我在模型中的一个变量上使用它,以消除该变量出现的峰值,因为该变量是由名为 ON 的布尔值触发的,当该布尔值等于 1 时,该变量在前几秒记录峰值,如图所示。

1

当我使用触发梯形时,它给了我错误的变量值。 这是我使用触发陷阱的模型的摘录:

 model prog
  Real y;
  Boolean u;
protected
 discrete Real endValue "Value of y at time of recent edge";
 discrete Real rate "Current rising/falling rate";
  discrete Modelica.SIunits.Time T "Predicted time of output reaching endValue";
equation
amplitude = Var;
  u = ON;
  y = if time < T then endValue - (T - time) * rate else endValue;
 when {initial(), u, not u} then
    endValue =  if u then offset + amplitude else offset;
    rate = if u and rising > 0 then amplitude / rising else if not u and falling > 0 then -amplitude / falling else 0;
    T = if u and not rising > 0 or not u and not falling > 0 or not abs(amplitude) > 0 or initial() then time else time + (endValue - pre(y)) / rate;
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          end when;
end prog;
布尔逻辑 模型 OpenModelica Dymola 特征工程

评论

1赞 Markus A. 11/28/2022
在不知道输入和/或所需行为的情况下很难提供帮助。可能其他块更易于应用过滤,例如 或?Modelica.Blocks.Continuous.FirstOrderSecondOrder
0赞 Dahmani Merzaka 11/28/2022
我得到的问题是,当布尔值=1时,阀门打开并且通过它的质量流量在那一刻达到峰值,逐渐打开阀门将有助于模型的稳定性。
0赞 Akhil Nandan 11/30/2022
如果您能提供能够编译的最低版本的代码,如果它不暴露机密性,那就太好了。

答:

0赞 Dahmani Merzaka 11/28/2022 #1

我的目标是将布尔值转换为实数,以便在我的模型中逐渐打开阀门,我的触发梯形模型中的故障是我输入了 amplitude= Var,而 Var 是我的阀门的质量流量。正确的做法是将 amplitude=ON,其中 ON 是控制阀门打开的布尔值,然后我将质量流量乘以“y”(触发梯形块的结果),这将模拟阀门的逐渐打开

评论

0赞 Markus A. 11/29/2022
对于您想要实现的目标,我会使用 a 和 a 的组合(在 的输出中)。Modelica.Blocks.Math.BooleanToRealModelica.Blocks.Nonlinear.SlewRateLimiterBooleanToReal
1赞 Markus A. 11/29/2022
请注意:编辑原始问题比添加答案来澄清问题更有意义。
0赞 Akhil Nandan 11/30/2022
@MarkusA.的建议在我之前的一份工作中对我有用,所以我肯定会推荐尝试一下!Modelica.Blocks.Nonlinear.SlewRateLimiter
1赞 Akhil Nandan 11/30/2022 #2

请参考以下 Modelica 代码:

model Test
  Modelica.Blocks.Nonlinear.SlewRateLimiter slewRateLimiter(Td = 0.5)  annotation(
    Placement(visible = true, transformation(origin = {-4, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Sources.BooleanPulse booleanPulse(period = 10)  annotation(
    Placement(visible = true, transformation(origin = {-82, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
  Modelica.Blocks.Math.BooleanToReal booleanToReal annotation(
    Placement(visible = true, transformation(origin = {-44, 30}, extent = {{-10, -10}, {10, 10}}, rotation = 0)));
equation
  connect(booleanToReal.u, booleanPulse.y) annotation(
    Line(points = {{-56, 30}, {-70, 30}}, color = {255, 0, 255}));
  connect(booleanToReal.y, slewRateLimiter.u) annotation(
    Line(points = {{-32, 30}, {-16, 30}}, color = {0, 0, 127}));
  annotation(
    uses(Modelica(version = "4.0.0")));
end Test;

上面的代码为布尔脉冲 () 输入生成以下输出:Modelica.Blocks.Sources.BooleanPulse

enter image description here

希望这有帮助!