Translate

2018/01/29

TRNSYS,TRNBuildで地面の温度を扱う

基礎など地面に接している部位の設定

建物の地面側の温度って割と重要です。土間床になっている建物、例えば倉庫とかではかなり室温に影響します。地面側の温度が低ければ、室温は低くく、夏期は冷房負荷は少なくなりますが冬期は逆に暖房負荷が増えます。

TRNSYS/TRNBuildでは基礎や地下室など地面に接している壁は境界条件として扱います。

設定は至って簡単で、TRNBuildで壁のCategoryBOUNDARYを選択、boundary conditionで地面側の温度を指定するだけです。

例)C:\TRNSYS18\Examples\3D_Building

  1. 床面(基礎)のConstructionを選択
  2. CategoryをBOUNDARYへ変更
  3. boundary conditionで地面側の温度を指定

※"C:\TRNSYS18\Examples\3D_Building\6_Step_Add_Daylight\Building.tpf"より

image


地面側の温度

地面側の温度は何らかの方法で計算した値、もしくは固定値で指定します。計算する期間が短ければ固定で指定するのもありかと思いますが、おそらく季節変動などを見込んだ値にしたいケースがほとんどだと思います。こういう場合は、外部のコンポーネントを使って、Input経由で値を取り込みます。

図はExamples\3D_Buildingの例ですが、Type77(Simple Ground Temperature Model)で地面側の温度を計算、Type56へ引き渡しています。Type56側では上の図のようにTGROUNDで受け手取って、地面側の温度として処理しています。
image


地面側の温度を計算する


Type77の他、地面側の温度の計算方法はいくつか考えられます。TRNSYS-USERSで調べると "f factor" approach(日本語で何というのか不明)という方法が紹介されています。

上記で紹介したType77は年間の平均温度温度振幅だけで計算できるのでお手軽ですが、地下室などでは深さによっても温度が変わってくるはずです。すべてのケースにType77を当てはまるのはどうかという気がします。地面側の温度は建物や気象条件、土の種類、計算の目的なども含めて検討してみてください。

2018/1/30追記

後で気がついたのですが、Type77では地表面からの深さを複数指定できます。下の図は0.5m, 1.0m, 1.5mの3箇所の温度を計算した例です。地表面に近い基礎部分は浅い深さの温度、地下室の壁や床は深めで計算した値を指定して計算するのもありかもです。

image

一年分計算すると、深さに応じて変動したカーブが描かれます。

image


EA気象データの地中温度計算プログラム(GTWin)で予め計算、そのデータを使って計算するのも手かも知れません。(計算結果をファイルに書き出して、それをType9で読み込んで計算するとか)

その他、TRNSYSで地面側の温度の計算に利用できるコンポーネントを紹介しておきます。

・標準コンポーネント

Type 49: Slab on Grade

詳細はマニュアル「4.6.4. Type 49: Slab on Grade」を参照
参考:TRNSYSで地中温度

http://www.kankyoukei.com/2011/10/trnsys_20.html

・TESS Individual Component Libraries(オプション)

Type1276 "Be All End All" Ground Coupling

http://www.trnsys.com/tess-libraries/individual-components.php

※日本国内でのお取り扱いはこちらの窓口まで。


動作環境

以下の環境で動作を確認しています。
Windows10 Pro(64bit)
TRNSYS18.00.0017(64bit)

2018/01/24

TRNSYSで実測データでシミュレーションする

実測データや気象庁などの観測データから計算用の気象データを作る際の注意点をまとめてみます。
TRNSYSには標準的な気象データを読み込んで出力する各種気象データリーダーが添付されています。これらを使って市販やオープンソースの気象データを扱うことができます。
実測データを使いたいケースではUser Formatに対応したコンポーネント、Type99も用意されています。このコンポーネントを使って実測データなど標準気象データ以外を扱うことができます。

Type99のデータフォーマット

