Translate

2016/04/19

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

さてと、前回はTRNSYSの関数をC/C++コンポーネントから使う際の基本的な流れを解説しました。

今回は、もう少し具体的に掘り下げてみたいと思います。TRNSYSの関数と一口に言っていますが、ソースコードを眺めるとFunctionとして定義されている物と、Subroutineとして定義されている物の2種類あるのが分かります。

この2つ、ざっくり戻り値があるかないかの違いです。(C/C++から呼び出す際はどちらも関数として扱います)表にするとFunctionとSubroutineって戻り値があるか、ないか(void)の違いなんですよね。

戻り値の型 引数の型
Function Integer,
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++の値の型の対応は下表のようになります。

FORTRAN C/C++
Integer,Integer(4) int
Real(8),Double Precesion double
Real(4) float

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

※2016/4/25 追記

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

別名の定義

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

#define     別名          関数名

例)SetTypeVersion()

#define setTypeVersion                    SETTYPEVERSION

ヘッダーファイルの準備

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

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

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

ヘッダーファイルを追加

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

2016-04-19_14h43_46

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

2016-04-19_14h49_28

参考までに作成したサンプルを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) ヘッダーファイル・実践編

0 件のコメント:

コメントを投稿