この記事では、Raspberry PiでModbus RTU通信をする方法について紹介します。
Contents
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を使って方法で実装します。
使うもの(ハード)
- Raspberry Pi(Modbusマスタ機)
- USB-RS232Cコンバータx2
- ヌルモデムケーブル(クロスケーブル)
- PC(Modbusスレーブ機)
使うもの(ソフト)
- マスタプログラム
Raspberry Pi上で動かすModbusマスタプログラム - スレーブシミュレータ
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番地のアドレスに、適当なデータを設定します。
検証
マスタプログラムを走らせ、動作を確認してみます。作成したPythonプログラムを次のように実行します。
python3 SimpleModbusTest.py
スレーブPCのSimply Modbus上で、1000番地のアドレスにセットしたデータが読み出せていれば成功です。上の例通りに設定していると、100が読み出せているはずです。
最後までお読みいただきありがとうございます。Raspberry PiをModbusマスタとしたシステム構築時の手助けとなれば幸いです。