コンポーネント

コンポーネントは、コンパイルの結果である、バイナリー・レベルのエンティティーです。 ライブラリー (.lib ファイル) と実行可能プログラム (.exe ファイル) は、IBM® Rational® Rhapsody® により生成されたソース・ファイルを使用するビルド・プロセスの最終出力です。

ブラウザーで、最終コンポーネントの名前と場所を指定できます。 また、コンポーネントにマップする要素、インクルード・ファイルの場所、およびコンパイル時にリンクするライブラリー、追加のソース、標準ヘッダーを指定することもできます。

コンポーネントが実行可能ファイルである場合、Rational Rhapsody は、Main<component>.hMain<component>.c と呼ばれる、そのコンポーネント用の宣言ファイルと実装ファイルを生成します。 これらのファイルの名前は、アクティブ・コンポーネントから付けられています。例えば、アクティブ・コンポーネントが DefaultComponent という名前で、実行可能ファイルである場合、 そのソース・ファイルの名前は MainDefaultComponent.hMainDefaultComponent.c です。 コンポーネントがライブラリーである場合、ファイルは、単に <component>.h<component>.c という (「Main」という接頭辞を付けない) 名前になります。

コンポーネントの宣言 (.h) ファイルは、コンポーネントとそのイニシャライザー、およびクリーンアップ・メソッドを宣言します。 例:

/************************************************
.
.
.
#ifndef MainDefaultComponent_H
#define MainDefaultComponent_H
/*---------------------------------------------*/
/* MainDefaultComponent.h                      */
/*---------------------------------------------*/

/* Constructors and destructors:*/

void DefaultComponent_Init();
void DefaultComponent_Cleanup();

#endif

/************************************************
   File Path   : DefaultComponent¥DefaultConfig¥
MainDefaultComponent.h
************************************************/

コンポーネントの実装 (.c) ファイルには、メインプログラム・ループが含まれます。 例:

.
.
.
#include "MainDefaultComponent.h"
#include <oxf/Ric.h>
#include "Default.h"

/*---------------------------------------------*/
/* MainDefaultComponent.c                      */
/*---------------------------------------------*/

void DefaultComponent_Init() {
    Default_OMInitializer_Init();
}

void DefaultComponent_Cleanup() {
    Default_OMInitializer_Cleanup();
}

int main(int  argc, char*  argv[]) {
   if(RiCOXFInit(argc, argv, 6423, "", 0, 0)) {
      DefaultComponent_Init();
      {
         /*#[ configuration
         DefaultComponent¥DefaultConfig */
         /* your code goes here */;
         /*#]*/
      }
      RiCOXFStart(FALSE);
      DefaultComponent_Cleanup();
      return 0;
   }
   else
      return 1;
   }

/************************************************
   File Path   : DefaultComponent¥DefaultConfig¥
MainDefaultComponent.c
************************************************/

コンポーネントの宣言ファイルには、Ric.h ファイルが組み込まれます。このファイルに、 IBM Rational Rhapsody Developer for C のリアルタイム・フレームワークが定義されます。

メインプログラムのループは、フレームワークで提供される関数の 1 つである、RiCOXFInit() を呼び出します。 このフレームワーク初期設定関数は、以下の操作を実行します。

RiCOXFInit() が正常終了して戻ると、次に main() 関数が、構成の「初期設定」タブで入力された初期設定コードを実行します。 main() 関数は、その後、コンポーネントの初期設定を行う関数を呼び出します (例えば、DefaultComponent_Init())。 この関数は、次にそのコンポーネントに含まれるパッケージを初期設定する関数を呼び出します。

一度コンポーネントが初期設定されると、main() 関数は RiCOXFStart() 関数を呼び出し、これがメインタスクを開始します。 デフォルトで、生成されたコードは OXFStart() 関数にパラメーター値 FALSE を渡します。 これは、システムが新規タスクを fork しないで、モデルがメインシステム・スレッドで稼働することを意味します。

GUI アプリケーションを作成していて、コンパイルされたコンポーネントがメインプログラム・スレッドを妨害してはいけないライブラリーである場合、 RiCOXFStart() に値 TRUE を渡して、ライブラリーがシステムを制御しないようにできます。

RiCOXFInit() 関数と RiCOXFStart() 関数は共に Rational Rhapsody モデルの実行を開始します。 これらは、モデルでイベントの受信を開始する前に呼び出される必要があります。 コンポーネントが別のアプリケーション (例、GUI アプリケーション) にリンクされるライブラリーである場合、Rational Rhapsody は、そのライブラリー用の main() 関数は生成しません。上記の 2 つの関数を呼び出すコードを作成する必要があります。イベント処理を開始するアプリケーションのメインプログラム・ループのどこかで、まず最初に、RiCOXFInit() を呼び出し、次に RiCOXFStart() を呼び出します。

rhapsody.ini ファイルでアニメーション・ポート番号がデフォルトの 6423 以外の数値に設定されている場合、RiCOXFInit() の 3 番目のパラメーターで正しいポート番号を渡す必要があります。

例えば、住宅暖房システムのサンプルでは、GUI アプリケーション (hhsproto コンポーネント) のプログラム入場点は、次の呼び出しを使用して hhsprdlg.cpp ファイルに定義されています。

RiCOXFInit(NULL, NULL, 6423, "", 0, 0);

RiCOXFInit() の 3 番目の引数、 6423 は、デフォルトのアニメーション・ポート番号です。アニメーション・ポートが別の番号に設定されている場合、使用中の番号と一致するようにこの引数を編集してください (例、6424)。 そうしないと、アニメーションが動作しません。

注: すべてのグローバル・インスタンスは、OXFInit()OXFStart() が呼び出される前に作成されている必要があります。 作成されていないと、アプリケーションが異常終了します。

最後のイベントが処理されて、モデルが終了ポイントに到達すると、 main() 関数は、コンポーネントをクリーンアップするための関数を呼び出します (例えば、DefaultComponent_Cleanup())。

コンポーネントのソース・ファイルは、構成ディレクトリーに生成されます。これはデフォルトでコンポーネント・ディレクトリーの下にあります。 例:

<project_dir>¥<component_dir>¥<config_dir>

フィードバック