HOME会社概況業務内容開発分野開発事例CANモジュールソフテックだよりお問い合わせ
HOME > ソフテックだより > 第259号(2016年6月1日発行) 技術レポート「PLCでのシリアル通信〜受信処理の工夫〜」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより(技術分野別)のページへ
ソフテックだより(シーン別)のページへ


ソフテックだより 第259号(2016年6月1日発行)

技術レポート

「PLCでのシリアル通信〜受信処理の工夫〜」

1. はじめに

PLCは各メーカーから販売されている通信ユニットを使用することで、シリアルやEthernet、CC-Linkなど様々な通信を行うことが可能になります。今回は通信規格の中でも用途を問わず多く普及しているシリアル通信について、PLCで実現する際の工夫の一例をご紹介させて頂きます。

各PLCメーカーにより若干の違いはありますが、通信ユニットには指定したデータサイズの受信や、設定した終了コードの受信等、受信完了と判断するための設定が用意されており、要求仕様に合わせて活用することで、容易に通信を実現することができます。

  三菱電機

キーエンス

横河電機 オムロン
iQ-Rシリーズ Qシリーズ KVシリーズ FA-M3シリーズ CJシリーズ

RJ71C24
RJ71C24-R2
RJ71C24-R4

QJ71C24N
QJ71C24N-R2
QJ71C24N-R4
KV-L20V
KV-L21V
F3RZ81-0F
F3RZ82-0F
F3RZ91-0F
CJ1W-SCU
終了コード指定
受信データサイズ指定
受信間隔時間指定
(異常検知のみ)

(異常検知のみ)

(レスポンス受信モード
のみ)

(Ver.1.2以降&
プロトコルマクロモードのみ)

表1. 各社シリアルユニット受信設定有無

しかし、実際にはこのユニットの受信設定だけでは目的の仕様を実現できないこともあります。ユニットの受信設定で実現できない具体的な例としましては、データフレームが可変長、かつ終了コードが無い場合で、Modbus RTU通信で通信相手が数種類いる場合等がこれに当てはまります。(Modbus通信についてはソフテックだより第133号「PLCでModbus通信〜横河電機社製での実装例〜」をご参照願います。)
Modbus RTU通信は、バイナリデータとして送受信を行うプロトコルのため終了コードはなく、3.5文字分の無受信間隔がデータの識別材料となります。 しかし、3.5文字分の無受信間隔というと、ボーレートが9600bpsで3ms程度と、PLCで正確に判別するのは難しく、取りこぼしてしまう危険性もあります。

こういった場合は、受信データサイズ指定と終了コード指定では実現することが困難となります。また、メーカーやユニットにより、持っている設定や機能が違うこともあるため、プログラムの互換性という点では低くなるといってよいかと思います。

そこで、今回はメーカーやユニットの違いに制約されず、また、データフレームが可変長で終了コードが設定できない等にも柔軟に対応できる、受信処理の方法をご紹介します。

2. 受信処理の工夫

データフレームが可変長で終了コードが無い場合の受信処理の方法として、下記を紹介します。
ユニット受信データサイズ指定を1byteとし、1回のユニット読出命令でユニットの受信バッファから1byteずつ受信データを読み出し解析するという方法になります。複数種類のメッセージやり取りを実装しなければならず、かつそれらのメッセージサイズが可変長だったとしても、1byteデータを連結してメッセージ化する事とメッセージ内容の解析を行う事で、受信処理を実現することが出来ます。また、受信データはユニットのバッファに格納されるため、スキャンタイムの影響で受信データをとりこぼすことはありません。

3. 受信データ1byte解析の手順

今回はキーエンス製PLCを使用した場合の受信データ1byte解析手順をサンプルプログラムでご説明します。PLCの通信相手は複数台おり、かつ受信データフレーム数が可変である想定です。

受信データ1byte解析サンプル(フローチャート)
図1. 受信データ1byte解析サンプル(フローチャート)

ここでは最低限の異常処理は含めますが、基本的には通信処理のみの簡潔なプログラムを記載しています。実際には仕様にあわせて、受信したデータの正当性チェックやタイムアウトの処理等も必要となります。

受信データ1byte解析サンプル(全体)
図2. 受信データ1byte解析サンプル(全体)

まず下記図3の通り、ユニットの扱うデータ単位をワード単位と指定し、受信終了データサイズを1byteと指定します。この設定をすることで、ユニットがデータを1byte受信すると読出要求(R34002)がONするようになります。

※各社PLCユニットにより設定手順は異なりますので、指定バイト受信設定は各々の マニュアルを参照ください。

