0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

WebエンジニアがModbus(RTU/TCP)とUnit ID(Slave)にハマって抜け出した話

Posted at

Web系エンジニアがSCADAに憧れてModbusを触り始めたら、
RTU / TCP / Slave(マスター / Unit ID) で初手から盛大に詰まり ました。

PLC実機は持っていないので、 PythonでPLCシミュレータを作りながら理解した内容を
未来の自分と、同じ沼にハマる人向けに整理します。

結論(まずこれだけ)

  • RTUのマスターは“役割”であって“機器の種類”ではない
    • PLCにもなれる
    • ゲートウェイにもなれる
    • 産業用PCにもなれる
  • Modbus TCP の Unit ID(slave番号)は基本的にRTU互換の名残
    • ただし TCP⇔RTU ゲートウェイ構成では実用上めちゃ重要

Modbus RTU とは?

特徴(RTU)

  • 物理:RS-485 / RS-232
  • トポロジ:バス型(数珠つなぎ)
  • 1マスター + 複数スレーブ
  • マスターだけが通信を開始
  • slave番号(Unit ID)が必須
[ マスター ] ---- RS-485 ---- [ スレーブ#1 ]
                             [ スレーブ#2 ]
                             [ スレーブ#3 ]

:writing_hand_tone2:「誰に話しかけているか」を示すのが slave番号

スレーブって何者?

スレーブ =「要求が来たら答える側」
自分からは基本しゃべらない。聞かれたら返すだけの存在。

役割 従来の呼び方 いま風の言い方
司令塔 マスター クライアント
返答役 スレーブ サーバ / デバイス

Modbusでは今でも仕様書に Master / Slave 表記がありますが、
ドキュメントによっては Client / Server 表記も見かけるときがあります。

:hatched_chick: ざっくりイメージ

:pig: SCADA / 上位システム
「40513 読ませて」

:robot: PLC(スレーブ)
「はい、40513 = 1 です」

この :robot: 側がスレーブ

  • 自分からは送らない
  • 読まれたら返す
  • 書かれたら反映する
  • 指定されたアドレス範囲しか知らない

RTUのマスターになれる“正体”は3パターン

① PLC がマスター


[ PLC (Master) ] ---- RS-485 ---- [ インバータ ]
[ 電力計 ]
[ I/O ]

条件

  • PLCが Modbus RTU マスター対応
    または RS-485 通信ユニットを装着

:writing_hand_tone2:Modbus TCP 非対応の機器を扱う場合、現場で一番多い構成な気がします。

② ゲートウェイがマスター(TCP⇔RTU変換)

[ SCADA ]
    |
Ethernet
    |
[ Gateway (RTU側 Master) ] ---- RS-485 ---- [ 旧機器 ]
方向 役割
TCP側 サーバ(スレーブ役)
RTU側 マスター

:writing_hand_tone2:古いRTU機器をLANの世界に“翻訳”する橋渡し役

③ 産業用PC / 普通のPCがマスター

[ PC (Master) ] ---- USB-RS485 ---- [ センサー ]
                                    [ 電力計 ]
  • 検証・試験・シミュレーションでよく使う構成
  • pymodbus / minimalmodbus などで実装

「スレーブの取り扱いが分からない」問題の正体

たぶんここが詰まったやつ:point_down_tone2:

:speak_no_evil:勘違いしないように

勘違い 実際
スレーブが勝手に通知してくる ❌ しない
スレーブ側から通信を開始できる ❌ できない
スレーブは状態を定期送信する ❌ 読まれたら返すだけ
スレーブは複雑なロジックを持てない ⭕ 持ってよい(通信は受動的)

つまり「RTUのマスターって誰?」

PLC?
ゲートウェイ?
Modbus対応PLC?

:writing_hand_tone2:全部 YES(役割で決まる)

機器 マスターになれる? 条件
PLC :white_check_mark: RTUマスター対応 or 通信ユニット
ゲートウェイ :white_check_mark: TCP⇔RTU変換
PC :white_check_mark: RS-485変換器 + ソフト
PLC(スレーブ専用) :x: マスター機能なし

Modbus TCP とは?

特徴(TCP)

  • 物理:Ethernet(LAN)
  • IPアドレスで相手が一意
  • 高速・構成がシンプル
  • slave番号(Unit ID)は基本不要
[ SCADA ] ---- TCP/IP ---- [ PLC ]

:writing_hand_tone2: IPアドレスで相手が決まるので「slave番号で誰に送るか」を決める必要がない。

それでも Unit ID が残っている理由

① RTU互換(歴史的経緯)

  • TCP化したが、フレーム構造を流用
  • Unit IDフィールドがそのまま残った

② TCP ⇔ RTU ゲートウェイ対応(ここが実務で重要)

[ SCADA ]
    |
(TCP)
    |
[ Gateway ] -- RS-485 --> [ Slave#1 ]
                          [ Slave#2 ]
                          [ Slave#3 ]
項目 意味
IP ゲートウェイ
Unit ID RTU側のスレーブ番号

:writing_hand_tone2:TCP側の Unit ID = RTU側の宛先指定

扱い方

PLCへ直TCP接続

SCADA ---- TCP ---- PLC
  • Unit ID = 1 固定でOK(PLC仕様に従う)
  • 複数PLCは IP で区別

TCP⇔RTUゲートウェイ経由

SCADA --TCP--> Gateway --RTU--> 複数機器
  • Unit ID = RTU側のスレーブ番号
  • 設定ミスで 別機器が動く事故 が起きがち

よくあるハマりどころ

症状 原因
つながるが応答なし Unit IDがPLC想定と違う
一部の機器だけ反応しない Unit ID=0 を受け付けない機器がある
ゲートウェイ越しで誤動作 Unit ID 指定ミス

まとめ(これだけ覚えればOKかな!)

RTUのマスターは“役割”
TCPのUnit IDは“名残”
ゲートウェイ構成のときだけ本気で効いてくる

おまけ:設計チェックリスト

  • PLCはRTUマスター対応か?
  • Unit ID の扱いを構成図に明記しているか?
  • ゲートウェイ越しなら Unit ID と RTUアドレス対応表を作っているか?
  • 検証環境と本番で Unit ID の扱いがズレていないか?
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?