Type99には専用フォーマットが用意されているので、それに合せて実測データを加工します。データフォーマットの構造です。<userdefined>につづく20行ほどはヘッダーで、実測値点の緯度経度やタイムゾーン、含まれる実測値の種類を定義しています。それにつづいて実際のデータが<data>行以降に続きます。


緯度経度とタイムゾーン

実測値点の緯度(latitude)経度(longitude)とタイムゾーンを指定します。緯度は北半球(+)、南半球(-)、経度はグリニッジを基準に東(+)、西(-)で指定します。
タイムゾーンはグリニッジ標準時との時差を指定します。日本国内は+9になります。
以下は東京の例です。
<longitude> -139.76
<latitude>  35.69
<gmt>       9

インターバルと開始時刻

実測データのインターバル(interval)は、実測の間隔に合わせてHourで指定します。例えば15分間隔であれば0.25を指定します。Type99では標準は1hを前提にしているため短い間隔を指定するとエラーの原因になることがあります。とくに理由がない場合は1h間隔のデータがお勧めです。
開始時刻(firsttime)は1/1 1:00から始まる通し時間で指定します。例えば、2/1 1:00から始まる実測データであれば745を指定します。
インターバル1h,開始時刻2/1 1:00の例
<interval>  1
<firsttime> 745

データの指定

<var>で始まる行ではデータの種類とカラム位置を指定します。リストはサンプルデータ("C:\TRNSYS18\Examples\Data Files\Type99-UserFormat.99")の抜粋です。この例では水平面直達日射、水平面天空日射、外気温、相対湿度、風向、風速のデータを定義しています。
<var> IBEAM_H <col> 5 <interp> 0 <add> 0 <mult> 1 <samp> 1
<var> IBEAM_N <col> 0 <interp> 0 <add> 0 <mult> 1 <samp> 0
<var> IDIFF_H <col> 6 <interp> 0 <add> 0 <mult> 1 <samp> -1
<var> IGLOB_H <col> 0 <interp> 0 <add> 0 <mult> 1 <samp> 0
<var> TAMB    <col> 3 <interp> 2 <add> 0 <mult> 1 <samp> 0
<var> RHUM    <col> 4 <interp> 1 <add> 0 <mult> 100<samp> 0
<var> WSPEED  <col> 2 <interp> 1 <add> 0 <mult> 1 <samp> 0
<var> WDIR    <col> 1 <interp> 1 <add> 0 <mult> 1 <samp> 0
データの指定は値のキーワードと、<data>行以降のカラム番号の組み合わせで指定します。
水平面直達日射の値はキーワードは IBEAM_H、カラム位置は<col>5 です。これでデータ部分の5カラム目が水平面直達日射として扱われます。
下のリストは<data>行の抜き出したものです。赤い部分が5カラム目、水平面直達日射の値です。(0が並んでいるのは開始時刻が夜間なので日射がないため)
<data>
  0   0.0   -2.1   .93        0   0
 80   0.0   -2.5   .95        0   0
340    .5   -2.9   .96        0   0
  0   0.0   -3.4   .96        0   0
 30    .5   -4.1   .95        0   0
 50   0.0   -4.9   .94        0   0
 40   1.0   -5.5   .93        0   0
 70   1.5   -5.6   .91        0   0
120    .5   -5.4   .91       22  28
データのキーワードは以下の通りです。
  • 水平面直達日射(IBEAM_H)
  • 法線面直達日射(IBEAM_N)
  • 水平面天空日射(IDIFF_H)
  • 水平面全天日射(IGLOB_H)
  • 外気温(TAMB)
  • 相対湿度(RHUM)
  • 風速(WSPEED)
  • 風向(WDIR)
日射量についてはすべてを指定する必要はありませんが、直散分離の関係で、最低限必要な項目が決まっています。以下のいずれかの組み合わせで指定が必要です。
  • 水平面直達日射(Ib)、水平面天空日射(Id)
  • 水平面全店日射(I)、水平面天空日射(Id)
  • 水平面全店日射(I)、法線面直達日射(Ibn)
  • 水平面全店日射(I)、外気温(Tamb)、相対湿度(RH)

