ヘッダファイルからLabWindows™/CVI™関数パネル生成する

概要

LabWindows/CVIは、さまざまなソースコードのドキュメント化ツールを提供し、開発者にとってより簡単で快適なコードの記述プロセスを実現します。そのツールの1つが、///ヘッダファイルタグを使用してヘッダファイルから関数パネルを生成する機能です。

ヘッダファイルタグを使用することで、LabWindows/CVI内で関数呼び出しを簡単に生成およびテストし、その関数を対話式実行ウィンドウですぐに実行できるという関数パネルのメリットを実現しながら、関数パネルの生成処理をスピードアップすることができます。

このチュートリアルでは、さまざまなヘッダファイル(.h)タグをユースケースのサンプルとともに詳しく説明します。

内容

関数パネル生成

LabWindows/CVIでヘッダ/インクルード(.h)ファイルを開くと、Option→Generation Function Treeコマンドを使用して関数パネルを生成できます。  関数ツリー構造を明確に定義するには、ヘッダファイルタグを使用する必要があります。  しかし、ヘッダファイルタグを含まないヘッダファイルから関数パネルを生成すると、全ての関数パネルが計測器ツリーのルートに配置され、全てのパラメータが入力として作成されます。

図1.「Generate Function Tree」ダイアログ

たとえば、以下のヘッダファイルから関数パネルを生成すると、結果の関数パネル(.fp)ファイルは図2のようになります。関数パネルツリーの構造が平坦であることに注目してください。

int __stdcall fn1(int a);
int __stdcall fn2(int b);
int __stdcall fn3(int a, int b);

float __stdcall fn4(float a);
float __stdcall fn5(float b);
float __stdcall fn6(float a, float b);

図2.タグなしのヘッダファイルから生成された関数パネル

メモ: Generate Function Tree」ダイアログ内のデフォルトの修飾子フィールドは、ソースヘッダファイルで使用されているデフォルトの修飾子と一致している必要があります。 

///キーワードで識別されるヘッダファイルタグを使うと、以下のような柔軟性が得られます。

  • 関数を整理する
  • 関数名を調整する
  • パラメータ制御のタイプと名前を変更する
  • パラメータのカスタマイズを追加する
  • デフォルト値を表示する
  • 関数、パラメータ、クラスにヘルプを追加する
  • その他

クラスによる階層追加

まず、クラスを使って.fpファイルに階層を作成できます。以下のタグは、クラスの開始を識別します。

/// -> Class Name

以下のタグが、クラスの終了を示します。

/// <- Class Name

メモ: このタグのクラス名はオプションであり、コードを読みやすくすることができます。->タグと<-タグもネスト化できます。

サンプル

/// -> Integers
int __stdcall fn1(int a);
int __stdcall fn2(int b);
int __stdcall fn3(int a, int b);
/// <- Integers

/// -> Floats
float __stdcall fn4(float a);
float __stdcall fn5(float b);
float __stdcall fn6(float a, float b);
/// <- Floats

図3は、上記のコードから生成された関数パネルを示しています。

図3.->タグで生成された関数パネル

関数補正する

自動生成された関数パネル間で一貫性のあるスタイルを作るため、LabWindows/CVIは作成した各関数パネルに対して以下のアクションを実行します。

  • 関数接頭辞を削除する
  • 最初の文字を大文字にする
  • 大文字または数字のグループの最初の大文字または数字の前にスペースを挿入する。  たとえば、Set6100SensorRpmsは、Set 6100 Sensor Rpmsになる。

自動単語分割メカニズムにより、生成された関数パネル名は意図した名前と異なる場合があります。生成された関数パネルのタイトルを修正するには、XCHGタグを使用します。コンマで区切られた複数の置換文字列ペアを指定することもできます。

メモ: PXCHタグを使用して関数パネル制御器の文字列を置換することもできます。

サンプル

/// XCHG Fn/Function
/// -> Integers
int __stdcall fn1(int a);
int __stdcall fn2(int b);
int __stdcall fn3(int a, int b);
/// <- Integers

/// -> Floats
float __stdcall fn4(float a);
float __stdcall fn5(float b);
float __stdcall fn6(float a, float b);
/// <- Floats
/// XCHG

図4は、上記のコードから生成された関数パネルを示しています。

図 4.XCHGタグで生成された関数パネル

カスタムデータタイプ追加する

関数パネル生成器はコンパイラに基づいておらず、ヘッダファイルで定義されたデータタイプを解析しないため、非ANSIデータタイプを使用すると構文エラーが発生します。これを修正するには、ADDTタグを使用して、ヘッダファイルで使用するカスタムデータタイプを生成器に認識させます。

サンプル

/// ADDT int8
/// ADDT uInt8

生成器はタイプ名を関数パネルに追加し、さらに派生配列とポインタタイプを追加します。

 

int8
int8 []
int8 *
int8 **
int8 ***
int8 *[]
           uInt8
