我在Modelica中有一个电池模型。 PNet是流过电池的功率值(PNet充电时为正,放电时为负)。这基于负载而振荡。我想计算电池经过的循环次数,以及每个循环的放电深度。
答案 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
,因为这会生成循环方程,从而不是你想要的。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中模拟的结果: