警告メッセージ

Howtoは、Armadilloシリーズを有効に活用するための参考資料です。使用ソフトウェアのバージョンなど諸条件の差異によって、記載内容と実際の動作が異なる場合があります。また、すべての機能検証や長期の動作試験を行ったものではありませんので、必ずご使用目的に適合した検証・試験を行ってください。

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

対象製品: Armadillo-IoT G3L

この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が消灯,点灯が確認できれば通信成功です。

消灯命令の場合:

点灯命令の場合:

カテゴリ: