我尝试使用此代码:
Real x,y;
Boolean trigger(start = true)
when x < y and trigger then
trigger = false;
end when;
我想只为“when”生成一次事件。但我的代码不起作用。 如何在modelica中为when语句生成复杂事件?
答案 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 example和the 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;
可能有更好的方法来实现这一目标。还有其他人对此有所了解吗?
您可以检查编译日志(统计信息 - 事件)以确认只触发了一个事件。