<interp>は補完処理の指定です。1h間隔のデータを使って、タイムステップ0.25hで計算するようなケースで値の補完処理が行われます。0:補完なし、1:線形補完、2:は5点スプライン補完です。
スプライン補完では、実際の値よりも大きな値や小さな値に補完されることがあります。このため相対湿度へ指定すると、計算上100%を超えるケースがあります。湿度については<interp>2の指定は避けてください。
<add>, <mult>値への係数。必要に応じて指定します。(あまり使わないです)
<samp>データのサンプリング範囲の補正値。日射データなど計測した範囲の指定です。具体的には1h間隔で日射量を計測した場合、その値がある時刻の直前のタイムステップ(-1)、前後1/2のタイムステップ(0)、次のタイムステップ(1)分なのかを指定します。ケースバイケースですが実測データでは直前の1ステップ分になっていることが多いようです。
ちなみにEA気象データについては前後1/2の範囲(0)になっていますので、もしEA気象データを利用される場合は注意してください。
気温、湿度などは通常は0で指定してください。
その他、詳しくはマニュアルの「4.12.2. Type 99: User-Defined File Format Data Reader / Processor」参照

データ作成の注意点


欠測データの補正
割とありがちですが、欠測でデータがない、もしくはデフォルト値が含まれていることがあります。Type65でグラフを描くと、明らかに変な値が見つかることがあります。こういった場合はなんらかの方法で補正を行ってください。
データ数は24hの倍数
<data>以降の行は24hの倍数必要です。これは仕様なので、実測データが半日分で終わっているような場合は最終日のデータは捨てて24hの倍数になるように調整してください。
<interval>は割り切れる値がおすすめ
計算上はHourで扱うため、割り切れない値(例、5分間隔=0.08333333)ではエラーの原因になることがあります。(おそらく計算上の誤差が積み重なってエラーになる)
3分(0.05h)、6分(0.1h)などHourに換算して割り切れる値がお勧めです。
上述したように一般に気象データは1hour間隔のデータが多いため、特に理由がなければ1h間隔がお勧めです。

助走計算期間も忘れずに
建物(TRNBuild/Type56)を含むプロジェクトでは蓄熱などの関係から、ある程度の助走計算の期間を取る必要があります。(参考:TRNSYSの助走期間)建物の種類などにもよりますが、1週間から2週間程度は取る事が多いようです。
実測期間が十分長ければ問題ありません。はじめの1~2週間分のデータを助走して捨てれば済みます。
実測期間が1~2週間では、助走期間をどう扱うか検討が必要になります。例えば、実測データを再利用して助走期間に充てる(実測が7/1から1週間なら同じデータを6/24から1週間分として利用する。いいのかな、これ?)、近隣の気象データで代用するなど、何らかの対策が必要です。このあたりはコメントしにくいので考えてみてください。

動作環境

以下の環境で動作を確認しています。
Windows10 Pro(64bit)
TRNSYS18.00.0017(64bit)

2018/01/18

Dead Bandってなに?

TRNSYSには制御系として一連のコンポーネントが用意されています。

image

が、しかし制御の話って用語の意味がよくわからない。(制御とか完全に門外漢なんですよね)

設定項目にDead Band、とかTemperature Dead Bandって用語があちこちで使われているのですが、日本語だとなんというのか分からない。(Deadって単語が不気味だし)

これ日本語だと「不感帯」とか「調節感度」のことのようです。(アズワンさんのサイトの説明が簡潔で分かりやすい)

Type166 Simple Thermostat

このDead Bandがどのように働くのか、TRNSYS18から新しく追加されたコンポーネント、Type166を使って確認してみます。これ暖房設定温度、冷房設定温度の両方が設定できる便利なコンポーネントです。試しに用意したのは図のような、ごくごくシンプルなプロジェクト。

image

