TRNSYSの単位換算がヘンな値を返す???

計算していると、単位を換算したいケースってありますよね。たとえばkJをkWhに換算したいとか。そういう場合、TRNSYSには単位換算用にType57 Unit Convertorっていう便利なコンポーネントが用意されています。値を換算して返してくれるシンプルなコンポーネントです。

これが、あるプロジェクトで使ったら、なぜか変な値を返します。結果だけ見ると、換算係数がタイムステップごとに変化しているように見えます。コンポーネント間を流れるデータをチェックしていくと、どうも上流がType55だと変な値に換算されているようです。

こういうつなぎ方をすると、換算が変になる。

ここで使っているType55って、値を積算してくれる便利なコンポーネントなんですが、なぜ?

いろいろ検討して行き詰ってしまったので、開発元へ問い合わせてみました。結論から言うと、換算してから積算すればOK

こういうつなぎ方。換算してから積算する。

結果的に目的は果たせるのですが、なんで逆順だとだめなんだ?

これにはTRNSYSがコンポーネントを呼び出す順番が関係しています。通常のコンポーネントはTRNSYSからタイムステップごとに値が収束するまで繰り返し呼び出されます。

ところが、ある種のコンポーネントは他のコンポーネントの収束後に1度だけ呼び出されるものがあります。これは出力系のコンポーネントに多くて、たとえばType25のようにファイルにデータを書き出すコンポーネントなどがそれにあたります。結果の書き出し専用なので、収束まえのデータとか書き出されたら困るので、必ず収束後に呼び出されます。

これと同じで、Type55も収束後に一度だけ積算のため実行されるように作られています。

Type57は、ごく普通のコンポーネントなので、収束まで繰り返し呼び出され、値を出力します。この呼び出しタイミングの違いが原因で、次のような状態になります。

Type55:収束後の値を積算処理した値を出力
Type57:収束時の換算値を出力

この違いで、結果的にType57はひとつ前のタイムステップの換算値を出力してしまうようです。(あーややっこしい。)

原因が解ってしまえば、なんてことない話ですが、コンポーネントの見た目としては、どちらでも同じ結果になりそうな気になるので、ちょっと注意が必要ですね。

コンポーネントを並べるときは、出力系や積算系などは必ず最後につなぐと憶えておくといいかもしれません。

TRNSYSのコンポーネントに詳細情報を追加する

TRNSYSというか、ほとんどFORTRANのネタです。というかIntel Fortranネタですね。

コンポーネントを作ってて、ふとファイルのプロパティを見てみたら。。。

なんかどうも味気ない。製品名とか著作権とか、何も表示がないので、ちょっと寂しい。

こういう場合C++だと、リソースを追加すればOKなので、FORTRANでも同じだろうと追加してみたら、ちゃんと詳細情報が追加できました。

まずはリソースの追加

ソリューションエクスプローラーで、Resource Filesを選んで、リソースファイルを追加する。

次に、リソースファイルにVersionリソースを追加する。

Versionリソースを開いて、試しにProductNameを変更する。

そして再ビルド 

ファイルのプロパティを確認すると。

設定した製品名がちゃんと反映されています。

ファイルの説明とか、著作権なんかも設定できるので、このコンポーネントのDLLってなんだっけ?って時や、バージョン管理したいときに役立ちそうです。

Inputの値を”ラベル”として扱う方法

コンポーネントのInputの項目って、通常は値、もしくはEquationなので設定された変数とか定数を入力することができます。

ところが、例外があって、この部分を単なる文字列として扱う事もできます。例えば、Type65 Online Plotterでは、Inputに入力された値を単なる文字列として扱って、グラフの凡例で使っています。

なーんか不思議ですよね?Inputの項目を変数として扱う場合と、単に文字列で扱う場合って、どこで区別しているんでしょう?
ちょっと必要に迫られて調べてみました。

新しくコンポーネントを作ってみると。。。

試しに普通にProformaとコンポーネントを作ると、この部分は値、もしくは変数として認識されます。Type65と同じようにInputへ適当な文字列を入れて実行してみるとエラーになります。

例)実際にInputの項目に”Ctrl01″って文字列を入れてエラー発生

*** Fatal Error at time   :         0.000000
    Generated by Unit     : Not applicable or not available
    Generated by Type     : Not applicable or not available
    TRNSYS Message     98 : Unrecognized variable name or bad data card.
TRNSYS was looking for a numerical value or the name of a variable
defined in an equation/constant and instead it found the data in
“reported information” below.
    Reported information  : Ctrl01 0 0 0 0 0 0 0 0 0

メッセージからすると、対応する変数が無いってコトでエラーになっているようですが、はて?
でもType65は、なんでOKなんだろ?

ちなみに、Inputの項目を文字列として取得するためのAPIはちゃんと用意されています。

例)Inputの値の説明を取得する
label = getVariableDescription(CurrentUnit, 1)

Type65のソースコードと比較してみると、同じAPIを使って文字列のデータを取得しているのにエラーは発生しません。でも自分で書いたコンポーネントではエラーになります。
う~ん、きっとなにか切り替えの仕組みがあるはずです。しかし、Type65のソースコードやProformaを眺めても、それらしい記述が見つかりません。ナゾです。

隠し機能なのか?

1日悩んでお手上げだったので開発に問い合わせたら、あっさり答えが返ってきました。

「ExeフォルダのDescrips.dat にType番号書いとけばOK」(意訳)

なんと、専用のファイルがあるようです。という事で実際にType番号を書き加えてみました。

例)Descrips.dat
This file should contain the TYPE numbers 
208  !Tess Library Model: Type208.for
535  !Tess Library Model: Type535.for
221  !MyComponent: Type221  ←この行を追加した

で、試したらあっさり動いた。

この仕組み、ドキュメントには記載が見当たらない(見付けらていないだけか?)
滅多に使う機能じゃないので、知っている人だけが知っていればいいってことなのかな?
ま、ともかく、目的は達せそうです。

R言語を試す(インストール)

なんだか、最近ちょいちょいR言語が話題になります。しかも統計データの処理だとか、気象データを取ってきて処理するとか便利&面白そうな話題です。

これはちょっと試してみても損はないのではと、インストールしてみました。

インストーラーの入手

RjpWiki」という便利なサイトがあるので、ここからインストーラーをダウンロードできます。(正確には最新版のダウンロードサイトへのリンクがある)

「Rのインストール」で、使用環境に合わせてインストーラーをダウンロードすることができます。

http://www.okada.jp.org/RWiki/?R%20%A4%CE%A5%A4%A5%F3%A5%B9%A5%C8%A1%BC%A5%EB

インストール

Windows版インストーラーを選んでダウンロードしたら、起動。

ごく一般的なインストーラーなので、指示に従ってインストールすればOK。

Rを起動

ということで、スタートメニューからRを起動してみる。

あっさり起動。しかし、どうやって使うんだ、これ?久しぶりに見るコマンドラインな画面は面食らいます。

次はR言語そのものの勉強だな。。。

なぞのエラー

先日の話ですが、締め切り間際の作業中、いろいろ設定を変更して、さあTRNSYSで計算しようと思ったらエラーが発生。

なんか、やっちまったようです。

で、リストファイル(*.lst)でエラーをチェックしようと思ったら。。。。

アイコンがグレーになってて、リストファイルが参照できないんですけど。。。

なんか、もー、時間がない時に限って意味不明なエラーが起きるよ、とほほほ。

なにを変更したのが原因だ?

沈思黙考。。。

しばらくして、テスト用にファイル名を「テストモデル.tpf」って名前に変えていたのに気がついた。

そう、TRNSYSって日本語というか、英語以外だと通じないときがあります。

ファイル名を英語にしたら、無事に計算開始。

ヘンな汗が出ました。

シンポジウムへ出かける

今週はなにやらセミナーやシンポジウムが集中していて、外出&座りっぱなしの一週間でした。健康には良くないですね。おかげで仕事がたまり気味。でもセミナーに出かけると、いろいろ情報収集ができて楽しいです。

出かけた学会のシンポジウム「実務者のための自然換気設計」で紹介されていたハンドブックが面白そうだったので、さっそく購入してみました。

自然換気といえば住宅というイメージがあったんですが、オフィスビルでも自然エネルギーの活用となると、換気をどうするかといった点がテーマになるようです。

まだ読み始めたところですが、換気の他、温熱環境やシミュレーション、実施例など多岐に渡っていて、なかなか面白いです。

TRNSYS,TRNFlowが紹介されているページもあって、思いがけず嬉しかったです。

Direct Access toolbarのアイコンを大きくする

打ち合わせ用にノートPCを持ち歩いているのですが、これが解像度が高すぎで画面が見にくいケースがあります。

Simulation StudioのDirect Access Toolbar(画面右側)なんか、表示が細かくなりすぎて、かなり見にくい。

こういう場合は、[File]-[Settings]で表示されるダイアログの「Project」タブで「Icon size of Direct Access bar」でサイズを大きな値に設定します。

OKボタンをクリックしてダイアログを閉じて、Simulation Studioを再起動すると。。。

Direct Access Toolbarの表示が大きくなります。多少不恰好になるのが難点ですが、これでノートPCでも見やすくなります。

くるっと回るアイコン

TRNSYSのSimulation Studioにはいろいろと面白い機能が用意されています。

Rotate

まずは、アイコンを選んで右クリック。ここで表示されるメニューから、[Graphic]-[Roate clockwise]を選択します。

と、こうなる。アイコンが90度回転しました。

何に使うんだ、これ?って気もしますが、アイコンの向きに意味があるような場合に便利そうな機能です。

Focus on

次はアイコンを選んで右クリック。ここで表示されるメニューから[Graphic]-[Focus on]を選択します。

と、今度は選んでいるアイコンと接続されているコンポーネント以外が非表示になります。

コンポーネントがたくさん配置されているプロジェクトでは、特定のコンポーネントの接続関係を確認するのに便利な機能です。

コンポーネントが認識されない。。。(2)

さて、前回、新しく作ったコンポーネントがTRNSYSから認識されない状況に陥りました。

原因は参照しているMSVCR110.DLLが見つけられないこと。

このファイルが何かというと、一般には「Cランタイムライブラリ」と言われるファイルです。コンポーネントはFORTRANで書いているので、なんでCのランタイム参照してるんだという気もしますが、まあ、必要なんで参照してます。

単純な話、このMSVCR110.DLLをTRNSYSから認識できるパスに放り込んでやればエラーはでなくなります。

例)VS2012では以下のフォルダに格納されています。

C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\redist\x86\Microsoft.VC110.CRT

このフォルダから、DLLをC:\TRNSYS17\Exeフォルダにコピーします。これであっさり解決です。

落とし穴

と、ここで落とし穴が待ち構えています。この「Cランタイムライブラリ」、TRNSYS自身も参照しています。しかも厄介なことに、少し前のバージョンを参照していてファイル名も違っています。(具体的にはMSVCRT.DLLという名前のファイル)

図にすると、こんな感じ。

ここで何が問題かというと、TRNSYS本体とコンポーネントの間で参照先が違うので、実行時に齟齬が発生するケースがあります。(大部分は問題ないのですが、一部の処理で齟齬が出ます)

なんちゅーか、初版と改訂版のテキスト混在みたいな感じですかね。同じ授業なのに人によって使っているテキスト違っているから、受講者の理解している内容が違っているみたいな。ちょっと違うか。

具体的な例としては、データファイルを参照しているコンポーネントだとTRNSYS本体が割り当てたLUがコンポーネント側から見えないといった問題となって現れます。TRNSYSのデータとしては問題ないのに、エラーで動かない状況になります。

こういう時は基本的に新しい方に合わせてしまうのがよろしい。という事でTRNSYS(TRNDLL.DLL)も同じライブラリを参照するようにビルドし直してやればOK.

図にすると、こんどは、こんな感じ。

同じライブラリを参照するようになるので、齟齬もなく安心して使えます。

実作業としてはTRNDLL.DLLを開発中のコンポーネントと同じコンパイラで再ビルドすればOKです。

コンポーネントが認識されない。。。(1)

新しく作ったTRNSYSのコンポーネントがなぜか認識されない。Simulation Studioでメッセージを確認すると、どうもDLLとして認識されていないっぽい。

以下、リストファイル(*.lst)に書き出されているエラーメッセージ

*** Fatal Error at time   :         0.000000
    Generated by Unit     : Not applicable or not available
    Generated by Type     :   201
    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  :  Type201 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 UserLibDebugDLLs and UserLibReleaseDLLs folders contain the Type.

はて?特殊なことはしてないはずなんだけどな?どんな理由で認識されないんだろ?
こういう時は、TRNSYSをコマンドラインから実行してみると、より詳しい原因が判ることがあります。(Simulation Studioから実行すると、Simulation Studioからのエラーメッセージが記録されてしまうので、TRNSYS本体のエラーメッセージを確認するため直接実行してみる)

で、コマンドラインから、こんな感じでTRNSYSを実行してみると。。。

C:>C:Trnsys17ExeTRNExe.exe sample.dck


DLL(MSVCR110.dll)を参照しているのに見つけられていない。

さて、エラーの原因は判ったものの、さて次はどうする???

つづく。