EtherCATの通信距離について
※Qitta投稿記事の転記です
投稿日 2019年12月14日
更新日 2019年12月14日
この記事は EtherCATについて語る Advent Calendar 2019 の14日目です。
昨日は@nonnoiseさんの 商用EtherCATスレーブをまとめる でした。
はじめに
さて、やっとEtherCATの実験記事を書く事ができる。
ただ、実験であるため、失敗は付き物です。
この記録も、半ば失敗のようなものです。
(想像よりも良い結果が出たとしても、想像と違った為、記事としては失敗なのです。)
それでは早速、実験内容をまとめていきます。
やりたかったこと
今回のタイトル「EtherCATの通信速度と通信距離との関係について」ですが、
要は、<font color="Red">通信ケーブルの長さによって通信速度に差が出るのか</font>の実験を行いたかったのです。
自分には開発用の赤基板が4枚あります。
その4台分のスレーブを連結して、ケーブルの差で時間差が出てくれば、実験は成功です。
なお、自作の基板のリビジョンですが・・・
赤基板は実験用(部品の変更を何度かしました)
緑基板は量産用(部品変更無し)
どちらも回路に変更はこざいません。同じものと見てください。
以下の道具を使用して説明してきます。
- Raspberry Pi 3B+
- PyEtherCAT
- EtherCATスレーブ評価基板LAN9252使用
- LED16モジュール
また、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台接続時
Raspberry Pi 3BのLANポートより、1台のEtherCATスレーブへ接続します。
長さは 0.15m の短い物を使用しております。
EtherCAT開発方法 フレーム編 リードまでのソースを改良し、読み出しコマンドの開始と終了の計測を行います。
1台目の計測
平均 time:0.4892517821957367[ms]
最大 time:0.8022785186767578[ms]
最小 time:0.492095947265625[ms]
[0x0E00]= 0x0000,0x0004,0x9252,0x0001
1台目との通信速度はこんな感じです。
リードを行なっていますので
RasPi -> A と A -> RasPi を行なって、パケットが戻ってくるまでの時間となります。
また、見やすいように**単位をms(ミリ秒)**にしてあります。そこもご注意ください。
平均値は100回送受信した時間の平均値で、最大と最小はその中での値です。
特にRaspberry Pi側にリアルタイム改造を行なっていない為、見ての通り最大と最小にばらつきがございます。
これをジッタと呼んだりするそうです。
まぁまぁな結果です。
ちなみに、最大値の0.78ミリ秒でも、周波数に直すと1.3KHzぐらいの速度が出てます。
え?十分じゃない????
(自作ライブラリがPythonなので、Cソースで書き直せばもっと早い気がしますが、一旦速度を競う場から離れようと思ってます。自信がある方はぜひ!)
2台接続時
ケーブルを、1台目から2台目へと繋ぎます。
長さは 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台接続時
3台目をつなげていきます。2台目から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
おやおや?1台目、2台目、3台目、共に差は無いです。
あれかな?ケーブルが短いからかな?? ならもっと長いケーブルを使えば差が出るだろう!!!
#4台接続時
どん!!
秋葉原で安く売っていた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のケーブルを間に入れても全く問題なく動作したので、以下の動画もみていただければと思います。(画像をクリックした先にあります)
50Mが間に刺さってるとは思えない。間違いなく自分が走るよりも早いだろう。
若干、結果の平均値に疑問が残る。台数増やしてケーブルの距離も伸びたのに、速度が早くなっている物もいる。
これは、ケーブルの長さによる遅延よりもOSによる動作タイミングの差による遅延の方が影響力が大きい可能性がある。
本来は、ここでリアルタイム化したOSを用意したいところだが、著者はあまりその辺り詳しくない為、本件は50Mでも差はなかったという結論で終えたいと思う。
おわりに
さて、取り合えずケーブルを長くしても通信速度が落ちなかったという、あまり嬉しくない結果となってしまったが、**50メートルぐらい余裕だよ!**と明日から言えるようになりますね。
50メートル以上のテストも行いたいですが(規格上1キロメートル)そこまでのケーブルも無いですし、自作するにもケーブル在庫が大変な事になりますし、今回は保留しようかなぁと思います。
何かの機会に、期待が高まったさにに、また挑戦したいと思います。
あと、自分の自作基板がちゃんと50メートルでも動いてよかったと思いました(マル)
ではでは!
北神(@nonNoise)
P.S.
因みに、自宅のデスクトップUbuntu環境(LANは1Gbps)では、以下のような速度が出た。
1台目の計測
平均 time:0.2914221599848584[ms]
最大 time:0.3707408905029297[ms]
最小 time:0.23818016052246094[ms]
速い。速いが、RaspberryPiより遅くなることもある。その話は後ほど・・・
Discussion