CAPLの基礎 - Vector

Technical Article
ECUテストのプログラミングをもっと効率的に
∼ CAPL の基礎と使用上のヒント&コツ ∼
パート 1:CAPL の基礎
CAPL はベクターが開発したプログラミング言語で、広く使われているベクターのソフトウェアツール「 CANoe 」と
「 CANalyzer 」で使用します。本稿では、CAPL の基本的知識をはじめ、すべてのユーザーの理解度に応じたヒントや
コツを、3部構成で解説していきます。このパート1ではCAPLの基礎について解説します。主にCAPLを初めて学ぶ方
を対象にしていますが、十分な知識があるユーザーの方もCAPLを構成する際に生かせるヒントを見つけていただけ
ると思います。パート2ではCAPLの高度な機能について考察し、最後のパート3ではパフォーマンスや必要なメモリに
ついてのトピックを取り上げ、さらに、データベースと連想配列を使用する際のヒントやコツを紹介します。
CAPLは初めてDOS版CANalyzerに導入されて以来、20年以上
長年にわたって拡張が加えられ、
「可能な限りシンプルに」の原則
にわたり、単純な刺激入力から複雑なバスノードのシミュレーショ
に従って、複雑なタスクも解決できるプログラミング言語に進化
ンまで幅広いタスクの効率的な実装に役立ってきました。
(以下、
してきています。
本稿では「CANoe」をCANoeとCANalyzerの2製品の総称として
「 CAPL 」 は、
「 Communication Access Programming
使用します。)CAPLの使用目的は、
「特定のタスクを可能な限りシ
ンプルに記述、実行すること」であり、受信メッセージへの対応、
Language」の略です。当初はCANだけでしたが、次第に拡張され、
LIN、FlexRay、MOST、J1587、ARINC、CANopenなどのあらゆる
シグナル値のチェックと設定、メッセージ送信などのタスクによく
車両バスシステムに対応するようになりました。
使用します。プログラムはこれらの用途に特化したもので、かつ、
付加的なオーバーヘッドは一切必要ありません。
CANoeユーザーが通常行うプログラミング作業の多くは、図1の
他の多くのプログラミング言語と同様、CAPLの構文規則はC言
語に基づいています。CやC#言語、あるいは最近の多様なスクリ
プト言語の知識があれば、短期間でCAPLを使いこなせるようにな
例のように短くて単純なものかもしれません。しかし、それほど単
ります。ただし、CAPLプログラムにはCプログラムと一線を画す、
純には済まないタスクも数多く存在します。だからこそ、CAPLは
独自の特徴がいくつかあります。
February 2015
1
Technical Article
図1:
単純なCAPLプログラムの例
> CAPLプログラムは「イベント駆動型」です。つまり、CAPLプ
ログラムは個々の関数の集まりであって、その関数の1つ
1つが、メッセージの受信、シグナルの変化、タイマーの期
限切れ、さらには「環境」の変化といった、解析対象のシス
テム内のイベントに反応します。たとえば、
「EngineState」
と い う メ ッ セ ー ジ に 反 応 す る に は、
「On message
EngineState」を使用します (図1)
> CAPLプログラムは、解析対象のシステムのコンセプトに応
じた固有のデータベースを使用します。このデータベー
ス内でメッセージやシグナルの名前を定義し、その名前を
プログラムコード内で直接使用できます。図1のメッセー
ジの「EngineState」や、このメッセ ージ内 のシグナ ル の
「EngineSpeed」がこの名前にあたります
> CAPLプログラムには「ポインタ型」は使用しません。そのた
め、Cプログラミングでしばしば発生しがちな潜在的なプロ
グラミングエラーやプログラムクラッシュの原因を根本か
ら排除することができます。しかし、エラーを招きやすいと
はいえ、ポインタの概念が非常に優れていることは確かで
す。そのためCAPLにはポインタに代わる機能がいくつか用
意されています。動的メモリの代用となる連想配列もその
1つです
CAPLとC 言 語に共 通する重 要な性 質として忘 れてはならな
いのが、CAPLは常にコンパイルされるという点です。つまり、
February 2015
CAPLは効率的に実行できる、柔軟性の高いマシンコードに変換
されます。
例:単純なCAPLプログラム
次に、単 純な CAPLプログラム ( 図 1) を紹 介します。これは
バスモニタリングツールの基本的なタスクの 1つを行うプログ
ラムで、バス上のトラフィックを監視し、バス上で発生する2つ
のイベントを、ユーザーが観察 /モニタリングできるように処理
します。これはサンプルの「 Easy.cfg」からの CANoeプログラム
「Display.can」の短縮版サンプルです。図 1はプログラムを示
しています。それでは、まず全体的な機能の概略を、次に個々
のセクションの詳細を説明していきます。
タスクの説明
> ここでのタスクはCANバスを観察することです。このバスの
ノード、メッセージ、伝送シグナルといった要素は、データ
ベースに記述されています
> 「EngineState」メッセージを受信すると、それに含まれる
「EngineSpeed」シグナルを取得し、パネルに表示させます
> 「LightState」メッセージを受信すると、それに含まれる
「 HeadLight 」と「Flashlight 」のシグナルを取得し、グラ
フィック表示用パネルに表示させます
2
Technical Article
プログラムの詳しい説明
CAPLとは?
図 1にある行番号はCAPLプログラムの一部ではなく、個々の
行やセクションを参照しやすいよう挿入されたものです。また、
図 1では見た目をコンパクトにまとめるため、開きブラケットは改
行せずに配置しています。
CAPLプログラムではグローバル変数とグローバル定数の定義
が可能です。これは「 var iables」セクション (1 行目から5 行目)
で行われます。このプログラムでは、ここに記載されている定数
と変数がグローバルに定義されています。これらはプログラム
内の任意の場所で使用できますが、同じCANoeアプリケーショ
ン内の別のプログラムでは使用できません。他のセクションでは
イベントに対する反応 (7 行目から17 行目) と補助(ユーザー定
義)関数 (19行目から28行目) が定義されています。
7行目から9行目はメッセージイベントプロシージャーの最小
CAPLはVector Informatik(ベクター本社)によって開発され
た、Cライクな手続き型プログラミング言語です。プログラム
ブロックの実行はイベントによって制御されます。CAPLプログ
ラムは専用のブラウザーで開発およびコンパイルされます。
これにより、システム変数をはじめ、データベースに含まれて
いるあらゆるオブジェクト (メッセージ、シグナル、環境変数)
へのアクセスが可能になります。さらに、CAPLは事前定義さ
れた関数を数多く用意しており、開発/テスト/シミュレーション
ツール「CANoe」や「CANalyzer」に活用できます。
本稿は、2014年2月CiA発行の『 CAN Newsletter 』
に掲載されたベク
ター執筆による記事内容を和訳したものです。
限の形を示しています。この関数はこのメッセージがバス上で伝
送されるたびに呼び出されます。CAN の場合、これが呼び出さ
れる正確な時点はCANコントローラーでの TXまたはRX の割り込
みの時点、すなわちメッセージが正しく伝送された直後になりま
す。特定の関数を呼び出すトリガーとなるメッセージは、
「 this」
構文で参照されます。
8 行 目 で は、受 信 さ れ た ば かりの メッセ ー ジ (this) から
執筆者:
Marc Lobmeyer (Dipl.-Inf.)
1994年 よりCANoeお よ びCANalyzerの
開発者としてVector Informatikに勤務。
「 EngineSpeed」シグナルの値が読み出され、変換 (/1000.0)
を経てシステム変数に割り当てられています。
11 行目から17 行目は「 Light St ate 」メッセージのためのメッ
セージイベントプロシージャーを示していて、方向指示器に関
する情報を伝送しています。この処理は「 EngineSt ate 」メッ
セージの処理に似ており、12 行目では伝送直後のメッセージ
(t his) で「方向」フラグ (.dir) をチェックするなど、独自の特
徴を備えています。このプログラムで考慮する必要があるのは
受信したメッセージ (RX 値 ) のみです。なぜなら、ノードから送
Roman Marktl (Dipl.-Ing)
2012年 よりCANoeお よ びCANalyzerの
CAPL機能関連のプロダクトマネージャー
としてVector Informatikに勤務。
信されたメッセージが、イベントプロシージャー (TX 値 ) をもト
リガーするためです。この場合、エラーメッセージが 15 行目に
出力されます。
シグナルをインターフェイス ( 各種の状態がそれぞれのビット
マップで表示されるパネル ) 上で表示させる処理はやや複雑で
あるため、その実装は独立した関数に任されています。13 行目
では、パラメーターとして求められる2 つのメッセージシグナル
を用いて、
「 SetLightDsp 」が呼び出されています。
最後に、19行目から28行目では独立した関数を定義しており、
伝送されるシグナル値に応じて、Lights の名前空間にあるシス
テム変数「 LightDisplay 」にそれぞれの値を書き込んでいます。
このデモ用コンフィギュレーションでは、この変数によってディス
プレイパネルに適切なビットマップが選択されます。
(別稿パート 2 へ続く)
February 2015
■ 本件に関するお問い合わせ先
ベクター・ジャパン株式会社
営業部
(東京) TEL:03-5769-6980 FAX:03-5769-6975
(名古屋)TEL:052-238-5020 FAX:052-238-5077
E-Mail:[email protected]
3