見出し画像

Pythonでmodbus rtu通信 ~スレーブ機器からデータ取得~

本記事ではPythonでmodbus通信ができるライブラリ「pymodbus」の導入編として基本的な使い方を書いていきます。modbus通信には通信方式として「RTU」「TCP」「ASCII」の3つがありますが、この記事ではRS-232などのシリアル接続を介して使用する「modbus RTU」を扱います。

環境

・windows 10(64bit)
・python 3.8.2(32bit版)
・エディタ Visual Studio Code 1.53.1

ライブラリインストール

コマンドプロンプトを起動して以下のコマンドを入力すればpipでライブラリをインストールすることができます。

py -m pip install pymodbus

スレーブ機器のデータを取得

パソコン側で以下のコードを書いてスレーブ機器からデータを取得します。以下の例では「Read Holding Register」のファンクションコードを使用しています。

COMポート番号やパリティ、ボーレートなどは接続したい機器の通信仕様にあわせて設定してください。

from pymodbus.client.sync import ModbusSerialClient as ModbusClient

#---------- 接続開始 ----------#
client = ModbusClient(method = "rtu", port="COM5",stopbits = 1, bytesize = 8, parity = 'E', baudrate= 115200, timeout= 1)
client.connect()

#---------- データ読み出し ----------#
# address   : レジスタ番号
# count     : 読み出すレジスタ数 
# unit      : スレーブ装置の番号
result= client.read_holding_registers(address=100, count=1, unit= 1)

# 読み出したデータをコンソール画面に出力
print(result.registers)

#---------- 接続終了 ----------#
client.close()

あとはmodbus通信が実装された機器とハードウェアで接続(例えばUSB-RS232ケーブルなど)して上記のコードを実行すれば、エディタのコンソール画面にレジスタ番号100のデータが出力されます。もし、レジスタ番号100~102まで取得したければcout=3とすれば良いです。

参考

pymodbusのライブラリにある関数を参照してみると以下のように定義されています。pymodbusはインターネット上に日本語の情報がまだ少ないように感じたので、困ったときはこのように関数の定義を参照してみると良いかもしれません。

    def read_holding_registers(self, address, count=1, **kwargs):
       '''

       :param address: The starting address to read from
       :param count: The number of registers to read
       :param unit: The slave unit this request is targeting
       :returns: A deferred response handle
       '''
       request = ReadHoldingRegistersRequest(address, count, **kwargs)
       return self.execute(request)

おわりに

ライブラリ化されていてmodbus通信について詳しくない方でも使いやすくなっている点がpymodbusのメリットだと思います。GUIを作成するライブラリも組み合わせればちょっとしたmodbus通信のGUIツールなんかも作れると思います。

何かお役に立てたら、サポートしていただけると嬉しいです!モチベーションを高めて、アウトプットしていきます!