【问题标题】:How to pass multiple variables from one model to another model (inner/outer)如何将多个变量从一个模型传递到另一个模型(内部/外部)
【发布时间】:2018-11-13 15:21:43
【问题描述】:

假设我们有以下模型:

收藏家:

model Collector
  Real collect_here;
annotation(defaultComponentPrefixes="inner");
end Collector;

以及以下模型可能多次:

model Calculator
  outer Collector collector;
  Real calculatedVariable = 2*time;

equation 
  calculatedVariable = collector.collect_here;

end Calculator;

如果 calcModel 在要模拟的系统中仅存在一次,则上述代码有效。如果模型不止一次存在,我会得到一个单一的系统。这通过下面的示例得到证明。更改参数 works 会导致系统正常工作或失败。

model Example
  parameter Boolean works = true;

  inner Collector collector;
  Calculator calculator1;
  Calculator calculator2 if not works;

end Example;

在收集器中使用数组来传递多个变量并不能解决问题。

另一种可能的解决方法是使用连接器,但我只让它与一个 calcModel 一起工作。

【问题讨论】:

    标签: modelica dymola


    【解决方案1】:

    使用Calculator 的多个实例确实会破坏模型,因为单个变量calculatedVariable 将有多个方程来尝试计算其值。因此 Dymola 抱怨系统在结构上是奇异的,在这种情况下,这意味着所得到的方程组中的方程多于变量。

    提供更多见解:实际上检查 Collector 将失败,因为自 Modelica 3.0 以来,每个组件都必须平衡(意味着它必须具有与状态一样多的未知数),而 @ 不是这种情况987654324@ 因为它确实有一个未知数但没有方程式。这极大地限制了inner/outer 构造的可能应用,因为基本上每个变量都必须在定义的地方进行计算。

    在给定的示例中,如果恰好使用了一个Calculator,则会在整个系统中进行补偿。所以这个单一的组合将起作用。虽然这可行,但它是不应该做的事情 - 因为很容易出错(并且所有子模型都应该通过检查)。

    您关于如何解决此问题的问题实际上错过了对问题实际情况的描述。在我看来,您的方法可能对以下一些情况有用:

    1. 您想从一个点绘制多个变量,这将是收集器。为此,“变量选择”应该是最直接的方法:请参阅 Dymola 手册卷。 1,关于如何应用它们的“4.3.11 匹配和变量选择”部分。
    2. 您想对该变量执行一些数学运算。然后,拥有可变大小的矢量化输入可能会很有用。这可以实现与此输入的任意数量的连接。有关此示例,请查看:Modelica.Blocks.Math.MultiSum
    3. 您想在不同型号之间路由多个信号(从您的描述来看这不太可能,但仍然如此):那么expandable connectors 将是一个很好的可能性。要了解具体内容,请查看 Modelica.Blocks.Examples.BusUsage

    希望这会有所帮助,否则请更清楚地说明您的代码实际想要实现的目标。

    【讨论】:

    • 我想收集从一组模型中计算出来的热损失,以便在系统分析中更容易处理。
    • 您想要每个热量损失的向量,还是它们的总和就足够了?总而言之,它应该是使用Modelica.Thermal.HeatTransfer 中的组件的最简单方法,例如在Modelica.Thermal.HeatTransfer.Examples.Motor 中,所有热流都传送到environment。通过“分析中的过程”,您是否考虑在模拟后离线的Modelica中这样做?
    • 虽然第一步是将各个组件的热损失相加,但下一步是将功率等其他变量的总和相加。所以我需要一个普遍适用的解决方案。总和应该在模拟期间计算。
    • 我现在唯一想到的就是使用我原始答案中的选项 2。这有点麻烦,因为您需要为每个信号画一条线,但我想不出一个通用的方法......
    • 我刚刚尝试了这个并在模型中添加了一个 connect(variable,multiSum.u[X]),但是需要为每个模型输入 multiSum -X- 的输入维度连接语句。由于我们模型的大小,这在现在是不可行的,或者说是不可能的。 TransiEnt 库中已经有我的问题的解决方案,但我现在很难理解它。等我想通了再补充。
    【解决方案2】:

    几天前我为这种情况准备了一个演示库。您可以通过https://gist.github.com/beutlich/e630b2bf6cdf3efe96e5e9a637124fe1 访问它。如果您阅读有关 Example2 的文档,您可以看到指向 an article from H. Elmqvis et. al. 的链接,这是您问题的线索。也就是说,您需要一个连接器,并且继承从每个 Calculator 到一个 Collector 的连接。

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-08
      • 1970-01-01
      相关资源
      最近更新 更多