首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何封装openmodelica的流体库模型?

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

Stack Overflow用户
提问于 2017-06-01 16:37:25
回答 2查看 334关注 0票数 2

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

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

代码语言:javascript
复制
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。检查‘外部’组件名称是否拼写错误。请在顶部作用域中声明一个具有相同名称的‘内部’组件。继续扁平化,只考虑‘外部’组件声明。”

我不知道该如何解释这条信息。任何帮助都是受欢迎的。

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

在此之前,非常感谢您。

EN

回答 2

Stack Overflow用户

发布于 2017-06-01 17:29:16

y4cine,

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

代码语言:javascript
复制
model myPipe
  extends Modelica.Fluid.Pipes.DynamicPipe(
    redeclare package Medium = Modelica.Media.Water.StandardWater,
    final height_ab=0,
    final isCircular=true);
end myPipe;

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

致以最好的问候,Rene Just Nielsen

票数 3
EN

Stack Overflow用户

发布于 2017-06-01 21:16:19

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

outerinner是modelica中的特殊关键词。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44302528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档