この記事は EtherCATについて語る Advent Calendar 2019 の10日目です。
昨日は@nonnoiseさんの EtherCAT開発方法 フレーム編(リードまで) でした。
#はじめに
ん〜前回のEtherCAT開発方法 フレーム編(リードまで) を書きなぐりのようにまとめたけど、ちょっとマニアック過ぎて、知りたいのはそこじゃない感を感じたりしてるんだが・・・
ただ、まぁEtherCATを通る上ではEtherCATのコアレジスタにアクセスしなければならないし、そこを触れていなくても間接的には利用している訳で、そういった意味で前回と今回の内容は大事なので、取り敢えずまとめておきます。
##ArtifactNoise開発モデル
この先の内容は、以下の環境を元に説明していきます。
- Raspberry Pi 3B+ (4BやJetson Nano、Ubuntuデスクトップなど)
- PyEtherCAT
- EtherCATスレーブ評価基板LAN9252使用
- LED16モジュール
※本ライブラリは、WindowsやMac OSでは、セキュリティーの関係で動作しません。
他の方法については、他の方々の方法を参考に。
#Write(ライト)方法
http://ww1.microchip.com/downloads/jp/DeviceDoc/00001909A_JP.pdf
さて、Write(書き込み)を行うには、まずレジスタが書き込みに対応している必要がある。多くのレジスタはRO(リードオンリー)となっており、RW(リードライト)となっている箇所、もしくはWO(ライトオンリー)の物を探す必要がある。なお、WOは滅多に無いのてここでは除外する。
レジスタの中で、著者が気に入っているレジスタが、RUN LED オーバーライド レジスタである。
このレジスタは、本来正常に動いているRUN LED(EtherCATでは正常に動いている際にこのLEDが点灯する決まり)を、強制的に動作を変更するレジスタである。
早速、RUN LEDの状態を変化させてみよう。
前回と同じですが、以下の方法でライブラリをダウンロードします。
git clone https://github.com/pyEtherCAT/EtherCAT_Master.git
cd EtherCAT_Master
以下のソースを書きます。
from pyEtherCAT import MasterEtherCAT #ライブラリの読出し
nic = "eth0" # ネットワークカードのアドレスを記載
cat = MasterEtherCAT.MasterEtherCAT(nic)
ADP = 0x0000 #1台目
ADDR = 0x0138 #コアレジスタのアドレス
data = [0]*1
data[0] = 0x10 | 0x0D
cat.APWR(IDX=0x00, ADP=ADP, ADO=ADDR, DATA=data) #データ書き込み
(DATA, WKC) = cat.socket_read() #結果を読出し
print("[0x{:04X}]= 0x{:02x}".format(ADDR, DATA[0]))
#読み出したデータを表示する
結果〜
[0x0138]= 0x1d
こ↑こ↓が光る!!点滅るす!!
所謂、Lチカやぁぁぁぁ!!!
って事で、皆さんLチカが出来ましたね。
解説すると・・・
- APWRを使って自動インクリメント物理ライトリードで書き込んで読み込んでを行います。
- ADPは、自動インクルメントなので、機器に接続された1台目を読みにいきます。2台目を読む際は-1をします。
- ADDRは、コアレジスタのアドレスを指定します。RUN LED オーバーライド レジスタは0x0138なので、それを指定します。
- DATAには、オーバーライドを有効にするため4bitを1にする0x10と、その先のLED状態を点滅にする0x0Dを重ねています。
- socket_readは必要ありませんが、APWRは戻り値もあるので書き換えられたか確認の為、読み出してます。
という感じで、書き換えが出来ましたね。
#実は・・・・
このレジスタ辺りの資料を見ていくと、EEPROMで設定するレジスタという項目もあります。
これは、チップが起動時やリセット時に最初に読み出される内容で、
本来はROのレジスタもEEPROMに書き込むことでビットを変更出来たりします。
自身が販売しているモジュールにはこのEEPROM周りは解決してGPIOとして設定していますが、正直ここが一番理解もデバックも動作確認も厳しく、説明もしづらく、いっそGUIソフトを作ったほうが良いのではないかと思っている所です。
EEPROM辺りは、来年の活動にご期待下さい!。
#裏技・・・?
EtherCATコアレジスタに、ユーザーRAMが存在します。
正直、この先も深いEtherCATの機能に手を伸ばすよりも・・・このユーザーRAMを使ってオレオレEtherCATを作るって言う手も・・・いやいやいや。
取り敢えず、APRDとAPWRを駆使すれば、何とかEtherCATらしい事が出来るという事です。
#まとめ
さて、これでリードとライトが出来ました。
これでEtherCATがチョットワカルだね!!
・
・
・
ウソです。そんな事はありません。EtherCATの難しさはこれからです。
実はまだ自分も調べつくせてない機能で
FMMUx
SyncManager
MailBox
ect・・・・
EtherCAT上位層はほんと難しい。正直ここで十分な気もしつつ、
来年以降頑張っていこうかと思います。
ではでは・・・次回はデバック方法をまとめます!
北神 (@nonNoise)