OpenModelica(とJModelica)でBuildingsライブラリを学ぶ_その9

概要

OpenModelicaでLBNLのBuildingsライブラリを使う。初心者なのでいろいろ教えて頂けるとありがたい。
前回SpaceCoolingのSystem2をやったので今回はSystem3をやる。
使用バージョン
-OpenModelica1.12.0 →Modelica標準ライブラリ3.2.2
-JModelica2.2 →Modelica標準ライブラリ3.2
-Buildings 5.0.1

System3の概要とSystem2からの変更点

f:id:kinonotofu:20180804205959p:plain
System2では気象データファイル読み取り用のモデルweaDatを使用していたものの、使用時は定数を設定して一定の外気温を出力しているだけだった。今回はその部分をちゃんと気象データファイルを読み込んで外気温を出力するように変更する。また、一定の外気温度の場合は定常状態となりオープンループ制御でも一定の室温に収束していたが、外気温が変動するとそうもいかなくなるので閉ループ制御を追加する。
それからvolのenergyDynamicsがFixedInitialからSteadyStateInitialにかわっていた。このタイミングで変更した理由はよくわからない。 閉ループ制御のために新しく追加したモデルはオンオフコントローラーcon、設定温度TRooSetPoi、室温センサーsenTemRooであり、ポンプ流量mWat_flowはSystem2とは別のモデルを使用している。これらはModelica標準ライブラリを使って実装している。Modelica標準ライブラリでuがインプット、yがアウトプットになっているのは何かの略なのだろうけど何なんだろう。追加したモデルのコネクタの設定を以下に示す。

  connect(TRooSetPoi.y, con.reference);
  connect(vol.heatPort, senTemRoo.port);
  connect(senTemRoo.T, con.u);
  connect(con.y, mWat_flow.u);
  connect(mWat_flow.y, souWat.m_flow_in);

senTemRooはvolから温度をもらってconに渡している。conは別のポートにもTRooSetPoiから温度をもらっている。conからオンオフの制御信号をmWat_flowに送り、mWat_flowが信号を流量にしてsouWatに渡している。

気象データ読取モデルweaDat

前回はこのモデルをつかいながらも外気温は定数を出力していたが今回は.mosファイルからデータを読み取って出力する。そのため、TDryBulSouをBuildings.BoundaryConditions.Types.DataSource.ParameterからBuildings.BoundaryConditions.Types.DataSource.Fileへ変更している。TDryBul=TOut_nominalが残っているのは初期値として使うからだろうか。設定しなくてもよいかもしれない。

  BoundaryConditions.WeatherData.ReaderTMY3 weaDat(
    pAtmSou=Buildings.BoundaryConditions.Types.DataSource.Parameter,
    TDryBul=TOut_nominal,
    filNam=Modelica.Utilities.Files.loadResource("modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos"),
    TDryBulSou=Buildings.BoundaryConditions.Types.DataSource.File)

オンオフコントローラーcon

ややこしいが熱コンダクタンス用のモデルのインスタンスはtheConという名前でこれとは別物である。 TRooSetPoiから設定温度をreferenceに、senTemRooから計測温度をuに受け取り、mWat_flowへyを受け渡している。帯域幅は1[K]に設定している。

  Modelica.Blocks.Logical.OnOffController con(bandwidth=1)
    "Controller for coil water flow rate";

Modelica.Blocks.Logical.OnOffControllerの実装は以下の通り。

  block OnOffController
    Blocks.Interfaces.RealInput reference
    Blocks.Interfaces.RealInput u
    Blocks.Interfaces.BooleanOutput y
    parameter Real bandwidth(start=0.1)
    parameter Boolean pre_y_start=false
  initial equation
    pre(y) = pre_y_start;
  equation
    y = pre(y) and (u < reference + bandwidth/2) or (u < reference - bandwidth/2);
  end OnOffController;

pre(y)で1時刻前のyの値を参照している。yが論理演算になっているが設定温度-0.5×帯域幅より低い場合はtrue、設定温度+0.5×帯域幅より高い場合がfalseであることに注意。bandwidthの範囲の温度のときはpre(y)と同じになる。
f:id:kinonotofu:20180805195753p:plain

