作ってみようTRNSYSコンポーネント C/C++編(7) ヘッダーファイル・実践編
2019/11/22 追記:TRNSYS18ではヘッダーファイル(”C:\TRNSYS18\SourceCode\Templates\TRNSYS.h”) が標準で添付されます。
さてと、前回は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 Precision | double |
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) ヘッダーファイル・実践編
6件のピンバック
作ってみようTRNSYSコンポーネント C/C++編(5) コンポーネントが呼び出されるタイミング – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(4) Simulation Studioで実行してみよう – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(2) ソースコードの生成 – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(1) 基本情報 – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(3) ソースコードを読んでみよう – 建築環境工学系日記
作ってみようTRNSYSコンポーネント C/C++編(6) ヘッダーファイル – 建築環境工学系日記