interface:can:canopen

CAN

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の一部はこの関係で送受信を行う.

CANOpenは基本的に標準フォーマットデータフレームを用いて通信する.
標準フォーマットのデータフレームとリモートフレームには,11bitのIDが割り当てられている.CANOpenではこのIDの中身が2つに分割される. 上位4bitはfunction codeと呼ばれ,下位7bitにはNodeIDが割り当てられている.ここからもわかるように,CanOpenでは最大で127台のノードを接続できる.

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

ネットワーク管理を行う.CANOpenノードの運転状態を制御する.NMTはデータ長が2bytesの単一のCANフレーム

SDOアクセスに起因しないエラーが発生するたびに,エマージェンシメッセージが送信される.

  • 0,1byte: 2byteのエラーコード
  • 2byte: エラーレジスタ(0x1001,0x00)のコピー
  • 3~7byte : メーカ固有のエラーコード

ノード間で更新頻度の高いデータ,情報をブロードキャストする.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を受信したタイミングで,ノードは受信したデータを出力を反映する.

Service Data Object,CANOpenのすべてのオブジェクトディクショナリにアクセス可能.ノードの初期パラメータの設定に使ったりする.

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

オープンソースのCANOpenフレームワーク
https://canfestival.org/

https://canopennode.github.io/CANopenSocket/
pac5527のサンプルコードに入っているCanOpenはこれを使っている模様

参考文献

  • interface/can/canopen.txt
  • 最終更新: 2024/07/07
  • by yuqlid