この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 |
スレーブID | 3 |
終端抵抗 | 約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設定値
設定 | 説明 | 設定値 | |
---|---|---|---|
flags | flags 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のために以下例のようなパケットを送信します。
内容 | 値 | 説明 |
---|---|---|
スレーブID | 0x03 | サンプルプログラム内で設定したスレーブID |
機能コード | 0x05 | スレーブの保有レジスタへの書き込み |
書き込みアドレス(上位) | 0x00 | |
書き込みアドレス(下位) | 0x04 | LED番号 マスタ側の実行引数によって変化する |
データ(上位) | 0x00 | |
データ(下位) | 0x00 または 0x01 | LEDの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が消灯,点灯が確認できれば通信成功です。
消灯命令の場合:
点灯命令の場合: