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

如何在modelica for when语句中生成复杂事件?,modelica,openmodelica,Modelica,Openmodelica,我尝试使用以下代码: Real x,y; Boolean trigger(start = true) when x < y and trigger then trigger = false; end when; 实x,y; 布尔触发器(开始=真) 当x

我尝试使用以下代码:

Real x,y;
Boolean trigger(start = true) 
when x < y and trigger then
   trigger = false;
end when;
实x,y;
布尔触发器(开始=真)
当x
我只想为“when”生成一次事件。但是我的代码不起作用。
如何在modelica for when语句中生成复杂事件?

您似乎遇到的问题是第一条错误消息
内部错误BackendDAETransform.analyseStrongComponentBlock失败(很抱歉,尚未实现对离散方程系统的支持)
。这似乎是,我认为这是因为在when语句中重新定义了部分条件变量

您可以使用
reinit
解决此问题。另见和。它需要作用于一个状态变量,这就是为什么我把
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;
也许有更好的方法来实现这一点。还有其他人对此有意见吗


您可以检查编译日志(Statistics-events)以确认只触发了一个事件。

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

计算因果关系分析需要触发变量 由方程求解:当x 您可以通过在这些周围放置“pre”来切断循环 when条件中的引用

因此,解决办法是:

Real x,y;
Boolean trigger(start = true) ;
equation
when x < y and pre(trigger) then
   trigger = false;
end when;
实x,y;
布尔触发器(start=true);
方程式
当x

正如您所看到的,这非常简单(并在Dymola中进行了模拟),但我没有在OpenModelica中检查它。

“但我的代码不起作用”并不是很有帮助——您希望发生什么,会发生什么?另外,请发布一个完整的,有效的例子。我得到翻译错误,我认为这是无效的代码。当我使用时代码工作:当x。但是我得到了很多事件(x时,可以使用几个条件,如
,但它与运算符“or”(条件不相互排斥)一样工作。谢谢您的回答。我看到了它的工作原理,我会发现我的实现有问题。非常感谢,它也在OM中。它可能是不带'pre()'的模拟,带有'algorithm':
布尔触发器(start=true,fixed=true);时间>5时的算法,然后触发:=假;结束时