本文将介绍在Modelica使用时遇到的一些Bug以及处理方法,主要使用的平台是Dymola,有任何问题可联系博主。
Bug以及解决方法
组件名称无效的情况
问题描述:当组件名称与自建库名称一致时,容易出现报错问题,但并不一定100%复现错误。
//错误例子 package Controller Controller.HeatpumpController_LC2 Controller "空气源热泵控制器" annotation (Placement(transformation(extent={{760,-540},{968,-400}}))); //正确示范 package Controller Controller.HeatpumpController_LC2 controller "空气源热泵控制器" annotation (Placement(transformation(extent={{760,-540},{968,-400}})))
解决方案:这个问题似乎是软件的一个Bug,当完成包(package)的声明后,紧接着对模型进行示例化时,如果使用与包相同的名称(name1)则会报错,但这时先修改package名称(name2),再使用先前名称(name1)对模型进行实例化,最后将package名称改回,则不会触发错误。 通常情况下,组件名称建议小写开头,变量名称建议大写开头。
联合仿真问题
问题描述:与Energyplus进行联合仿真时,出现交互时间点报错,如下图所示:
解决方法:尝试了几种方式,并且对导出的FMU进行了测试,FMU的设置没有问题,问题应该是在于模型的使用方法,FMU模块的输入输出之间不能以代数方程的方式直接相连,需要具有微分环节,并且通过pre函数带来的延时环节同样不能使用,典型应用环路如下:
其中,温度计应该设置一定的延迟动态时间,否则还是会触发交互点时间差问题。
膨胀水箱的使用问题
问题描述:通常在使用的时候,对于一个封闭的环路需要连接一个膨胀水箱才可以正常运行,但当系统有多个定压点存在时,并且模型中使用同一个膨胀水箱时就需要注意连接点的问题,防止出现本没有耦合关系的环路,水力出现了耦合的情况。例如在下面的例子中,本想搭建两个没有水力过程耦合但使用同一个定压水箱的环路,如下第一张图所示,但会发现两个环路出现了混流的情况。
问题解释:设备的进口与出口连接时,其实就是将两个流体接口进行等价,因此,第一张图其实等效于第二张图,因此流体会在接口进行混合后再输配给下游设备,也就是出现混流的情况。
解决方法:避免接口等价,就是添加一些组件,使得其再编译时不将两个环路定压点进行等价,或者直接使用两个膨胀水箱,如下图所示。
此外,经过测试发现,如果将两个接口封装在模型外,也可以防止接口等价现象的出现。
补充:使用边界源(Buildings.Fluid.Sources.Boundary_pT)也可以实现相同的定压效果,其原理都是通过指定接口压力来达到定压的效果,但如果添加膨胀水箱模型(Buildings.Fluid.Storage.ExpansionVessel),其中将加入几个微分方程,如下所示,用于判断水箱是否拥有充足的水,当定压点压力持续降低水箱内水流尽后,模型将会报错。因此一般情况下,使用边界源的方法时,模型计算速度将要快于使用膨胀水箱模型,在不需要考虑补水等因素的模型中,推荐使用边界源模型。
equation assert(m > 1.0E-8, "Expansion vessel is undersized. You need to increase the value of the parameter V_start."); // Conservation equations der(m) = port_a.m_flow; der(H) = port_a.m_flow * actualStream(port_a.h_outflow); der(mXi) = port_a.m_flow * actualStream(port_a.Xi_outflow); der(mC) = port_a.m_flow * actualStream(port_a.C_outflow); // Properties of outgoing flow. // The port pressure is set to a constant value. port_a.p = p_start; m*port_a.h_outflow = H; m*port_a.Xi_outflow = mXi; m*port_a.C_outflow = mC;
评论
还没有任何评论,你来说两句吧!