0

我刚开始学习modelica,我有一个(新手)问题。对我来说,问题是将思维方式从传统的编程思维方式转变为模型思维方式。

我想做简单的程序。我的输入数组具有 5 分钟分辨率的 PV 输出值。我的输入数组具有 60 分钟分辨率的热负荷值。我有一个能量储存器,可以存储多余的能量或实时获取能量来满足热量需求。

我在 openmodelica 中写了这个:

`class Add
 Real PV[:] = 100:10:1000;
 Real Heat[:] = 200:300:6000;
 Real Storage;
 Real p;
 Integer j;
 Integer i;
 Boolean power,heat;
 equation
 power=sample(0,5);
 heat=sample(0,60);
 when power then
 j=j+1;
end when;

when heat then
i=i+1;

end when;

Storage= PV[j] * 2.375-Heat[i];

p=Storage+ pre(p);

end Add;`

但是当我 c/p 到 dymola 时,它会在这个“p=Storage+ pre(p);”部分出现错误,因为它说 pre() 不能用于连续模型。当我删除 pre() 时,它说它不能除以 0。

你能解释一下我做错了什么吗?

谢谢!

4

1 回答 1

2

我希望我能正确理解你的问题。我用 Dymola 解决了一个简单的例子——我希望这也适用于 OpenModelica。

如果您尝试使用时间序列的输入数据,我建议您使用模型Modelica.Blocks.Sources.TimeTable。在您的情况下,表格的第一列将表示每小时时间步长,即 0、3600、7200,...;第二列可以给出以 kW 为单位的热量需求值,如果它像您的示例中那样恒定为 300 kW,这可能意味着 300、300、300,...;

您可以在方程式中使用其 RealOutput as 来引用 TimeTable 模型的输出TimeTable.y

因此,您的测试用例的一个非常简单的示例可能如下所示:

model heatStorage

  Modelica.SIunits.Conversions.NonSIunits.Energy_kWh storage "Energy content of storage in kWh";

  Modelica.Blocks.Sources.TimeTable solarThermal(table=[0,50; 3600,70; 7200,40; 10800,73]);
  Modelica.Blocks.Sources.TimeTable heatDemand(table=[0,300; 3600,300; 7200,300; 10800,
    300]);

equation
  der(storage) = (solarThermal.y - heatDemand.y)/3600;

end heatStorage;

我假设太阳能集热器的时变输出。如果您使用 PV 来加热水,您可以包括另一个变量和转换方程。对于变量storage,我使用了以 kWh 为单位的能量定义,因此我将给定的方程除以 3600。由于 Modelica 是基于方程的,因此写作der(storage)与将方程的右侧积分相同。因此,计算的值storage是输入和输出之差的积分。

我希望这有帮助。

于 2014-02-12T09:40:48.667 回答