受信データ1byte解析サンプル(受信設定)
図3. 受信データ1byte解析サンプル(受信設定)

次に読出し処理の部分ですが、図3のユニットへの設定により、1byteのデータをユニットが受信するとユニットからの読出要求(R34002)がONするため、ユニットの受信バッファからデータを読み出し、ユニットへの読出完了フラグ(R34102)をONします。

ここでは各PLCユニットやメーカーが異なる場合でもプログラムの互換性を維持するため、ユニット読出命令は使用せずにユニットの受信バッファから直接データを読出しています。

ノイズ等による伝送エラーでユニットが異常を検出した場合は、ユニットからの異常検出(R34003)がONするため、受信データは読み出さずに、ユニットへの読出完了フラグ(R34102)をONすることで、異常データを破棄します。

受信データ1byte解析サンプル(1byte読出し)
図4. 受信データ1byte解析サンプル(1byte読出し)

1byteのデータを読出した後は色々な処理が考えられますが、ここでは、サンプルとしてデータレジスタDM1000から1デバイスに1byteずつデータを格納する例を下記図5にご紹介します。通信相手が複数台いる(受信データサイズが可変)場合でも、図5の通り柔軟に対応することができます。

受信データ1byte解析サンプル(受信後処理の例)
図5. 受信データ1byte解析サンプル(受信後処理の例)

4. 受信データ1byte解析のメリットとデメリット

柔軟な対応ができる受信データ1byte解析ですが、その他にもメリットとデメリットがありますのでご紹介します。

受信データ1byte解析サンプル(全体)
図6. 受信データ1byte解析のメリットとデメリット

4.1 メリットについて

受信データ1byte解析のメリットは以下の2つがあります。
1つ目は上述したように受信データサイズが可変で、終了コードを設定できない場合でも、受信するデータの解析ができればどんなメッセージでも対応することができます。これが受信データ1byte解析の一番大きなメリットとなります。

2つ目はどのPLCメーカーのユニットも受信データサイズ設定を持つため、メーカーやユニットが異なる場合でも、全て受信データ1byte解析で対応できます。そのため、ユニットに合わせて若干の修正は必要ですが、受信完了設定やプログラムの考え方を変更せずに対応することができます。

4.2 デメリットについて

次に受信データ1byte解析のデメリットは以下の3つがあります。
1つ目に、受信データが大きいと全て読み出すまでに時間がかかってしまうということが挙げられます。1byteずつ読み出すという事は、ユニットとのフラグ取り合いの関係上2スキャン以上毎に1byteずつ読み出すという事になります。そのため、スキャンタイムが5msの場合、100byteの受信データを読み出すのに1秒(1000ms)以上かかるということになります。

2つ目のデメリットも同様に、スキャンタイムに比例して読出しに時間がかかるという点が挙げられます。スキャンタイムが長すぎるのはそもそも良くないですが、受信データが大きいというのは良くあるかと思います。スキャンタイムを短くしたり、受信命令等を使用せずに受信バッファから直接読み出したり(図4参照)、色々な工夫をすることである程度短縮できますが、やはり受信データが大きい場合はあまりお勧めできません。

3つ目は、プログラム量が増えます。仕様を満たすためには仕方のないことですが、設定ではなくプログラムで終了コードや受信データサイズの判定を行う必要があるため、必要なプログラムが増えることになります。また、プログラム量が増えるため、必然的にバグが発生する可能性も高くなります。

5. まとめ

本レポートでは受信データ1byte解析処理を実装する事により、様々な通信プロトコルに柔軟に対応できる方法をご紹介しましたが、逆にフォーマットが固定の場合に便利な方法としまして、ユーザー登録フレームという機能が挙げられます。ユーザー登録フレーム機能については、ソフテックだより第147号「PLCを使用したシリアル通信 〜ユーザー登録フレーム機能〜」をご参照願います。

最後に、この記事を書くに至ったきっかけとしまして、私が担当することになった案件で、Modbus RTU通信に触れる機会があったことが始まりです。
Modbus RTU通信ははじめに記載した通り、ユニットの受信設定だけでは実現することが難しく、今回ご紹介したこの1byte毎に読み出す方法で対応しました。通信相手も数種類あり受信データサイズが可変でしたが、全く問題なく受信できています。ご紹介したようなデメリットもあるため、いつでも使えるという訳ではありませんが、こういった方法もあると知って頂ければと思い、この記事を書かせて頂きました。

この記事を読んで頂いた方に少しでも参考にして頂けたら幸いです。 最後までお読み頂き、ありがとうございました。

(Y.T.)


関連ページへのリンク

関連するソフテックだより