如何在modelica中为when语句生成复杂事件?

时间:2017-05-16 09:41:28

标签: modelica openmodelica

我尝试使用此代码:

Real x,y;
Boolean trigger(start = true) 
when x < y and trigger then
   trigger = false;
end when;

我想只为“when”生成一次事件。但我的代码不起作用。 如何在modelica中为when语句生成复杂事件?

2 个答案:

答案 0 :(得分:2)

在Dymola中,您收到以下错误消息:

  

计算因果关系分析需要变量触发   从等式求解:当x < y然后触发然后触发=   假;结束的时候;   但是,何时条件还取决于未知数。

     

你可以通过在这些周围放置'pre'来削减循环   在条件的时候引用。

因此解决方案将是:

Real x,y;
Boolean trigger(start = true) ;
equation
when x < y and pre(trigger) then
   trigger = false;
end when;

如你所见,这很简单(并在Dymola中模拟),但我还没有在OpenModelica中检查它。

答案 1 :(得分:1)

您似乎遇到的问题是第一条错误消息Internal error BackendDAETransform.analyseStrongComponentBlock failed (Sorry - Support for Discrete Equation Systems is not yet implemented)。这似乎是https://trac.openmodelica.org/OpenModelica/ticket/1232,我认为这是因为在when语句中重新定义了部分条件变量。

您可以使用reinit解决此问题。另请参阅Bouncing ball examplethe reference。它需要对状态变量进行操作,这就是我将der(trigger)放在那里的原因。

model test_when
  Real trigger(start = 1.0, fixed = true);
equation
  der(trigger) = 0;
  when trigger > 0.5 and time > 5 then
    reinit(trigger, 0);
  end when;
  annotation(
    experiment(StartTime = 0, StopTime = 10, Tolerance = 1e-06, Interval = 0.02));
end test_when;

可能有更好的方法来实现这一目标。还有其他人对此有所了解吗?

您可以检查编译日志(统计信息 - 事件)以确认只触发了一个事件。