3

Dymola 2014 を使用した協調シミュレーション用の FMU として Modelica モデルをエクスポートしたいと考えています。pyfmi を使用して協調シミュレーションを完了する予定です。

これをテストするために、2 つの流体境界の間のパイプを通る流体の流れをモデル化しようとしています。流体源の圧力をモデルへの入力にしたいと思います。私の計画は、この圧力を外部で計算し、各タイムステップで Modelica モデルに入力することです。

すべての標準ライブラリ コンポーネントを含む私の初期モデルは次のとおりです。

model SE_BVP "BVP for stack exchange."
  inner Modelica.Fluid.System system;
  Modelica.Fluid.Pipes.StaticPipe pipe(
    redeclare package Medium = Modelica.Media.Air.MoistAir,
    length=1,
    diameter=1);
  Modelica.Fluid.Sources.Boundary_pT boundary1(nPorts=1, redeclare package
    Medium = Modelica.Media.Air.MoistAir);
  Modelica.Fluid.Sources.Boundary_pT boundary(nPorts=1, redeclare package Medium=
    Modelica.Media.Air.MoistAir, use_p_in=true);
  Modelica.Blocks.Interfaces.RealInput p_in1;

equation
   connect(pipe.port_b, boundary1.ports[1]);
   connect(boundary.ports[1], pipe.port_a);
   connect(boundary.p_in, p_in1);
end SE_BVP;

次に、2 つのテスト モデルでラップします。

model SE_BVP_test_1
 Real preVal = 101335;
 SE_BVP SE_BVP_1;

equation
 SE_BVP_1.p_in1 = preVal;

end SE_BVP_test_1; 

@Thierryの提案に基づいて行われたパラメータタイプ

model SE_BVP_test_2
  parameter Real preVal = 101335;
  SE_BVP SE_BVP_1;

equation
  SE_BVP_1.p_in1 = preVal;

end SE_BVP_test_2; 

これらのモデルを実行すると、同じ結果が得られます。

変数の型付けはありません。

パラメータ入力あり

どちらのモデルも Dymola 内で動作しています。

ここで、fmu をロードして pyfmi を使用してシミュレートしたいので、次のスクリプトを作成しました。

  import pyfmi
  import numpy as np
  import pylab as P
  import os

  # Define the FMU to test
  fmuDirNam = "SE_BVP_Test_1"  # CS 2.0 type FMU
  fmuNam = fmuDirNam + ".fmu"

  # Define the input var
  inVar = "preVal"

  # Get the path to the FMU
  curr_dir = os.path.dirname(os.path.abspath(__file__))
  par_dir = os.path.dirname(curr_dir)
  path_to_fmu = os.path.join(par_dir, "projectFMUs", fmuDirNam)

  # Load the model
  model = pyfmi.load_fmu(os.path.join(path_to_fmu, fmuNam))

これは失敗し、次のエラーが表示されます。

FMIL: module = FMI2XML, log level = 2: XML element 
'Real': could not parse value for real attribute  
 'start'='pipMod.pipe.flowModel.states[1].p/(gasConstant_Unique7( 
      Modelica.Media.Air.MoistAir.ThermodynamicState(     
 p =

FMIL: module = FMI2XML, log level = 2: XML element 
'Real': could not parse value for   real attribute 
'start'='pipMod.pipe.flowModel.states[2].p/(gasConstant_Unique7(             
Modelica.Media.Air.MoistAir.ThermodynamicState(             
p =

FMIL: module = FMI2XML, log level = 2: XML element 
'Real': could not parse value for real attribute 
'start'='Modelica.Media.Incompressible.TableBased.Polynomials_Temp.evaluate({-4.96717436974791E-11, 5.06626785714286E-08, 1.72937731092437
FMIL: module = FMI2XML, log level = 2: XML element 'Real': could not parse value for real attribute 
'start'='Modelica.Media.Incompressible.TableBased.Polynomials_Temp.evaluate({-4.96717436974791E-11, 5.06626785714286E-08, 1.72937731092437

FMIL: module = FMI2XML, log level = 1: No model structure information available. 
Cannot continue.

FMIL: module = FMI2XML, log level = 1: Parse error at line 2703:
parsing aborted

トレースバックから:

pyfmi.fmi.FMUException: The XML-could not be read. Parse error at line 2703:
parsing aborted

モデルが Dymola 内で正しくシミュレートされている場合、この解析エラーの原因は何ですか?

  • CS 1.0エクスポートでもこれを試してみましたが、今回は別のモジュールがfmuを読み取っていますが、同じ例外が発生しました。

  • inputとタグの両方を削除するとparameter、謎の変数の問題が発生したと考えましたが、そうではありません。parameterのようなタグを使用しても Test_2、同じ例外 (CS 2.0) が発生します。

概要: Dymola 2014、python 2.7.x、FMI for CO-simulation 2.0

4

5 に答える 5

4

@RwardBound: シミュレーション中にパラメーターを変更する場合は、FMI 1.0 FMU ではなく FMI 2.0 を使用することをお勧めします。この機能は FMI 2.0 でサポートされています。たとえば、最新バージョンの Dymola は、このような FMU を生成できます。PyFMI は FMI 2.0 にも対応していると思います。

万歳、ティエリー

于 2014-08-14T17:10:01.467 に答える
3

この問題は、Dymola によって生成された XML が正しくないことが原因です。スカラー変数の開始属性は、すべて仕様に従って、式ではなく値でなければなりません。仕様では、実数スカラー変数の場合、開始値は float でなければならず、整数の場合、開始値は int でなければならないと述べています。これは、FMI 1.0 と FMI 2.0 の両方にも当てはまります (仕様はhttps://fmi-standard.org/downloadsで読むことができます)。

取得した FMU が標準に従って正しいことを確認するために、コンプライアンス チェッカーと呼ばれるツールがあり、これも上記のサイトで入手できます。これは、エクスポート ツールが問題の原因である可能性を排除するために、このような種類の問題が発生した場合に使用する優れたツールです。

Dymola 2015 では、モデル SE_BVP_test_1 の XML が正しく生成され、PyFMI を使用してシミュレートできます。

于 2014-09-03T09:12:53.570 に答える
1

初期化時に input=0 を回避する簡単な方法は、おそらく max() ブロックを追加して、入力を非常に小さい数値と比較することです。

例えば:

input = max(a very small positive number, input) if your input is always greater than zero. 

パラメータ(入力)が符号を切り替える場合、同様の方法を見つけるのに十分賢いと思います。

于 2014-08-14T18:31:37.897 に答える
1

FMU (または Modelica ライブラリとしても) としてエクスポートするために Dymola モデルをテストするベスト プラクティスは、テスト用の最上位モデルを構築することです。次に、エクスポートされたモデル専用のシミュレーション環境を構築できます。

簡単な「10/u を割る」モデルの例を見てみましょう。

model div10
  Modelica.Blocks.Math.Division division;
  Modelica.Blocks.Interfaces.RealInput u(start=10);
equation 
  division.u1 = 10;
  connect(division.u2, u);
end div10;

次に、この最上位モデルを作成してdiv10モデルをテストする必要があります。

   model div10_tester  
      parameter Real default_u = 2.0;
      div10 div10_1;
    equation 
      div10_1.u = default_u;
    end div10_tester;

別の解決策は、「dsu.txt」を使用することです (注: div10 だけをシミュレートする場合、エラー ログに記載されているように、start=10 ステートメントは効果がありません。「dsu.txt」ファイルがない場合 => すべての入力0 に設定されます)。ただし、これは開始値のみを指定するため、非常に制限されています。

于 2014-08-14T12:03:20.443 に答える