CANOpen
CANを元に,医療,産業分野のネットワーク制御に使用されている.
CanOpenにおいて、ネットワーク上において少なくとも1つのデバイスはHeartbeat producer(s)として存在する必要があり、ほかのすべてのデバイスはHeartbeat consumersとなる必要がある。
EPOS4: Motor stop at communication lost?
CAN通信はOSI参照モデルの1,2層を定義,CANOpenは7層を定義,3,4,5,6層はなし.これはEtherCATも同様であり,CoEは1,2層をEtherCATにで実装したものとなる.
インデックス | 割当 |
---|---|
0x0000~0x0FFF | データ型式領域 |
0x1000~0x1FFF | CoE通信領域 3つの例外を除き,CANベース以外の通信では自由に使える?0x1000,0x1001,0x1018はCiAによって指定される.0x1018はデバイスのベンダID |
0x2000~0x5FFF | メーカ固有領域 |
0x6000~0x9FFF | CANopenプロファイルに使用 |
0xA000~0xAFFF | ネットワーク変数 |
0xB000~0xBFFF | CiA302-7で指定されるシステム用変数 |
0xC000~0xFFFF | CiA用に予約 |
通信の振る舞い
CANOpenは主に3つの通信の振る舞いで動作する.1つの動作を続けるということはなく,場合によって3つの状態をそれぞれ遷移していく.
マスタ/スレーブ
この関係で通信するのはNMTのみ,ネットワーク上の1台のノードがマスタ,それ以外がスレーブとなる.
通信の起動はマスタからのみ行うことができ,スレーブはそれに応じて応答するのみ.スレーブが自ら通信を開始したり,スレーブ同士で通信することはできない.
クライアント/サーバ
1対1で通信をする時,送信開始側がクライアントとなる.この関係で通信するオブジェクトはSDOのみ.
サーバがデータを受け取る場合,クライアントがデータを受け取る場合がある.
マスタ/スレーブにおいても,クライアント/サーバの関係は成立する
例;マスタが1つのノードにリモートフレームなど何かしらの要求を行い,スレーブがこれに応答する時,マスタはクライアント,スレーブはサーバとして振る舞っている.
コンシューマ・プロデューサ
あるノードが,ネットワーク上の不特定のノードにオブジェクトを送信する場合この関係となる.
プロデューサがオブジェクトを送信し,コンシューマは必要なデータのみを受信する.
コンシューマからリモートフレームが送信され,それに応じてプロデューサがオブジェクトを送信することもある.
PDO,SYNC,TIME,NMTの一部はこの関係で送受信を行う.
COB-ID
CANOpenは基本的に標準フォーマットデータフレームを用いて通信する.
標準フォーマットのデータフレームとリモートフレームには,11bitのIDが割り当てられている.CANOpenではこのIDの中身が2つに分割される.
上位4bitはfunction codeと呼ばれ,下位7bitにはNodeIDが割り当てられている.ここからもわかるように,CanOpenでは最大で127台のノードを接続できる.
CanOpenプロトコル
function code(4bit)でCANOpenのプロトコルを,NodeID(7bit)で送信するノードのIDを指定する.
function codeによって,最大8byteのデータをどのように扱うか決定する.
CanOpenプロトコル | function code(4bit, hex) | Node IDs(7bit, hex) | COB-ID(hex) |
---|---|---|---|
NMT | 0x00 | 0x00 | 0x0 |
SYNC | 0x01 | 0x00 | 0x80 |
EMCY | 0x01 | 0x01 ~0x7F | 0x81 ~0xFF |
TIME | 0x02 | 0x00 | 0x100 |
TxPDO1 | 0x03 | 0x01 ~0x7F | 0x181 ~0x1FF |
RxPDO1 | 0x04 | 0x01 ~0x7F | 0x201 ~0x27F |
TxPDO2 | 0x05 | 0x01 ~0x7F | 0x281 ~0x2FF |
RxPDO2 | 0x06 | 0x01 ~0x7F | 0x301 ~0x37F |
TxPDO3 | 0x07 | 0x01 ~0x7F | 0x381 ~0x3FF |
RxPDO3 | 0x08 | 0x01 ~0x7F | 0x401 ~0x47F |
TxPDO4 | 0x09 | 0x01 ~0x7F | 0x481 ~0x4FF |
RxPDO4 | 0x0A | 0x01 ~0x7F | 0x501 ~0x57F |
TxSDO | 0x0B | 0x01 ~0x7F | 0x581 ~0x5FF |
RxSDO | 0x0C | 0x01 ~0x7F | 0x601 ~0x67F |
NMT error control | 0x0E | 0x01 ~0x7F | 0x701 ~0x77F |
NMT
ネットワーク管理を行う.CANOpenノードの運転状態を制御する.NMTはデータ長が2bytesの単一のCANフレーム
SYNC
EMCY
SDOアクセスに起因しないエラーが発生するたびに,エマージェンシメッセージが送信される.
- 0,1byte: 2byteのエラーコード
- 2byte: エラーレジスタ(
0x1001
,0x00
)のコピー - 3~7byte : メーカ固有のエラーコード
TIME
PDO
ノード間で更新頻度の高いデータ,情報をブロードキャストする.CANのデータフレームである最大8bytesを全部データとして扱える.
各ノードは好きなタイミングでデータを送信できる(これはCANの機能として保証される),1つのフレームに複数のデータを詰め込むことが可能.
CANOpenにおいてこの事項を満たすためにPDO(プロセスデータオブジェクト)が存在している.
PDOは送信受信が分かれている.PDOがどのノードから送信されているか,受信されているかの判別が必要である.よって,PDOを送信するノード(プロデューサ)は1つ,プロデューサにとってPDOはTPDOとなり,その他のノード(1つまたは複数のコンシューマ)にとってはRPDOとなる.
送信タイミング
PDOは4つの送信タイミングが存在する.
イベント・ドリブン(チェンジオブステート)
PDOに設定したデータに変更が入ったときに送信する.しかし,PDOが非常に短時間似変化した時,このノードのTPDOがバスを占有するリスクが有る.このため,インヒビットタイマを用いることでこれに対応する.TPDOの送信後PDOの値がどれだけ変化してもインヒビットタイマが終了するまでは次のTPDOを送信しないという実装になる.このため,インヒビットタイマで指定した時間がそのままTPDOの送信が発生する最小周期と設計することができる.
デメリットとして,インヒビットタイマの終了前に生じた値の変化を他のノードに反映できないという点がある.
タイムドリブン
ノード内に設定したイベントタイマによって定期的に送信する.このため,各ノード間でタイマの同期はされていないことに注意する,各ノードの送信においてTPDOの送信タイミングにはズレが生じる.バスの帯域使用率,レイテンシの計算は簡単であるが,オーバーヘッドが大きいことに注意.
ポーリング
PDOにおいては非推奨.
個別ポーリングはCANのリモートリクエストを用いて実装するが,リモートリクエストはCANコントローラやチップベンダによって実装が異なる.
シンクロナイズドポーリングを用いるのが良い.
シンクロナイズドポーリング(グループポーリング)
全ノードに対して同じタイミングで処理を反映したいときに用いる.CANOpenではSYNCシグナルを用いて実現する.
これにより,全ノードに対して時刻同期を行うことができる. SYNCシグナルはグローバルなタイマタイミングとして機能する.
センサの場合
各ノードは値をずっと読み取りデータを更新する,SYNCを受信すると,このタイミングでのデータを送信する.SYNCを送信したノードはこれらセンサの値を受信するが,各データはSYNCを送信したタイミングでデータとなる.
アクチュエータ場合
各アクチュエータのノードに新しいデータを送信する.データを受信した各ノードは,そのデータをすぐには出力には反映せずに保持する.その後,SYNCを送信する.SYNCを受信したタイミングで,ノードは受信したデータを出力を反映する.
SDO
Service Data Object,CANOpenのすべてのオブジェクトディクショナリにアクセス可能.ノードの初期パラメータの設定に使ったりする.
しかしオーバヘッドが大きい。どんなサイズのデータでも必ず8byteのデータを消費する。
Object Dictionary
CANOpenで定義されている各変数を全部まとめておく変数テーブルという認識
16bitのindexとその中に8bitのsubindexが存在する.
Index | Sub-Index | Object | ||
---|---|---|---|---|
0x0000 | 未使(予約済み) | |||
0x001-0x025F | 0x0001-0x001F | Static data types | ||
0x0020-0x003F | Complex data types | |||
0x0040-0x005F | Manufacturer-specific complex data types | |||
0x0060-0x025F | Device profile specific data types | |||
0x0260-0x0FFF | 未使(予約済み) | |||
0x1000-0x1FFF | 通信プロファイル領域 CiA301 | |||
0x1000 | Device Type | |||
0x1001 | Error register | |||
0x1002 | Manufacturer status register | |||
0x1003 | Pre-defined error field/ERRHistoryADOM | |||
0x1005 | COB-ID SYNC | |||
0x1006 | Communication cycle period/NMTCycleLenU32 | |||
0x1007 | Synchronous window length | |||
0x1008 | Manufacturer Device Name | |||
0x1009 | Manufacturer Hardware Version | |||
0x100A | Manufacturer Software Version | |||
0x100C | Guard time | |||
0x100D | Life time factor | |||
0x1010 | Store parameters/ NMTStoreParamREC | |||
0x1011 | Restore default parameters/ NMTRestoreDefParamREC | |||
0x1012 | COB-ID TIME | |||
0x1013 | High resolution time stamp | |||
0x1014 | COB-ID EMCY | |||
0x1015 | Inhibit Time EMCY | |||
0x1016 | Consumer heartbeat time | |||
0x1017 | Producer heartbeat time | |||
0x1018 | Identity Object | |||
0x10F1 | Error Settings | |||
0x10F3 | Diagnosis History | |||
0x10F4 | External Synchronization Status | |||
0x10F5 | External Synchronization Settings | |||
0x1200-0x127F | CANopen: SDO Server Parameter | |||
0x1280-0x12FF | CANopen: SDO Client Container Parameter | |||
0x1400-0x14FF | CANopen: Receive PDO Communication Parameters | |||
0x1600-0x17FF | CANopen, EtherCAT: Receive PDO Mapping | |||
0x1600 | Receive PDO mapping 1 | |||
0x00 | Number of entries | |||
0x01 | 1st receive PDO mapped | |||
0x02 | 2nd receive PDO mapped | |||
︙ | ︙ | |||
0x20 | 32nd receive PDO mapped | |||
0x1601 | Receive PDO mapping 2 | |||
0x1602 | Receive PDO mapping 3 | |||
0x1800-0x19FF | CANopen: Transmit PDO Communication Parameters | |||
0x1A00-0x1AFF | CANopen, EtherCAT: Transmit PDO Mapping | |||
0x1A00 | Transmit PDO mapping 1 | |||
0x00 | Number of entries | |||
0x01 | 1st transmit PDO mapped | |||
0x02 | 2nd transmit PDO mapped | |||
︙ | ︙ | |||
0x20 | 32nd transmit PDO mapped | |||
0x1A01 | Receive PDO mapping 2 | |||
0x1A02 | Receive PDO mapping 3 | |||
0x1C00 | Sync Manager Communication Type | |||
0x00 | Number of used sync manager channels | |||
0x01 | Communication type sync manager 0 | |||
0x02 | Communication type sync manager 1 | |||
0x03 | Communication type sync manager 2 | |||
0x04 | Communication type sync manager 3 | |||
0x1C12 | Sync Manager channel 2 | |||
0x00 | Number of assigned PDOs | |||
0x01 | PDO mapping object index of assigned TxPDO 1 | |||
0x02 | PDO mapping object index of assigned TxPDO 2 | |||
0x03 | PDO mapping object index of assigned TxPDO 3 | |||
0x04 | PDO mapping object index of assigned TxPDO 4 | |||
0x1C13 | Sync Manager channel 3 | |||
0x1C32 | Sync Manager 2 synchronization | |||
0x00 | Number of sub-objects | |||
0x01 | Sync mode | |||
0x02 | Cycle time | |||
0x03 | Shift time | |||
0x04 | Sync modes supported | |||
0x05 | Minimum cycle time | |||
0x06 | Calc and copy time | |||
0x08 | Command | |||
0x09 | Delay time | |||
0x0A | Sync0 cycle time | |||
0x0B | cycle time too small | |||
0x0C | SM-event missed | |||
0x0D | Shift time too short | |||
0x0E | RxPDO toggle failed | |||
0x20 | Sync error | |||
0x1C33 | Sync Manager 3 synchronization | |||
0x2000-0x5FFF | 製造メーカ固有プロファイル領域 | |||
0x6000-0x9FFF | 標準化されたデバイスプロファイル領域 | |||
0xA000-0xAFFF | 標準化されたインターフェースプロファイル領域 | |||
0xC000-0xCFFF | 未使(予約済み) |
Object Dictionaryの0x6000
~から定義されている標準化されたデバイス(インターフェース)プロファイル領域という部分にCiA4xxで定められた割当がされるということのようだ.
RxPDO, 0x1600
- 0x17FF
TxPDO, 0x1A00
- 0x1BFF
プロトコル・スタック
CANFestival
オープンソースのCANOpenフレームワーク
https://canfestival.org/
CANopen Stack Project
CanOpenNode
https://canopennode.github.io/CANopenSocket/
pac5527のサンプルコードに入っているCanOpenはこれを使っている模様
Lely CANopen
参考文献
CANopenの“オープン”な特徴とは?
CANopenの概要
ソフテックだより 第193号(2013年9月4日発行)技術レポート「CANopenプロトコル」
CANopen Explained - A Simple Intro (2020)
CANopen Explained - A Simple Intro [2021]
CANopen - A Simple Introduction (2022)
CiA
CiA 402: Internationally standardized profile for electrical drives
CiA 402 Motion control example for MAXPOS drive