3

部分モデルの 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コントローラーが壊れる可能性があるという事実を無視しましょうxxこれは、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でこの抽象的なスイッチを何らかの方法で表現することは可能ですか?

4

2 に答える 2

3

これは、変更によって異なるモデルにバインドできないため、モデルの配列では機能しません。GenericSwitch 内にあるすべてのコントローラーを指定する必要があります。必要に応じて、GenericSwitch および Switch モデルを自動的に生成できます。

partial model Ctrl
  input Real u;
  output Real y;
end Ctrl;

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 GenericSwitch
  replaceable model MyCtrl1 = Ctrl;
  replaceable model MyCtrl2 = Ctrl;
  MyCtrl1 c1(u = u);
  MyCtrl2 c2(u = u);
  input Real u;
  input Integer sel;
  output Real y;
equation 
  y = if sel == 1 then c1.y else c2.y;
end GenericSwitch;

model Switch = GenericSwitch(
  redeclare model MyCtrl1 = P, 
  redeclare model MyCtrl2 = PI);
于 2015-04-18T16:18:56.957 に答える