Arduino

ArduinoをModbusスレーブで動作させる

ArduinoをModbusスレーブで動作させる方法を紹介します。

PLC等のModbusのマスタ機器が、Arduinoから情報を受け取る際にModbus通信が活用出来ます。
例えば、Arudinoから温度などの情報を読み出すことなどで使えます。

早速やっていきましょう。

Modbus マスタとスレーブ

Modbusでは指令や情報を読み出す指令を送る側をマスタと呼びます。
逆に、マスタから指令を受けたり、情報を返したり側をスレーブと呼びます。

今回紹介するのは、マスタ機器からの情報読み出し指令に対してArduinoが情報を返すことを行うので、Aruduinoはスレーブとなります。

Arduino Modbusスレーブスケッチ

GitHubで公開されているArduino用のModbusライブラリを使います。
こちらのリンクからダウンロード出来ます。
GitHub-Aruduino Modbusライブラリ

下のようにライブラリおよびサンプルスケッチ一式(zip形式)をダウンロードしてください。
GitHubからArduino用のModbusライブラリをダウンロード

次に、サンプルのスケッチを開きます。

ダウンロードした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の内容と同じことが確認出来ました。

ArduinoをModbusスレーブにして通信。確認結果。

ファンクション03(レジスタデータ読み出し), 先頭(40001番地となる)から10個分のデータを読み出す指令と結果。

最後までお読みいただきありがとうございました。



-Arduino