作ってみようTRNSYSコンポーネント C/C++編(5) コンポーネントが呼び出されるタイミング
前回はSimulation Studioで作成したコンポーネントの動作を確認しました。 あとは計算式に合わせてソースコードを書き換えればOKです。基本的にはParameters,Inputsの値を取得して計算を実行、結果をOutputsへ引き渡してあげます。 さて、ここでもう少しコンポーネントの動きについて掘り下げてみましょう。
if文がいっぱい
ソースコードを眺めてみるとParameters,Inputs,そしてOutputsの処理の他にも、なにやらごちゃごちゃとif分で処理が記述されています。例えば131行目からを見ると、次のような処理が記述されています。
info[6]の値が’-2’ならinfo[11]を16にセットして、そのまま処理終了。つまり本来の計算まで進まずに終了しています。ちなみにここではコンポーネントの対応するバージョンが16である事を宣言しています。(TRNSYS17使っているのに、なんで16なのかは後述) 他にもif文が何カ所かありますが、同じように何かを処理して、そのまま終了しています。これら本来の計算とは関係ない処理に見えますが、コンポーネントの処理を行う上で重要な処理を行っています。
コンポーネントは計算以外にも呼び出される
Simulation Studioでコンポーネントの配置、接続を行っていると、その順番に沿ってコンポーネントが呼び出されて計算が行われているように見えます。実際、動きとしては基本的にはその通りなのですが、計算の処理以外にも付随した処理が必要になる事があります。
例えば、コンポーネントがデータファイルを参照するようなケースを考えてみましょう。この場合、データファイルを開いて値を読み込む処理が必要になります。こういった処理は計算ごとに行う必要はないので、一般的には計算の開始前にまとめて処理するのが効率的です。 TRNSYSではタイムステップごとの計算の他、計算全体の開始前、終了後などのタイミングでコンポーネントを呼び出します。逆にコンポーネント側では、どのタイミングで呼び出されているのか意識して処理を進める必要があります。
具体的には、先ほどのif文のように、コンポーネント側ではinfo[]やタイムステップの値を使って、自身がどの段階で呼び出されているのか判定して処理を行います。 コンポーネント対応バージョンの処理などは、TRNSYS側からは最初に一度だけ呼び出されるので、そのタイミングでバージョンを宣言して終了するようにします。データファイルを読み込む処理などは、初期値の値を設定している以下のif文で処理すると良いでしょう。
このあたりを含め、コンポーネントの仕組みについて詳しくは、ドキュメントの以下の箇所に、
7.3. How to Create New Component
info[]については以下に詳しく記載されています。
7.4.3. The INFO array – Typical calling sequence
この記述ですが、FORTRANを前提に記載されているため、C/C++では配列の添え字が一つずれます。(配列はC/C++では0、FORTRANでは1から始まるため)info[6]の説明はドキュメントではinfo(7)を見て下さい。 さて、ここでやっているinfo[]の値をif文で処理やり方ですが、これ実はTRNSYS16形式と呼ばれる方法です。前述のバージョンの宣言で16を指定しているのはこのあたりの事情によります。
最新版のTRNSYS17では、専用の関数で判定する方式に変更され、分かりやすくなっています。
TRNSYS17形式(FORTRAN)の例。
!Set the Version Number for This Type
If(getIsVersionSigningTime()) Then
Call SetTypeVersion(17)
Return
EndIf
info[]を判定するやり方に比べると、何をやっているのかだいぶ理解しやすくなります。 C/C++でも同じような書き方ができるんですが、そのあたりの話しについては、また次回ということで。つづく。
—————————————————-
以下、このシリーズの目次
作ってみようTRNSYSコンポーネント C/C++編
(1) 基本情報
(2) ソースコードの生成
(3) ソースコードを読んでみよう
(4) Simulation Studioで実行してみよう
(5) コンポーネントが呼び出されるタイミング
(6) ヘッダーファイル・基本編
(7) ヘッダーファイル・実践編
6件のピンバック
作ってみようTRNSYSコンポーネント C/C++編(1) 基本情報 – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(4) Simulation Studioで実行してみよう – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(6) ヘッダーファイル – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(2) ソースコードの生成 – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(3) ソースコードを読んでみよう – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(7) ヘッダーファイル・実践編 | 建築環境工学系日記