設定温度TRooSetPoi

TRooSetPoiは定数を出力するだけのモデルである。conが設定値をコネクタからもらってくる仕様になっているため追加されている。

  Modelica.Blocks.Sources.Constant TRooSetPoi(k=TRooSet)

f:id:kinonotofu:20180805195858p:plain

室温センサーsenTemRoo

volから温度をもらってconへ出力している。特に設定はない。

  Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemRoo

conの入力がReal型の数値であり、volからのコネクタがHeatPortかFluidportなので、HeatPortから温度をもらってReal型の数値として出力している。 Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensorの実装は以下の通り。

  model TemperatureSensor
    Modelica.Blocks.Interfaces.RealOutput T(unit="K");
    Interfaces.HeatPort_a port;
  equation
    T = port.T;
    port.Q_flow = 0;
  end TemperatureSensor;

f:id:kinonotofu:20180805195828p:plain

ポンプ流量mWat_flow

mWat_flowのモデルをModelica.Blocks.Sources.ConstantからModelica.Blocks.Math.BooleanToRealに置き換える。ポンプsouWatの入力はBoolean型のオンオフ信号を使えないのでオンオフ信号を流量に変換するために使っている。OnOffControllerは暖房向けのオンオフになっており、冷却時の設定としてtrueで0、falseでmW_flow_nominalを出力している。

  Modelica.Blocks.Math.BooleanToReal mWat_flow(realTrue=0, realFalse=
        mW_flow_nominal) 

Modelica.Blocks.Math.BooleanToRealの実装は以下の通り。

  block BooleanToReal "Convert Boolean to Real signal"
    parameter Real realTrue=1.0;
    parameter Real realFalse=0.0";
    Blocks.Interfaces.RealOutput y;
  equation
    y = if u then realTrue else realFalse;
  end BooleanToReal;

f:id:kinonotofu:20180805195714p:plain

計算実行

やっぱりOpenModelicaでは実行できないので前回と同じくJModelicaで実行してみる。
計算は15552000[s]から15638400[s]まで9732個のデータが出力されており一日分の計算になっているものの時間間隔が均等ではなかった。そういうものなのだろうか。
* 室温と外気温
f:id:kinonotofu:20180805202706p:plain

外気温が変動しているが、室温はオンオフ制御でだいたい設定温度±0.5[K]くらいになっている。グラフの形もまぁチュートリアルのドキュメントにあるものと同じ形状にはなっている。ちなみにweaDatのTDryBulSouは常に1を、TDryBulは常に305.5を出力しており、実際に外気温を確認できるのはTDryBul_in_internalである。TDryBulはあくまで一定値の出力用、TDryBulSouは設定値Buildings.BoundaryConditions.Types.DataSource.Fileを示す数値が出力されているだけのようだった。

  • ポンプの水の発停
    f:id:kinonotofu:20180805203056p:plain
    ポンプの流量も一応確認。

  • コイル水側の出入口温度
    f:id:kinonotofu:20180805203915p:plain
    水の出入口温度はポンプが停止して流量がなくなってもコイルを通過する空気温度になっているようである。流量が0だから計算できないとかにはなっていないらしい。

おわりに

コネクタの型をあわせるためにモデルを追加するのはもう少しシンプルにできないものかなぁと思ったけどモデルを入れ子にしてもう少しまとまりをつくるとすっきりするのだろうか。今回追加した4つのモデルをまとめて一つのモデルとして扱ってもいいような気がする。とりあえずBuildingsライブラリのExamples/Tutorial/SpaceCoolingはひとまずこれで終わり。このチュートリアルの中でもいろいろ疑問を放置したままになっていることが多いのでそのあたりは少しずつ整理してつぶしていきたいと思った。ライブラリの.moファイルのannotationにそれぞれ書いてあるドキュメントの日本語訳作業ものんびりはじめた。

github.com

さすがに全部を訳し切るのはできない気がするけれど使用するモデルの整理のついでくらいに思って部分的にでもやろうと思う。なによりもう一個の方がまだ終わってないので図とかそろえてさっさと形を整えてあげないといけないのだけれど。。。
とりあえずブログでは次回からはAirflowのExampleでも見ながら建物の換気回路網計算をしたいと思う。