Raspberry Pi

Raspberry PiでModbus RTU通信!PHP編

この記事では、Raspberry PiでModbus RTU通信をする方法について紹介します。別の記事でPythonで実現する方法を紹介しましたが、今回はPHPで行います。

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に吐き出すようにすれば、ブラウザでセンサの情報を見ることが出来ますね。

使うもの(ハード)

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

使うもの(ソフト)

  1. マスタプログラム
    Raspberry Pi上で動かすModbusマスタプログラム
  2. スレーブシミュレータ
    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番地のアドレスに、適当なデータを設定します。

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

検証

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

php PhpSerialModbusAppTest.php

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

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

-Raspberry Pi