この記事では、Raspberry PiでModbus RTU通信をする方法について紹介します。別の記事でPythonで実現する方法を紹介しましたが、今回はPHPで行います。
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メッセージを送る方法はいくつかあるのですが、今回はWebサーバー側のプログラム言語としてよく用いられるPHPで実現します。
Raspberry PiをWebサーバー兼Modbusマスタ機にして、Modbus対応のセンサ機器(温度検出してるAruduino等)から読みだしたデータをhtmlに吐き出すようにすれば、ブラウザでセンサの情報を見ることが出来ますね。
使うもの(ハード)
- Raspberry Pi(Modbusマスタ機)
- USB-RS232Cコンバータx2
- ヌルモデムケーブル(クロスケーブル)
- PC(Modbusスレーブ機)
使うもの(ソフト)
- マスタプログラム
Raspberry Pi上で動かすModbusマスタプログラム - スレーブシミュレータ
Simply Modbusというツールを使います。ここからダウンロードして、スレーブ機となるPCへインストールしてください。
Raspberry Piで動かすModbusマスタプログラム
Luca SoltoggioさんがGitHubで公開しているPhpSerialModbusというクラスを使います。
下記リンク先からダウンロードできます。
PhpSerialModbusの概要
- Modbusファンクション 01, 02, 03, 04, 05, 06に対応
- 専用ファンクションコードの実装も可能(枠だけは準備されている)
- タイムアウト、CRCコントロールは実装済
このクラスを使えば、Modbusの部分の実装をする必要が無いので、作りたいアプリケーションプログラムの作成に集中出来ます。GNU Public Lisenceです。
作成するプログラム例はこちらです。スレーブ機器に対し、1000番地のデータの読み出しを行うコマンドです。
<?php
include("PhpSerialModbus.php");
$modbus = new PhpSerialModbus;
$modbus->deviceInit('/dev/ttyUSB0',115200,'none',8,1,'none');
$modbus->deviceOpen();
$result=$modbus->sendQuery(1,3,"3E8",1);
print_r($result);
$modbus->deviceClose();
?>
4行目で、スレーブと通信するためのシリアル通信の設定をしています。Raspberry Pi にUSBシリアルコンバータを繋ぐと、おそらく/dev/ttyUSB0 にマウントされていますので、このディレクトリを指定しています。続く設定はシリアル通信のボーレートの設定です。
6行目のsendQuery(1,3,"3E8",1)が実際のModbusのメッセージ処理です。
- 第1引数 : ModbusスレーブID、この例では1を指定。
- 第2引数 : ファンクションコード、この例では3(レジスタ読み出し)を指定
- 第3引数 : 読み出しレジスタアドレス、この例では1000番地を指定。10進数の1000を16進数値の3E8で指定
- 第4引数 : 読み出しレジスタ数、この例では1ワードと指定
スレーブ側のツールの設定
今回、スレーブ機器としてPCを準備し、Simply Modbusというツールを使って、PCからデータをマスタであるRaspberry Piに返します。Simply Modbusを立ち上げて、マスタプログラムから読み出す1000番地のアドレスに、適当なデータを設定します。
検証
マスタプログラムを走らせ、動作を確認してみます。作成したPythonプログラムを次のように実行します。
php PhpSerialModbusAppTest.php
スレーブPCのSimply Modbus上で、1000番地のアドレスにセットしたデータが読み出せていれば成功です。上の例通りに設定していると、100が読み出せているはずです。
最後までお読みいただきありがとうございます。Raspberry PiをModbusマスタとしたシステム構築時の手助けとなれば幸いです。