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

Har*_*mar 4 modelica openmodelica

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

Mar*_* A. 5

这是一个非常普通的问题,所以我的回答也将很普通。我也不清楚,您指的是一个周期。维基百科提到深层和浅层放电,还有其他一些。

一些一般注意事项:在Modelica中,该when语句可用于计数。您可以通读Modelica语言规范的 8.3.5节以获取有关此内容的完整信息。

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

  • 该模型noiseSource计算一个随机数,然后由一阶(PT1)元素过滤该随机数以计算PNet。在原始示例中,可能应该跳过过滤器,它只是在一点点平滑轨迹。
  • 当条件变为真时,when语句中的代码将执行一次,从而启用计数。
  • pre语句cycleswhen语句激活之前访问right 的值,从而可以计算条件发生的频率。
  • start=0cycles(start=0)为变量设置初始值cycles,因为你不能使用这是必要的cycles = 0,因为这会产生周期的公式,这是不是你想要的。
  • inner模型globalSeed是使noiseSource工作所必需的。

这是实际的代码:

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;
Run Code Online (Sandbox Code Playgroud)

而在Dymola中模拟的结果是:

上面代码的结果