3

以下简单模型是正确的并且在 dymola 中工作:

model new_timer

  Modelica.Blocks.Logical.Timer timer;
  Real my_time( start=0);

equation 
    timer.u=true;

    my_time=timer.y;

end new_timer;

但是,在使用 dymola 进行“检查”期间,以下一项是正确的,但在模拟期间不起作用:

model new_timer

  Modelica.Blocks.Logical.Timer timer;
  Real my_time( start=0);

algorithm 
    timer.u:=true;
    my_time:=timer.y;

end new_timer;

我想知道并寻找一种使后者工作的方法。dymola报错如下:

Failed to generate code for an algebraic loop
involving when equations or algorithms with when parts.
Unknowns:
my_time
timer.entryTime
timer.u
timer.y

Equations:
when timer.u then
timer.entryTime = time;
end when;
timer.y = (if timer.u then time-timer.entryTime else 0.0);
algorithm 
    timer.u := true;
    my_time := timer.y;

You may be able to cut the loop 
by putting 'pre' around some of the references to
unknown continuous time variables in when parts or when conditions.

Translation aborted.
4

2 回答 2

3

出色地。这是一个很好的例子,说明了为什么你应该尽可能使用方程部分。

以下...

算法
    timer.u:=真;
    my_time:=timer.y;

...大致等于:

算法
    (timer.u,my_time) := f(timer.y);

现在更清楚的是 timer.u 看起来依赖于 timer.y。所以你得到一个循环。

下面创建了两个算法部分,这意味着依赖关系更加分散(有点像方程部分):

算法
    timer.u:=真;
算法
    my_time:=timer.y;

尽量使用尽可能短的算法部分。

于 2014-01-27T06:00:02.143 回答
2

这是一个奇怪的问题,我怀疑这是 Dymola 中的一个错误(原因我稍后会解释)。

事实证明您遇到了这个问题,尽管在这种情况下并不明显为什么会这样。

因此,一种解决方案是使用稍微不同的Timer模型实现,如下所示:

block Timer 
  "Timer measuring the time from the time instant where the Boolean input became true" 

  extends Modelica.Blocks.Interfaces.partialBooleanBlockIcon;
  Modelica.Blocks.Interfaces.BooleanInput u "Connector of Boolean input signal"
    annotation (extent=[-140,-20; -100,20]);
  Modelica.Blocks.Interfaces.RealOutput y "Connector of Real output signal" 
    annotation (extent=[100,-10; 120,10]);
protected 
  discrete Modelica.SIunits.Time entryTime "Time instant when u became true";
initial equation 
  pre(entryTime) = 0;
equation 
  when pre(u) then
    entryTime = time; 
  end when;
  y = if u then time - entryTime else 0.0;
end Timer;

请注意子句pre中条件周围存在运算符。when

一般来说,使用pre运算符是一个好主意(正如我在其他问题中解释的那样)。为什么在您的具体情况下有必要,我无法解释。条件表达式只是true在您的情况下,这意味着它应该when在模拟开始时触发该子句。我没有看到 Dymola 在这里谈论的代数环。我怀疑这与 Dymola 试图组织在模拟开始时应该发生的所有事情并在那里遇到一些复杂情况有关。但这并不明显,并且可以通过Timer我提到的替代模型来避免。

于 2014-01-26T14:41:08.140 回答