Parameters/Temperature dead bandはデフォルトの2.0℃Inputs/Heating setpoint,Cooling setpointもデフォルトで、それぞれ20℃,24℃のままにしてあります。

image

image

テスト用の気温の値が要るので、これはEquationで16℃~28℃範囲で変化するシンプルな値(サインカーブ)を生成して代用します。

ちなみに、こんな感じ。

angle=mod(time,360)
val = sin(angle)*6+22 !22℃±6℃のサインカーブ

この値を使ってType166の動きを見ると、図のよう温度によってCooling/Heating signalの値が変化して出力されます。

image

ちょっと分かりにくいのでCooling Signalの部分を拡大すると、Cooling Setpoint(24℃)を中心にTemperature Dead Band(2℃)なので、気温25℃でOn,23℃に下がるとOffの動きになります。(実際に計算する場合は、このOn/Offでエアコンを制御することになるので、室温はこの幅でハンチングすることになります)

image

ハンチングの例

図はType166で暖房の制御をしているサンプル("C:\TRNSYS18\Examples\HVACTemplates\System1.tpf")の室温の出力を取りだした例です。Heating SetpointとDead Bandの範囲でキレイに制御されている様子が分かります。

image

ほかにも制御系はあるんですが、単純なOn/Off制御はこんな感じで行う事ができます。

動作環境

以下の環境で動作を確認しています。

Windows10 Pro(64bit)
TRNSYS18.00.0016(64bit)

2018/01/12

PythonでBuiファイルを操作する

年末年始にPythonをあれこれ試してみました。Type169で使えるようになったというのもあるんですが、他にも使い道がないかと思ったわけです。

とはいえ、そもそもPythonの文法もよく分かっていないので、勉強がてらちょっとしたプログラム書いてみました。

テーマはBuiファイル(.b18)の解析ライブラリ。解析ライブラリというと大げさですがBuiファイルを読み込んで、Layerの厚みを変更するぐらいのプログラムを想定して試作してみました。

Buiファイルはテキスト形式で構造がシンプルなのでプログラムからは比較的扱いやすい内容になっています。厚みを変更するのであれば、ひとまずLayer,Constructionのデータが扱えれば事足りそうです。

Pythonと格闘すること数日。なんかそれっぽく動くライブラリ(パッケージ)が出来上がりました。

Buiファイルの保存にも対応したので、Layerの厚みを更新して、保存、計算に利用するような使い方ができそうです。(大量に計算を回すときに使えそう)

#coding:utf-8
"""
Buiファイルを読み込んで、EXT_WALLの断熱材の厚みを変更して保存する
load a Bui file, update the thickness of the insulation material in EXT_WALL and save it.
"""
from b18 import BuiFile

if __name__ == '__main__':
    bui = BuiFile('Building.b18')
    # Search 'EXT_WALL'
    wall = next( (con for con in bui.constructions if con.name=='EXT_WALL') ,None)
    if(wall != None):
        wall.thickness[2] = 0.2 #Thickness for 'DAEMA'
        bui.save('copy_Building.b18')

実際に変更前後のBuiファイルを比べてみるとこんな感じ。ちゃんと厚みが変更されている。

処理前のファイル

CONSTRUCTION EXT_WALL
  LAYERS   = PUTZ  KST   DAEMA HOLZ 
  THICKNESS= 0.015 0.175 0.167 0.02 
  ABS-FRONT= 0.4   : ABS-BACK= 0.5 

処理後のファイル

CONSTRUCTION EXT_WALL
  LAYERS   = PUTZ KST DAEMA HOLZ
  THICKNESS= 0.015 0.175 0.2 0.02
  ABS-FRONT= 0.4   : ABS-BACK= 0.5 


これにTRNSYSの実行処理を加えたら壁の構成を変えながらパラメトリックスタディができそうです。

しかし、たまに新しい言語を覚えるのは楽しいですね。なんというか、新しい道具を手に入れると、やれることが広がる感じが好きです。

動作環境

以下の環境で動作を確認しています。

