1. ホーム
  2. 製品・技術情報
  3. RS-422/485について

製品・技術情報

RS-422/485について

  • 2009.12.10

RS-485半2重通信の極意

RS-485は、差動の送信を利用することで信号が拾う各種ノイズ妨害の殆どを相殺しますので長距離シリアル通信に適しています。シンプルなRS-485ネットワークは、1つのマスターと最大で32のスレーブデバイスから成ります。RS-485は、半2重通信を使用しますので即ち、同じ2線(以下に示すD+とD-)が送信と受信の両方に使用されるために接続しているどちらのサイドが送信できるかを制御する方法がシステムに組み込まれる必要があります。この記事では、Moxaの特許であるADDC(Automatic Data Direction Control : データ転送方向自動制御)のコンセプトを説明しADDCがどのように動作するかを説明します。

(図1)RS-485半2重通信

送信(Tx)と受信(Rx)の方向を制御する最も一般的な方法は、UARTとRS-485半2重の書き込みの間のRTS信号を使用することです。シンプルなロジック回路(図2)を使用することによりRTSをオンまたは、オフにすることでTxとRxの方向を切り替えることができます。これは、即ち、データを送信するためにRTSをオンにすることまた、次に送信が終了したらオフにすることです。全体のコンセプトは、説明や理解することが容易ですが十分に役に立つレベルの精密なタイミングのメカニズムを考案することは、極めて大変です。

(図2)データの方向を制御するためのRTSの利用

殆どの場合、RS-485バスは、マスター・スレーブ型アーキテクチャを使用しますがRS-485バス上のそれぞれのデバイスは、ユニークなIDを持つ必要があります。マスターは、IDと共にコマンドを送り各スレーブにそれぞれ応答するように求めます。RTSのデフォルトのステータスは、オフですが全てのデバイスは、Rxの状態であり他のデバイスの1つからデータを受信(コマンド、または、コマンドへの応答のいずれか)するのを待っています。一般的な方法は、次の通りです :

  1. マスターは、Tx状態に切り替えデバイスに問合わせを行うためにコマンドを送信しそして次にRx状態に切り替えて応答を待ちます。
  2. マスターから問合わせを受けIDが一致したスレーブは、Tx状態に切り替え応答を返し次にRx状態に戻します。

もしマスターが非常にゆっくりとRx状態に戻る場合、マスターは、全ての応答を受け取れません。もしマスターの戻りが早すぎる場合、コマンドは、正しく送られません。タイミングを正しく制御するためには、いつデータの送信が終わったかを知る必要があります。

(図3)方向を制御するためのRTSの利用

UARTの保持とシフトレジスター(UART を直接制御するために)

送るべきデータがない場合、有効なUARTのTxINT(Transmitter Empty Interrupt : 送信機空割り込み)を使用してRTSをオフにすればOKと思うかも知れません。しかし、TxINTの値のチェックは、実際に付加バイトがシフトレジスターからまだ送信されている時にも保持レジスターが空であることだけを伝えます。UARTの送信シフトレジスターは、1ビットずつデータを送るのに使用されます。FIFOにデータを入れる度にUARTは、データをシフトレジスターに自動的に移動します。シフトレジスターが空であることを確認するためにLSR(Line Status Register : ラインステータス・レジスタ)を読みTHRE(Transmitter Holding Register Empty : 送信機保持レジスター空)ビットとTEMT(Transmitter Empty : 送信機空)ビットの両方がセットされているかまたは、されていないかをチェックする必要があります。両方がセットされている場合、RTSをオフにすることは安全です。

Win32とUNIX/Linuxアプリケーション(シリアルアプリケーションプログラマー向けに)

殆どの場合、UARTを手動で制御する必要がなく代わりにOSで提供されたAPIを使用するだけです。Win32システムには、WriteFile()をUNIX/Linuxシステムには、write()を使用することができます。Win32は、RTSを自動で動かすためにRTS_CONTROL_TOGGLE機能を提供します。もしSetCommState()をコールすることでDCB 構造の中でfRtsControlをこの値に設定する場合、ドライバーは、データを送る前にRTSを自動的にオンに終了する時に自動でRTSをオフにすべきです。このアプローチを使用する前にもしシリアルの拡張ソリューション(serial.sys、Windowsの組み込みシリアルポートドライバを使用していないことを意味します)を使用する予定の場合、最初にベンダーがサポートしていることを確認する必要があります。もしRTS_CONTROL_TOGGLEがサポートされていない場合、RTSを手動で制御することは、多くのタイミングの問題を引き起こし信頼性は、高くありません。

UNIX/Linuxの場合、POSIX tty APIは、RTSトグル機能をサポートしていませんのでRTSを手動で制御する必要があります。この場合、データが送られまで待つためにtcdrain()をコールしRTSをオフにするすることができます。問題は、ttyドライバーがドライバーバッファおよびUART保持レジスターをチェックするだけなのです。残念ながらシフトレジスターが空であることを確認する方法は、ありません。RTS制御を使用してUNIX/Linux でRS-485を本当に使用したい場合、ドライバーを修正するか、対応のためにメーカーに相談する必要があります。

仮想シリアルポートを使用する動作(シリアルアプリケーションプログラム向け)

もしもシリアルポートがUSB - シリアルまたは、イーサネット - シリアル変換製品のような仮想ポートの場合、ドライバーは、製品の中のファームウェアで動作する必要があり実際のUARTではないので全てのデータがいつ送り終わったかを知るのは、容易でありません。これは、性能に対しては、優れていますがRS-485 RTSの制御にとって良くありません。もし書き込み動作が終了した時にRTSを直ぐにオフにする場合、データは、まだ送信中でこれが問題を引き起こします。この場合Win32では、ドライバーでサポートされている場合、RTS_CONTROL_TOGGLEを使用することができます。サポートされていない場合、WriteFile()が返される前に全てのデータが送信完了であることを確認するためにドライバーが進化版オプション(MoxaのUPortとNPortのクラシカルモードの様な)をサポートしているかを確認する必要があります。仮想シリアルポートにとってRTS_CONTROL_TOGGLE、または、Windows/UNIX/Linuxでサポートされているクラシカルモード無しにRTSを手動で制御するのは、不可能です。

RTSの自動制御(全ての方に)

ソフトウェア(ドライバーまたは、アプリケーション)によるRTSの制御は、多くの問題を引き起こしますので多くのハードウェアベンダーは、方向を自動で制御することでこの問題を解決します。これは、Moxa特許のADDC(Automatic Data Direction Control : データ転送方向の自動制御)機能で行われているようなRS-485ハードウェアによるTx/Rxの方向を自動で切り替えることができることを意味します。これは、既存のソフトウェアとコンパチブルでもし、RS-485バス経由でコマンドを送信したい場合、RTS信号を制御することに悩むことなくただ送るだけです。ハードウェアは、アクションを検知しTx状態に自動的に切り替えます。いくつかのコンバーター製品は、ユーザに最初にボーレイトを設定するように求めていますので注意して下さい。詳細の情報については、製品のマニュアルを読んでください。

まとめ

RS-485の実装を単純化するための良い方法は、ADDCをサポートする製品を選ぶことです。ADDCの利用でタイミングを合わせるためのプログラムを修正する時間を浪費する必要がありません。既存のプログラムを現状のまま保持することができまた、ADDCの動作は、確実です。RTSをオンまたは、オフするプロセスの制御は、ADDCによって不要となり必要とする内容は、ハードウェアを適正に設定することだけです。

下記をクリックするとPDF版がダウンロードできます。
RS-485半2重通信の極意(PDFファイル)