在Modelica中替换折旧函数基数(c)

时间:2019-11-21 15:01:50

标签: modelica openmodelica jmodelica

documentation中,表明cardinality()函数已过时,不应再使用。但是,它仍在ThermoSysPro等库中使用。

例如

if (cardinality(C) == 0) then
 some code
end if;

其中CFluidInletFluidOutlet

有人可以举一个简单的例子说明如何替换它吗?

3 个答案:

答案 0 :(得分:5)

通常的解决方案是使连接器成为条件连接器,如果启用该连接器,则需要连接器。

对于物理连接器,您可以查看如何处理热口和支撑: Modelica.Electrical.Analog.Interfaces.ConditionalHeatPort Modelica.Mechanics.Rotational.Interfaces.PartialElementaryOneFlangeAndSupport2

对于控制信号,您可以查看如何处理p_inh_inModelica.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中,并且在其他流体库(IBSPAAixLibBuildings,{{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]可以有效地捕获这种情况,否则会导致用户不打算并且很难发现的流体端口中的混合。