HOME > ソフテックだより > 第125号(2010年11月2日発行) 技術レポート「RS-485の通信プロトコルについて」

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

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


ソフテックだより 第125号(2010年11月2日発行)

技術レポート

「RS-485の通信プロトコルについて」

1. はじめに

パソコンや組み込み機器などの通信インターフェイスとしてはUSB、Ethernetなどが一般的ですが、工業用では現在でもRS-232CやRS-422、RS-485インターフェイスが多く使われています。
以前のソフテックだよりで、シリアル通信(RS-232C)USBについて取り上げていますが、今回はこのRS-485の通信プロトコルについて取り上げたいと思います。

2. RS-422

まず、RS-485と同じ伝送方式をとるRS-422について説明します。
RS-422は、差動信号を使った平衡型伝送方式です。
不平衡型であるRS-232Cは、GNDを共通として、送信、受信信号線の電圧を変化させて伝送するのに対し、平衡型では+と−の差動信号で電圧をみるため、ノイズに強く、高速通信に向いています。そのため、RS-232Cの最大ケーブル長が15メートルに対して、RS-422では1200メートルまでの伝送を可能としています。

3. RS-485

RS-485では、RS-422の上位互換として規格化されたもので、32台までマルチドロップ接続が可能となっています(通常はネットワークの両端に終端抵抗が必要となります)。
電気的特性は、RS-422と同じなので、最大通信距離もRS-422と同じです。
また、信号線の方式としては、送受信を共通として使用する2線式(半二重)と、送信と受信をそれぞれ別々に使用する4線式(全二重)の二つの方式があります。

4. RS-485の通信プロトコル

RS-485 は物理層の通信仕様であるため、通信プロトコルは規定されていません。そのため、プロトコルを独自に規定して運用することになります。

ただし、前述したように、RS-485ではマルチドロップの接続が可能のため、接続された各機器がそれぞれのタイミングで送受信を行ってしまうと、データが衝突し壊れてしまいます。そのため、常にどれか1つの機器だけが送信を行うようにする必要があります。
この一般的な解決方法としては、通信プロトコルをマスター/スレーブ形式で規定することです。つまり、マスター機器がスレーブ機器に対してデータ要求を行い、該当する1台のスレーブだけがデータ応答を返すというルールの中で通信することです。

次に、2線式と4線式の違いを考慮する必要があります。
4線式の場合には、送信線と受信線がそれぞれ別になっているため、マスター/スレーブプロトコルであれば特に問題ありません。
しかし、2線式の場合には、送受信線が一つしかないため、今送信中なのか受信中なのかを切り替える必要があります。
しかし、送信から受信に切り替える際に、実際にはデータを受信していないのに、受信したと認識してしまうことがあります。

ここで、平衡型伝送方式の話に戻りますが、平衡型では通信を行う時に電気的に+/-レベルを変化させて1/0を送ります。しかし、送信も受信も何も通信していない時には、電気的には不定レベルになる可能性があります。
そのため、送信から受信に切り替えた際に、実際には通信は行われていないのに受信をしたとCPUに通知されてしまうことがあります。これはハード側で、不定状態にならないICを使うか、プルアップやプルダウンによって、不定状態にならないような対応をすることなどで回避可能ですが、部品コストや消費電流、抵抗の施工などの理由から、ソフト側で対応しなければならないケースがあります。

このような場合には、通信プロトコルで、通信フレームの先頭へダミーデータを入れる「ダミーデータを使用する方法」、もしくは、送信受信の切り替えの際にウェイトを入れ受信可能状態になってから受信開始するという「ウェイトを入れる方法」などで回避します。

ソフト的には、2線式よりも4線式の方が考慮することが少ないのが分かると思いますが、実際は配線工事のコストを考慮し4線式より2線式で使われるケースが当社では多いです。

5. RS-485 2線式の通信プロトコル

では、実際にRS-485 2線式の通信プロトコルがどのようになるか具体的に例をあげてみたいと思います。

まず通信の同期方式を、非同期の調歩同期方式でデータ長8ビット、ストップビット1ビット、パリティチェックはなしとします。
次に通信フレームですが、フレームの開始を表すSTX(スタートテキスト)、終了を表すETX(エンドテキスト)を規定します。通信フレーム長が固定の場合や、フレームの中にデータ長などが含まれる場合にはETXは不要なケースもありますが、ここではETXを規定することとします。
そして、フレームの中に宛先を示すIDを設けます。これは、例えば0x00がマスターとし、それ以外はスレーブ側を特定する通し番号などを割り当てます。
このIDによって、受信側は受信したデータが誰宛てなのかを特定できるようになり、宛先が自分の場合には応答データを返信し、自分宛ではない場合には何も行わないという動きをとれるようになります。
また、必要があれば、BCCやCRCなどの誤り検出用データを設けます。
ここまでの通信フレームは以下のようなイメージになると思います。

