システムとモデリング

modelica, Julia, Design Structure Matrix, SysML, 他モデリング全般について。

SysML練習 温水タンクモデル simulink実装

明けましておめでとうございます。Otepipiです。本年もよろしくお願いいたします。

 さて、早速ですが前回SysMLでモデリングした温水タンクモデルをMatlab/simulinkで実装しました。
 元になったフロー等、資料をまずは載せておきます。

f:id:Otepipi:20171226195735p:plain

フロー

f:id:Otepipi:20171231202106p:plain

要求

f:id:Otepipi:20171231202113p:plain

ブロック

f:id:Otepipi:20171231202501p:plain

アクティビティ

そしてこれらを元にしてsimulinkで実装した様子が下になります。

f:id:Otepipi:20180102203233p:plain
汚い&見え辛い図で恐縮です。どうしても線が交差してしまいますね。もっと描画する初めの方で全体のレイアウトを考えれば線が交差せずきれいな図になると思うのですが、今回はエイヤッととりあえず書いてしまいました。今回苦労した点は対数平均温度差を計算する部分ですね。繰り返し計算になりますので、simulinkだと「代数ループ」が発生してエラーになってしまいます。それを回避するために[Initial Condition]ブロックを入れたのですが、それでもエラーになってしまいましたので、さらに[Memory]ブロックで遅れ時間を作ってやったらエラーはでなくなりました。このあたりはまだ僕も良く理解できていないところですね。

これを計算すると、下のようなグラフになります。

f:id:Otepipi:20180102204000p:plain

タンク内温水温度と製品出口温度

 要求定義にあった、 「製品出口温度40±2」を達成できています(達成できるようにパラメーターを変更しているので当たり前です)。制御の内容はアクティビティ図を見てただければ概略を掴めると思いますが、ヒーターのon/off動作で温水タンク内の温水温度をコントロールし、製品出口温度を40℃±2℃になるようにしています。熱交換により温水温度は低下していきますので、それをヒーターで補ってやるイメージです。目標が40±2℃と粗いので、グラフもジグザグになっています。ちなみにサンプリング時間は1秒でシミュレーションしています。サンプリング時間を1秒に固定することでいくらかの積分を省くことができる(例えば熱量[J]と熱流量[J/s]の値が同じになるので)ので、多少計算が楽になりますが、サンプリング時間を変えた瞬間に使えなくなるので再利用がしづらいですね。後々変えていこうと思います。

他、各サブシステムを見ていきます。

f:id:Otepipi:20180102205242p:plain

subsystem:対数平均温度差計算

サブシステム対数平均温度差計算は、そのまんま対数平均温度差を計算するサブシステムですね。多変数の繰り返し計算を必要として、このシステムの計算をやりづらくした大きな原因ですね。今思うと、熱量の計算を対数平均温度差で算出するのではなく、NTUを使って算出すれば陽的に計算できて繰り返し計算が少なくて済んだのではないかと思います。simulinkでは陽的な計算を心がけていきたいですね………

f:id:Otepipi:20180102205723p:plain

subsystem:熱移動量計算

熱移動量計算は、先程のサブシステムで算出した対数平均温度差を使って熱移動量(正確には熱流量[J/s])を求めるサブシステムです。NTUを使っておけば………

f:id:Otepipi:20180102210018p:plain

subsystem:温度計算

温度計算サブシステムは、「熱交換器の温水・ジュースの入口温度」と、前求めた「熱移動量」から、「熱交換器の温水・ジュースの出口温度」を計算するブロックになっております。このサブシステムのジュースの出口温度が製品温度となっています。

f:id:Otepipi:20180102210403p:plain

subsystem:電気ヒーター熱量計算

電気ヒーター熱量計算はジュースの熱交換器出口温度を参照して、設定値(この場合40℃)より2℃低ければヒーターが作動します。そしてジュースの出口温度が設定値(40℃)より2℃高くなった時点でヒーターが停止します。この2℃に関連する動作はrelayブロックで規定しています。

f:id:Otepipi:20180102210705p:plain
relayブロックは液面制御のバッファタンクモデルでも使用しました。制御ではかなり頻繁に使うことになるのではないでしょうか。

f:id:Otepipi:20180102210843p:plain

subsystem:温水温度計算

最後のサブシステムは温水温度計算です。これは『温水タンク内』の温水温度(=熱交換器入り口の温水温度)を計算するものです。さきほどサブシステム温度計算で熱交換器出口の温水温度を計算しましたが、温水タンク内の温水温度と熱交換器出口の温水温度は全く異なりますので注意して下さい。

これで温水タンクモデルのシミュレーションは終了となります。