uInt8 []
uInt8 *
uInt8 **
uInt8 ***
uInt8 *[]

 

リング、スライダ、およびバイナリスイッチ制御作成する

デフォルトで、関数パネル生成器は入力制御を作成します。一方、生成器が列挙体タイプを検出すると、そのパラメータに対して自動的にリング制御器を作成しますが、RNGSLDBINタグを使って他のタイプの制御器を作成する柔軟性も備えています。

各タグには、スラッシュで区切られた2つのパラメータが必要です。最初のパラメータはパラメータの位置 (1基準の指標) です。2つ目のパラメータはオプションで、関数パラメータのデータタイプがenumタイプの場合に、列挙体の名前を表すことができます。

メモ: BINタグは、正確に2つの値を持つ列挙体のみに関連付けることができます。

サンプル

typedef enum {
    ON=1,
    OFF=0,
} MyBinaryEnumType;

/// BIN 1
int __stdcall fnX(MyBinaryEnumType binaryInput);

図 5.バイナリ制御器

#defineプリプロセッサコマンドで定義された値のセットを使用する場合、ENUMタグを使って値を名前付きの列挙体にグループ化することができます。

メモ: 生成器に列挙体の終わりを認識させるために、#define値のグループに続いて空の行が必要です。

サンプル

/// ENUM enum1
#define ON  1
#define OFF 0

/// ENUM enum2
#define ONE   1
#define TWO   2
#define THREE 3
#define FOUR  4

/// BIN 1/enum1
/// SLD 2/enum2,3/enum2
/// RNG 4/enum2,5/enum2
int __stdcall fnX(int a, int b, int c, int d, int e);

図6は、上記のコードから生成された制御器を示しています。

図 6.BIN、SLD、RNGタグを使用して生成された制御器

追加のデフォルト値を既存の列挙体に追加する必要があるときは、スライダまたはバイナリ制御器にEHDVタグを使います。生成器は、値リストの一番上に値を追加します。ラベルは「Default」と表示され、制御器が指定された値に設定されます。

サンプル

typedef enum {
    kLeftAligned=0,
    kRightAlighed=1,
} AlignmentEnumType;
 

/// SLD 1
/// EHDV 1/-1
int __stdcall fnX(AlignmentEnumType alignment);

図7は、上記のコードから生成された制御器を示しています。

図 7.EHDVタグを使用して生成された制御器

リング、バイナリ、またはスライダの制御器に異なる値のラベルを作成する場合、各列挙体の値にコメントを追加することで、作成できます。生成器は、列挙体の値の名前をコメントしたテキストに置き換えます。

メモ: 列挙体のコメントでは、セミコロンは使用しないでください。

 

 

サンプル

typedef enum {
    kLeftAligned= 0,   // Left aligned
    kRightAlighed=1,   // Right aligned
} AlignmentEnumType;

/// SLD 1
/// EHDV 1/-1
int __stdcall fnX(AlignmentEnumType alignment);

 

図8は、上記のコードから生成された制御器を示しています。

図8.SLDタグ付きのコメントを使用

出力パラメータ宣言する

出力パラメータを定義するには、OUTタグを使用します。ポインタと配列だけが、出力パラメータになります。他のデータタイプではエラーが発生します。


サンプル

/// OUT 2,3
int __stdcall Sphere_Calc(float radius, float *surface, float *volume);

図9は、上記のコードから生成されたものを示しています。

図9.OUTタグを使って生成された制御器

パラメータデフォルト定義する

関数パネル生成器は、空の入力および出力パラメータを作成し、全てのリング、バイナリ、スライダのパラメータをそれらの最初の項目に設定しますが、パラメータのデフォルト値を変更する必要がある場合は、DFLTタグを使用します。

サンプル

/// OUT 2,3
/// DFLT 1/1.0,2/&surface,3/&volume
int __stdcall Sphere_Calc(float radius, float *surface, float *volume);

図10は、上記のコードに対して生成された制御器を示しています。

図10.DFLTタグで生成された制御器

パラメータタイプ変更する

特定のパラメータタイプを関数パネルで使用する必要がある場合、PTYPタグを使ってANSI-Cデータタイプから、関数パネル上で有効な他のタイプに変更します。たとえば、void*として宣言されているが数値配列に使用されている関数パラメータは、void*からLabWindows/CVIのNumeric Arrayに変更できます。

サンプル

/// PTYP 1/Numeric Array
float __stdcall CalcArrayMean(void *array, int dataType);

図11は、上記のコードから生成された制御器を示しています。

図11.PTYPタグを使って生成された制御器

SetAttributeおよびGetAttribute関数使用する

