Modelica:创建简单的流体模型
Modelica: Creation of Simple Fluid Models
我正在尝试创建流组件的模块化模拟(起初不使用标准 Modelica.Fluid,为了学习和简单)。我决定从只担心质量流量(而不是 temperature/enthalpy)开始,并创建了一个连接器 Stream
,如下所示:
connector Stream
Real pressure;
flow Real m_flow;
end Stream;
使用这个连接器,我想跟踪整个简单系统的压力和流量:
flow source >> valve >> tank >> pump >> flow sink
我为这些组件创建了以下模型:
model FlowSource "Flow Source can be used as a starting point of a flow"
parameter Real pressure = 1.0 "Pressure of the source";
Stream outlet;
equation
outlet.pressure = pressure;
end FlowSource;
model Valve
parameter Real Cv "Valve Coefficient, Cv";
Real setpoint(min=0,max=1) "Valve setpoint";
Real dp(start=1) "Pressure drop across the valve";
Real m(start=Cv) "Flow through the valve";
Real f(min=0,max=1) "Valve Characteristic f(setpoint)";
Stream inlet, outlet;
equation
inlet.m_flow + outlet.m_flow= 0.0; // Conservation of mass
dp = inlet.pressure - outlet.pressure; // Pressure drop calculation
f = setpoint; // linear valve
m = inlet.m_flow;
m = if(dp >= 0) then Cv*f*sqrt(dp) else -Cv*f*sqrt(-dp);
end Valve;
model Tank "Simple model of a tank"
parameter Real volume=1 "tank volume (m^3)";
parameter Integer num_ports=1 "Number of ports";
parameter Real static_pressure=1 "Internal Tank Pressure";
parameter Real initial_level = 0;
Stream[num_ports] ports "Stream Connectors";
Real level "Level in % 0-100";
protected
Real vol "Volume of medium in the tank";
initial equation
level = initial_level;
equation
for i in 1:num_ports loop
ports[i].pressure = static_pressure;
end for;
der(vol) = sum(ports.m_flow); // need to add density conversion
level = vol * 100 / volume;
end Tank;
model Pump "Simple model of a Pump"
Real setpoint(min=0,max=1) "setpoint of the pump (0.0 to 1.0)";
Stream inlet, outlet;
protected
Real dp "Pressure differential across the pump";
Real f "flow rate inside pump";
equation
inlet.m_flow+ outlet.m_flow= 0.0;
dp = outlet.pressure - inlet.pressure;
f = inlet.m_flow;
dp = (100-400*(f^2)); // insert better pump char. curve here
end Pump;
model FlowSource "Flow Source can be used as a starting point of a flow"
parameter Real pressure = 1.0 "Pressure of the source";
Stream outlet;
equation
outlet.pressure = pressure;
end FlowSource;
我可以创建这些模型的实例并将它们连接到一个单独的模型中。然而,我 运行 陷入了一个我认为是边界条件的问题。我想指定进入流体源的压力。当流体流向储罐时,阀门将产生压降。这是由罐内公称压力和流体源之间的差异决定的,应该可以正常工作。
问题是当泵遇到流体槽时(或者如果我有一个直接进入水箱的泵)。设置流体槽的压力会导致我的泵出现问题,因为它还会设置泵出口的压力(它们已连接)。泵的压力需要是入口压力和流量的函数(它应该给系统增加一些压力),水槽的压力应该以此为基础计算。不过dp的计算也需要这个压力。。。所以就转了一圈。
我做错了什么,有没有更好的方法来实现这样的系统?
谢谢!
编辑:
我忘了提到设定点(泵尚未实现)是在使用这些模型和方程式的主模型中设置的。所以我所有的模型都是平衡的。 (请参阅我对下面答案的评论)。
我的第一个建议是 "unit test" 您的每个组件。在这一点上,您会发现泵和阀门模型也可能有一个变量(或者缺少一个方程)。
如果你想对你的水箱模型进行单元测试,你应该制作一个质量流量源模型(你称之为 FlowSource
实际上是压力源)并将其中两个连接到你的水箱。
在阀门模型中,您应该 setpoint
一个参数或一个外部输入。在泵模型中,变量 setpoint
未被使用,因此您可以将其删除或将其作为参数。
修复后您的模型工作正常。
我将修复程序放在一个 mo 文件中,您可以在此处获取:
https://drive.google.com/file/d/0B8ojPn4YxnI9blRodUVWUjVGTE0/view?usp=sharing
此致,
雷内·贾斯特·尼尔森
我正在尝试创建流组件的模块化模拟(起初不使用标准 Modelica.Fluid,为了学习和简单)。我决定从只担心质量流量(而不是 temperature/enthalpy)开始,并创建了一个连接器 Stream
,如下所示:
connector Stream
Real pressure;
flow Real m_flow;
end Stream;
使用这个连接器,我想跟踪整个简单系统的压力和流量:
flow source >> valve >> tank >> pump >> flow sink
我为这些组件创建了以下模型:
model FlowSource "Flow Source can be used as a starting point of a flow"
parameter Real pressure = 1.0 "Pressure of the source";
Stream outlet;
equation
outlet.pressure = pressure;
end FlowSource;
model Valve
parameter Real Cv "Valve Coefficient, Cv";
Real setpoint(min=0,max=1) "Valve setpoint";
Real dp(start=1) "Pressure drop across the valve";
Real m(start=Cv) "Flow through the valve";
Real f(min=0,max=1) "Valve Characteristic f(setpoint)";
Stream inlet, outlet;
equation
inlet.m_flow + outlet.m_flow= 0.0; // Conservation of mass
dp = inlet.pressure - outlet.pressure; // Pressure drop calculation
f = setpoint; // linear valve
m = inlet.m_flow;
m = if(dp >= 0) then Cv*f*sqrt(dp) else -Cv*f*sqrt(-dp);
end Valve;
model Tank "Simple model of a tank"
parameter Real volume=1 "tank volume (m^3)";
parameter Integer num_ports=1 "Number of ports";
parameter Real static_pressure=1 "Internal Tank Pressure";
parameter Real initial_level = 0;
Stream[num_ports] ports "Stream Connectors";
Real level "Level in % 0-100";
protected
Real vol "Volume of medium in the tank";
initial equation
level = initial_level;
equation
for i in 1:num_ports loop
ports[i].pressure = static_pressure;
end for;
der(vol) = sum(ports.m_flow); // need to add density conversion
level = vol * 100 / volume;
end Tank;
model Pump "Simple model of a Pump"
Real setpoint(min=0,max=1) "setpoint of the pump (0.0 to 1.0)";
Stream inlet, outlet;
protected
Real dp "Pressure differential across the pump";
Real f "flow rate inside pump";
equation
inlet.m_flow+ outlet.m_flow= 0.0;
dp = outlet.pressure - inlet.pressure;
f = inlet.m_flow;
dp = (100-400*(f^2)); // insert better pump char. curve here
end Pump;
model FlowSource "Flow Source can be used as a starting point of a flow"
parameter Real pressure = 1.0 "Pressure of the source";
Stream outlet;
equation
outlet.pressure = pressure;
end FlowSource;
我可以创建这些模型的实例并将它们连接到一个单独的模型中。然而,我 运行 陷入了一个我认为是边界条件的问题。我想指定进入流体源的压力。当流体流向储罐时,阀门将产生压降。这是由罐内公称压力和流体源之间的差异决定的,应该可以正常工作。
问题是当泵遇到流体槽时(或者如果我有一个直接进入水箱的泵)。设置流体槽的压力会导致我的泵出现问题,因为它还会设置泵出口的压力(它们已连接)。泵的压力需要是入口压力和流量的函数(它应该给系统增加一些压力),水槽的压力应该以此为基础计算。不过dp的计算也需要这个压力。。。所以就转了一圈。
我做错了什么,有没有更好的方法来实现这样的系统?
谢谢!
编辑: 我忘了提到设定点(泵尚未实现)是在使用这些模型和方程式的主模型中设置的。所以我所有的模型都是平衡的。 (请参阅我对下面答案的评论)。
我的第一个建议是 "unit test" 您的每个组件。在这一点上,您会发现泵和阀门模型也可能有一个变量(或者缺少一个方程)。
如果你想对你的水箱模型进行单元测试,你应该制作一个质量流量源模型(你称之为 FlowSource
实际上是压力源)并将其中两个连接到你的水箱。
在阀门模型中,您应该 setpoint
一个参数或一个外部输入。在泵模型中,变量 setpoint
未被使用,因此您可以将其删除或将其作为参数。
修复后您的模型工作正常。
我将修复程序放在一个 mo 文件中,您可以在此处获取:
https://drive.google.com/file/d/0B8ojPn4YxnI9blRodUVWUjVGTE0/view?usp=sharing
此致, 雷内·贾斯特·尼尔森