CodeZine(コードジン)

特集ページ一覧

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2009/02/05 12:00

目次

セルタイプコードの例

 それでは、簡単な例を見てみましょう。以下のような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 配置するようにすることもできますが、セルタイプコードを書換える必要がありません。ハードウェア資源に合わせてコードを生成することができます。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

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

著者プロフィール

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

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

あなたにオススメ

All contents copyright © 2005-2021 Shoeisha Co., Ltd. All rights reserved. ver.1.5