、これが役立つことを願って、あなたが知っておく必要があるいくつかの制限があります。 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
が存在する可能性はありません。しかし、我々はそのようなことを証明することができます一般に?いいえ。
条件付きコンポーネントが導入されたとき、関係する変数と式のセットが決して「同期外れ」にならないことを常に自明に保つことができる控えめなセマンティクスが実装されました。解決策はできる、あなたのケースのために
を「条件がfalseの場合、コンポーネント、その修飾、およびコンポーネントを含むすべての接続の方程式 が、削除されている」:
は、私たちは仕様が言うに戻るにしてみましょう潜在的に非常に単純です。 「x」の宣言方法に応じて、component
に変更を加えることができます。
parameter Boolean use_component=false;
Component component(x=0) if use_component;
このエレガンスは変更のみcomponent
およびcomponent
が存在しておりません、どちらも修正(式)である場合に適用されることです。したがって、変数x
とそれに関連する方程式は "同期"しています。しかし、これはすべてのケースで機能しません(IIRC、x
にはinput
修飾子が必要です。これはおそらくあなたのケースで可能でしょうか?)。
残りの2つの選択肢があります。まず、式component.x
をcomponent
の中に入れます。 2番目の方法は、component
にコネクタを導入し、接続すると、必要な式が生成されます。変更の場合(これは偶然ではありません)と同じように、あなたはいくつかの種類の入力コネクタとx
を関連付けた後、これを行うことができます:今
parameter Boolean use_component;
Component component if use_component;
Constant zero(k=0);
equation
connect(k.y, component.x);
を、私は、すべての3例(修正を考慮した後のことを想像できます方程式を内部化してconnect
を使用すると)、どちらもうまく動作しないという結論に至ります。このような場合は、コンポーネントの設計方法に問題があることをお勧めします。これらの制限が発生する理由は、正確にコンポーネントを確認する必要性に関連します。これには、コンポーネントが完全であることが必要です(仕様の用語では「平衡」)。
私が上記のアプローチで問題を解決できない場合は、本当にバランスのとれた問題があると思われ、おそらくコンポーネントの境界を何とか再定義する必要があると思われます。このような場合は、あなたがしようとしていることの詳細をここに別の質問をすることをお勧めします。