在documentation中,表明cardinality()
函数已过时,不应再使用。但是,它仍在ThermoSysPro等库中使用。
例如
if (cardinality(C) == 0) then
some code
end if;
其中C
是FluidInlet
或FluidOutlet
有人可以举一个简单的例子说明如何替换它吗?
答案 0 :(得分:5)
通常的解决方案是使连接器成为条件连接器,如果启用该连接器,则需要连接器。
对于物理连接器,您可以查看如何处理热口和支撑:
Modelica.Electrical.Analog.Interfaces.ConditionalHeatPort
Modelica.Mechanics.Rotational.Interfaces.PartialElementaryOneFlangeAndSupport2
对于控制信号,您可以查看如何处理p_in
,h_in
等
Modelica.Fluid.Sources.Boundary_pT
Modelica.Fluid.Sources.Boundary_ph
但是,ThermoSysPro的连接器不属于这些类别,因此理想情况下也应对其进行清理。
答案 1 :(得分:2)
我唯一可以在这方面使用的是connectorSizing
注释。 MLS第18.7章对此进行了描述。
它在Modelica标准库中多次使用,例如在Modelica.Blocks.Math.MinMax
中通过参数nu
。使用时,该工具会根据与之连接的数量自动为nu
设置修饰符。
parameter Integer nu(min=0) = 0 "Number of input connections"
annotation (Dialog(connectorSizing=true));
Modelica.Blocks.Interfaces.RealVectorInput u[nu];
在下面的示例中,在图形层中创建连接时,Dymola会自动生成nu=2
。我删除了图形注释,以使代码更具可读性。
model ExCS
Modelica.Blocks.Math.MinMax minMax(nu=2);
Modelica.Blocks.Sources.Sine sine(freqHz=6.28);
Modelica.Blocks.Sources.Constant const(k=0.5);
equation
connect(sine.y, minMax.u[1]);
connect(const.y, minMax.u[2]);
end ExCS;
答案 2 :(得分:2)
cardinality()
运算符用在Modelica.Fluid.Sources.BaseClasses.PartialSource
中,并且在其他流体库(IBSPA
,AixLib
,Buildings
,{{1 }}和BuildingSystems
),形式为
IDEAS
我偶尔会从用户那里得到一些模型,这些模型最终以某种方式与 // Only one connection allowed to a port to avoid unwanted ideal mixing
for i in 1:nPorts loop
assert(cardinality(ports[i]) <= 1,"
each ports[i] of boundary shall at most be connected to one component.
If two or more connections are present, ideal mixing takes
place with these connections, which is usually not the intention
of the modeller. Increase nPorts to add an additional port.
");
end for;
建立了多个连接。这种情况的发生方式尚不清楚,但是我发现使用ports[i]
可以有效地捕获这种情况,否则会导致用户不打算并且很难发现的流体端口中的混合。