CANopenは、自動化で使用される組み込みシステム向けの通信プロトコルスタックおよびデバイスプロファイル仕様です。OSIモデルの観点から見ると、CANopenはネットワーク層を含む上位層を実装しています。CANopen規格は、アドレス指定方式、いくつかの小規模な通信プロトコル、およびデバイスプロファイルによって定義されるアプリケーション層で構成されています。通信プロトコルは、ネットワーク管理、デバイス監視、およびノード間の通信をサポートしており、メッセージの分割/分割解除のためのシンプルなトランスポート層も備えています。データリンク層と物理層を実装する下位レベルのプロトコルは通常、コントローラエリアネットワーク(CAN)ですが、イーサネットパワーリンクやEtherCATなどの他の通信手段を使用するデバイスでもCANopenデバイスプロファイルを実装できます。
CANopenの基本的なデバイスおよび通信プロファイルは、CAN in Automationによって公開されたCiA 301仕様に記載されています。より特殊なデバイス向けのプロファイルは、この基本プロファイルの上に構築され、CAN in Automationが発行したCiA 401などの多数の他の規格で規定されています。I/OモジュールおよびCiA 402用モーションコントロール用。
すべてのCANopenデバイスは、制御ソフトウェアに特定の標準機能を実装する必要がある。
CANopenデバイスには、デバイスの設定および通信に使用されるオブジェクト辞書が必要です。オブジェクト辞書のエントリは次のように定義されます。
オブジェクト辞書値の基本データ型(ブール値、整数値、浮動小数点値など)は標準で定義されています(ビット単位のサイズは、関連する型定義(インデックス範囲0x0001~0x001F)にオプションで格納されます)。また、文字列、配列、レコードなどの複合データ型(インデックス範囲0x0040~0x025Fで定義)も同様に定義されています。複合データ型は8ビットのインデックスでサブインデックス付けできます。配列またはレコードのサブインデックス0の値は、データ構造内の要素数を示し、型はUNSIGNED8です。
例えば、デバイス通信パラメータは、基本デバイスプロファイルCiA 301で標準化されている。これらはインデックス範囲0x1000~0x1FFF(「通信プロファイル領域」)にマッピングされます。この領域の最初の数個のエントリは次のとおりです。
適切なツールがあれば、電子データシート(EDS)に基づくデバイスのオブジェクト辞書の内容をカスタマイズして、デバイス構成ファイル(DCF)を作成し、デバイスを特定のCANopenネットワークに統合することができる。CiA 306によるとEDSファイルのフォーマットはINIファイルフォーマットです。CiA 311で説明されているXMLスタイルのフォーマットが今後導入される予定です。。
CANバス(CANopenのデータリンク層)は、11ビットのID、リモート送信要求(RTR)ビット、および0~8バイトのデータで構成される短いパケットのみを送信できます。CANopen規格では、11ビットのCANフレームIDを4ビットのファンクションコードと7ビットのCANopenノード IDに分割しています。これにより、CANopenネットワーク内のデバイス数は127に制限されます(0はブロードキャスト用に予約されています)。CANバス規格の拡張(CAN 2.0 B)では、29ビットの拡張フレームIDが使用できますが、実際には、拡張ID範囲を必要とするほど大規模なCANopenネットワークはほとんど見られません。
CANopenでは、CANフレームの11ビットIDは通信オブジェクト識別子(COB-ID)と呼ばれます。送信衝突が発生した場合、CANバスで使用されるバスアービトレーションにより、IDが最小のフレームが遅延なく最初に送信されます。時間制約のある機能に低いコード番号を使用することで、可能な限り低い遅延を実現できます。
CANopenフレームの内容:
11ビットの識別子を持つデータフレームは、「ベースフレームフォーマット」とも呼ばれます。
デフォルトのCAN-IDマッピングでは、フレームの最初の4ビットに機能コード(NMT、SYNC、EMCY、PDO、SDOなど)を割り当てることでフレームをソートし、重要な機能に優先順位を付けます。ただし、このマッピングは特別な目的に合わせてカスタマイズできます(基本的な通信に必要なNMTとSDOを除く)。
この規格では、特定のCAN-IDをネットワーク管理およびSDO転送用に予約しています。一部の機能コードとCAN-IDは、デバイスの初期化後に標準機能にマッピングする必要がありますが、後から他の用途に設定することも可能です。
シンプルなネットワーク構造の場合、CANopenはメッセージ識別子の事前定義済み割り当てをサポートしています。
送信と受信の方向はデバイスの視点からである。したがって、ネットワーク上のデバイスへのクエリは、0x600+nodeid を送信し、0x580+nodeid を返されることになる。[ 1 ]
CANopenノード間のメッセージングでは、さまざまな種類の通信モデルが使用されます。
マスター/スレーブ関係では、CANopenノードのうち1つがマスターとして指定され、スレーブに対してデータの送受信やデータ要求を行います。NMTプロトコルは、マスター/スレーブ通信モデルの一例です。
SDOプロトコルではクライアント/サーバー関係が実装されており、SDOクライアントはデータ(オブジェクト辞書のインデックスとサブインデックス)をSDOサーバーに送信し、サーバーは要求されたデータ(指定されたインデックスにあるオブジェクト辞書の内容)を含む1つ以上のSDOパッケージで応答します。
HeartbeatプロトコルとNode Guardingプロトコルでは、プロデューサー/コンシューマーモデルが使用されています。プロデューサー/コンシューマーのプッシュモデルでは、プロデューサーは特定の要求なしにコンシューマーにデータを送信しますが、プルモデルでは、コンシューマーがプロデューサーにデータを要求する必要があります。
NMTプロトコルは、ステートマシンの変更コマンド(例えば、デバイスの起動と停止)を発行したり、リモートデバイスの起動やエラー状態を検出したりするために使用されます。
モジュール制御プロトコルは、NMTマスタがデバイスの状態を変更するために使用されます。このプロトコルのCANフレームCOB-IDは常に0であり、これは機能コードが0、ノード IDが0であることを意味します。つまり、ネットワーク内のすべてのノードがこのメッセージを処理します。 コマンドの送信先となる実際のノードIDは、メッセージのデータ部分(2バイト目)に指定されています。これも0にすることができ、その場合はバス上のすべてのデバイスが指定された状態に移行します。
ハートビートプロトコルは、ネットワーク内のノードを監視し、ノードが稼働していることを確認するために使用されます。ハートビートプロデューサー(通常はスレーブデバイス)は、バイナリ機能コード1110とノード ID(COB-ID19 = 0x700 + ノード ID)を含むメッセージを定期的に送信します。フレームのデータ部分には、ノードの状態を示す1バイトが含まれています。ハートビートコンシューマはこれらのメッセージを読み取ります。メッセージが特定の時間制限内(デバイスのオブジェクトディクショナリで定義)に到着しない場合、コンシューマは、たとえばデバイスのリセットやエラーの通知などのアクションを実行できます。フレームのフォーマットは次のとおりです。
CANopenデバイスは、起動時に初期化状態からプレオペレーション状態へ自動的に移行する必要があります。この移行が行われると、単一のハートビートメッセージがバスに送信されます。これが起動プロトコルです。
スレーブ監視のために、ノードガードと呼ばれる応答/返信型(プルモデル)プロトコルが存在する。
SDOプロトコルは、リモートデバイスのオブジェクト辞書への値の設定および読み取りに使用されます。オブジェクト辞書にアクセスするデバイスはSDOサーバであり、リモートデバイスにアクセスするデバイスはSDOクライアントです。通信は常にSDOクライアントによって開始されます。CANopenの用語では、通信はSDOサーバ側から捉えられるため、オブジェクト辞書からの読み取りはSDOアップロード、辞書エントリへの書き込みはSDOダウンロードとなります。
オブジェクト辞書の値はCANフレームの8バイト制限を超える可能性があるため、SDOプロトコルでは、より長いメッセージのセグメンテーションとデセグメンテーションが実装されています。実際には、SDOダウンロード/アップロードとSDOブロックダウンロード/アップロードの2つのプロトコルがあります。SDOブロック転送は標準規格に新しく追加されたもので、プロトコルのオーバーヘッドをわずかに削減しながら大量のデータを転送できます。
クライアントからサーバ、サーバからクライアントへの各SDO転送メッセージのCOB-IDは、オブジェクトディクショナリで設定できます。オブジェクトディクショナリでは、アドレス0x1200~0x127Fに最大128台のSDOサーバを設定できます。同様に、デバイスのSDOクライアント接続は、0x1280~0x12FFの変数で設定できます。ただし、事前定義された接続セットは、起動直後(プレオペレーション状態)でもデバイスの設定に使用できるSDOチャネルを定義します。このチャネルのCOB-IDは、 受信の場合は0x600 + ノードID、 送信の場合は0x580 + ノードIDです。
ダウンロードを開始するために、SDOクライアントはSDOチャネルの「受信」COB-IDを含むCANメッセージで以下のデータを送信します。
プロセスデータオブジェクト(PDO)プロトコルは、様々なノード間でリアルタイムデータを処理するために使用されます。1つのPDOあたり、デバイスとの間で最大8バイト(64ビット)のデータを転送できます。1つのPDOには複数のオブジェクト辞書エントリを含めることができ、1つのPDO内のオブジェクトは、マッピングおよびパラメータオブジェクト辞書エントリを使用して構成できます。
PDOには、送信PDO(TPDO)と受信PDO(RPDO)の2種類があります。前者はデバイスから送られてくるデータ(デバイスはデータ生成元)用で、後者はデバイスに送られてくるデータ(デバイスはデータ消費者)用です。つまり、RPDOを使用するとデバイスにデータを送信でき、TPDOを使用するとデバイスからデータを読み取ることができます。事前定義された接続セットには、4つのTPDOと4つのRPDOの識別子が用意されています。設定により、最大512個のPDOを使用できます。
PDOは同期的にも非同期的にも送信できます。同期PDOはSYNCメッセージの後に送信されますが、非同期メッセージは内部トリガーまたは外部トリガーの後に送信されます。たとえば、デバイスがTPDOリクエストを受け入れるように設定されている場合、RTRフラグ付きの空のTPDOを送信することで、必要なデータを含むTPDOを送信するようデバイスに要求できます。
RPDOを使用すると、例えば2つのデバイスを同時に起動できます。同じRPDOを2つ以上の異なるデバイスにマッピングし、それらのRPDOが同じCOB-IDでマッピングされていることを確認するだけで済みます。
同期プロデューサーは同期コンシューマーに同期信号を提供します。同期コンシューマーは信号を受信すると、同期タスクの実行を開始します。
一般的に、同期PDOメッセージの送信時間を固定し、同期オブジェクトの送信周期性を確保することで、センサデバイスがプロセス変数をサンプリングするように配置したり、アクチュエータデバイスが協調的に動作を実行したりすることが保証されます。
同期オブジェクトの識別子は、インデックス1005hにあります。
通常、タイムスタンプオブジェクトは、時刻を6バイトのフィールドで表します。これは、午前0時からのミリ秒数(最大27ビット、32ビットフィールドに格納)と、1984年1月1日からの日数を表す符号なし16ビットの数値で構成されます。(これは2163年6月7日にオーバーフローします。)
特に伝送速度が低下した大規模ネットワークにおける時間制約の厳しいアプリケーションでは、非常に高精度な同期が求められます。場合によっては、ローカルクロックをマイクロ秒単位の精度で同期させる必要があるかもしれません。これは、オプションの高解像度同期プロトコルを使用することで実現できます。このプロトコルは、特殊な形式のタイムスタンプメッセージを用いて、ローカルクロックの避けられないずれを調整します。
高解像度タイムスタンプは、1マイクロ秒の解像度を持つunsigned32型でエンコードされます。つまり、タイムカウンターは72分ごとにリセットされます。これは、高解像度タイムスタンプ(オブジェクト1013h)をPDOにマッピングすることで設定されます。
緊急メッセージは、デバイス内部で致命的なエラーが発生した際にトリガーされ、該当するアプリケーションデバイスから他のデバイスへ優先度の高い状態で送信されます。そのため、割り込み型のエラーアラートに適しています。緊急電報は「エラーイベント」ごとに一度だけ送信できます。つまり、緊急メッセージを繰り返してはなりません。デバイスで新たなエラーが発生しない限り、それ以上の緊急メッセージを送信する必要はありません。CANopen通信プロファイルで定義された緊急エラーコードによって、エラーレジスタとデバイス固有の追加情報がデバイスプロファイルに指定されます。
マスターと、ID 1およびノード ID 2に設定された2つの圧力トランスデューサスレーブ間の通信のサンプルトレース。
電子データシート(EDS)は、CiA306で定義されているファイル形式で、デバイスの通信動作とオブジェクト辞書エントリを記述します。これにより、サービスツール、構成ツール、開発ツールなどのツールがデバイスを適切に処理できるようになります。
これらのEDSファイルは、CiA CANopen適合性テストに合格するために必須です。
2007年末以降、CiA311ではXDDと呼ばれる新しいXMLベースのフォーマットが定義されています。XDDはISO規格15745に準拠しています。