EtherCATの通信距離について

この記事は [EtherCATについて語る Advent Calendar 2019](https://adventar.org/calendars/4097) の14日目です。
昨日は@nonnoiseさんの [商用EtherCATスレーブをまとめる](https://qiita.com/nonNoise/items/d02c2d68a8db53fd9375) でした。

#はじめに

さて、やっとEtherCATの実験記事を書く事ができる。
ただ、実験であるため、失敗は付き物です。

この記録も、**半ば失敗**のようなものです。

（想像よりも良い結果が出たとしても、想像と違った為、記事としては失敗なのです。）

それでは早速、実験内容をまとめていきます。

#やりたかったこと

今回のタイトル「EtherCATの通信速度と通信距離との関係について」ですが、

要は、<font color="Red">**通信ケーブルの長さによって通信速度に差が出るのか**</font>の実験を行いたかったのです。

自分には開発用の赤基板が４枚あります。

その４台分のスレーブを連結して、ケーブルの差で時間差が出てくれば、実験は成功です。

なお、自作の基板のリビジョンですが・・・
**赤基板は実験用（部品の変更を何度かしました）**
**緑基板は量産用（部品変更無し）**
どちらも回路に変更はこざいません。同じものと見てください。

以下の道具を使用して説明してきます。

- Raspberry Pi 3B+ 
- [PyEtherCAT](https://github.com/pyEtherCAT)
- [EtherCATスレーブ評価基板LAN9252使用](https://www.switch-science.com/catalog/5917/)
- [LED16モジュール](https://www.switch-science.com/catalog/5918/)

また、RaspberrPiの環境も乗せておきます。

    Raspberry Pi 3B+ 

    Linux raspberrypi 4.9.80-v7+ #1098 SMP Fri Mar 9 19:11:42 GMT 2018 armv7l GNU/Linux

    Distributor ID: Raspbian
    Description:    Raspbian GNU/Linux 9.3 (stretch)
    Release:        9.3
    Codename:       stretch
    Wi-Fi通信周り以外無改造（OSインストール状態)


#1台接続時

![_20191214_174124.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/eb9d8542-b8be-74f7-4ea5-b4e81267dae5.jpeg)


Raspberry Pi 3BのLANポートより、１台のEtherCATスレーブへ接続します。
長さは 0.15m の短い物を使用しております。

[EtherCAT開発方法 フレーム編 リードまで](https://qiita.com/nonNoise/items/bbe1689344ccc7b8ace0)のソースを改良し、読み出しコマンドの開始と終了の計測を行います。

    1台目の計測
    平均　time:0.4892517821957367[ms]
    最大　time:0.8022785186767578[ms]
    最小　time:0.492095947265625[ms]
    [0x0E00]= 0x0000,0x0004,0x9252,0x0001

１台目との通信速度はこんな感じです。
リードを行なっていますので
　RasPi -> A と　A -> RasPi　を行なって、パケットが戻ってくるまでの時間となります。

また、見やすいように**単位をms(ミリ秒)**にしてあります。そこもご注意ください。

平均値は１００回送受信した時間の平均値で、最大と最小はその中での値です。

特にRaspberry Pi側にリアルタイム改造を行なっていない為、見ての通り最大と最小にばらつきがございます。
これをジッタと呼んだりするそうです。

まぁまぁな結果です。

ちなみに、最大値の0.78ミリ秒でも、周波数に直すと**1.3KHzぐらい**の速度が出てます。

え？十分じゃない？？？？

（自作ライブラリがPythonなので、Cソースで書き直せばもっと早い気がしますが、一旦速度を競う場から離れようと思ってます。自信がある方はぜひ！）

#2台接続時
![_20191214_174156.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/318ad7e2-a802-02c3-3415-58340f35bf82.jpeg)

ケーブルを、１台目から２台目へと繋ぎます。
長さは 0.15m の短い物を使用しております。

RasPi -> A -> B -> A -> RasPi　といった感じで、
**一度Bまでいって戻ってくる**形式になります。
 
    2台目の計測
    平均　time:0.4948654560127644[ms]
    最大　time:0.7331371307373047[ms]
    最小　time:0.4856586456298828[ms]
    [0x0E00]= 0x0000,0x0004,0x9252,0x0001


前回と比べて、少し差はありますが、**大差ない**感じです。
ふむふむ。大差ないですか。

#3台接続時
![_20191214_174255.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/13d2e25b-9225-c806-ca78-03d97e2b1f84.jpeg)

3台目をつなげていきます。２台目から３台目に接続して、再度試します。

RasPi -> A -> B -> C -> B -> A -> RasPi　

の流れになります。

    3台目の計測
    平均　time:0.4925318438597399[ms]
    最大　time:0.7188320159912109[ms]
    最小　time:0.5033016204833984[ms]
    [0x0E00]= 0x0000,0x0004,0x9252,0x0001

おやおや？１台目、２台目、３台目、共に差は無いです。

あれかな？ケーブルが短いからかな？？　ならもっと長いケーブルを使えば差が出るだろう！！！

#4台接続時
![_20191214_174310.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/12499/565235b5-7106-ea01-0b66-e791a41ded7e.jpeg)

どん！！

秋葉原で安く売っていた**50M**のLANケーブルです。
今までが0.15m だったので、**約334倍**の長さ！
市販されているLANケーブルの最大長です。
50M以上のケーブルは、自作しないと手に入らなそう。

そんな、日常では使わない**クッソ長いケーブル**で試せばどうなるのか！
一番最後の台数に接続しました。

 RasPi -> A -> B -> C -(50M)-> D -(50M)-> C -> B -> A -> RasPi

といったルートです。

早速試してみましょう。

    4台目の計測
    平均　time:0.49217060358837394[ms]
    最大　time:0.7135868072509766[ms]
    最小　time:0.5035400390625[ms]
    [0x0E00]= 0x0000,0x0004,0x9252,0x0001

**えぇぇぇぇぇ！！！！！**

な、なぜ？なぜ大差が無い？？ケーブルは約334倍やぞ？？？



#結果



    1台目の計測
    平均　time:0.4892517821957367[ms]

    2台目の計測
    平均　time:0.4948654560127644[ms]

    3台目の計測
    平均　time:0.4925318438597399[ms]

    4台目の計測
    平均　time:0.49217060358837394[ms]


悲しい事に、ケーブルの長さで通信速度に**大差が出ると思って、それをまとめる記事**を考えていましたが、
まさか、<font color="Red">**ケーブルの長さによって遅延しない**</font>結果になってしまうとは・・・

可能性としては、そもそも**ケーブルの長さに影響される通信速度では無い**可能性があります。

基準としてみていたのが**ms(ミリ秒)**で、感覚としては**us(マイクロ秒)**の値でしたので、**より高速に通信した際に小さな差(マイクロ秒以下レベル)で出てくる**可能性があるのかなぁ。

悔しい。遅くなると思って50Mのケーブル買っちゃったじゃん。

逆に良い面と捉えれば、**距離に関係なく一通りの動作が同時に行われる**という事だ。
これはとても素晴らしい事で、0.15mで試した後に、
実際の現場で30mや50mで引き回しをしても同等の結果を得ることが出来るという事だ。
まぁ、本当に同様かは実際に試してみる必要があるんだけどね。
それでも問題ない可能性の方が高いだけ良い。


とりあえず、デモ用に作ったプログラムが、50Mのケーブルを間に入れても全く問題なく動作したので、以下の動画もみていただければと思います。（画像をクリックした先にあります）

[![画像がここに入る](http://img.youtube.com/vi/jmy41d4wOtU/0.jpg)](http://www.youtube.com/watch?v=jmy41d4wOtU)

50Mが間に刺さってるとは思えない。間違いなく自分が走るよりも早いだろう。

若干、結果の平均値に疑問が残る。台数増やしてケーブルの距離も伸びたのに、速度が早くなっている物もいる。
これは、**ケーブルの長さ**による遅延よりも**OSによる動作タイミングの差**による遅延の方が影響力が大きい可能性がある。
本来は、ここでリアルタイム化したOSを用意したいところだが、著者はあまりその辺り詳しくない為、本件は50Mでも差はなかったという結論で終えたいと思う。

#おわりに

さて、取り合えず**ケーブルを長くしても通信速度が落ちなかった**という、あまり嬉しくない結果となってしまったが、**50メートルぐらい余裕だよ！**と明日から言えるようになりますね。
50メートル以上のテストも行いたいですが（規格上1キロメートル)そこまでのケーブルも無いですし、自作するにもケーブル在庫が大変な事になりますし、今回は保留しようかなぁと思います。
何かの機会に、期待が高まったさにに、また挑戦したいと思います。

あと、自分の自作基板がちゃんと５０メートルでも動いてよかったと思いました（マル）

ではでは！
北神(@nonNoise)

P.S.
    
因みに、自宅のデスクトップUbuntu環境（LANは1Gbps)では、以下のような速度が出た。

    1台目の計測
    平均　time:0.2914221599848584[ms]
    最大　time:0.3707408905029297[ms]
    最小　time:0.23818016052246094[ms]

速い。速いが、RaspberryPiより遅くなることもある。その話は後ほど・・・