部分モデルの Modelica 配列について以前に尋ねた質問の動機を与えたいと思います。次の 2 つのコントローラー間のスイッチのモデルを考えてみましょう。
model Switch
input Real u;
input Integer sel;
output Real y;
protected
Real x;
equation
if sel == 1 then
y = 0.1 * (0 - u);
der(x) = 0;
else
y = 0.1 * (0 - u) + 0.2 * x;
der(x) = 0 - u;
end if;
end Switch;
の発散によりしばらく選択されていない場合、PIコントローラーが壊れる可能性があるという事実を無視しましょうx
。x
これは、PI コントローラーが選択されているときにリセットすることで修正できます。ただし、これはここでのポイントではありません。
このスイッチを 2 つの方法で抽象化したい。まず、パラメトリックな数のコントローラーを切り替えます。次に、部分モデルを使用してコントローラーを抽象化します。をコントローラーCtrl
の部分モデルとします。
partial model Ctrl
input Real u;
output Real y;
end Ctrl;
次のように、スイッチに組み込まれた 2 つのコントローラーをインスタンス化できます。
model P extends Ctrl;
equation
y = 0.1 * (0 - u);
end P;
model PI extends Ctrl;
protected
Real x;
equation
y = 0.1 * (0 - u) + 0.2 * x;
der(x) = 0 - u;
end PI;
スイッチの抽象バージョンは、次のようなものであると想定されています。
model Switch
parameter Integer N(min=1);
Ctrl c[N];
input Real u;
input Integer sel(min=1, max=N);
output Real y;
equation
for i in 1:N loop
c[i].u = u;
end for;
y = c[sel].y;
end Switch;
ただし、このモデルにはいくつかの問題があります。まず、このモデルをインスタンス化する方法が明確ではありません。たとえば、1P
つのPI
コントローラーを使用する場合です。次に、驚くべき警告が表示されます。c[1].u
Modelicaでこの抽象的なスイッチを何らかの方法で表現することは可能ですか?