如果您想使用条件组件,则需要注意一些限制。 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 不存在时,component.x 就没有机会存在。但是我们能一般地证明这些事情吗?没有。
因此,当引入条件组件时,实现了保守语义,它始终可以轻松确保所涉及的变量和方程组永远不会“不同步”。
让我们回到规范所说的内容:“如果条件为假,则组件、其修饰符和任何连接方程
涉及该组件,被删除”
对于您的情况,解决方案可能非常简单。根据您声明“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)之后,您得出的结论是它们都不起作用。如果是这种情况,那么我会谦虚地建议您对如何设计组件有疑问。出现这些限制的原因与检查组件自身的正确性的必要性有关。这要求组件是完整的(规范术语中的“平衡”)。
如果您无法使用我上面提到的方法解决问题,那么我怀疑您确实存在平衡问题,并且您可能需要以某种方式重新定义组件的边界。如果是这种情况,我建议您在此处打开另一个问题,详细说明您正在尝试做什么。