(Serial通信 Modbus RTU RS-485を理解) 自宅で手軽に通信環境を構築

2020年7月15日

記事の目的

通信Modbus RTU RS485を理解するには,自宅でその通信環境を整え,自分に色々試験を行うことが近道である。本記事では誰もが簡単に扱えるマイコンArduinoを使用し,通信環境を構築する手順を示す。

使用する機器と配線の紹介

今回実現する通信は,Modbus RTU RS485 Half Duplex(半二重通信)である。
使用する機器は以下の通りである。
PCさえあれば,\5,000-程度の費用で試験環境の構築が可能である。

 

➀USBポートを二つ以上搭載したPC
➁マイコン及び⓸ジャンパワイヤ:Arduino UNO R3


⓷RS422 RS485 シリアル ポート コンバーター


各機器を実際に配線した様子は以下の通りである。Arduinoとシリアルコンバータをジャンパワイヤで接続した接続図も併せて示す。
動作概要としては,
➀PCのArduino UNO R3 (Software)から➁Arduino UNO R3にModbus通信を行うためのソフトウェアをインストール
➁上記ソフトウェアによってArduino UNO R3がModbus Masterとなり,⓷シリアルポートコンバータを介して,➀PCにインストールされたModbus slave(Software)と通信を行う。

ソフトウェアインストールとその設定方法

PCにはArduino UNO R3にプログラムを実装・通信するためのプログラム(手順は参考文献で紹介する"PCとArduinoを接続するための手順及び設定"参照)及び RS422 RS485 シリアル ポート コンバーターを動作させるためのドライバを付属CDよりインストールする必要がある。
また,Arduino UNO R3をModbus Master側として駆動するには,スケッチ → ライブラリをインクルード → ライブラリ管理より"Modbus Master"を検索し,インストールする必要がある。
更に,PC内にModbus Slave側となるシミュレータを設けるため,ソフトウェア"Modbus Slave"をインストールする必要がある。(以下URLからDownload可能)
このソフトウェアは起動から10分間は無償での使用が可能である。

通信動作の仕様, Sketch紹介及び設定

通信で行う動作仕様として,Masterから指定するRegisterに対し,決まった時間毎に書き換え処理(Fucnction code:06, Preset Single Register)を繰り返すSketchを作成しArduinoに実装する。Baud rate 115,200bpsとし,その他の設定はArduinoの標準設定(8data bits, No Parity, One stop bit)とする。

 

Arduino(Modbus Master)に実装したSketch
#include <ModbusMaster.h>               //Library for using ModbusMaster
ModbusMaster node;                    //object node for class ModbusMaster
void setup()
{
Serial.begin(115200);             //Baud Rate as 115200
node.begin(1, Serial);            //Slave ID as 1
}
void loop()
{
node.writeSingleRegister(0x40000,111);
delay(1000);
node.writeSingleRegister(0x40001,1);
delay(1000);
node.writeSingleRegister(0x40000,0);
delay(1000);
node.writeSingleRegister(0x40001,0);
delay(1000);
node.writeSingleRegister(0x40000,2);
delay(1000);
node.writeSingleRegister(0x40001,2);
delay(1000);
node.writeSingleRegister(0x40000,3);
delay(1000);
node.writeSingleRegister(0x40001,9);
delay(1000);
}
Modbus Slave(Modbus  Slave側)もConnection setupにてMaster側の通信設定に合わせた形とする。
Slave Definitionでは,Slave IDを"1″とし,Master側のプログラムにより書き換わるレジスタの内容を把握するため,Function code 03 Read Holding Registerの設定とする。

動作検証

動画の通り,Register"0x40000″及び"0x40001″の値が時間毎に書き換わっていることが確認でき,Modbusの試験環境が整っていることを示すことが出来た。
また,Modbus slaveより出力されるCommunication logも正常動作が確認できた。
実際に得られたテキストデータもCommunication log_0712よりダウンロード可能である。
以下はArduinoのスケッチ"node.writeSingleRegister(0x40000,111);"の指令に対するModbus slave側の受信内容及び送信内容である。

参考文献

PCとArduinoを接続するための手順及び設定
(初心者でもわかる・できる!Arduinoを使った初めての電子工作実践)
Modbus プロトコル概説書
Arduino 日本語リファレンス
On-line CRC calculation and free library
RS-485 MODBUS Serial Communication with Arduino as Master (Circuit Digest)
Modbus tools

技術

Posted by Gin