3

あらゆる種類の基本型 (Real、Integer、String、Boolean) を含む大きなコネクタがあるとします。状態イベントに基づいて接続を切り替えるにはどうすればよいですか? 私はこのようなことをしたいと思います:

model switch
 input ComplicatedConnector icon[2];
 output ComplicatedConnector ocon;
 input Real x;
 equation
   if x >= 0 then
     connect(ocon, icon[1]);
   else
     connect(ocon, icon[2]);
   end if;
end switch;

これは動作しません。Modelica ではどのように適切に表現できるのでしょうか?

Adrian Pop のコメントに基づく回答。

model switch
 input ComplicatedConnector icon[2];
 output ComplicatedConnector ocon;
 input Real x;
 ComplicatedConnector con;
 initial equation
   con = icon[1];
 equation
   connect(ocon, con);
   when x >= 0 then
     con := icon[1];
   end when;
   when x < 0 then
     con := icon[2];
   end when;
end switch;

更新: 上記のモデルは間違っています。なぜなら、スイッチから予期しないイベントが発生しない場合、ocon は icon[1] の初期値を永久に出力するからです。これは間違った答えによるものではなく、答えの私の誤った解釈によるものであることに注意してください。次のモデルは、Michael Tiller による回答に基づいています。

model switch
 input ComplicatedConnector icon[2];
 output ComplicatedConnector ocon;
 input Real x;
 Integer k;
 initial equation
   k = 1;
 equation
   ocon = icon[k];
   when x >= 0 then
     k := 1;
   elsewhen x < 0 then
     k := 2;
   end when;
end switch;
4

2 に答える 2

2

不可能です。コンパイル時に既知のパラメーター (構造パラメーターとも呼ばれます) に基づいてのみ、それらを切り替えることができます。connect を含む if 式の条件は、パラメーター式である必要があります。

于 2015-03-22T00:26:07.297 に答える
2

connectステートメントは方程式であることに注意してください。それらを自分で展開できます。これらは主に、定型方程式を生成するための「簿記」エラーを回避するために存在します。したがって、私が提案するのは、単純にswitchモデルを取り、それぞれconnectを方程式に展開することです。それはうまくいくはずです。

于 2015-03-23T12:49:37.770 に答える