考虑下面的MWE,其中一个模型有一个可折叠的函数,可以从多个选项中选择如何计算介质比热容,有些使用来自介质模型的函数,有些则没有,因此使用一个软件包来收集所有的比热容函数。
package Library
model Model
replaceable package Medium =
Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation(choicesAllMatching=true);
replaceable function cp = FunctionPackage.baseCp annotation(choicesAllMatching=true);
parameter Real M;
parameter Real V;
parameter Real Qflow;
Real T;
Real p;
equation
M*cp(p,T)*der(T) = Qflow;
p*V = M*Medium.R_gas*T;
end Model;
package FunctionPackage
partial function baseCp
input Real p;
input Real T;
output Real cp;
end baseCp;
function realCp
extends baseCp;
algorithm
cp := Medium.specificHeatCapacity(p, T);
end realCp;
function linearCp
extends baseCp;
algorithm
cp :=0.1*T + 1000;
end linearCp;
end FunctionPackage;
end Library;如果我要在另一个模型中模拟Model,我必须选择要计算cp的函数:
model Simulation
Library.Model Model(
redeclare package Medium = Modelica.Media.Air.SimpleAir,
M=1,
Qflow=1,
V=0.1,
redeclare function cp = Library.FunctionPackage.linearCp);
end Simulation;但是,如果我选择realCp函数,那么错误就会上升:
Function Medium.specificHeatCapacity is not known in (function Library.FunctionPackage.realCp)这对我来说并不奇怪,我知道在FunctionPackage中声明的函数“不知道”在Model模型中声明的中介包。因此,我的问题是:我如何使他们意识到?是否可以将媒体作为函数的输入传递?
我知道,在FunctionPackage中声明Model中的函数会将它们放在与Medium相同的范围内,使我能够在函数中调用它,而不会出现任何问题。虽然这样做使我失去了replaceable function的下拉功能,但我在这里确实需要这样做,因此失去它不是一种选择。
顺便说一句,我不知道这个问题是否有用,但我在Windows 1064位下使用Dymola2017 (32位)。
发布于 2018-07-10 08:16:45
您不能将媒体包直接作为普通函数输入传递.
一种解决办法如下:
添加介质作为LibraryFunction的可替换包
package FunctionPackage
replaceable package Medium =
Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
choicesAllMatching=true);
...并在需要它的地方创建一个新的FunctionPackage:
model Model
replaceable package Medium =
Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
choicesAllMatching=true);
replaceable function cp = MyFunctionPackage.baseCp annotation (
choicesAllMatching=true);
package MyFunctionPackage = FunctionPackage (redeclare package Medium =
Medium);
...
model Simulation
package MyFunctionPackage = Library.FunctionPackage(redeclare package Medium=
Modelica.Media.Air.SimpleAir);
Library.Model Model(
redeclare package Medium = Modelica.Media.Air.SimpleAir,
...
redeclare function cp = MyFunctionPackage.linearCp);
end Simulation;另一个变体是在函数中将它作为可替换的包,如下所示(更短,但我发现它更令人困惑):
function realCp
extends baseCp;
replaceable package Medium =
Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
choicesAllMatching=true);
algorithm
cp := Medium.specificHeatCapacityCp(p, T);
end realCp;并用作:
function cp = FunctionPackage.realCp(redeclare package Medium=Medium);发布于 2018-07-10 13:22:35
不是一个完整的答案,但下面是一个可模拟的模型(在Dymola 2019中测试),它基于最初的问题和Hans的答案(使用变式2):
package Library
model Model
replaceable package myMedium = Modelica.Media.Air.SimpleAir constrainedby
Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
choicesAllMatching=true);
function funMach = FunctionPackage.Mach(redeclare package funMedium=myMedium);
Real Mach;
parameter Modelica.SIunits.Temperature T=293.15;
parameter Modelica.SIunits.Pressure p=101325;
protected
Real TempTime = T + time;
equation
Mach = funMach(state=myMedium.setState_pT(p,TempTime), velo=300);
end Model;
package FunctionPackage
function Mach
replaceable package funMedium = Modelica.Media.Interfaces.PartialSimpleIdealGasMedium annotation (
choicesAllMatching=true);
input funMedium.ThermodynamicState state;
input Modelica.SIunits.Velocity velo;
output Real Mach;
protected
Modelica.SIunits.Velocity souvel;
algorithm
souvel := funMedium.velocityOfSound(state);
Mach := velo/souvel;
end Mach;
end FunctionPackage;
end Library;https://stackoverflow.com/questions/51247315
复制相似问题