如何封装openmodelica流体库的模型?

时间:2017-06-01 08:37:25

标签: modelica openmodelica

问题和动机: openmodelica中流体库的模型非常精细,需要正确设置许多参数才能使模型运行并获得可接受的结果。 我想为机械和工艺工程师建立一个日常工程计算环境 - 没有模拟专家。 因此,必须预先配置我的库的组件,并且不应强迫用户编辑图形模型背后的代码(例如,重新声明介质)。

思想: 将流体模型放入自己的模型中,正确配置它们,重新声明介质并提供流体连接器。

model flowEncapsulateFluid1
inner Modelica.Fluid.System system;
replaceable package Medium =  Modelica.Media.Water.ConstantPropertyLiquidWater                           constrainedby
Modelica.Media.Interfaces.PartialMedium "Medium in the component"
  annotation (choicesAllMatching = true);

model myStaticPipe
Modelica.Fluid.Pipes.StaticPipe pipe(redeclare package Medium = Medium, allowFlowReversal = true, height_ab = 2, length = 2, diameter = 0.1);
Modelica.Fluid.Interfaces.FluidPort_a port_a;
Modelica.Fluid.Interfaces.FluidPort_b port_b;
equation
connect(pipe.port_b, port_b);
connect(port_a, pipe.port_a);

model myTank1
Modelica.Fluid.Vessels.OpenTank tank1(crossArea = 1, 
redeclare package  Medium = Medium, use_portsData = true, height = 12,
level_start = 8, nPorts = 6, 
portsData = {Modelica.Fluid.Vessels.BaseClasses.VesselPortsData 
(diameter = 0.1)});
Modelica.Fluid.Interfaces.FluidPort_a port_a 
(redeclare package Medium = Medium);
Modelica.Fluid.Interfaces.FluidPort_a port_a1 
(redeclare package Medium = Medium);
Modelica.Fluid.Interfaces.FluidPort_a port_a2 
(redeclare package Medium = Medium);
Modelica.Fluid.Interfaces.FluidPort_a port_a3 
(redeclare package Medium = Medium) ;
Modelica.Fluid.Interfaces.FluidPort_a port_a4 
(redeclare package Medium = Medium) ;
Modelica.Fluid.Interfaces.FluidPort_b port_b 
(redeclare package Medium = Medium);

equation
connect(tank1.ports[6], port_b);
connect(port_a4, tank1.ports[5]);
connect(port_a3, tank1.ports[4]);
connect(port_a2, tank1.ports[3]);
connect(port_a1, tank1.ports[2]);
connect(port_a, tank1.ports[1]);
end myTank1;

package UnitTests

model Test1
flowEncapsulateFluid1.myTank1 myTank11;
myStaticPipe myStaticPipe1;
myTank1 myTank12;
equation
connect(myStaticPipe1.port_b, myTank12.ports_b);
  connect(myTank11.ports_b, myStaticPipe1.port_a);

end Test1;

end UnitTests;
annotation(
uses(Modelica(version = "3.2.2")));
end flowEncapsulateFluid1;

我收到了消息"没有相应的'内部'声明找到组件.Modelica.Fluid.System tank1.system声明为'外部'。   现有的内心'组件是:     没有内心的'在外部'的任何父作用域中的模型中定义的组件。组件的范围:Modelica.Fluid.Vessels.OpenTank $ tank1。   检查你是否没有拼错外线'组件名称。   请声明内心'顶部作用域中具有相同名称的组件。   只考虑外部'继续扁平化。组件声明。"

我不知道如何解释这条消息。欢迎任何帮助。

此外,如果有人能为我提供此项目的建议或链接,我将不胜感激。

非常感谢提前。

2 个答案:

答案 0 :(得分:3)

y4cine,

您可以创建一个从Modelica.Fluid组件扩展的组件库,并最终确定您不希望用户看到的参数。例如

model myPipe
  extends Modelica.Fluid.Pipes.DynamicPipe(
    redeclare package Medium = Modelica.Media.Water.StandardWater,
    final height_ab=0,
    final isCircular=true);
end myPipe;

当您实例化组件(显示在Dymola中)时,参数不可见(参见下面的屏幕截图)。

parameters hidden

祝你好运, Rene Just Nielsen

答案 1 :(得分:0)

关于你的问题的这一部分:“没有找到组件.Modelica.Fluid.System tank1.system声明为'outer'的相应'内部'声明。

outerinner是modelica中的特殊关键词。

流体库定义了一个名为“系统”的“外部”模型,位于Modelica.Fluid.System。如果你把它拖到一个给出警告的模型中,问题就会消失,因为它会找到这个外部模型。通常,这个系统模型应该处于高水平而不是单个组件......