1

フロー コンポーネントのモジュラー シミュレーションを作成しようとしています (最初は、学習と単純化のために、標準の Modelica.Fluid を使用しません)。質量流量 (温度/エンタルピーではなく) のみを心配することから始めることにし、Stream以下に示すコネクタを作成しました。

connector Stream
  Real pressure;
  flow Real m_flow;
end Stream;

このコネクタを使用して、単純なシステム全体の圧力と流量を追跡したいと考えています。

flow source >> valve >> tank >> pump >> flow sink

これらのコンポーネントに対して次のモデルを作成しました。

model FlowSource "Flow Source can be used as a starting point of a flow"
  parameter Real pressure = 1.0 "Pressure of the source";
  Stream outlet;
equation
  outlet.pressure = pressure;
end FlowSource;

model Valve
  parameter Real Cv "Valve Coefficient, Cv";
  Real setpoint(min=0,max=1) "Valve setpoint";
  Real dp(start=1) "Pressure drop across the valve";
  Real m(start=Cv) "Flow through the valve";
  Real f(min=0,max=1) "Valve Characteristic f(setpoint)";
  Stream inlet, outlet;
equation
  inlet.m_flow + outlet.m_flow= 0.0;  // Conservation of mass
  dp = inlet.pressure - outlet.pressure;  // Pressure drop calculation
  f = setpoint; // linear valve
  m = inlet.m_flow;
  m = if(dp >= 0) then Cv*f*sqrt(dp) else -Cv*f*sqrt(-dp);
end Valve;

model Tank "Simple model of a tank"
  parameter Real volume=1 "tank volume (m^3)";
  parameter Integer num_ports=1 "Number of ports";
  parameter Real static_pressure=1 "Internal Tank Pressure";
  parameter Real initial_level = 0;
  Stream[num_ports] ports "Stream Connectors";
  Real level "Level in % 0-100";
  protected
  Real vol "Volume of medium in the tank";  
initial equation
  level = initial_level;
equation
  for i in 1:num_ports loop
    ports[i].pressure = static_pressure;
  end for;
  der(vol) = sum(ports.m_flow); // need to add density conversion
  level = vol * 100 / volume;
end Tank;

model Pump "Simple model of a Pump"
  Real setpoint(min=0,max=1) "setpoint of the pump (0.0 to 1.0)";
  Stream inlet, outlet;
  protected
    Real dp "Pressure differential across the pump";
    Real f "flow rate inside pump";
equation
  inlet.m_flow+ outlet.m_flow= 0.0;
  dp = outlet.pressure - inlet.pressure;
  f = inlet.m_flow;
  dp = (100-400*(f^2)); // insert better pump char. curve here
end Pump;

model FlowSource "Flow Source can be used as a starting point of a flow"
  parameter Real pressure = 1.0 "Pressure of the source";
  Stream outlet;
equation
  outlet.pressure = pressure;
end FlowSource;

これらのモデルのインスタンスを作成し、それらを別のモデルに接続できます。ただし、境界条件と思われる問題に直面しています。入ってくる流体源の圧力を指定したいと思います。流れがタンクに移動すると、バルブの圧力が低下します。これは、タンク内の公称圧力と流体源との差によって決定され、正常に機能するはずです。

問題は、ポンプが流体シンクに出会うときです(または、ポンプがタンクに直接入っている場合)。流体シンクの圧力を設定すると、ポンプの出口の圧力も設定されるため、ポンプに問題が発生します(それらは接続されています)。ポンプの圧力は、入口の圧力と流量の関数である必要があり (システムに圧力を加える必要があります)、これに基づいてシンクの圧力を計算する必要があります。ただし、その圧力はdpの計算にも必要です...したがって、円になってしまいます。

このようなシステムを実装するためのより良い方法はありますか?

ありがとう!

編集:セットポイント(ポンプはまだ実装していません)が、これらのモデルを方程式で使用するメインモデルに設定されていることを忘れていました。したがって、私のモデルはすべてバランスが取れています。(以下の回答に関する私のコメントを参照してください)。

4

1 に答える 1

3

私の最初のアドバイスは、各コンポーネントを「単体テスト」することです。その時点ですでに、ポンプ モデルとバルブ モデルの両方に変数が 1 つある (または式が 1 つ不足している) ことがわかります。タンク モデルの単体テストを行う場合は、質量流量源のモデルを作成し (呼び出すのFlowSourceは実際には圧力源です)、そのうちの 2 つをタンクに接続する必要があります。

バルブ モデルではsetpoint、パラメータまたは外部入力を作成する必要があります。ポンプ モデルでは変数setpointは使用されていないため、変数を削除するか、パラメーターにすることができます。

モデルが正常に動作することを修正したら。

ここで取得できるmoファイルに修正を入れました:

https://drive.google.com/file/d/0B8ojPn4YxnI9blRodUVWUjVGTE0/view?usp=sharing

よろしく、 ルネ・ジャスト・ニールセン

于 2015-03-13T07:25:03.160 に答える