概要
RS-485(EIA-485)は、1983年にEIA(Electronic Industries Alliance)が制定した差動シリアルバス規格です。差動信号(A線とB線の電圧差で論理を表現)を採用しているため、ノイズ環境下でも安定した通信が可能で、最大1200mという長距離通信と最大32デバイス(拡張で256デバイス以上)のマルチドロップ接続を実現します。
工場の製造ライン・ビル設備管理・産業機器・太陽光発電システム・スマートメーターなど、電気的ノイズが多く長距離配線が必要な産業環境で広く使われています。Modbus RTUプロトコルの物理層として特に多用されており、産業用通信の事実上の標準となっています。
通信速度は最大10Mbps(短距離時)または1.2Mbps(1200m時)で、マスタースレーブ方式での半二重通信が基本です。
歴史・背景
RS-485はRS-422(差動・4線式・1対1)を多点接続に拡張した規格として1983年に制定されました。2003年にTIA-485-Aとして改訂されています。
1990年代から産業用フィールドバスとして普及が進み、Modbus(1979年にModicon社が開発したプロトコル)との組み合わせで産業機器の標準インターフェースとなりました。現在でも新規産業システムでのRS-485 + Modbusの採用は多く、レガシー機器との接続性も重視されています。
BACnet(ビル管理)・DMX512(舞台照明)・PROFIBUS(産業FA)など、RS-485を物理層として使うプロトコルは多岐にわたります。
技術仕様
電気的特性
| 項目 | 仕様 |
|---|---|
| 信号方式 | 差動(A線・B線) |
| ロジック1(マーク) | VA - VB ≥ +0.2V |
| ロジック0(スペース) | VA - VB ≤ -0.2V |
| 最大差動電圧 | ±6V |
| 最大コモンモード電圧 | -7V〜+12V |
| 最大通信速度 | 10 Mbps(短距離) |
| 最大距離 | 1200m(100kbps以下) |
| 最大ノード数 | 32(Unit Load 1.0)/ 最大256(Unit Load 0.125) |
| 終端抵抗 | 両端に120Ω(ケーブル特性インピーダンスに合わせる) |
速度と距離の関係
| 速度 | 最大距離 |
|---|---|
| 10 Mbps | 12 m |
| 1 Mbps | 120 m |
| 100 kbps | 1200 m |
ケーブルの容量(pF/m)と終端抵抗によって変化します。
ケーブルと配線
RS-485には特性インピーダンス120Ω前後のツイストペアケーブルを使います(CAT5/CAT5eのツイストペアの流用も可)。配線はバス型トポロジー(デイジーチェーン)が基本で、スター型やT字分岐は反射の原因になるため避けます。
動作原理
半二重通信と方向切り替え
RS-485の基本形は2線式(A線・B線)の半二重通信です。送信時と受信時で方向を切り替えるため、トランシーバのDE(Driver Enable)/RE(Receiver Enable)ピンをGPIOで制御します:
// STM32でRS-485通信(MAX485/SP3485等のトランシーバ使用)
#define RS485_DE_PORT GPIOA
#define RS485_DE_PIN GPIO_PIN_1
// 送信モードに切り替え
void rs485_tx_enable(void) {
HAL_GPIO_WritePin(RS485_DE_PORT, RS485_DE_PIN, GPIO_PIN_SET); // DE=High
}
// 受信モードに切り替え
void rs485_rx_enable(void) {
HAL_GPIO_WritePin(RS485_DE_PORT, RS485_DE_PIN, GPIO_PIN_RESET); // DE=Low
}
// RS-485でデータ送信
void rs485_send(uint8_t *buf, uint16_t len) {
rs485_tx_enable();
HAL_UART_Transmit(&huart1, buf, len, 1000);
// 送信完了まで待機(TC: Transmission Complete フラグ確認)
while (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) == RESET);
rs485_rx_enable(); // 送信後に受信モードへ戻す
}
// 受信(タイムアウト付き)
uint16_t rs485_receive(uint8_t *buf, uint16_t max_len, uint32_t timeout) {
rs485_rx_enable();
HAL_StatusTypeDef ret = HAL_UART_Receive(&huart1, buf, max_len, timeout);
if (ret == HAL_OK) return max_len;
if (ret == HAL_TIMEOUT) {
// 受信済みバイト数を返す(実装によって異なる)
return max_len - huart1.RxXferCount;
}
return 0;
}
Modbus RTU over RS-485の実装
Modbus RTUはRS-485の最も一般的な利用シナリオです:
// Modbus RTUフレーム構造
// [スレーブアドレス(1B)][機能コード(1B)][データ(N B)][CRC(2B)]
uint8_t modbus_read_regs(uint8_t slave_addr, uint16_t start_reg, uint16_t num_regs) {
uint8_t frame[8];
frame[0] = slave_addr; // スレーブアドレス
frame[1] = 0x03; // 機能コード03(保持レジスタ読み取り)
frame[2] = (start_reg >> 8) & 0xFF;
frame[3] = start_reg & 0xFF;
frame[4] = (num_regs >> 8) & 0xFF;
frame[5] = num_regs & 0xFF;
uint16_t crc = calc_crc16(frame, 6);
frame[6] = crc & 0xFF; // CRC下位バイト(リトルエンディアン)
frame[7] = (crc >> 8) & 0xFF;
rs485_send(frame, 8);
// スレーブの応答を受信...
}
バイアス抵抗(フェイルセーフ)
バスに誰も送信していないアイドル状態(全DEがDisable)では、A線・B線が同電位になりノイズで誤動作することがあります。バス上に追加のプルアップ/プルダウン抵抗(バイアス抵抗)を設けて、アイドル時にA線=High、B線=Lowになるよう固定します:
VCC ─── 560Ω ─── A線 ─────── (各ノード) ─── A線 ─── 120Ω(終端)
B線 ─────── (各ノード) ─── B線 ─┘
GND ─── 560Ω ─── B線
(バイアス抵抗:VCC側とGND側に各560Ω程度)
用途・ユースケース
RS-485の主な採用分野:
- 産業用FA(ファクトリーオートメーション): Modbus RTU通信でPLC・インバーター・温調器を接続。1本のRS-485バスに複数の計測器や制御機器をデイジーチェーンで接続
- ビル管理(BAS): BACnet MS/TP(RS-485物理層)で空調・照明・防犯設備を統合管理
- 太陽光・蓄電システム: パワーコンディショナー(PCS)とモニタリング装置の通信(Modbus RTU)
- スマートメーター: 電力・ガス・水道のスマートメーターのデータ収集(RS-485 + Modbus or 専用プロトコル)
- 舞台照明(DMX512): ステージ照明のデジタル制御プロトコルDMX512はRS-485物理層を使用
- PROFIBUS: ドイツ発の産業用フィールドバスPROFIBUSはRS-485物理層を採用
実装・開発のポイント
トランシーバICの選定
| IC | 特徴 |
|---|---|
| MAX485 / MAX3485 | 定番。5V系 / 3.3V系 |
| SP3485 | 3.3V対応、低消費電力 |
| THVD1500 | 過渡保護、高ESD耐性 |
| ADM2587E | デジタルアイソレーター内蔵(絶縁型) |
| ISO1500 | ISO規格準拠、絶縁型 |
工場環境では浮遊電位差によるコモンモード電圧が大きくなるため、絶縁型トランシーバ(ADM2587Eなど)が推奨されます。
終端と反射の対策
ケーブル末端の反射を防ぐため、バスの両端(物理的に最も端のノード)に120Ωの終端抵抗を実装します。多くのRS-485トランシーバモジュールには実装済みの終端抵抗とジャンパーが付属しています。
長距離配線でのノイズ対策
1200mのような長距離では、ケーブルのシールドアースや、ケーブルルーティング(電力線と並走させない)が重要です。産業環境では光ファイバー変換ユニット(RS-485→光ファイバー)を使うケースもあります。
他技術との比較
RS-485 vs RS-232C
| 項目 | RS-485 | RS-232C |
|---|---|---|
| 信号方式 | 差動 | シングルエンド |
| 最大距離 | 1200m | 約15m |
| マルチドロップ | 最大32〜256ノード | 不可(1対1のみ) |
| ノイズ耐性 | 優れる | 中程度 |
RS-485 vs CAN
CANバスは差動信号・マルチマスター・高度なエラー処理を持つ点でRS-485より高機能ですが、より複雑で高コストです。RS-485 + Modbusは単純で低コスト、CANは高信頼・リアルタイム性が求められる用途に向いています。