Raspberry Pi Python

Raspberry PiでModbus RTU通信!Python編

この記事では、Raspberry PiでModbus RTU通信をする方法について紹介します。

Modbusとは

産業用の通信プロトコルの一つで、マスターとなる機器がコマンドを送り、スレーブ機器がコマンドに対応してデータを返したりするときの、データのやり取りを規定するプロトコルになります。

実装が簡単なため、マスターとなるPLCが産業用の電子機器から情報を取得したり、制御したりするために広く活用されています。

Modbusには大きく2種類あり、RS-232CやRS-485等のシリアル通信を使う際のデータのやり取りを規定するModbus RTU、Ethernetを使う場合のデータのやり取りを規定するModbus TCP/IPがあります。

この記事ではRaspberry Pi(ラズパイ)でModbus RTUの通信を行ってみたいと思います。

ラズパイをマスターにしてModbus RTUでコマンドを送信

Raspberry Piをマスターにして、Modbus RTUでスレーブ機器からデータを取得してみたいと思います。Raspberry PiからModbus RTUメッセージを送る方法はいくつかあるのですが、今回は最も手軽であるPythonを使って方法で実装します。

使うもの(ハード)

  1. Raspberry Pi(Modbusマスタ機)
  2. USB-RS232Cコンバータx2
  3. ヌルモデムケーブル(クロスケーブル)
  4. PC(Modbusスレーブ機)

使うもの(ソフト)

  1. マスタプログラム
    Raspberry Pi上で動かすModbusマスタプログラム
  2. スレーブシミュレータ
    Simply Modbusというツールを使います。ここからダウンロードして、スレーブ機となるPCへインストールしてください。

Raspberry Piで動かすModbusマスタプログラム

Pythonで実装します。Modbus RTUのコマンドを簡単にプログラムから使うことを可能にする"Pymodbus"というライブラリを使います。次のように、pipでRaspberry Piにインストールして下さい。

sudo pip3 install pymodbus

作成するプログラム例はこちらです。スレーブ機器に対し、1000番地のデータの読み出しを行うコマンドです。

from pymodbus.client.sync import ModbusSerialClient as ModbusClient
from pymodbus.register_read_message import ReadWriteMultipleRegistersResponse

# Modbus connect
client = ModbusClient(method = 'rtu', port = '/dev/ttyUSB0', stopbits=1, bytesize=8,parity='N', baudrate='9600',timeout=0.1)
connection_Modbus = client.connect()
value = client.read_holding_registers(1000,1,unit=0x01)
print(value)

5行目で、スレーブと通信するためのシリアル通信の設定をしています。Raspberry Pi にUSBシリアルコンバータを繋ぐと、おそらく/dev/ttyUSB0 にマウントされていますので、"port"にこちらを指定します。

7行目が実際のModbusのコマンドです。1000番地からデータを1つ取得するコマンドです。Modbusコマンドでは、スレーブのアドレスを指定する必要があります。最後のunit=0x01は、「スレーブ番号1番」を指定しています。

スレーブ側のツールの設定

今回、スレーブ機器としてPCを準備し、Simply Modbusというツールを使って、PCからデータをマスタであるRaspberry Piに返します。Simply Modbusを立ち上げて、マスタプログラムから読み出す1000番地のアドレスに、適当なデータを設定します。

Simply modbusのModbus通信設定
スレーブIDとシリアル通信設定
Simply modbusでスレーブ側のデータセット
1000番地に100をセット

検証

マスタプログラムを走らせ、動作を確認してみます。作成したPythonプログラムを次のように実行します。

python3 SimpleModbusTest.py

スレーブPCのSimply Modbus上で、1000番地のアドレスにセットしたデータが読み出せていれば成功です。上の例通りに設定していると、100が読み出せているはずです。

最後までお読みいただきありがとうございます。Raspberry PiをModbusマスタとしたシステム構築時の手助けとなれば幸いです。

-Raspberry Pi, Python