如何将多个变量从一个模型传递到另一个模型(内部/外部)

时间:2018-11-13 15:21:43

标签: modelica dymola

假设我们有以下模型:

收藏家:

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一起使用。

2 个答案:

答案 0 :(得分:4)

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

提供更多的见解:实际上,检查Collector会失败,因为从Modelica 3.0开始,每个组件都必须保持平衡(这意味着它必须具有与状态一样多的未知数),事实并非如此。 Collector,因为它确实有一个未知但无方程式。这强烈限制了inner/outer构造的可能应用,因为基本上每个变量都必须在其定义的位置进行计算。

在给定的示例中,如果仅使用一个Calculator,则会在整个系统中对此进行补偿。因此,此单个组合将起作用。尽管此方法可行,但它不应该执行某些操作-显然很容易出错(所有子模型都应通过检查)。

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

  1. 您要从一个点绘制多个变量,该点将是收集器。为此,“变量选择”应该是最简单的方法:请参见《 Dymola手册》。 1,有关如何应用它们的“ 4.3.11匹配和变量选择”部分。
  2. 您想对该变量进行一些数学运算。然后,使用可变大小的矢量化输入可能会很有用。这样就可以对此输入进行任意数量的连接。有关此示例,请查看:Modelica.Blocks.Math.MultiSum
  3. 您希望在不同模型之间路由多个信号(根据您的描述不太可能,但是仍然可以):然后,expandable connectors是一个很好的可能性。要了解实际情况,请查看Modelica.Blocks.Examples.BusUsage

希望这会有所帮助,否则请更清楚地指定您希望通过代码实现的目标。

答案 1 :(得分:3)

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