有条件的组件声明和如果方程一个以下(conditional component declaratio

2019-07-19 04:20发布

我试图建立一个模型,将有基于是否某些组件不存在(在我的情况下,流体端口)略有不同的方程。

像下图的代码将无法正常工作:

parameter Boolean use_component=false;
Component component if use_component;
equation
if use_component then
  component.x = 0;
end if;

我怎样才能解决此问题?

Answer 1:

如果你想使用条件的部件,有你需要知道的一些限制。 在Modelica的3.3规范的第4.4.5概括起来很好。 它说:“如果条件为假,则组成部分,其改性剂,以及涉及的组件的任何连接方程,被删除”。 我会告诉你如何使用这个解决在短短的第二个你的问题,但首先我想解释一下为什么你的解决方案不起作用。

这个问题有检查的模式去做。 你的情况,很明显,公式component.x和组件component或者两者同时存在或都不存在。 那是因为你让他们连接到相同的布尔变量。 但是,如果你有没有这样的:

parameter Real some_number;
Component component if some_number*some_number>4.0;
equation
if some_number>=-2 and some_number<=2 then
  component.x = 0;
end if;

我们可以看到,这在逻辑上等同于你的情况。 有没有机会component.x时存在的component不存在。 但是,我们可以在一般的证明这样的事情? 没有。

所以,当引入有条件的部件,保守的语义得以实施,可以随时平凡确保变量和参与方程组从来没有“不同步”。

让我们回到什么要求:“如果条件为假,则组成部分,其改性剂,以及涉及的组件的任何连接方程,被删除”

对于你的情况下,解决方案可能是很简单的。 这取决于你如何申报“X”,你可以只添加修改component ,即

parameter Boolean use_component=false;
Component component(x=0) if use_component;

这样做的优雅的是,修改仅适用于component ,并且如果component不存在,也不是变形例(方程)。 所以变量x和其相关的公式是“同步”。 但是,这并不适用于所有的情况下(IIRC,做工x都必须有一个input这个工作预选赛......也许这是可能你的情况?)。

有两个剩余的替代品。 首先,把方程component.x内部component 。 第二是介绍上的连接器component ,如果连接,将产生所需的方程。 由于与修改的情况下(这是不是巧合),你可以联想x与某种类型的输入连接器,然后执行以下操作:

parameter Boolean use_component;
Component component if use_component;
Constant zero(k=0);
equation
connect(k.y, component.x);

现在,我可以想像,在考虑所有这三种情况后(修改,内化方程和使用connect ),你得出的结论,他们没有将工作。 如果是这样的话,那么我会谦卑地建议你与你是如何设计的组件中的问题。 这些限制产生的原因涉及到需要自己的正确性检查的部件。 这就要求该部件是完整的(在本说明书中的术语“平衡”)。

如果你不能用的方法解决这个问题我上面提到的,那么我怀疑你真的有一个平衡的问题,你可能需要以某种方式重新定义组件的边界。 如果是这样的话,我建议你在这里打开另一个问题与你正在尝试做的细节。



Answer 2:

我想,为什么这是行不通的原因是,解析器将寻找变量“component.x”,如果组件不活跃,不存在的声明。 它如果您在注释中插入“评估=真正的”甚至不工作。 在我看来,干净的解决方案是在一级方程式在同一块工作,使不同组方程。 您可以创建正确的连接器和paramenters的包装模型,然后如果是例如因果模型,你可以使用可更换类,以参数化模型作为功能,否则,在非因果模型的情况下,把公式里面if语句。 另一种可能的解决方法是将一个块内两个不同的模式,这样你就可以用自己的变量进入方程部分,然后建立条件的连接,使与已选定的行为块的使用情况。 换句话说,你可以建立一个“包模式”里面有两大块,然后将连接方程来里面的if语句包裹型号的连接器。 记住建立起来的模型,这样会有quations的一贯制甚至对未使用的块。 但是,这不是最好的解决办法,因为如果块大,你将不得不等待更长的时间进行编译,因为一切都将被编译。

我希望这个能帮上忙,

马尔科



Answer 3:

您也可以哑分量,是不是在图形层可见:

connector DummyHeatPort 
  "Dummy heatport to facilitate optional heatport.  Use this with a conditional heatport by connecting it to the heatport.  Then use the -DummyHeatPort.Q_flow in the thermal energy balance."
  Modelica.SIunits.Temperature T "Port temperature";
  flow Modelica.SIunits.HeatFlowRate Q_flow 
    "Heat flow rate (positive if flowing from outside into the component)";
end DummyHeatPort;

然后,当这两个端口模型被使用

 Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatport if use_heat_port;
 DummyHeatPort dummy_heatport;

...

 equation
 flowport_a.H_flow + flowport_b.H_flow - dummy_heatport.Q_flow = storage 
    "thermal energy balance";
  connect(dummy_heatport, heatport);  

这样,如果目前heatport被使用,但不以其他方式导致错误。



文章来源: conditional component declaration and a following if equation