IO-Link 通信のプロトコル解説

電子工作

IO-Link のプロトコルについて,簡単に紹介します.

はじめに

IO-Link の通信プロトコルについてネットを検索すると,M-sequence に沿って通信を行う,という説明はあるもののそれ以上の詳しい情報はほとんどありません.詳しい情報となると IO-Link の規格書[キャッシュ] はあるのですが,こちらは逆に詳しすぎ,300 ページ近くの大作で読みこなすのが大変です.

そこで,センサーの計測値を読み出す通信に限定して,プロトコルの解説をしたいと思います.

具体例による説明

ここからは,キーエンスの流量センサ FD-Q10C から瞬時流量を読み出すための通信内容を例に説明をしていきます.

センシングデータへのアクセス方法

『FD-Qシリーズ IO-Link 取扱説明書』を見ると下記のように記載されており,瞬時流量はデバイスパラメータのインデックス 0x94 に 2Byte で格納されていることが分かります.

規格書の 4.4 Communication features of SDCI を見ると,デバイスパラメータには ISDU を使って読み書きできることが分かります.(章番号は,IO-Link 規格書 version 1.1.3 のもの.以下,同様.)

ISDU を読み書きする際の通信例は,A.5.7 ISDU examples に載っています.

ISDU リクエストデータ

ISDU の読み出しリクエストを行うときの通信データについて考えます.今回の対象デバイスの場合,インデックスは 0x94 と 1Byte なので,次のような構造になることが分かります.

すなわち,0x93, 0x94, 0x07 の 3Byte です.

ISDU のチェックサムの計算方法は A.5.6 Check ISDU (CHKPDU) に規定されています.

M-sequences

IO-Link で通信を行う場合,先ほどの 0x93, 0x94, 0x07 を直接送ることはできず,全ては M-sequences というプロトコルに従って,通信を行う必要があります.

M-sequences の詳細は,7.3.3.2 M-sequences に規定されおり,マスターから UART フレームを送ると,デバイスから UART フレームが返ってくる仕組みになっています.

M-sequence にはいくつかタイプが指定されているのですが,今回は,1Byte のデータをやりとりする TYPE_0 を使いたいと思います.

なお,デバイスがサポートしているタイプは,Direct Parameter page 1 の 0x03 M-sequence Capability にて確認できます.様々なデバイスに対応する場合,TYPE_0 決め打ちではなく,まず内容を確認して通信で使うタイプを決定することが望ましいです.

TYPE_0 を使う場合,先ほどの ISDU のリクエスト (0x93, 0x94, 0x07) は次のような 3 つの M-sequence を使って伝送されます.4 つめの通信はデバイスからのデータを受信するためのものになります.

TYPE_0 通信

ISDU の最初のバイト 0x93 を伝送するときの M-sequence の具体的な構成方法を以下に示します.送りたいデータ 0x93 は OD に詰め込み,MC および CKT を Annex A Codings, timing constraints, and errors に従って設定します.

完成した M-sequence 0x70, 0x09, 0x93 を UART で送ると,デバイスからは 0x2D が返ってきます.

IDSU リードリクエスト通信

以上を踏まえて,LTC2874 を介して ISDU リードリクエストを送信したときの様子をまとめると次のようになります.2番目以降の M-sequence の Adderess (FlowCTRL) は 1, 2 とインクリメントする点に注意してください.他は最初と同じです.

LTC2874 の場合,送信したデータも受信値として入ってくるので,RXD の前半には TXD と同じ内容が入ります.

IDSU レスポンスデータ

ISDU のリクエストに対する応答は,下記のような ISDU で返ってきます.

なお,I-Service = 0b1100 の Read Response (-) はデバイス側でエラーが発生した場合に使われます.また,デバイス側の何らかの事情ですぐに応答ができない場合,I-Servce = 0b0000 の No Service が返ってきます.

リクエストの時と同じように,M-sequence にマッピングすると次のようになります.

IDSU リードレスポンス通信

以上を踏まえて,LTC2874 を介して ISDU リードレスポンスを受信したときの様子をまとめると次のようになります.

この場合,瞬時流量の値は,0x018E = 398 すなわち 3.98 L/min であることが分かります.

まとめ

以上を理解すれば,センサーとは最低限のやりとりはできるようになると思います.参考になれば幸いです.

コメント