.SUBファイルは、IVIドライバで特定の計測器属性に対してよく使用されます。  計測器で、属性が.SUBファイルに保存されているSetAttributeまたはGetAttribute関数が必要な場合、ERNGタグをその属性のパラメータに、PTYPタグをその値のパラメータに使用します。属性のパラメータの場合、生成器が空のリングを作成しますが、計測器がロードされるとリングパラメータのコンテンツは.SUBファイルの属性で埋められます。数値のパラメータの場合、生成器はパラメータタイプをvoid*からLabWindows/CVIのAny Typeに変更します。

メモ: .subファイルの構造については、「Instrument Driver Interactive Developer Interface Specification」の第7章を参照してください。

サンプル

/// ERNG 1
/// PTYP 2/Any Type
/// OUT 2
int __stdcall GetAttribute(int attribute, void *value);

メモ: .SUBファイルは、関連付けられた.fpファイルと同じフォルダにあり、共通のルート名を持っている必要があります。

このサンプルでは、添付のFPGen.subファイルを使って、計測器属性を入力します。 関数パネルを生成したら、GetAttribute関数を開き、Option→Operate Function Panel(F9)を選択します。図12は、上記のコードから生成された制御器を示しています。


図12.ERNGタグを使って生成された制御器

変数引数使用する

場合によっては、関数宣言で変数引数を使用する必要があります。関数パネルで追加のパラメータ制御器が必要な場合、VARGタグを使って追加できます。

サンプル

/// VARG int/More Numbers Ending With Zero
int __stdcall Sum(int number, ...);

図13は、上記のコードから生成された制御器を示しています。

図13.VARGタグを使って生成された制御器

変数引数が含まれる関数パネルを使用する場合、1番目の入力制御器に最初の番号を入力し、2番目の制御器に残りの番号をカンマで区切って入力した後、最後に0を入力します。関数呼び出しの結果は以下のようになります。

Sum(1, 2, 3, 4, 5, 0);

図14.シーケンスで生成された制御器

 

パラメータカスタマイズする

カスタマイズを関数パネルパラメータに追加できます。  カスタマイズはパラメータ制御器の右側にある「...」ボタンで示されます。パラメータをカスタマイズするには、CUSTタグを使用します。パラメータの位置、目的のカスタマイズ関数を含むDLL、およびエントリポイント名を指定します。 カスタマイズ関数およびDLLの作成に関する詳細は、LabWindows/CVIのヘルプを参照してください。

メモ: カスタマイズDLLは、DLLが見つかるように、システムパスまたは計測器と同じフォルダになくてはなりません。  DLLの指定には、相対パスまたは絶対パスを使用することもできます。

 

サンプル

/// CUST 1/cviLibCust.dll/SelectAnyFile
int __stdcall SaveDataToFile(char filePath[], void *data);

このサンプルでは、添付のcviLibCust.dllファイルを使用します。関数パネルを生成したら、SaveDatatoFile関数を開き、Option→Operate Function Panel(F9)を選択します。カスタマイズボタンをクリックすると(またはパラメータ内にカーソルを合わせてEnterを押すと)、図15に示すように「ファイルを開く」ダイアログが表示されます。

図15. パラメータをカスタマイズする

ヘルプ追加する

最後に、関数パネルをドキュメント化するため、HFP、HCL、HFUN、HPAR、およびHRETタグを使用して、計測器のヘルプ、各クラスのヘルプ、各関数のヘルプ、さらには各パラメータのヘルプも追加することができます。フォーマットされたテキストまたはHTML形式のヘルプを追加することもできますが、ヘルプのコンテンツはファイルに保存する必要があります。  各ファイル名は、1つ以上のヘルプ生成タグに関連付けることができます。

サンプル

/// HFP FPfileHelp.htm
/// HCL IntegerClassHelp.htm
/// -> Integers
/// HFUN Fn1Help.htm
/// HPAR 1/ParameterAHelp.htm
int __stdcall fn1(int a);
/// HFUN Fn2Help.htm
/// HPAR 1/ParameterBHelp.htm
int __stdcall fn2(int b);
/// HFUN Fn3Help.htm
/// HPAR 1/ParameterAHelp.htm,2/ParameterBHelp.htm
int __stdcall fn3(int a, int b);
/// <- Integers

メモ:  このサンプルで使用されたHTMLファイルは、ご参考までに以下に添付してあります。

関数パネルファイルを生成したら、カーソルを関数fn3の最初のパラメータに合わせて、メニューからEdit→Show Prototypeを選択するか、Ctrl+Shift+Spaceを押してください。すると、関数プロトタイプがツールヒントに表示されます。

疑問符ボタンをクリックする(またはF1を押す)と、パラメータヘルプを表示できます。

図16. HTML関数のヘルプ

関連リンク

実績あるLabWindows/CVI開発環境は、ソースコードタグ、ヘッダファイルから関数パネルを生成する機能、関数パネルからHTMLドキュメントを生成する機能など、さまざまなドキュメント化ツールを使用して、ANSI Cアプリケーション開発の生産性を向上させることができます。 

Was this information helpful?

Yes

No