Windows10 Pro(64bit)
Python:Anaconda 5.0.1(Python 3.6/64bit) https://www.anaconda.com/download/
TRNSYS18.00.0016(64bit)

2018/01/09

TRNSYSでPythonスクリプトを動かす

Type169(Python)

TRNSYS18からPython(Type169)が使えるようになりました。TRNSYSのプロジェクトで、ちょっとした計算や判定処理をPythonで手軽(?)に記述できます。

でも、いきなりType169を利用すると図のようなエラーが発生します。

image

詳細なメッセージは以下。

*** Fatal Error at time   :         0.000000

     Generated by Unit     : Not applicable or not available

     Generated by Type     :   169

     TRNSYS Message    105 : A TYPE was called in the TRNSYS input file but was either not linked into trndll.dll or was not found in an external dll. A dummy subroutine was called in its place. Please link the TYPE or remove it from the input file

     Reported information  :  Type169 could not be located in either the trndll.dll or in an external dll. Please relink theTRNDll.dll including this Type or make sure that an external DLL in the \UserLib\DebugDLLs and \UserLib\ReleaseDLLs folders contain the Type.


これ、普段はTypeのDLLが無い、もしくは関連するDLLが不足しているときに表示されるメッセージです。分かりにくいですが、Type169ではPyhtonの実行環境が必須なので、予め環境を整えてないとこのエラーになります。

Pythonの環境を整える

ということで、事前にPythonの実行環境の設定が必要です。
一般的にはPythonの公式サイト(https://www.python.org/)からインストーラーをダウンロードして、インストールしますが、ここではAnacondaのパッケージを使って環境を整えます。(サイズは少々大きくなりますが、こちらの方が取り扱いが簡単です)

AnacondaのダウンロードサイトからPython3.6,64bit版のインストーラーをダウンロードしてインストールします。いくつかオプションが表示されますが、すべてデフォルトでOKです。

https://www.anaconda.com/download/

image

環境変数の設定

インストールが終了したら、次は環境変数、PathにAnacondaのパスを追加します。

デフォルトでインストールしていれば、環境変数PathC:\Users\<ユーザー名>\Anaconda3 を追加すれば準備完了です。

image

Simulation Studioでなにかプロジェクトを用意して、うまく動けば設定環境です。

image

Pythonスクリプト

この例で使っているスクリプト(以下)を簡単に説明すると、Type169からはPythonFunction()を呼び出して、さらにmyFunc()を呼び出しています。エラーが起きたときにログファル(_error.log)に書き出したかったので、2段階の呼び出しになっています。直接myFunc()を呼び出してもそのまま動くはずです。

type169_wtih_try.py

"""type169(Python) sample"""
import TRNSYSpy as trn
import traceback
import os

def myFunc():
    # retrieve values from the Inputs
    inp1 = trn.getInputValue(1)
    inp2 = trn.getInputValue(2)
    inp3 = trn.getInputValue(3)
    # processing
    out1 = inp1+inp2
    out2 = inp3**inp2
    # return the new values to the Outputs
    trn.setOutputValue(1, out1)
    trn.setOutputValue(2, out2)
    return

def PythonFunction():
    """This function is called from TRNSYS/Type169"""
    # delete the previous log file if it exists.
    logfile = "_error.log"
    if os.path.exists(logfile):
        os.remove(logfile)

    try:
        myFunc()

    except:
        # save messages to the log file when something goes wrong.
        print('error')
        with open(logfile, 'w') as f:
            f.write(traceback.format_exc())

上記サンプルのダウンロードはこちらから。

Github/TRNSYS.JP

https://github.com/TRNSYSJP/TRNSYS.JP/tree/master/TRNSYS18/Examples/Type169_Calling_Python


動作環境

以下の環境で動作を確認しています。

Windows10 Pro(64bit)
Python:Anaconda 5.0.1(Python 3.6/64bit) https://www.anaconda.com/download/
TRNSYS18.00.0015(64bit)