我刚开始学习modelica而且我有一个(新手)问题。对我来说,问题在于将思维方式从传统的编程思维转变为思维方式。
我想做简单的程序。 我有输入数组,PV输出值分辨率为5分钟。 我有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。
你能解释一下我做错了吗?
谢谢!
答案 0 :(得分:2)
我希望我能正确理解你的问题。我使用Dymola来解决一个简单的例子 - 我希望这也适用于OpenModelica。
如果您尝试使用时间序列的输入数据,我建议您使用模型Modelica.Blocks.Sources.TimeTable
。在您的情况下,表的第一列将表示每小时的时间步长,即0,3600,7200,...;第二列可以给出以千瓦为单位的热量需求值,如果它恒定在300千瓦,就像你的例子那样,这可能意味着300,300,300,......;
您可以使用RealOutput作为TimeTable.y
在方程式中引用TimeTable模型的输出。
您的测试用例的一个非常简单的示例可能如下所示:
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
的计算值是输入和输出之差的积分。
我希望这会有所帮助。