「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。
ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ
弊社では、CAN (Controller Area Network)通信を用いたFA-M3向けのモジュール「SZ20」を販売しているほか、パソコンとCAN通信を行うアプリケーションの開発など、これまでの案件でCAN通信を扱う機会がありました。昨年、このCAN通信を発展させた通信規格「CANopen」を調査する機会があり、当時入社半年の私が担当することとなりました。
私たちはCANopenについてまったく未知でしたので、CANopenとは?というところから調査を行うことになりました。今回のソフテックだよりでは、その調査した内容をご紹介いたします。なお、CANについては過去のソフテックだよりで触れていますので、併せてご覧ください。(ソフテックだより 第65号(2008年5月7日発行)技術レポート「CANのWindowsソフトウェアへの導入」、ソフテックだより 第131号(2011年2月2日発行)技術レポート「CAN通信モジュール紹介」)
CANopenとは、組み込み向けの通信プロトコルです。2004年にドイツの「CAN in Automation(以下CiAと称します)」によって規格化され、今日まで発展を続けてきました。CiAは、多様な分野でCANopenデバイスを使用できるよう、各分野向けに通信仕様書を策定しオープンにしてきました。現在その仕様書数は30を超え、その対象分野はFA、医療、車両、鉄道など多岐に渡ります。CANを下地にした通信プロトコルは、DevicenetやSAE J1939などCANopen以外にも存在しますが、CANopenはそれ以上に汎用的です。また、CANopenデバイスは、どのような組み合わせでも使用でき、プラグ&プレイでの拡張が容易というオープンネットワーク(※1)の特徴があります。さらには、誰でも開発に参加できます。
CANopenの通信プロトコルは、CiA301というドキュメントにまとめられていて、これは誰でも入手することが可能です。今回のソフテックだよりは、基本的にこのCiA301を参考にまとめています。なお、さらに踏み込んでCANopenデバイスを製造し販売するためには、CiAへのベンダー登録が必要で、その際割り振られるベンダーIDと、CiA302というプログラミングマニュアルが必要です。
ここではCiA301に基づき、CANとCANopenの違いをご説明します。まず、OSI(Open Systems Interconnection)参照モデルを例にすると、CANは物理層とデータリンク層に該当し、CANopenはアプリケーション層に位置します。(図1)すなわち、通信のルールだけを定めたのがCANで、そこで扱われるデータの使い道を定めたのがCANopenと表現できます。その例として、CAN IDとオブジェクトディクショナリについてご紹介します。
図1. OSI参照モデルに基づくCANとCANopenの比較
まず、CANとCANopenにおいて、データを送信するフレームの中には、11 bitか29 bitのCAN IDと最大8 byteのデータフィールドが含まれます。CAN IDは、「より小さいIDほどネットワーク上で高い優先度を持つ」というルールがあり、それはCANopenも同様です。ここでの決定的な違いは、そのCAN IDの用途です。
CANでは、個々のIDをどう用いるかは、全て開発者の裁量に依存しますが、CANopenでは、CiA301である程度定義されています。例えば、ネットワーク上で最も優先度の高いID = 0は、CANopenデバイス本体の制御命令です。
IDを自由に決められないことは不便に感じられますが、一方で大規模なシステムや、拡張を繰り返すシステムでは、ID管理の煩わしさが軽減されることも多いはずです。
また、オブジェクトディクショナリはCANopenの特長の一つになります。(図2)これは、最大65535のインデックスと、一つ当たり最大256のサブインデックスから成るデータセットで、デバイスの動作などを全てデバイス内部に定義した辞書のようなものです。他のCANopenデバイスやアプリケーションからの読み書きを受けつつ、自らを制御することが出来ます。
図2. OSI参照モデルに基づくCANとCANopenの比較
この機能の利点は、デバイスの動作をあらかじめアドレッシングして定義しておけることで、CANopenネットワークとその外側の独立性を高め、異なる機器やネットワークとの接続も簡便になります。すなわち、CANopen外部のネットワークからは、ユーザーがCAN IDやメッセージを意識せずに、デバイスの制御ができることになります。この特長を有さないCANでは、デバイスの動作や送受信したCANメッセージの使い道を、開発者が1から構築しなければいけません。
このように、CANopenはCANの特長そのままに、ユーザーの利便性を図った通信プロトコルと言えます。
ここでは、CANopenネットワーク上で使用されるコミュニケーションオブジェクト(※2)と、そのオブジェクトを使用したときのデバイスの関係についてご説明します。
CANopenデバイス間で送受信されるオブジェクトは、それぞれ以下のように定義されています。また、各オブジェクトで使用されるCAN IDは全て標準IDで定義されており、基本的には表1のように定義されています。
ファンクション コード(*1) |
ID(ノードID) | オブジェクト | 送信形態 | 用途 |
---|---|---|---|---|
0000 | 0 | NMT | 1対複数 | 変更不可 |
- | 1〜127 | 予約領域 | - | 変更不可 |
0001 | 128 | SYNC | 1対複数 | 変更可能 |
0001 | 129〜255 | EMCY | 1対1 | 変更可能 |
0010 | 256 | TIME | 1対複数 | 変更可能 |
- | 257〜384 | 予約領域 | - | 変更不可 |
0011〜1010 | 385〜1407 | PDO | 1対複数 (1対1も可) |
変更可能 |
1011 | 1409〜1535 | SDO(tx) | 1対1 | 変更不可 |
1100 | 1537〜1663 | SDO(rx) | 1対1 | 変更不可 |
- | 1760〜1791 | 予約領域 | - | 変更不可 |
1110 | 1793〜1919 | NMT error control | 1対1 | 変更不可 |
- | 2020〜2047 | 予約領域 | - | 変更不可 |
表1. CANopenで標準的なCAN IDの割り振りと用途
PDOはCANopenデバイスのステータスやセンサー情報など、速報性の高い情報の送信に使用します。データ送信のタイミングは、CANopenデバイス内部のイベント、他のCANopenデバイスから送信されたリモートフレーム(※3)の受信、後述するSYNCイベントとの同期の3パターンがあります。このうち内部イベントやSYNCイベントに同期して自発的に送信するPDOをTPDO(Transmit PDO)、他のCANopenデバイスにPDOを要求するリモートフレームをRPDO(Receive PDO)と呼ばれます。
SDOはCANopenデバイス内のオブジェクトディクショナリにアクセスするために使用します。優先送信、通常送信、ブロック送信の3種類があり、状況に応じて使い分けが可能です。それぞれ、優先送信は4 byte以下のデータを速やかに、通常送信は5 byte以上のデータを1つか複数の通信フレームで、ブロック送信は8 byteを超えるデータをまとめて、といった特徴があります。中でもブロック送信は、複数のデータフレームを使うことで、8 byteを超えるデータを高速で送受信する手段です。この場合、通信中での送信失敗が懸念されますが、Go-Back-n ARC(※4)という方法で、送受信の信頼性を確保しています。
TIMEはその名の通り、現在時刻を通知するためのオブジェクトです。
SYNCはネットワーク同期を図るためのオブジェクトで、一部のPDOは、このSYNCイベントに同期して送信されます。
EMCYはCANopenデバイスで内部エラーが生じたときに使用されるメッセージです。CANopenではEMCYで発せられるエラーコードについても定義しており、エンジニアがわざわざエラーコードとそのエラー内容の組み合わせを考える必要はありません。
NMTはネットワーク上のCANopenデバイスをコントロールするオブジェクトで、特にCANopenデバイスの制御命令は最も高い優先度を持ちます。NMTでは、CANバス上にある全CANopenデバイスの動作・停止・初期化等をコントロールすることができます。この用途ゆえ、全CANopenデバイスはNMTに対応する必要があります。全CANopenデバイスは、運転準備段階・運転・停止・初期化のいずれかの状態をとり、NMTマスタのNMTエラーコントロールに応じて、その状態を遷移します。このことはNMTステートマシンと呼ばれています。運転状態ではないデバイスは、使用できるオブジェクトの種類に制限があります。
NMTには各CANopenデバイスの生存確認にも使用されるプロトコルも定義されています。その方法は、個々のデバイスが定周期でメッセージを送信するハートビートと、NMTマスタからのリモートフレームに応答するガーディングという2つがあります。前者は定周期のメッセージが途絶えた場合、後者はリモートフレームに応答が無い場合に、それぞれデバイス異常と判断されます。
このように、CANopenデバイスはNMTを使ってお互いの動作を監視しできるほか、デバイスの停止、初期化などを、管理者無しで行えるようになっています。
次にネットワーク上のCANopenデバイスの関係についてご紹介します。各オブジェクトをやり取りする上で、各デバイスは、マスタ/スレーブ、クライアント/サーバ、プロデューサ/コンシューマの3つの関係を取ることになります。
この関係で通信を行うのはNMTのみです。CANopenネットワーク上には必ず1台のCANopenデバイスがマスタとして存在し、他はスレーブとなります。(図3)マスタはネットワーク上にある1つか複数のスレーブデバイスにデータを送るか、デバイスにリモートフレームを要求し、そのデバイスより応答データを受け取るなどして、デバイスの状態を管理します。
図3. マスタ/スレーブ
CANopenデバイスが1対1で通信を行う場合、送信開始側がクライアントになり、クライアント/サーバの関係となります。(図4)この関係で使用するオブジェクトはSDOのみで、最終的にサーバ側がデータを受け取る場合と、クライアント側がデータを受け取る場合の2種類があります。
図4. クライアント/サーバ
あるCANopenデバイスが、ネットワーク上の不特定のデバイスに対してオブジェクトを送る場合はプロデューサ/コンシューマの関係となります。(図 5)コンシューマは必要なデータだけを受け取る形になります。ただし、コンシューマ側からリモートフレームが送信され、それに応じる形でプロデューサがオブジェクトを送信する場合もあります。PDO、SYNC、TIMEとNMTの一部はこの関係で送受信が行われます。
図5. プロデューサ/コンシューマ
この3つの関係は、オブジェクトや状況に応じて変化しうる流動的な関係です。あるデバイスが時間とともにPDOを出力したり受信したりという動作を繰り返すならば、出力時はPDOプロデューサ、受信時はPDOコンシューマという位置づけになります。
最後に、簡単な構築例をご紹介します。
図6. CANopenネットワーク構築例
この例は、PCとCANopenに対応する制御機器との簡単な接続例で、ユーザーがPC上のアプリケーションを通じてPLCを管理するケースを想定しています。図中において、PCからはイーサネット等を通じてPLC 1にアクセスでき、この両者の通信でCANメッセージを意識することはありません。また、PCからの操作は、オブジェクトディクショナリとSDOを用いて、CANopenネットワーク上の機器へ反映させることができます。
この例では、PLC 1がマスタとなってCANopenネットワークが管理されます。例えば、NMTスレーブにあたるモータ 1がハートビート出力を停止した場合、PLC 1はモータ 1が異常であると判断し、NMTエラーコントロールを行います。また、このネットワークでは、PLC 2は定期的にSYNCを発信しており、モータ 2はこのイベントに同期して動作をしています。
本号を通じて、CANopenについて、少しでも興味をお持ちいただけましたら幸いです。なお、CANopenデバイスでシステムを構築される場合、EDS(Electronic Data Sheet)ファイルを用いた事前検討が可能です。EDSファイルはオブジェクトディクショナリの機能を列挙したファイルですので、それを購入前に入手できれば、机上シミュレーションが可能になります。もし、本ソフテックだよりをご覧くださった方で、CANopenデバイスの使用を検討されている場合は、各CANopenデバイスのベンダーに問い合わせてみてはいかがでしょうか?
CANopenデバイスは、ユーザーのネットワーク構築の簡略化や利便性を図った規格と言えますが、このプロトコルスタックを1から開発するという視点で見ると、難しい開発であると感じました。しかしながら、こういった開発を行うことにはとても面白みも感じます。今回は調査だけでしたが、機会があればCANopenデバイス開発に関与させていただければと思います。
最後までお読みいただきありがとうございました。
(Y.T.)
関連ページへのリンク
関連するソフテックだより