作ってみようTRNSYSコンポーネント C/C++編(7) ヘッダーファイル・実践編

さてと、前回はTRNSYSの関数をC/C++コンポーネントから使う際の基本的な流れを解説しました。 今回は、もう少し具体的に掘り下げてみたいと思います。TRNSYSの関数と一口に言っていますが、ソースコードを眺めるとFunctionとして定義されている物と、Subroutineとして定義されている物の2種類あるのが分かります。 この2つ、ざっくり戻り値があるかないかの違いです。(C/C++から呼び出す際はどちらも関数として扱います)表にするとFunctionとSubroutineって戻り値があるか、ないか(void)の違いなんですよね。

戻り値の型引数の型
FunctionInteger,
Double Precision
なし、
Integer,
Double Precision
Subroutineなしなし、
Integer,
Double Precision

TRNSYSでは戻り値を返すgetIsVersionSigningTime()のように”get”で始まる関数はFunctionで、それ以外の関数はSubroutineとして定義されている事が多いようです。

C/C++の宣言

C/C++から呼び出す際の定義は以下の形式になります。ソースコードを調べて赤い文字の部分を適宜、型に合わせて変更します。

extern “C” __declspec(dllimport) 戻り値の型 _cdecl 関数名(引数の型* 引数の名前, 引数の型* 引数の名前);

例)SetTypeVersion() extern “C” __declspec(dllimport) void _cdecl SETTYPEVERSION(int* ver);

FOTRANとC/C++の値の型の対応は下表のようになります。

FORTRANC/C++
Integer,Integer(4)int
Real(8),Double Precisiondouble
Real(4)float

なお、引数はすべてポインタで宣言する点に注意して下さい。※

※2016/4/25 追記 FORTRAN側で引数にVALUE属性(値渡し)が指定されている場合を除く。(その場合は、通常の型で定義する必要があります)

別名の定義

関数に別名(Alias)を付けて場合は以下の形式です。この部分はなくても問題ありませんが、TRNDLL.DLLで公開されている関数名そのままだと、ソースコードが読みにくくなります。ここは多少手間でも定義しておくのがお勧めです。

#define     別名          関数名

例)SetTypeVersion()

#define setTypeVersion                    SETTYPEVERSION

ヘッダーファイルの準備

Simulation Studioからエクスポートされたプロジェクトでは予めTRNSYS16形式で最小限の関数が定義されてたヘッダーファイルを参照しています。

TRNSYS17形式のヘッダーファイル(こちらも最小限の関数が定義されています)も用意されているので、こちらへ差し替えて定義を追加するのが良いでしょう。

TRNSYS17形式のヘッダーファイルはC:Trnsys17SourceCodeTemplatesTRNSYS.h に用意されているので、このファイルをプロジェクトのフォルダへコピー、追加して登録します。

ヘッダーファイルを追加

ヘッダーファイル(TRNSYS.h)をプロジェクトのフォルダへコピーしたら、ソリューションエクスプローラーの「Header Files」フォルダで右クリック。表示されるメニューから[追加]-[既存の項目]を選んで、ヘッダーファイルを追加します。

ヘッダーファイルをプロジェクトへ追加
ヘッダーファイルをプロジェクトへ追加

後は適宜関数の定義を追加すればOK.

関数宣言を追加する
関数宣言を追加する

参考までに作成したサンプルをGithubで公開します。

プロフォルマ

C:¥TRNSYS17¥Studio¥Proformas¥My Components  へダウンロード、保存してください。

ソースコード

「Step7」フォルダの内容をC:¥TRNSYS17¥Compilers¥My Components へダウンロード、保存してください。

実行用のサンプルプロジェクト

C:¥TRNSYS17¥MyProjects¥MyComponent201 へダウンロード、保存してください。
ということで、C/C++は今回で終了!

—————————————————-

以下、このシリーズの目次

作ってみようTRNSYSコンポーネント C/C++編
(1) 基本情報
(2) ソースコードの生成
(3) ソースコードを読んでみよう
(4) Simulation Studioで実行してみよう
(5) コンポーネントが呼び出されるタイミング
(6) ヘッダーファイル・基本編
(7) ヘッダーファイル・実践編

Pocket