请考虑以下Modelica示例模型:
model Detection2
Real x = (1-2*time)*1e5;
parameter Real x_min=0.1;
Real y;
equation
y = max(x,x_min);
assert(y>x_min, "(assert) triggered at t = " + String(time), level=AssertionLevel.warning);
when y <= x_min then
Modelica.Utilities.Streams.print("(when) triggered at t = " + String(time));
end when;
annotation (experiment(StopTime=1));
end Detection2;
当我模拟它(在Dymola 2019FD01中)时,得到以下结果:
结果看起来像预期的一样,但是assert消息和print语句都打印了错误的时间,它们总是打印停止时间,而不是我期望的时间!?
答案 0 :(得分:3)
这有两部分:
y>x_min
为“几乎为真”,即认为y>x_min-eps
为真,一些小的epsilon。在规范的8.5事件和同步中对此进行了说明。 https://specification.modelica.org/v3.4/Ch8.html#events-and-synchronization terminal
运算符。在某些情况下,比较会从字面上看。如果您使用x>x_min
和x<=x_min
代替,它将按预期工作。
或者,如果您使用过y = if x>=x_min then x else x_min
,则y可能会略低于x_min
,但是消息会触发。