在翻译时确定 Modelica 模型中特定组件的数量(使用 Dymola)

Determine the number of a specific component in a Modelica model at translation (using Dymola)

您如何确定翻译时此模型中给定 class 的实例数。此大小用于设置向量的大小。

model ModelToBeCounted
end ModelToBeCounted;
  
model Example
  ModelToBeCounted A;
  ModelToBeCounted B;
  ModelToBeCounted C;
end Example;

所以在这个例子中我想确定 ModelToBeCounted 的实例数。这些实例也可以在其他 classes 的实例中。可以更改顶层的代码来执行此操作,并且 ModelToBeCounted 也可以更改。

我尝试使用外部对象,但是我找不到一种方法来确保在用于报告外部对象总数的函数 运行 之前创建了所有外部对象。

有什么想法吗?

谢谢

ModelManagement 图书馆可以做到这一点。

事实上,正是您需要的功能可用:

ModelManagement.Structure.Instantiated.CountUsedModels("Example", {"ModelToBeCounted"});
= {3}

该库随 Dymola 一起安装,并可通过标准许可证使用。 您只需从 菜单中打开它。

一个问题可能是,这个函数必须翻译你的模型。我不确定这是否能满足您的要求:

This size is to be used to set the size of a vector.

如果你可以修改模型ModelToBeCounted你可以使用inner/outer:

  connector C
    Real totalNum;
    flow Real addNum;
  end C;

  model InnerObjectCounter
    C c;
  equation 
    c.totalNum+c.addNum=0 "Correct sign";
    annotation(missingInnerMessage="Add inner component to count objects");
  end InnerObjectCounter;

  model FlowSource
    C c;
  equation 
    c.addNum=1;
  end FlowSource;


  model AddCounter
    outer InnerObjectCounter objectCounter;
    final Integer totalNum=integer(flowSource.c.totalNum);
    FlowSource flowSource;
  equation 
    connect(flowSource.c, objectCounter.c);
  end AddCounter;

  model ModelToBeCounted
    AddCounter c;
  end ModelToBeCounted;

所有组件都使用inner/outer-mechanism自动连接到内部对象,它们的流量为 1 并加在一起。

如果你不能修改模型ModelToBeCounted,并且你愿意使用non-standarized方法你可以设置标志:

Hidden.AllowAutomaticInstanceOf=true;

然后使用:

final parameter Integer m=sum(1 for m in P.ModelToBeCounted);

来自: https://github.com/modelica/ModelicaSpecification/blob/MCP/0021/RationaleMCP/0021/