提问人:Dahmani Merzaka 提问时间:11/27/2022 最后编辑:Markus A.Dahmani Merzaka 更新时间:11/30/2022 访问量:88
触发梯形模型
Triggered Trapezoid Modelica
问:
我在Modelica逻辑块中使用触发梯形块。 我在模型中的一个变量上使用它,以消除该变量出现的峰值,因为该变量是由名为 ON 的布尔值触发的,当该布尔值等于 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;
答:
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.BooleanToReal
Modelica.Blocks.Nonlinear.SlewRateLimiter
BooleanToReal
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
希望这有帮助!
评论
Modelica.Blocks.Continuous.FirstOrder
SecondOrder