SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

組込みコンポーネントシステムTECS

【第4回】コンポーネントの実装コード


セルタイプコードの例

 それでは、簡単な例を見てみましょう。以下のようなTECS CDLがあるとします。これはアップダウンカウンタで、カウンタがレベルに達すると警告を発します。

コンポーネント記述(TECS CDL)
signature sUpDownCounter { /* アップダウンカウンタシグニチャ */
     void   countUp();
     void   countDown();
     void   readCount( [out]int32_t *count );
  };
  signature sAlert {         /* 警告シグニチャ */
     void   alert();
  };

  celltype tAlertCounter {   /* アップダウンカウンタセルタイプ */
     entry  sUpDownCounter eCounter; /* カウンタの受け口 */
     call   sAlert         cAlert;   /* 警告の呼び口 */
     attribute {
        int32_t      initial_count;  /* カウンタ初期値 */
	int32_t      alert_count;    /* 警告を発するカウント値 */
     };
     var {
        int32_t   count = initial_count;
     };
  };
tAlertCounter のセルタイプコード記述(C言語)
#include "tAlertCounter_tecsgen.h" /* TECSジェネレータ生成のヘッダファイル */

  void  eCounter_countUp()           /* 受け口 eCounter の countUp 関数 */
  {
    CELLCB   *p_cellcb;              /* CELLCB へのポインタ */
    if( VALID_IDX( idx ) ){          /* idx は正当値か */
      p_cellcb = GET_CELLCB(idx);    /* idx_is_id でない場合 p_cellcb = idx */
    }else{
      return E_ID;
    }

    /* ここから設計者の記述コード */
    VAR_count++;
    if( VAR_count == ATTR_alert_count )
      cAlert_alert();
    /* ここまで設計者の記述コード */
  }

  void  eCounter_countDown()         /* 受け口 eCounter の countDown 関数 */
  {
    CELLCB   *p_cellcb;
    if( VALID_IDX( idx ) ){
      p_cellcb = GET_CELLCB(idx);
    }else{
      return E_ID;
    }
    /* ここから設計者の記述コード */
    VAR_count--;
    /* ここまで設計者の記述コード */
  }

 tAlertCounterのセルタイプコードとして、受け口eCounterの受け口関数eCounter_countUp, eCounter_countDownとeCounter_readCountを記述します。eCounter_countUp関数では内部変数countの値が警告レベルalert_countに達すると、呼び口cAlertを通して警告を伝えます。上記の例ではeCounter_readCount 受け口関数は省略しています。

 ただし、内部変数countには'VAR_'を、属性alert_countには'ATTR_'を前置します。このように'ATTR_'や'VAR_'を前置して書くのは若干不便のように思えるかもしれませんが、ROMに配置される属性とRAMに配置される内部変数を意識することなくアクセスすることができます。もし、このようなマクロを用いなければ、少なくとも一方のアクセスでは、これらをつなぐポインタをかませなくてはなりません。

 また、属性や内部変数の一方しかない場合には、最適化によりROM領域が省略されたりRAM領域が省略されたりします。このような場合、セルを指すポインタがROM領域を指すかRAM領域を指すかは、ジェネレータが自動に判断してコード生成します。

 さらに、ジェネレータのオプションにより、すべてをRAM 配置するようにすることもできますが、セルタイプコードを書換える必要がありません。ハードウェア資源に合わせてコードを生成することができます。

次のページ

この記事は参考になりましたか?

組込みコンポーネントシステムTECS連載記事一覧

もっと読む

この記事の著者

大山 博司(おおやま ひろし)

TOPPERSプロジェクト コンポーネント仕様ワーキンググループ主査オークマ株式会社 FA システム本部 主管技師オークマ株式会社(当時は大隈鉄工所)に入社以来、数値制御装置の制御ソフトウェア開発に従事する。博士(工学)

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/3808 2009/04/03 11:39

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー