EasyCATとは?
AB&T社が開発・販売しているEtherCATスレーブ基板の製品群。この記事ではおもに EasyCAT Shield for Arduino について述べる。その名の通り、Aruino用のシールドである。
EasyCATのコンフィグとは?
EasyCATは、出荷時には入力32バイト+出力32バイトのPDO構成にコンフィグされている。ソフトウェアからは各々32バイトのバイト列として参照できる。買ってきてすぐに使えるのでこれはこれでお手軽だが、ユーザーが自由にPDO構成を設計してEasyCATをコンフィグすることもできる。その場合、ソフトウェアからはPDOを構造体として参照できる。コンフィグ情報はEasyCATのEEPROMに保存される。
コンフィグのためのツール
EasyCATのコンフィグには、Easy Configuratorというソフトウェアを使用する。このソフトウェアはメーカーの製品ページで配布されている。ユーザーマニュアルも同ページで配布されているので、詳細はそちらを参照のこと。
標準モードとカスタムモード
EasyCATのコンフィグには、入出力が定義ずみの標準モードと、ユーザーが自由に設計できるカスタムモードがある。標準モードには入出力のバイト数が16+16、32+32(出荷時)、64+64、128+128の4種類がある。この記事ではカスタムモードのコンフィグ方法について説明する。
Easy Configuratorの起動
Easy Configuratorはインストール不要のアプリである。zipを適当なフォルダに解凍して使う。Exe/EasyCAT_Config_GUI.exeから起動する。
スレーブ識別情報
「SLAVE IDENTIFICATION」の欄に、スレーブの識別情報を記入する。
- Vendor Id: ETGが割り当てた32ビットのベンダID。(※)
- Vendor Name: ベンダIDを保有する会社名
- Product Code: 32ビットの製品コード
- Revision: 32ビットのリビジョン番号
- Name: 製品名
※ 教育および実験の目的以外で使用する場合には必ず取得すること!
入出力PDOの定義
「INPUT PDO ENTRIES」および「OUTPUT PDO ENTRIES」の欄に入出力のPDOの名前と型を記入する。言ってはなんだが非常に編集しづらい。どうしてこんなク●UIになったのだろうか?
プロジェクトの保存とファイル生成
メニューの[Project] > [Save as]でプロジェクトを保存する。そして「Create files」のボタンを押すと、プロジェクトのフォルダに以下の3つのファイルが生成される。
(1) .xmlファイル (ESIファイル)
EtherCAT Slave Information(ESI)仕様書で定義された、XML形式のテキストファイル。EtherCATスレーブの識別情報や入出力PDO構成など種々の情報を記述する。
EasyCATのEEPROMへ書き込む
EasyCATに電源を入れて、EasyCATとPCをLANケーブルで接続する。EasyCATの「IN」のポートに接続し、「OUT」のポートには何も接続しないこと。ハブなどは使わず必ずケーブル1本で直結すること。
「Write EEPROM」ボタンを押すとファイル選択画面が開くので、生成した.binファイルを選択する。すると.binファイルがEasyCATのEEPROMに書き込まれる。書き込みには30秒くらいかかる。
Arduinoで使う
CUSTOM という名のマクロを定義してから、生成した.hファイルをインクルードし、その後に EasyCAT.h をインクルードする。
#define CUSTOM // カスタムモード #include "HogeSlave.h" // 生成したヘッダファイル #include "EasyCAT.h" // Arduino用ライブラリ #include <SPI.h> EasyCAT EASYCAT;
上記の例のPDO構成の場合、下記のようにしてアクセスできる。ちなみに、ユーザーマニュアルは入力と出力を取り違えていると思われる。PDOの入力/出力というのはマスターから見た表現である。
// 出力(マスター→スレーブ) uint16_t a = EASYCAT.BufferOut.Cust.piyoOutput1; int64_t b = EASYCAT.BufferOut.Cust.piyoOutput2; double c = EASYCAT.BufferOut.Cust.piyoOutput3; // 入力(スレーブ→マスター) EASYCAT.BufferIn.Cust.piyoInput1 = (uint8_t)x; EASYCAT.BufferIn.Cust.piyoInput2 = (int32_t)y; EASYCAT.BufferIn.Cust.piyoInput3 = (float) z;