【发布时间】:2020-09-25 22:09:50
【问题描述】:
这是我的模型中出现的一些可扩展连接器使用的最小工作示例:
model TestExpandableConnector
expandable connector ControlBus
extends Modelica.Icons.SignalBus;
Real signal1;
Real signal2;
end ControlBus;
ControlBus controlBus;
// example models to connect signals to
Modelica.Blocks.Math.Gain gain1;
Modelica.Blocks.Math.Gain gain2;
// and so on
equation
connect(controlBus.signal1, gain1.u);
connect(controlBus.signal2, gain2.u);
// and so on
end TestExpandableConnector;
这很好用,这里不用担心。
请注意,通常此模型将在图表层中创建,其中包含图形对象以及总线和组件之间的连接(在本例中为增益)。
虽然上面的例子是微不足道的,但在许多现实世界的例子中,我从一个可扩展的连接器中产生了许多连接。这很快会在图表层变得混乱,我正在尝试在这里学习/开发一些最佳实践来清理图表。
一种选择似乎是以几乎等同于 Simulink 的 From/Goto 元素的方式使用 RealExpression 模块。例如:
model TestExpandableConnectorRevised
expandable connector ControlBus
extends Modelica.Icons.SignalBus;
Real signal1;
Real signal2;
end ControlBus;
ControlBus controlBus;
// example models to connect signals to
Modelica.Blocks.Math.Gain gain1;
Modelica.Blocks.Math.Gain gain2;
// and so on
// using RealEpressions like goto tags
Modelica.Blocks.Sources.RealExpression realExpression1(y=controlBus.signal1);
Modelica.Blocks.Sources.RealExpression realExpression2(y=controlBus.signal2);
// and so on
equation
connect(realExpression1.y, gain1.u);
connect(realExpression2.y, gain2.u);
// and so on
end TestExpandableConnectorRevised;
现在有了这个变化,Dymola 抱怨这是非法的,因为无法确定因果关系。我似乎可以通过以下方式解决最后一个问题:1)将“输入”前缀添加到总线中的 signal1 和 signal2 声明,或 2)将 realExpressions 的声明 before contolBus 声明(这第二个解决方案对我来说有点奇怪)。
总体而言,从整理图表的角度来看,我对这些解决方案相当满意,但它们也至少感觉有点“hacky”。我在这个问题上的基本目标是询问这种方法是否可行或是否是个坏主意?此外,如果关于如何处理大型模型中所有连接的组织(尤其是可扩展连接器)有任何其他建议,我会全力以赴。作为一个额外的想法,在我看来,Modelica 语言的一个更专用的“From/Goto”功能在 Modelica 中可能真的很好,纯粹是为了整理图表,但完全等同于引擎盖下的连接语句。
【问题讨论】: