Raspberry PiでModbusの実験

Posted on 2019/09/23 13:28

弊社では通常の製品開発・ソフトウェア開発の合間に、時間を作って今後の製品開発のアイデアを探しがてら業務外で様々な実験をしています。

今回はRS-485を使ったModbusデータ通信検証のため、ラズベリーパイ(Raspberry Pi、通称ラズパイ)を使って実験をしてみました。

RS-485とは、一昔前によく使われていたRS-232Cを、より高速により長距離のデータ伝送ができるようになったシリアル通信の信号レベルの規格です。
長距離伝送に耐えうる事、耐ノイズ特性に優れ、RS232Cとは違い、1:Nの通信が出来るとの理由で、工場なんかではPLCの制御なんかに使われている様です。
パソコンではシリアルポートやパラレルポートは搭載されなくなって久しいですが、現在でも工場などの産業分野ではModbusが現役で活躍しています。
最近流行りのIoTでは、頻繁に少量のデータをそこそこの速度で転送するというニーズにマッチした規格ですね。
何より、耐ノイズ性が高いというのは工場内なんかでは有益なんじゃないでしょうか。 

  Modbusは1979年にModicon社によって策定された、シリアル通信のプロトコルです。
仕様が公開されており、Webページより、 プロトコル仕様書を無料でダウンロードすることができます。
Modbusには、RTUタイプとTCPタイプがありRTUタイプはRS485を用いたシリアル通信。
TCPタイプは、シリアル通信のパケットを内包したTCP通信となっています。

そこで今回、よく使われる温湿度計をRS485で接続し、Modbusってどんなもんか実験をしてみました。
温湿度計の仕様では、電源として5Vを入れれば良いようなので、ラズパイのインターフェイスピン4番と温湿度計の電源端子を接続し、ピン6番とGNDを接続します。
続いてUSB-RS485変換ドングルと温湿度計を結線するんですが、A(-)とかB(+)とか書いてありますねぇ・・・、どうやらAはAと、BはBと結線すれば良い様です。
(逆に挿しても壊れないとの事だったので、あまり悩まずに結線しちゃいます)

本当は、RS-485にUSB変換アダプタを使用してラズパイに接続するつもりだったんですが、ラズパイがアダプタに対応しておらず、linuxドライバーをカスタムビルドして使わないといけないみたいだったので、ラズパイ標準対応の変換ドングルを買っちゃいました(70THBですし)。

ラズパイには事前にラズビアンをインストールしてあったので、後はlibmodbusというC言語用のmodbusライブラリをweb上からDLしてきてビルドします。
後はテスト用の単純なコードをweb上のサンプルを見ながらC言語で書いてビルドして実行すればOKです。

実行した結果、室温、湿度がすんなりと取得出来ました。
わかった事は、データ読み書きの制御コードはライブラリでカプセル化されているので、必要なのは、接続機材のアドレス(最大接続16台)、機材毎に固有のレジスタアドレスとそのデータについてです。
それさえ分かれば、Modbusに接続された機材とのやりとりは簡単そうというのが今回の実験の感想です。