如何在Modelica中实现周期计数?

时间:2019-05-21 17:59:41

标签: modelica openmodelica

我在Modelica中有一个电池模型。 PNet是流过电池的功率值(PNet充电时为正,放电时为负)。这基于负载而振荡。我想计算电池经过的循环次数,以及每个循环的放电深度。

1 个答案:

答案 0 :(得分:5)

这是一个非常普通的问题,因此我的回答也将非常普通。我也不清楚,您指的是一个周期。 Wikipedia提到了深度放电和浅度放电,还有其他一些。

一些常规说明:在Modelica中,when语句对于计数非常有用。您可以通读Modelica Language Specification的第8.3.5节以获取有关此内容的完整信息。

下面的示例计算变量PNet变为正的频率,该频率应响应上述浅周期的数量。该模型的一些说明:

  • 模型noiseSource计算一个随机数,然后由一阶(PT1)元素过滤该随机数以计算PNet。在原始示例中,可能应该跳过该过滤器,它只是用来稍微平滑轨迹。
  • when语句中的代码在条件变为true时一次执行,从而可以进行计数。
  • pre语句在cycles语句激活之前立即访问when的值,从而可以计算条件发生的频率。
  • start=0中的cycles(start=0)设置了变量cycles的起始值,这是必需的,因为您不能使用cycles = 0,因为这会生成循环方程,从而不是你想要的。
  • {noiseSource}必须使用inner模型globalSeed

这是实际代码:

model CycleCounter
  inner Modelica.Blocks.Noise.GlobalSeed globalSeed;
  Modelica.Blocks.Noise.NormalNoise noiseSource;

  parameter Modelica.SIunits.Time T = 1e-3 "Time constant of PT1 element to filter random signal to compute PNet";

  Integer cycles(start=0) "Counts the number of ";
  Real PNet "Random value";

equation 
  der(PNet) = (noiseSource.y - PNet)/T;

  when PNet > 0 then
    cycles = pre(cycles)+1;
  end when;

  annotation (uses(Modelica(version="3.2.3")));
end CycleCounter;

以及在Dymola中模拟的结果:

Result of the code above