「SOEM(Simple Open EtherCAT Master) を動かしてみる」 2013年8月23日(金) 2013年8月28日(水) 江端智一 1. 背景と目的 ~~~~~~~~~~~~~ (1)手元にOMRON社のEtherCATスレーブ GX-MD1611(2万円くらいだったか)があ り、これを使って、本格的にEthernetを使って、パソコンから、電灯やクリス マスイルミネーションの制御(シーケンサもどき)をしようと考えた。 (2)ところが、EtherCATスレーブがあっても、マスタがなければ当然に動かな い。ところがマスタは高価である。また、別に産業用ロボットを動かしたい訳 ではないので、別段リアルタイム性能も必要はない。 (3)ならば、パソコンでマスタを作れれば足りるので、自作を試みようとした。 (4)しかし、調べてみたら、SOEM(Simple Open EtherCAT Master)というものを 見つけたので、これを構築することにした。 2. EtherCATの原理と、SOEM構築の動機 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ EtherCATの原理は、明快です。 マスタから放り投げられたイーサネットフレームに、複数のスレーブがデータ を読んだり書いたりするものです。 イメージでいうと、「飼育場に投げられた肉片を、獣達が奪い当って噛みつい ている」という感じでしょうか。 ただ、このイメージは悪すぎるので、もうすこし上品に記載すると、 「駅を通過している最中の新幹線(イーサネットフレーム)の、指定された座席 に飛び乗って(1500バイト→12000ビット分の座席がある)、または、所定の駅 できちんと飛び降りるという、制御データを運ぶ通信仕様」 つまり、ルパン三世やゴルゴ13でさえ真っ青の、命懸けの「飛び乗りデータ転 送方式」です。 技術的なポイントは、 「停止しない新幹線から、直接、データを乗車・降車させる」 という点にあります。これによって、制御情報が、必ず所定の時間に到着する こと(リアルタイム性)が担保されるのです。 それと、もう一つは、この新幹線の利用料金(ライセンス料)がタダであるとい う点です。 『新幹線の設計図を公開するから、みんな、好きかってに新幹線作っていい よー』というのです。 これは、パソコン使って、趣味でホームセキュリティシステムを作っているエ ンジニアには、本当に嬉しい。 こういう装置、昔から売っていましたけど、(例えば、カラクリックス (http://www.karacrix.jp/index.html)等)、EtherCATは、国際標準仕様であり、 ライセンス料無料です。この2つは、ホームホビーエンジニアとしては、かな り嬉しい。 加えて、イーサキャットのスレーブノードの値段が、本当に安い。 8ビット入力、8ビット出力くらいのスレーブノードで2万円弱。ポート単価 1000円割っています。これくらいなら、ボーナス時に一個づつ買い足していく こともできます。 加えて、最短サンプリング時間が125μ秒(これは、イーサネットフレームの流 さを光の速度で割った、論理上の限界最短時間)。 1m秒の1/4のサンプリング時間の制御システムを「ご家庭」のパソコンとLANで 楽しめる ―― といっても、自宅でこのような厳密時間を必要とする制御を使う場所な んて、ほとんどないのですけどね。 私が自宅で、使おうとしているのは、 http://www.kobore.net/soft/x10broker/index-jp.html の代替です。 X10のデバイスが、もう日本国内では手に入らなくなってきたからです(いいデ バイスなんですけど)。 ----- さて、話は変わりますが、 "EtherCAT" を日本語訳すると「エーテル猫」となります。 癒し系ネコのロゴ作って、流行らせませんか。 私としては、EtherCATのイーサネットフレームを、「バス」に見たてて、 「猫バス」(映画「隣のトトロ」) の使用許諾を、スタジオジブリから貰うことを、真面目に考えています。 3. SOEM構築の準備 ~~~~~~~~~~~~~~~~~ (1)WindowsXPの搭載されているパソコン。ただし、EtherCAT用にNICポート1つ を占拠する。 (2)OMRON社のEtherCATスレーブ GX-MD1611(たまたま、これがあったというだ け) (3)上記(1)と(2)を直結するクロスケーブル(ストレートではリンクアップしな かった) これら(1)〜(3)を接続する。 その後の調査で、マスタースレーブ間はクロスケーブルが必要ですが、スレー ブースレーブ間では、ストレートケーブルが必要であることが分かりました。 4. SOEM構築 ~~~~~~~~~~~~ ■Step.1 SOEM(Simple Open EtherCAT Master)のソースコードをインストールし、適当 なディレクトリに展開する。 私はここから→https://developer.berlios.de/projects/soem/ バージョン 1.3.0を落した。 # 実行ファイルも付けておいてくれれば、以下の作業の必要はなかったのに # なーとも思います(全ソースコードを公開して貰っておいて、図々しいにも # 程があると、自分でも思いますが) ■Step.2 WindowsXPに、Visual Studio 2010をインストールする。私は試供版の ULTIMATEをインストールした。 開発環境は必要ないが、コンパイラ必要となる為である。 因みに、インストールには、4時間くらいかかった。 ■Step.3 SOEM(Simple Open EtherCAT Master)を展開したディレクトリで、以下を実行。 >make_libsoem_lib.bat "C:\Program Files\Microsoft Visual Studio 10.0\VC" x86 >make_test_win32.bat "C:\Program Files\Microsoft Visual Studio 10.0\VC" x86 >make_test_win32_all.bat "C:\Program Files\Microsoft Visual Studio 10.0\VC" x86 「ユニコードにしろ」だのなんだのと、メッセージが喧しいが、一応コンパイ ルできて、 2つの実行ファイル test\win32\slaveinfo\slaveinfo.exe test\win32\simple_test\simple_test.exe ができているハズである。 ■Step.4 >slaveinfo \Device\NPF_{F9A10459-8FEB-4DCB-9750-ABA41521D119} (ちなみに、"\Device\NPF_{F9A10459-8FEB-4DCB-9750-ABA41521D119}"は、イー サネットNICのデバイス名であって、WireShark → Capture → Details で見 える) と打ち込むと SOEM (Simple Open EtherCAT Master) Slaveinfo Starting slaveinfo ec_init on \Device\NPF_{F9A10459-8FEB-4DCB-9750-ABA41521D119} succeeded. wkc = 0 1 slaves found and configured. Calculated workcounter 3 Slave:1 Name:GX-MD1611 Output size: 16bits Input size: 16bits State: 4 Delay: 0[ns] Has DC: 1 DCParentport:0 Activeports:1.0.0.0 Configured address: 1001 Man: 00000083 ID: 00000032 Rev: 00010000 SM0 A:1800 L: 512 F:00010026 Type:1 SM1 A:1c00 L: 512 F:00010022 Type:2 SM2 A:1100 L: 2 F:00010064 Type:3 SM3 A:1200 L: 2 F:00010020 Type:4 FMMU0 Ls:00000000 Ll: 2 Lsb:0 Leb:7 Ps:1100 Psb:0 Ty:02 Act:01 FMMU1 Ls:00000002 Ll: 2 Lsb:0 Leb:7 Ps:1200 Psb:0 Ty:01 Act:01 FMMUfunc 0:1 1:0 2:0 3:0 MBX length wr: 512 rd: 512 MBX protocols : 04 CoE details: 23 FoE details: 00 EoE details: 00 SoE details: 00 Ebus current: 0[mA] only LRD/LWR:0 End slaveinfo, close socket End program と表示される。 ■Step.5 >simple_test \Device\NPF_{F9A10459-8FEB-4DCB-9750-ABA41521D119} と打ち込むと、 SOEM (Simple Open EtherCAT Master) Simple test Starting simple test ec_init on \Device\NPF_{F9A10459-8FEB-4DCB-9750-ABA41521D119} succeeded. wkc = 1 1 slaves found and configured. Slaves mapped, state to SAFE_OP. segments : 1 : 4 0 0 0 Request operational state for all slaves Calculated workcounter 3 Operational state reached for all slaves. OK : all slaves resumed OPERATIONAL. Processdata cycle 25942, WKC 3 , O: 57 00 I: 00 00 T:44636696003717990120 Request init state for all slaves End simple test, close socket End program と表示され、スレーブのLEDが高速点滅して、なんかキレイ。 5. 考察 ~~~~~~~ 現在のところ、動作原理等について、全然判っていないので、これから WireSharkのログを睨みながら、EtherCATの仕組みを探っていく。 6. その他 ~~~~~~~~~ ■(もうコンパイルしたくないので)自分用に、実行ファイルを置いておくことにする。 http://www.kobore.net/soft/test/slaveinfo.exe http://www.kobore.net/soft/test/simple_test.exe ■SOEMライセンス(江端のテキトーな翻訳) Legal Notice. SOEM is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License version 2 as published by the Free Software Foundation. (SOEMはフリーソフトです。GPL2ライセンスの元において、再配布および修正 が可能です。) SOEM is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. (SOEMは、有用であるように配布されることが望ましいですが、いかなる保証 もしません。商品化や特殊な用途の為の適用の暗黙的な保証もありません。詳 しくはGPLを読んで下さい) As a special exception, if other files instantiate templates or use macros or inline functions from this library, or you compile this library and link it with other works to produce a work based on this library, this library does not by itself cause the resulting work to be covered by the GNU General Public License. However the source code for this library must still be made available in accordance with section (3) of the GNU General Public License. (特殊な例外として、他のファイルが、テンプレートをインスタンス化するか、 このライブラリからマクロやインライン関数を使用するか、このライブラリを コンパイルし、このライブラリに基づいて作品を制作するために他の作品でそ れをリンクする場合には、このライブラリは、その作品が、GNUによってカバー されることを意味せず、このライブラリのソースコードはまだGNU一般公衆利 用許諾契約書のセクション(3)に従って利用できるようにする必要があります。) This exception does not invalidate any other reasons why a work based on this library might be covered by the GNU General Public License. (この例外は、このライブラリをベースとする作品が、GPLによってカバーされ るいかなる理由も無効にするものではありません) The EtherCAT Technology, the trade name and logo "EtherCAT" are the intellectual property of, and protected by Beckhoff Automation GmbH. You can use SOEM for the sole purpose of creating, using and/or selling or otherwise distributing an EtherCAT network master provided that an EtherCAT Master License is obtained from Beckhoff Automation GmbH. (EtherCATのテクノロジー、商号およびロゴは"EtherCATは"の知的財産であり、 Beckhoff社オートメーション社によって保護されています。 あなたは、EtherCATのマスターライセンスをベッコフオートメーション社から 得られたことを条件に、SOEMを、EtherCATネットワークマスターの製造、仕様、 または譲渡またはは配布を目的としてSOEMを使用することができます) In case you did not receive a copy of the EtherCAT Master License along with SOEM write to Beckhoff Automation GmbH, Eiserstrasse 5, D-33415 Verl, Germany (www.beckhoff.com). berliOS has kindly hosted this project. (もしあなたがSOEMとともにEtherCATのマスターライセンスのコピーを受けとっ ていない場合は、ベッコフオートメーション社、Eiserstrasse5、D-33415フェ アル、ドイツ(www.beckhoff.com)に連絡して下さい。このプロジェクトは、 berliOSの主催で運営されています)。 ----- ## あれ? EtherCATって、こう説明されているんだけどな。 (http://www.ethercat.org/jp/opensource.html) 『EtherCATが国際標準であることにより、EtherCAT技術へのアクセスは誰にで も区別なくオープンとなっています。さらに、マスタ技術ライセンスは使用料 が無料です。ETGは技術の継続性を保証し、今後の新しい技術開発の全てを、 EtherCAT技術のユーザグループ、つまりETGのメンバーシップを保持している 全メンバに提供します。ライセンスやETGの規約を基にETGではこの技術を使用 したユーザアプリケーションの仕様適合性と相互運用性を維持します。』 ・・・つまり、ベッコフオートメーション社は、「知的財産権を『握っている』 けど、『権利行使』はしないぜ」といっているのかな? (よくあるケースだけ ど) 以上。 --------- ■EtherCATのファイルの使われ型 ESI File(XML) → Configuration Tool → ENI file(XML) → Master ■EtherCATのスレーブの物理構成 +---------------+ +-----+ ----□---(PHY)----| | | | RJ45 | ESC +------+ SII | |(EtherCAT Slave| | | ----□---(PHY)----| Controller) | +-----+ RJ45 +---------------+ SII:Slave Information Interface ■本当に分からんEtherCATの用語たち EEPROM EtherCATスレーブ情報(ESI)を格納する為の、スレーブのメモリ(と思 う) MailBox データ本体ではなく、マスタからスレーブに送付される、スレーブ用 の設定情報通信のことかな? FMMU フィールド・バス用メモリ管理ユニットのこと 一般的にEtherCATは、イーサネットフレーム全体を巨大なアドレス空 間として使う。イーサフレームは1500バイト(12000bit)をフルフルに 使って、1システムとして最大4Gバイトのアドレス空間を使う。 (なぜ、そのような巨大なアドレス空間になるかというと、多分、フ レームを回すごとに違うアドレスを指定して運ぶだけのことだろうか ら、論理的には無限大でも良いはず) これに対してFMMUというやつは、そのような巨大なアドレス空間を貰っ てもしょうがないので、そこから、現実の自分(スレーブ)の現実のア ドレスに変換する役割を行うユニットである(これがなければ、同じ タイプのスレーブが複数あった時にアクセスできないことはイメージ できよう) SMデータ シンクマネージャ? 分からん ESI EtherNET Slave Information ベンダから提供されるXMLファイルで、スレーブの固有情報(ベンダ情 報、製品情報、プロファイル、オブジェクト、プロセスデータ、同期 の有無、SyncManager設定等)の定義をするもの。 これをEtherCAT Configuration Toolに喰わせる。 ここで、Configuration Toolとは、主にマスタまたはマスタを経由し てスレーブを設定するツールのこと ENI EtherCAT Network Information マスタ本体持っているxmlファイルで、マスタとスレーブの初期化を 行う為の情報が入っている。 SII Slave Information Interface(SII) スレーブの各種の情報(初期化情報、アプリケーション通信設定スペッ ク(MailBoxのデータサイズ値)、プロセスデ0タのマッピング等)が設 定される。 ESC エスケープシーケンスではなく、EtherCAT Salve Controllerのこと。 スレーブの実行本体と考えて良い。 FPWR ■SOEMのソースファイル一覧 eepromtool.c SOEM マスタのEEpromツール ethercatbase.c 基本EtherCAT関数 ethercatbase.h 上記のヘッダファイル ethercatcoe.c CAN over EtherCAT (CoE)のモジュール ethercatcoe.h 上記のヘッダファイル ethercatconfig.c EtherCAT masterの設定モジュール ethercatconfig.h 上記のヘッダファイル ethercatconfiglist.h (意味不明) DEPRICATED Configuration list of known EtherCAT slave devices ethercatdc.c 分散クロック ethercatdc.h 上記のヘッダファイル ethercatfoe.c File over EtherCAT (FoE) モジュール ethercatfoe.h 上記のヘッダファイル ethercatmain.c メインEtherCAT関数 ethercatmain.h 上記のヘッダファイル ethercatprint.c エラーメッセージ変換モジュール ethercatprint.h 上記のヘッダファイル ethercatsoe.c Servo(サーボ) over EtherCAT (SoE) モジュール ethercatsoe.h 上記のヘッダファイル ethercattype.h EtherCATの一般型、定義 ebox.c SOEM マスタの例題コード red_test.c SOEMマスタの例題コード simple_test.c SOEMマスタの例題コード slaveinfo.c SOEMマスタの例題コード ■Visual C++ 2010用への改造の為の知識 ├─Debug (なんかよく分からんが、ログ情報が入っている) │ ├─doc │ ├─html ここのindex.htmlからマニュアルが引ける │ └─images │ ├─ipch │ └─soem130-aabc11f7 │ ├─lib │ └─win32 ここにある"libsoem.lib"が、最終的に欲しいもの │ ├─make │ └─compilers 無視して良い │ ├─obj 中間ファイルの溜まり場(だと思う) │ ├─osal (osalの"os"はOSのことだろう。"al"は何だろう) │ ├─linux ×(関係なし) │ ├─rtk ×(関係なし) │ └─win32(★) 時間情報取得系の関数 │ osal.c","inttypes.h","osal_win32.h","stdint.h" │ がある。 │ objディレクトリに、"osal.obj"という中間ファイルが │ 作られる。 │ ├─oshw (oshwの"os"はOSのことだろう。"hw"はハードウェアか?) │ │ WinPcapを使う為のNICのドライバと、ネットワークバイト変換 │ │ のプログラムがある │ │ │ ├─linux ×(関係なし) │ ├─rtk ×(関係なし) │ │ └─lw_mac │ │ │ └─win32(★) nicdrv.c,nicdrv.h NICドライバ関連 │ │ oshw.c,oshw.hは、ネットワークバイト変換 │ │ objディレクトリに、"nicdrv.obj" oshw.objという中間 │ │ ファイルが作られる。 │ │ │ └─wpcap │ │ │ ├─Include WinPcap関係のヘッダファイル9つ(*.cファイルなし) │ │ │ │ │ └─pcap WinPcap本体のヘッダファイル7つ(*.cファイルなし) │ │ │ └─Lib Packet.lib と wpcap.libがココにある │ │ │ └─x64 同上(64bit用なのだろう) │ ├─soem soemライブラリのソースファイル(とヘッダファイル) │ ethercatconfig.c │ ethercatsoe.c │ ethercatbase.c │ ethercatmain.c │ ethercatdc.c │ ethercatcoe.c │ ethercatprint.c │ ethercatfoe.c │ └─test ├─linux ×(関係なし) ├─rtk ×(関係なし) │ └─win32 ├─ebox ├─eepromtool ├─firm_update ├─red_test ├─simple_test simple_test.c (プロジェク化(初版)済み) │ │ │ └─slaveinfo