EtherCAT開発方法 フレーム編(ライトまで)

2023/04/19に公開

※Quiitaで書いた記事の転記です
投稿日 2019年12月09日

この記事は EtherCATについて語る Advent Calendar 2019 の10日目です。
昨日は@nonnoiseさんの EtherCAT開発方法 フレーム編(リードまで) でした。

はじめに

ん〜前回のEtherCAT開発方法 フレーム編(リードまで) を書きなぐりのようにまとめたけど、ちょっとマニアック過ぎて、知りたいのはそこじゃない感を感じたりしてるんだが・・・

ただ、まぁEtherCATを通る上ではEtherCATのコアレジスタにアクセスしなければならないし、そこを触れていなくても間接的には利用している訳で、そういった意味で前回と今回の内容は大事なので、取り敢えずまとめておきます。

ArtifactNoise開発モデル

この先の内容は、以下の環境を元に説明していきます。

※本ライブラリは、WindowsやMac OSでは、セキュリティーの関係で動作しません。

他の方法については、他の方々の方法を参考に。

#Write(ライト)方法

スクリーンショット_2019-12-09_20-51-06.png
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

以下のソースを書きます。

wrtittest.py
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

6a6ea962-d8b7-4947-b3ab-3cb3302b6f66.jpg

こ↑こ↓が光る!!点滅るす!!

所謂、Lチカやぁぁぁぁ!!!

って事で、皆さんLチカが出来ましたね。

解説すると・・・

  • APWRを使って自動インクリメント物理ライトリードで書き込んで読み込んでを行います。
  • ADPは、自動インクルメントなので、機器に接続された1台目を読みにいきます。2台目を読む際は-1をします。
  • ADDRは、コアレジスタのアドレスを指定します。RUN LED オーバーライド レジスタは0x0138なので、それを指定します。
  • DATAには、オーバーライドを有効にするため4bitを1にする0x10と、その先のLED状態を点滅にする0x0Dを重ねています。
  • socket_readは必要ありませんが、APWRは戻り値もあるので書き換えられたか確認の為、読み出してます。

という感じで、書き換えが出来ましたね。

#実は・・・・
このレジスタ辺りの資料を見ていくと、EEPROMで設定するレジスタという項目もあります。
スクリーンショット_2019-12-09_21-30-31.png

これは、チップが起動時やリセット時に最初に読み出される内容で、
本来はROのレジスタもEEPROMに書き込むことでビットを変更出来たりします。

自身が販売しているモジュールにはこのEEPROM周りは解決してGPIOとして設定していますが、正直ここが一番理解もデバックも動作確認も厳しく、説明もしづらく、いっそGUIソフトを作ったほうが良いのではないかと思っている所です。
EEPROM辺りは、来年の活動にご期待下さい!。

#裏技・・・?

スクリーンショット_2019-12-09_21-36-24.png

EtherCATコアレジスタに、ユーザーRAMが存在します。

正直、この先も深いEtherCATの機能に手を伸ばすよりも・・・このユーザーRAMを使ってオレオレEtherCATを作るって言う手も・・・いやいやいや。

取り敢えず、APRDとAPWRを駆使すれば、何とかEtherCATらしい事が出来るという事です。

#まとめ

さて、これでリードとライトが出来ました。
これでEtherCATがチョットワカルだね!!



ウソです。そんな事はありません。EtherCATの難しさはこれからです。
実はまだ自分も調べつくせてない機能で

FMMUx
SyncManager
MailBox
ect・・・・

EtherCAT上位層はほんと難しい。正直ここで十分な気もしつつ、
来年以降頑張っていこうかと思います。

ではでは・・・次回はデバック方法をまとめます!

北神 (@nonNoise)

Discussion