Raspberry Pi で IO-Link 通信

電子工作

Raspberry Pi で IO-Link を行ってみたので紹介します.

IO-Link とは?

IO-LINK はセンサ・アクチュエータとコントローラをデジタル通信でつなぐ FA 向けのデジタル通信規格です.

規格の概要は「IO-Link」で検索すると色々でてきますので,そちらを参照するのが良いです.

Raspberry Pi から使う上では下記の特徴があることを押さえておくと理解がスムーズと思います.

  • マスター・スレーブ方式の 1対1通信
  • 物理層としては,24V の UART 通信 (ただし,UART と違って,1 が L です)
  • 通信を行うときは,80µs の間 500mA で通信ラインをドライブして通信開始を通知 (WakeUp)

最後の項目は,『堅牢な IO-Link ソリューション[キャッシュ] では次のように紹介されていて,言い得て妙だなという感じです.24V で 500mA ですからまさに「大声」です.

その問題とは、センサ出力を忠実に送信しているIO-LinkデバイスにWake-upを知らせる方法です。答えは「大声で叫ぶ」ことです。

上記のような特徴を踏まえると,Raspberry Pi で IO-Link 通信を行うには何らかの PHY IC が必要になることが見えてきます.

インターフェース回路

PHY IC はいくつかのメーカから出ているのですが,その中で周辺回路が最もシンプルだったのが ADI の LTC2874 でしたので,こちらを使うことにしました.

回路図はこんな感じ.

実際に組んだ回路は,LTC2874 評価ボードの回路図[キャッシュ] を参考に,保護用のダイオードを追加しました.

Mouser で購入する場合の BOM はこんな感じです.M12 コネクタは他で大体しても良かったかも.

Mouser 番号 メーカ 番号 メーカ 数量 価格 (JPY)
755-PTZTFTE2536B PTZTFTE2536B ROHM Semiconductor 2 ¥39.9
584-LTC2874IFE#PBF LTC2874IFE#PBF Analog Devices Inc. 1 ¥2,059.1
523-M12A04PMMPSF8001 M12A-04PMMP-SF8001 Amphenol 1 ¥611.2
523-M12A04BFFBSR7001 M12A-04BFFB-SR7001 Amphenol 1 ¥1,341.7
603-RL0603FR-070R2L RL0603FR-070R2L Yageo 1 ¥38.9
512-FQT7N10LTF FQT7N10LTF ON Semiconductor 1 ¥74.3
512-S100 S100 ON Semiconductor 1 ¥55.5
667-EEU-EB1H101SJ EEU-EB1H101SJ Panasonic 1 ¥57.8
187-CL31B105KBHNFNE CL31B105KBHNFNE Samsung Electro-Mechanics 2 ¥7.1

Raspberry Pi とは UART および SPI で接続します.

もし,Raspberry Pi との接続端子数を減らしたい場合は,MAXIM の MAX14819 とかを使うと良いかもしれません.こちらは SPI のみつなげば OK です.

完成した基板はこんな感じになります.LTC2874 の実装にはサンハヤトの SSP-52 を使いました.

地味にハマるのが,LTC2874 の TXD 端子は UART の受信端子になることです.結線としては,Raspberry Pi の TXD 端子を LTC2874 の TXD (RXD ではない!)と接続するのが正しいです.

ソフト

基本的には,WakeUp を送った後で,IO-Link の通信仕様に従って通信する形となります.ソフトを作る上では,IO-Link の規格書[キャッシュ]の下記の章が参考になると思います.

  • 5.3.3.1 Transmission method
  • 5.3.3.3 Wake-up current pulse
  • 7.3.6.2 Transmission of ISDUs
  • Annex A Coding, timing constraints, and errors
  • Annex B Parameter and commands
  • Annex J Example sequence of an ISDU transmission

ちょっと注意が必要なのが,環境に酔っては通信時に LTC2874 過電流を検出してしまうことがあることです.症状としては,M-Sequence を UART で連続して送ると 2 個目以降が C/Q ラインに流れないというものになります.この症状が出た場合,SIO_MODE レジスタを 1 にして,過電流検出の時間を 480us に拡大するとことで回避できます.

キーエンスの流量センサ FD-Q10C

IO-Link のサンプルとして,キーエンスの流量センサ FD-Q10C と通信を行うスクリプトを作ってみましたので紹介します.

コード全体は,下記にあります.

GitHub - kimata/iol_water_flow
Contribute to kimata/iol_water_flow development by creating an account on GitHub.

規格書と照らし合わせて読んでいただければ,何やってるかは理解できると思います.

まとめ

Raspberry Pi で IO-Link 通信を行って流量計と通信を行ってみました.

IO-Link 対応の FA 機器はヤフオクでもそこそこ出回っていますし,通信可能距離は 20m と長いので,用途にハマれば色々と便利に使えそうです.

コメント