Slide 1:イントロダクション
この資料では、Pythonから産業機器と通信するための代表的なプロトコル「Modbus TCP」を、pymodbusを使って実装する方法を解説します。PLCやセンサとPythonをつなぎ、制御・取得・可視化へ広げる第一歩として理解していきましょう。
Slide 2:Modbus TCPの構造
Modbus TCPは、従来のModbusメッセージをTCP/IP上にカプセル化した通信規格です。Ethernet・IP・TCPの上にModbus ADUが乗り、CRCはTCP層が保証するため不要になります。ITネットワークと親和性が高い点が特徴です。
Slide 3:Client / Serverモデル
Modbus TCPはClient-Server型通信です。PythonスクリプトがClientとして要求を出し、PLCやセンサがServerとして応答します。Server側からは自発通信しない点が重要で、制御の主導権は常にClient側にあります。
Slide 4:データモデル(4領域)
Modbusではデータは4種類に分類されます。入力接点、コイル、入力レジスタ、保持レジスタです。特に保持レジスタは読み書き可能な16bitデータで、設定値や制御値のやり取りに多く使われます。
Slide 5:pymodbusの準備と注意点
pymodbusにはv2系とv3系があります。本資料ではv3系を前提とします。古いチュートリアルはv2系記述が多いため注意してください。importパスやClientクラスが異なる点がトラブル原因になります。
Slide 6:Step1 接続の確立
まずはModbus TCPサーバへ接続します。IPアドレスとポート502を指定し、connect()で接続確認を行います。通信後は必ずclose()するか、with構文で安全にクローズすることが重要です。
Slide 7:Step2 データ読み出し
read_holding_registersで保持レジスタを読み出します。重要なのはアドレス指定です。PLCの40101番地は、pymodbusでは0番になります。0-basedと1-basedのズレは最頻出のハマりどころです。
Slide 8:アドレスの考え方
pymodbusのアドレスは常に0始まりです。一方、PLCマニュアルは40101など1始まり表記が一般的です。「PLCアドレス −1」がpymodbusアドレス、というルールを必ず覚えてください。
Slide 9:Step3 データ書き込み
write_registerやwrite_registersで制御値を書き込みます。これは機器の動作に直接影響するため、アドレスと値の確認が重要です。誤った書き込みは想定外動作を招く可能性があります。
Slide 10:32bit Floatの扱い
Modbusは16bitが基本単位です。32bit浮動小数点は2レジスタを結合して表現します。その際、バイト順・ワード順(エンディアン)の違いを正しく処理しないと、値が破綻します。
Slide 11:エンディアン処理
BinaryPayloadDecoderを使うことで、エンディアンを指定して安全にFloatを復元できます。PLCごとにBig/Littleの組み合わせが異なるため、仕様書を必ず確認しましょう。
Slide 12:非同期通信(Async)
同期通信では応答待ち時間が発生します。Async版Clientを使うと、複数リクエストを並列処理でき、通信待ちの間に他処理を進められます。周期取得や高頻度通信に有効です。
Slide 13:擬似PLCサーバ
pymodbusではサーバ側もPythonで構築できます。実機がない環境でも、擬似PLCを立てて開発・テストが可能です。レジスタ初期値を定義し、Client側動作を安全に検証できます。
Slide 14:実践構成例
Raspberry PiをClientとして、産業用センサと通信する構成例です。取得した生データをスケーリングし、ログ保存や可視化へ展開できます。ModbusはOTとITをつなぐ入口です。
Slide 15:まとめ
pymodbusは、Pythonの柔軟性と産業機器の堅牢性をつなぐ強力なツールです。まずは正しいアドレス理解と通信確認から始め、データ分析やAI連携へ発展させていきましょう。