通信フレーム
図1. 通信フレーム

5-1. ダミーデータを使用する方法

ダミーデータを使用する方法の場合には、上記フレームの先頭に、送受信切り替え時の対策用のダミーデータDMY(0xFF)を追加するだけです。

ダミーデータ付通信フレーム
図2. ダミーデータ付通信フレーム

ここで、送受信切り替え時に何が起きるのかをもう少し詳しく説明したいと思います。
送受信切り替え時の不定状態になると、受信をしていないのにCPUには1ビット(0)を受信したと通知されることがあります。この1ビットをCPUは、調歩同期通信のスタートビットとして解釈してしまい、その後のデータ8ビットとストップビットを検出し、1バイトデータを受信したと検出してしまいます。
この時本当にデータを受信しておらず、ただスタートビットだけを検出してしまった場合であれば、それはただのゴミデータとなるのですが、実際にデータが送られている場合には、先頭のSTXとぶつかることになります。
そうなると、CPUがデータの開始をずれて認識してしまうので、データが化けてしまったり、フレーミングエラーとなってしまいます。

つまり、送信側は正常な1フレームのデータを送信したつもりでも、受信側ではSTXを受信できていないため、続くデータもすべて破棄してしまう動きになります。
よって、フレームの先頭にダミーデータ(1バイト以上)を挿入することによって、不要なスタートビットによるデータを破棄し、その後のSTXで本当のフレームデータの受信を始めるというわけです。
このことから、先頭の不要データを破棄させるダミーデータと、本当のフレームの先頭を表すSTXが最低限必要だということが分かると思います。
また、このダミーデータはEthernetフレームの先頭にある、遅延によるデータ消失を防ぐプリアンブルと同じような意味として使っています。

尚、例ではダミーデータは0xFFとし、パリティチェックはなしとしていますが、これにも理由があります。
まずダミーデータを0xFFとすると、不要なスタートビットを検出したとしてもデータをストップビットとして検出させることができ、フレーミングエラーをキャンセルさせることができるからです。
次にパリティチェックは、ありにしてしまうと、パリティビットによってストップビットが検出できずフレーミングエラーになる可能性があります。そのため、パリティチェックはなしにしていますが、どうしてもパリティチェックを使いたい場合には、奇数パリティにすればパリティビットが必ず1になり、ストップビットとして検出することになるので、フレーミングエラーをキャンセルすることができます。

5-2. ウェイトを入れる方法

次に受信前にウェイトを入れる方法についてですが、こちらは通信フレームの変更を行わず、1フレームの受信を開始する前に、1バイト以上が通信される時間を待機した後に受信(送信)することになります。
具体的には、通信速度が9600bps、ストップビット1ビット、パリティチェックありの場合には、スタートビット+データビット+パリティビット+ストップビットの11ビットの転送時間、つまり1.15ms(1÷9600×11×1000)以上待機後送信すれば、不要なスタートビットを検出しても、その1バイトが破棄された後に受信することになるので問題ないというわけです。

6. 送受信の切り替え方法

最後に送受信の切り替えにおけるソフト的な話について補足します。
ソフトの動きとしては、送信したい時に送信状態に切り替え、送信が終わったら受信状態に切り替えるという処理が必要になりますが、組み込みソフトであれば、送信完了割り込みのタイミングでRS-485のICに対して受信許可制御を行います。
仮に使用しているCPUに送信完了割り込みがなく、送信エンプティ割り込みしかない場合には、送信エンプティ割り込み後、1バイトデータが送信されるべき時間分待ち、送信レジスタが空になったことを確認し、受信許可制御を行います。

Windowsを搭載したパソコンでRS-485変換器などを使用している場合には、RTS信号線を受信許可切り替え線として割り当て、APIでRTSフロー制御をRTS_CONTROL_TOGGLEにセットすることで、送信完了後に受信切り替え制御を自動的に行うことが可能となっています。

7. まとめ

以上、RS-485の通信プロトコルについてまとめてみました。
今回あげた例はほんの一例で、他にもいろいろな方法があると思いますが、参考として見ていただければと思います。

(H.K.)


関連ページへのリンク

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

ページTOPへ