假设我们有以下模型:
收藏家:
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一起使用。
答案 0 :(得分:4)
使用Calculator
的多个实例确实会破坏模型,因为单个变量calculatedVariable
将具有多个方程式来尝试计算其值。因此,Dymola抱怨说该系统在结构上是奇异的,在这种情况下,这意味着所得方程组中的方程比变量多。
提供更多的见解:实际上,检查Collector
会失败,因为从Modelica 3.0开始,每个组件都必须保持平衡(这意味着它必须具有与状态一样多的未知数),事实并非如此。 Collector
,因为它确实有一个未知但无方程式。这强烈限制了inner/outer
构造的可能应用,因为基本上每个变量都必须在其定义的位置进行计算。
在给定的示例中,如果仅使用一个Calculator
,则会在整个系统中对此进行补偿。因此,此单个组合将起作用。尽管此方法可行,但它不应该执行某些操作-显然很容易出错(所有子模型都应通过检查)。
您有关如何解决此问题的问题实际上错过了对问题实质的描述。我认为在某些情况下,您的方法可能对以下情况有用:
Modelica.Blocks.Math.MultiSum
expandable connectors
是一个很好的可能性。要了解实际情况,请查看Modelica.Blocks.Examples.BusUsage
。希望这会有所帮助,否则请更清楚地指定您希望通过代码实现的目标。
答案 1 :(得分:3)
几天前,我为这种情况准备了一个演示库。您可以通过https://gist.github.com/beutlich/e630b2bf6cdf3efe96e5e9a637124fe1访问它。如果您阅读Example2上的文档,则可以看到指向an article from H. Elmqvis et. al.的链接,这是解决问题的线索。也就是说,您需要一个连接器,并且从每个计算器到一个收集器的继承连接。