Howto

Armadillo-IoT G3LをModbus スレーブとして制御する方法

このHowtoでは、Armadillo-IoT G3LをModbusスレーブとして制御する方法についてご紹介します。

Armadillo-IoT G3Lは、RS422/RS485シリアルポートを用いてModbus通信を行うことができます。
Armadillo-IoT G3LをModbus マスタで通信する方法については、別ブログ「Howto : Armadillo-IoT G3LのRS422/RS485シリアルポートでModbusの通信をする」を参照してください。

今回は、Armadillo-IoT G3L 2台をマスタ/スレーブにそれぞれ設定し、通信を行います。

modbus通信設定

今回は以下の設定で制御します。

通信規格ModbusRTU
プロトコルRS-485に準拠
通信方法2線式半二重
エラー検出方式CRC-16
通信速度19200bps
データ長8
スタートビット1
パリティービットなし
ストップビット1
スレーブID3
終端抵抗約120Ω

Armadillo-IoT G3Lの配線

2台のArmadillo-IoT G3Lに配線を行います。
配線はマスタ/スレーブ共に同じ配線を行います。

  • Armadillo-IoT G3LのCON4(ピン番号1)にSG用の配線を接続します。
  • Armadillo-IoT G3LのCON4(ピン番号2,3)に信号線DATA-、DATA+を接続します。
  • Armadillo-IoT G3LのCON4(ピン番号2,3)の信号線DATA-、DATA+の間に120Ωの終端抵抗を接続します。

※今回のHowtoでは簡易的にピン番号2,3に直接終端抵抗を設置しています。この設置方法では、ケーブルまたは終端抵抗が取れてしまう恐れがあるため、実際の運用での使用は避けて下さい。

全体図

配線図

Armadillo-IoT G3LのRS485設定

Armadillo-IoT G3LのRS485設定を行います。
マスタ/スレーブの両方で行ってください。

=> setenv optargs imx.rs485_uart2=0x03,0,0
=> saveenv

RS485設定値

設定説明設定値
flagsflags ENABLED(bit0)0: RS485無効

1: RS485有効
1
RTS_ON_SEND(bit1)0: データ送信時のRTS(Driver Enable)がLow

1: データ送信時のRTS(Driver Enable)がHigh
1
RTS_AFTER_SEND(bit2)0: データ非送信時のRTS(Driver Enable)がLow

1: データ非送信時のRTS(Driver Enable)がHigh
0
RX_DURING_TX(bit4)0: 半二重通信

1: 全二重通信
0
delay_rts_before_send送信前遅延時間(ミリ秒)0
delay_rts_after_send送信後遅延時間(ミリ秒)0

※RS485に設定する値の詳細については、製品マニュアル「RS422/RS485」を確認して下さい。
※RS485に設定する値は、初期値と同じ値です。Armadillo-IoT G3Lが初期状態であれば、この設定を行わない場合でもRS485を使うことができます。

サンプルプログラム

本Howtoでは例として、スレーブ側Armadillo-IoT G3LのLEDをon/offさせるサンプルプログラムをご紹介します。
プログラムはマスタ用,スレーブ用が存在します。

必要パッケージのインストール

サンプルプログラムの実行に必要なライブラリをインストールします。

[armadillo ~]# apt-get update
[armadillo ~]# apt-get install libmodbus-dev

送信パケット

今回のサンプルプログラムでは、LED on/offのために以下例のようなパケットを送信します。

内容説明
スレーブID0x03サンプルプログラム内で設定したスレーブID
機能コード0x05スレーブの保有レジスタへの書き込み
書き込みアドレス(上位)0x00
書き込みアドレス(下位)0x04LED番号 マスタ側の実行引数によって変化する
データ(上位)0x00
データ(下位)0x00 または 0x01LEDのon(0x01)/off(0x00)

サンプルプログラムのダウンロード

以下よりサンプルプログラムをダウンロードすることができます。

それぞれマスタ/スレーブのArmadillo-IoT G3L上に配置し、展開してください。

[armadillo ~]# ls
modbus_sample_master.tar.gz
[armadillo ~]# tar zxf modbus_sample_master.tar.gz

ファイル構成はそれぞれ以下の通りです。

  • master

    • Makefile
    • modbus_sample_master.c
  • slave

    • Makefile
    • modbus_sample_slave.c

動作確認

マスタ/スレーブそれぞれのプログラムを実行し、動作確認を行います。

スレーブ側のプログラム実行

スレーブ側のプログラムをビルドし、実行します。
ビルドは以下のようにmakeコマンドで行います。

[armadillo ~]# cd modbus_sample_slave
[armadillo ~]/modbus_sample_slave# ls
Makefile  modbus_sample_slave.c
[armadillo ~]/modbus_sample_slave# make
gcc -c -I /usr/include/modbus modbus_sample_slave.c -lm -lmodbus
gcc modbus_sample_slave.o -o modbus_sample_slave -lmodbus
[armadillo ~]/modbus_sample_slave# ls
Makefile  modbus_sample_slave  modbus_sample_slave.c  modbus_sample_slave.o

プログラムの実行には引数として、デバイスファイル名が必要となります。 Armadillo-IoT G3L の RS422/RS485シリアルポートインターフェースのデバイスファイル名は/dev/ttymxc1です。

[armadillo ~]/modbus_sample_slave# ./modbus_sample_slave /dev/ttymxc1
Opening /dev/ttymxc1 at 19200 bauds (N, 8, 1)
Waiting for a indication...

実行後、プログラムはマスタからの命令を待つ状態となります。

マスタ側のプログラム実行

スレーブ側のプログラム実行を確認後、マスタ側のプログラムをビルドし、実行します。
ビルドは以下のようにmakeコマンドで行います。

[armadillo ~]# cd modbus_sample_master
[armadillo ~]/modbus_sample_master# ls
Makefile  modbus_sample_master.c
[armadillo ~]/modbus_sample_master# make
gcc -c -I /usr/include/modbus modbus_sample_master.c -lm -lmodbus
gcc modbus_sample_master.o -o modbus_sample_master -lmodbus
[armadillo ~]/modbus_sample_master# ls
Makefile  modbus_sample_master  modbus_sample_master.c  modbus_sample_master.o

プログラムの実行には引数として、デバイスファイル名,対象LED番号,on/offが必要となります。

[armadillo ~]/modbus_sample_master# ./modbus_sample_master /dev/ttymxc1 4 off
[armadillo ~]/modbus_sample_master# ./modbus_sample_master /dev/ttymxc1 4 on

実行結果

マスタ側のプログラムを実行後、以下のようにスレーブ側のLED4が消灯,点灯が確認できれば通信成功です。

消灯命令の場合:

点灯命令の場合: