ArduinoをModbusスレーブで動作させる方法を紹介します。
PLC等のModbusのマスタ機器が、Arduinoから情報を受け取る際にModbus通信が活用出来ます。
例えば、Arudinoから温度などの情報を読み出すことなどで使えます。
早速やっていきましょう。
Contents
Modbus マスタとスレーブ
Modbusでは指令や情報を読み出す指令を送る側をマスタと呼びます。
逆に、マスタから指令を受けたり、情報を返したり側をスレーブと呼びます。
今回紹介するのは、マスタ機器からの情報読み出し指令に対してArduinoが情報を返すことを行うので、Aruduinoはスレーブとなります。
Arduino Modbusスレーブスケッチ
GitHubで公開されているArduino用のModbusライブラリを使います。
こちらのリンクからダウンロード出来ます。
GitHub-Aruduino Modbusライブラリ
下のようにライブラリおよびサンプルスケッチ一式(zip形式)をダウンロードしてください。
次に、サンプルのスケッチを開きます。
ダウンロードしたZipを展開し、examples、simple_slaveの階層にsimple_slave.inoがありますので、それを立ち上げArduinoへ書き込んで下さい。このとき、ダウンロードしたZipをライブラリとしてインポートしておく必要があります。メニューSketch → Include Library → Add.zip Library からGitHubからダウンロードしたZipをインポートした上でArduinoへの書き込みを行って下さい。
これで準備は完了です。
スケッチ概要
- 4行目のau16data配列がマスタ機器から読み出される情報となる
- 14行目でArduinoのModbusスレーブIDを1と指定
- 17行目でシリアル通信のボーレートを19200bpsと指定
- 22行目が実際のModbusの処理で、マスタからの指令を処理するメソッドを実行
#include <ModbusRtu.h>
// data array for modbus network sharing
uint16_t au16data[16] = {
100, 1415, 9265, 4, 2, 7182, 28182, 8, 0, 0, 0, 0, 0, 0, 1, -1 };
/**
* Modbus objec t declaration
* u8id : node id = 0 for master, = 1..247 for slave
* port : serial port
* u8txenpin : 0 for RS-232 and USB-FTDI
* or any pin number > 1 for RS-485
*/
Modbus slave(1,Serial,0); // this is slave @1 and RS-232 or USB-FTDI
void setup() {
Serial.begin( 19200 ); // baud-rate at 19200
slave.start();
}
void loop() {
slave.poll( au16data, 16 );
}
結果確認
ArduinoからModbusでデータが読み出せているか結果を確認するためには、マスタ機器を準備しModbusのレジスタ読み出し指令をArduinoへ送る必要があります。
今回は、マスタ機器として、パソコン上で動作するSimply Modbus Masterを使います。
こちらからダウンロード出来ます。
Modbusマスタシミュレータ SimplyModbusへのリンク
Simply Modbus Masterの出力結果
Arduinoの配列au16dataのデータが表示されていれば成功です。
Arduinoで格納したau16dataの内容
uint16_t au16data[16] = {
100, 1415, 9265, 4, 2, 7182, 28182, 8, 0, 0, 0, 0, 0, 0, 1, -1 };
SimplyModbus Masterの実行結果
COM port, ボーレート以外は設定不要です。
COM portはArduinoを繋がているPCのシリアルポート番号、ボーレートはArduinoスケッチに合わせ19200とします。
設定した後、SENDをクリックすると右側のようにArduinoからのデータが表示されます。
au16dataの内容と同じことが確認出来ました。

ファンクション03(レジスタデータ読み出し), 先頭(40001番地となる)から10個分のデータを読み出す指令と結果。
最後までお読みいただきありがとうございました。