Armadillo-IoT+920MHz帯マルチホップ無線通信アドオンモジュール
と
株式会社エム・システム技研様よりお借りしました
・R3-NMW1-N:Modbus-RTU透過型920MHz帯特定小電力無線通信用通信カード
+R7M-SV4:直流電圧/電流入力ユニット
+R3-SV4S:直流電圧入力カード
+R3-DA16:接点入力カード
・WL40W1-US1:Modbus-RTU透過型920MHz帯特定小電力無線局(子局)、少点数入出力ユニット
のデモ機
を使って、 Armadillo-IoTから920MHz帯無線経由で、リモートI/Oの電圧、接点の情報を読み取って、クラウド(Heroku)経由で見てみました。
(ブラウザのURLの部分は、後述の手順でHerokuから割り当てられたURLになりますので、伏字(***.herokuapp.com)にしてます。)
当方で確認した手順、サンプルプログラムを下記に説明します。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
注意)
ここでは、当方が確認した簡易的な手順を示しているに過ぎません。(エラー処理等は考慮されていません。)
本格的には、エラー処理、フェイルセーフ等のソフト設計を行う必要があります。
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
<本ブログ内での呼称について>
以降、本ブログ内では、
920MHz帯マルチホップ無線通信アドオンモジュールは、「920MHz無線(親機)」
R3-NMW1-N:Modbus-RTU透過型920MHz帯特定小電力無線通信用通信カードを「R3-NMW1-N(920MHz無線通信カード)」
R7M-SV4:直流電圧/電流入力ユニットを「R7M-SV4(直流電圧/電流入力ユニット)」
R3-SV4S:直流電圧入力カードを「R3-SV4S(直流電圧入力カード)」
R3-DA16:接点入力カードを「R3-DA16(接点入力カード)」
WL40W1-US1:Modbus-RTU透過型920MHz帯特定小電力無線局(子局)、少点数入出力ユニットを
「WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)」
と呼称することがあります。
また、上記のうち、920MHz無線通信の
R3-NMW1-N(920MHz無線通信カード)
WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)
を「920MHz無線(子機)」
と呼称することがあります。
今回の動作確認は下図のような構成です。
手順の概要は下記のようになります。
●1.機材、資料、ツール
●2.920MHz無線経由でリモートI/Oと通信するデモ機の構成
●3.Armadillo-IoTのアドオンインタフェースの設定
●4.Armadillo-IoTから920MHz無線(親機)の設定
●5.Armadillo-IoTから920MHz無線(親機)の運用開始
●6.920MHz無線(子機)の設定
●7.リモートI/Oと通信する仕様の確認
●8.920MHz無線経由でリモートI/Oと通信する仕様の確認
●9.920MHz無線経由でリモートI/Oからデータを取得するサンプルプログラム
●10.クラウド(Heroku)側のアプリの準備
●11.920MHz無線経由でリモートI/Oから取得したデータをクラウド(Heroku)経由で見る
●1.機材、資料、ツール
機材は下記のものを使用しました。
・Armadillo-IoT
株式会社エム・システム技研様よりお借りしました
・R3-NMW1-N:Modbus-RTU透過型920MHz帯特定小電力無線通信用通信カード
+R7M-SV4:直流電圧/電流入力ユニット
+R3-SV4S:直流電圧入力カード
+R3-DA16:接点入力カード
・WL40W1-US1:Modbus-RTU透過型920MHz帯特定小電力無線局(子局)、少点数入出力ユニット
のデモ機(冒頭の写真)
今回の動作確認において、下記の資料を使用しました。
・OKI製の920MHz帯無線に関する取扱説明書、API仕様書等は、沖電気工業株式会社様の下記Webサイトから入手しました。
http://www.oki.com/jp/920M/support/
・株式会社エム・システム技研様の下記仕様書を参考にしました。
R3-NMW1-N仕様書
R7M-SV4仕様書
R3-SV4S仕様書
R3-DA16仕様書
WL40W1-US1仕様書
Modbusプロトコル概説書
今回の動作確認に当たり、デモ機の設定は株式会社エム・システム技研様にお願いしました。 設定ツール等については、株式会社エム・システム技研様にお問い合わせください。
●2.920MHz無線経由でリモートI/Oと通信するデモ機の構成
920MHz無線経由の「リモートI/O」のデモ機は、下記のような構成、設定になっています。
●3.Armadillo-IoTのアドオンインタフェースの設定
今回確認した手順では、Armadillo-IoTと920MHz帯マルチホップ無線通信アドオンモジュールとは単純にシリアル通信しました。
補足)
<a href=http://conexio-m2m.jp/product/armadillo.html>920MHz帯マルチホップ無線通信アドオンモジュール</a>の正式な導入手順については、
下記コネクシオ株式会社様にお問い合わせください。
〒160 -6137
東京都新宿区西8-17-1 新宿グランドタワー37 階
TEL:03-5331-3677
コネクシオ株式会社
法人事業本部 法人営業第6部 システム開発課
m2m@conexio.co.jp
Armadillo-IoT ゲートウェイスタンダードモデル製品マニュアル 8.3.3. UARTより、 今回使用するアドオンインタフェースは、CON2の/dev/ttymxc0なので、 UART1:/dev/ttymxc0 を有効にします。
アドオンインタフェース(CON2)のシリアル通信(UART1)を有効にするために カーネルコンフィギュレーションで下記のように設定します。
Kernel Configuration
System Type --->
[*] Freescale i.MX family <ARCH_MXC>
Freescale i.MX support --->
[*] Support Armadillo-IoTG Std Base board <MACH_ARMADILLO_IOTG_STD>
[ ] Add-On Module Auto Detect <AIOTG_STD_ADDON_AUTO_DETECT>
Extension I/F Options --->
[*] Enable UART1 at CON1/CON2 <AIOTG_STD_UART1>
[ ] Enable UART1 HW flow control at CON1/CON2
<AIOTG_STD_UART1_HW_FLOW>
上記のコンフィギュレーション後、ビルドを行い、イメージをArmadillo-IoTに書き込みます。
●4.Armadillo-IoTから920MHz無線(親機)の設定
下記手順において、920MHz無線のコマンド、設定はAPI仕様書等のドキュメントを参考にしています。
補足)
OKI製の920MHz帯無線通信モジュール(親機)および後述の920MHz帯無線ユニット(子機)に関する
ドキュメント、ソフトウェアは、沖電気工業株式会社様のWebサイトから入手可能です。
<a href=http://www.oki.com/jp/920M/support/>http://www.oki.com/jp/920M/support/</a>
920MHz無線(親機)の運用開始までのシーケンスは下記のとおりです。
920MHz無線(親機)-> Armadillo-IoT:起動完了通知
Armadillo-IoT -> 920MHz無線(親機):基本設定
920MHz無線(親機)-> Armadillo-IoT:基本設定応答
Armadillo-IoT -> 920MHz無線(親機):初期コンフィギュレーション設定(暗号化鍵等)
920MHz無線(親機)-> Armadillo-IoT:初期コンフィギュレーション設定応答
Armadillo-IoT -> 920MHz無線(親機):運用開始要求
<無線起動->子機ネットワーク接続開始>
920MHz無線(親機)-> Armadillo-IoT:運用開始応答
(無線起動後、子機ネットワーク接続完了することで通信可能)
今回は、Armadillo-IoTから920MHz無線(親機)の設定、確認を行いました。
補足)
920MHz無線(親機)にはマイクロUSBコネクタが搭載されているので、PCと直接接続して設定することが可能です。
この場合は、沖電気工業株式会社様の保守コンソールのソフトウェア「MH920 Console for Module」を使用します。
920MHz無線(親機)とArmadillo-IoTとの通信のデータ構造は下記のとおりです。
・Armadillo-IoTから920MHz無線(親機)への設定、確認
・920MHz無線(親機)からArmadillo-IoTへの応答、通知
(Data内で"0x7e"を使う場合は、エスケープシーケンスで補完します。ここでは説明を割愛します。)
920MHz無線(親機)とR3-NMW1-N(920MHz無線通信カード)、WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)の
設定を整合する必要があります。
今回の確認手順では、下記のような設定に合わせました。
PAN-ID: 0005
ネットワークID: MH920
chリスト: 09のみ
MACアドレスリスト: MACアドレス認証しない
暗号化鍵: ********************************(左記は伏字にしてます。)
パケットフィルタリング: あり(ポーリング)
局番解析リスト:
[ショートアドレス: 0001、局番: 1]: R3-NMW1-N(920MHz無線通信カード)の有線通信(※1)
※1)R7M-SV4(直流電圧/電流入力ユニット)と接続
[ショートアドレス: 0001、局番: 2]: R3-NMW1-N(920MHz無線通信カード)の内部通信バス(※2)
※2)R3-SV4S(直流電圧入力カード)、R3-DA16(接点入力カード)と接続
[ショートアドレス: 0002、局番: 3]: WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)
上記のデータ構造を参考に、Armadillo-IoTから920MHz無線(親機)の設定、確認を行うサンプルプログラムを添付します。
serial_oki920_msys920_set.tar.gz
プログラム内では、920MHz無線(親機)への各コマンドはcmd_***という名称の配列で設定しています。
また、各コマンドに対する920MHz無線(親機)の応答が標準出力されるようにしています。
各コマンドの用途を説明します。
・基本設定確認のコマンド(cmdid=0x01)
static unsigned char cmd_01[15] = {0x7e, 0x10, 0x00, 0x0a,
0x10, 0x8f, 0x8f, 0x01, 0x01, 0x12, 0x34, 0x00, 0x01, 0x02, 0x7e};
今回は、このコマンドに対する応答で
PAN-ID:0005
ネットワークID:MH920
chリスト:09のみ
を確認しました。
ここで確認したPAN-ID、ネットワークID、chを
R3-NMW1-N(920MHz無線通信カード)
WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)
に設定します。
・MACアドレスリスト確認のコマンド(cmdid=0x11)
static unsigned char cmd_11[15] = {0x7e, 0x10, 0x00, 0x0a,
0x10, 0x8f, 0x8f, 0x01, 0x11, 0x13, 0x57, 0x00, 0x01, 0x02, 0x7e};
今回は、このコマンドに対する応答で
MACアドレスリスト: MACアドレス認証しない
に設定になっていることを確認しました。
・暗号化鍵確認のコマンド(cmdid=0x10)
static unsigned char cmd_10[78] = {0x7e, 0x10, 0x00, 0x49,
0x10, 0x8f, 0x8f, 0x01, 0x10, 0x12, 0x34, 0x00, 0x40,
/* 略 */
0x7e};
このコマンドに対する応答で確認した暗号化鍵を
R3-NMW1-N(920MHz無線通信カード)
WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)
に設定します。
(暗号化鍵設定のコマンドは割愛します。)
・パケットフィルタリング設定のコマンド(cmdid=0x06)
static unsigned char cmd_23w[33] = {0x7e, 0x10, 0x00, 0x1c,
0x10, 0x8f, 0x8f, 0x01, 0x23, 0x24, 0x68, 0x00, 0x13,
0x01, 0x01, 0x00, 0x28, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x7e};
このコマンドで、
パケットフィルタリング: あり(ポーリング)
に設定しました。
・パケットフィルタリング確認のコマンド(cmdid=0x23)
static unsigned char cmd_23[15] = {0x7e, 0x10, 0x00, 0x0a,
0x10, 0x8f, 0x8f, 0x01, 0x23, 0x24, 0x68, 0x00, 0x01, 0x02, 0x7e};
このコマンドに対する応答でパケットフィルタリングの設定を確認します。
・局番号解析用データ設定のコマンド(cmdid=0x06)
static unsigned char cmd_06w[41] = {0x7e, 0x10, 0x00, 0x24,
0x10, 0x8f, 0x8f, 0x01, 0x06, 0x12, 0x34, 0x00, 0x1b,
0x01, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00,
0x00,
0x7e};
このコマンドでプロトコルと局番解析の設定ができます。
今回は、Modbus(RTU)、局番解析あり、に設定しました。
・局番号解析用データ確認のコマンド(cmdid=0x06)
static unsigned char cmd_06[15] = {0x7e, 0x10, 0x00, 0x0a,
0x10, 0x8f, 0x8f, 0x01, 0x06, 0x24, 0x68, 0x00, 0x01, 0x02, 0x7e};
このコマンドに対する応答で、上記の局番号解析用データ設定コマンドが反映されたかを確認しました。
・局番リストの確認、設定のコマンド(cmdid=0x88)
static unsigned char cmd_88w1[919] = /* 略 */
static unsigned char cmd_88w2[919] = /* 略 */
このコマンドで、
局番解析リスト:
[ショートアドレス: 0001、局番: 1]: R3-NMW1-N(920MHz無線通信カード)の有線通信(※1)
※1)R7M-SV4(直流電圧/電流入力ユニット)と接続
[ショートアドレス: 0001、局番: 2]: R3-NMW1-N(920MHz無線通信カード)の内部通信バス(※2)
※2)R3-SV4S(直流電圧入力カード)、R3-DA16(接点入力カード)と接続
[ショートアドレス: 0002、局番: 3]: WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)
を登録しました。
・局番リストの確認のコマンド(cmdid=0x88)
static unsigned char cmd_88[15] = {0x7e, 0x10, 0x00, 0x0a,
0x10, 0x8f, 0x8f, 0x01, 0x88, 0x12, 0x34, 0x00, 0x01, 0x02, 0x7e};
このコマンドに対する応答で、上記の局番リスト設定コマンドが反映されたかを確認しました。
<サンプルプログラムの補足>
・Armadillo-IoTと920MHz無線(親機)とはシリアル通信であることから、
Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー
をベースに、シリアル通信で受信したデータを、今回の920MHz無線のAPI仕様(注)に基づいて通信するように改造したものです。
注)今回使用したコマンドは、上記のように静的に設定しているので、任意のAPI仕様には対応していません。
また、受信データについては、ヘッダサーチ、CRC計算などは有していません。
<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_oki920_msys920_setディレクトリ内でmakeすると、
serial_oki920_msys920_setという実行ファイルができます。
この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。 (下記は920MHz無線(親機)をArmadillo-IoTのアドオンインタフェースのCON2に接続した場合のため、/dev/ttymxc0を指定。)
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_msys920_set /dev/ttymxc0
コマンド実行後、920MHz無線(親機)からの応答がコンソールに出力されますので、 PAN-ID、ネットワークID、chリスト、暗号化鍵等を確認します。 応答待ちの状態が継続するので、Ctr+Cでプログラムを終了してください。
●5.Armadillo-IoTから920MHz無線(親機)の運用開始
無線を起動するため、運用開始のコマンドを発行します。
Armadillo-IoTから920MHz無線(親機)の運用開始のコマンドを発行するサンプルプログラムを添付します。
serial_oki920_start_20151115.tar.gz
上記3と同様に運用開始のコマンドを配列に設定して、シリアル通信で920MHz無線(親機)に設定しています。
・運用開始のコマンド(cmdid=0xd3)
static unsigned char cmd_d3[14] = {0x7e, 0x10, 0x00, 0x09,
0x10, 0x8f, 0x8f, 0x01, 0xd3, 0x56, 0x78, 0x00, 0x00, 0x7e};
このコマンド実行により無線が起動します。
<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_oki920_start_20151115ディレクトリ内でmakeすると、
serial_oki920_startという実行ファイルができます。
この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルを引数として実行します。 (下記は920MHz無線(親機)をArmadillo-IoTのアドオンインタフェースのCON2に接続した場合のため、/dev/ttymxc0を指定。)
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_start /dev/ttymxc0
応答待ちの状態が継続するので、Ctr+Cでプログラムを終了してください。 (単に応答待ちの状態を終了しているだけなので、プログラムは終了しても、 920MHz無線(親機)の無線は起動したままになっています。)
●6.920MHz無線(子機)の設定
920MHz無線(子機)を、手順4の920MHz無線(親機)の設定(下記)に合わせます。
(今回のブログ作成においては、株式会社エム・システム技研様に設定をお願いしました。)
PAN-ID: 0005
ネットワークID: MH920
chリスト: 09のみ
MACアドレスリスト: MACアドレス認証しない
暗号化鍵: ********************************(左記は伏字にしてます。)
パケットフィルタリング: あり(ポーリング)
局番解析リスト:
[ショートアドレス: 0001、局番: 1]: R3-NMW1-N(920MHz無線通信カード)の有線通信(※1)
※1)R7M-SV4(直流電圧/電流入力ユニット)と接続
[ショートアドレス: 0001、局番: 2]: R3-NMW1-N(920MHz無線通信カード)の内部通信バス(※2)
※2)R3-SV4S(直流電圧入力カード)、R3-DA16(接点入力カード)と接続
[ショートアドレス: 0002、局番: 3]: WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)
920MHz無線(親機)の運用を開始していると、920MHz無線(親機)とネットワーク接続されます。 (接続に20秒くらいかかります。) 接続が成功すると、920MHz無線(子機)の920RunのLEDが点灯します。
●7.リモートI/Oと通信する仕様の確認
7.1.リモートI/Oから取得するデータとアドレスの相関
ここでは、
・R7M-SV4(直流電圧/電流入力ユニット)からは、アナログ電圧(4ch)
・R3-SV4S(直流電圧入力カード)からは、アナログ電圧(4ch)
・R3-DA16(接点入力カード)からは、接点のON/OFF(16ch)
・WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)からは、アナログ電圧
(1ch)、積算パルス数
のデータを取得します。
手順2のように接続されている場合、上記データの取得には下記のアドレスを指定します。
[ショートアドレス: 0001、局番: 1]: R3-NMW1-N(920MHz無線通信カード)の有線通信の
アドレス1-4: R7M-SV4(直流電圧/電流入力ユニット)のアナログ電圧(4ch)
[ショートアドレス: 0001、局番: 2]: R3-NMW1-N(920MHz無線通信カード)の内部通信バスの
アドレス1-4: R3-SV4S(直流電圧入力カード)からは、アナログ電圧(4ch)
アドレス129-144: R3-DA16(接点入力カード)からは、接点のON/OFF(16ch)
[ショートアドレス: 0002、局番: 3]: WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)の
アドレス1: アナログ電圧(1ch)
アドレス3-4: 積算パルス数
7.2.リモートI/Oからデータを取得するModbus(RTU)コマンド
リモートI/OとはRS-485 Modbus(RTU)で通信します。
手順7.1のデータとアドレスの相関に基づいて、電圧、接点などの情報を取得するModbus(RTU)のコマンドを
Modbusプロトコル概説書
R3-NMW1-N仕様書
WL40W1-US1仕様書
を参考に生成すると、下記のようになります。
・R7M-SV4(直流電圧/電流入力ユニット)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンド
0x01 0x04 0x00 0x00 0x00 0x04 0xf1 0xc9
// スレーブアドレス: 0x01 (R3-NMW1-N(920MHz無線通信カード)の有線通信の局番: 1)
// ファンクションコード: 0x04 (Read Input Register)
// 開始アドレス: 0x00 0x00 (上記「アドレス1-4: R7M-SV4(直流電圧/電流入力ユニット)のアナログ電圧(4ch)」の開始アドレスから1を引いて設定)
// レジスター数: 0x00 0x04 (アナログ電圧(4ch)の4レジスタ)
// CRC: 0xf1 0xc9
・R3-SV4S(直流電圧入力カード)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンド
0x02 0x04 0x00 0x00 0x00 0x04 0xf1 0xfa
// スレーブアドレス: 0x02 (R3-NMW1-N(920MHz無線通信カード)の内部通信バスの局番: 2)
// ファンクションコード: 0x04 (Read Input Register)
// 開始アドレス: 0x00 0x00 (上記「アドレス1-4: R3-SV4S(直流電圧入力カード)からは、アナログ電圧(4ch)」の開始アドレスから1を引いて設定)
// レジスター数: 0x00 0x04 (アナログ電圧(4ch)の4レジスタ)
// CRC: 0xf1 0xfa
・R3-DA16(接点入力カード)から、接点のON/OFF(16ch)を取得するModbus(RTU)のコマンド
0x02 0x02 0x00 0x80 0x00 0x10 0x78 0x1d
// スレーブアドレス: 0x02 (R3-NMW1-N(920MHz無線通信カード)の内部通信バスの局番: 2)
// ファンクションコード: 0x02 (Read Input Status)
// 開始アドレス: 0x00 0x80 (上記「アドレス129-144: R3-DA16(接点入力カード)からは、接点のON/OFF(16ch)」の開始アドレスから1を引いて設定)
// レジスター数: 0x00 0x10 (接点のON/OFF(16ch)の16レジスタ)
// CRC: 0x78 0x1d
・WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)から、アナログ電圧(1ch)と積算パルス数を取得するModbus(RTU)のコマンド
0x03 0x04 0x00 0x00 0x00 0x04 0xf0 0x2b
// スレーブアドレス: 0x02 (WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)の局番: 3)
// ファンクションコード: 0x04 (Read Input Register)
// 開始アドレス: 0x00 0x00 (上記「アドレス1: アナログ電圧(1ch)」の開始アドレスから1を引いて設定)
// レジスター数: 0x00 0x04 (アナログ電圧(1ch)から積算パルス数までの4レジスタ)
// CRC: 0xf0 0x2b
7.3.リモートI/OからのModbus(RTU)レスポンス
手順7.2のコマンドを送信に対して、下記のようなレスポンスが返ってきます。
下記のレスポンスについて、
Modbusプロトコル概説書
R3-NMW1-N仕様書
WL40W1-US1仕様書
を参考に解釈を加えます。
・R7M-SV4(直流電圧/電流入力ユニット)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンド
0x01 0x04 0x00 0x00 0x00 0x04 0xf1 0xc9
に対するレスポンスは下記のようになります。
0x01 0x04 0x08 0x0c 0x0e 0x13 0x87 0x13 0x87 0x13 0x87 0x84 0xda
// スレーブアドレス: 0x01 (R3-NMW1-N(920MHz無線通信カード)の有線通信の局番: 1)
// ファンクションコード: 0x04 (Read Input Register)
// データバイト数: 0x08
// データ1: 0x0c 0x0e (アナログ電圧(0ch)のデータ)
// データ2: 0x13 0x87 (アナログ電圧(1ch)のデータ)
// データ3: 0x13 0x87 (アナログ電圧(2ch)のデータ)
// データ4: 0x13 0x87 (アナログ電圧(3ch)のデータ)
// CRC: 0x84 0xda
補足)R7M-SV4仕様書を参考にすると、 アナログ電圧のデータは、電圧のレンジ(設定による)の-15%~115%を2の補数で表記されています。
・R3-SV4S(直流電圧入力カード)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンド
0x02 0x04 0x00 0x00 0x00 0x04 0xf1 0xfa
に対するレスポンスは下記のようになります。
0x02 0x04 0x08 0x1f 0x1d 0x14 0x17 0x1f 0x78 0x14 0x1a 0xd9 0x15
// スレーブアドレス: 0x02 (R3-NMW1-N(920MHz無線通信カード)の内部通信バスの局番: 2)
// ファンクションコード: 0x04 (Read Input Register)
// データバイト数: 0x08
// データ1: 0x1f 0x1d (アナログ電圧(0ch)のデータ)
// データ2: 0x14 0x17 (アナログ電圧(1ch)のデータ)
// データ3: 0x1f 0x78 (アナログ電圧(2ch)のデータ)
// データ4: 0x14 0x1a (アナログ電圧(3ch)のデータ)
// CRC: 0xd9 0x15
補足)R3-NMW1-N仕様書を参考にすると、 アナログ電圧のデータは、電圧のレンジ(設定による)の-15%~115%を2の補数で表記されています。
・R3-DA16(接点入力カード)から、接点のON/OFF(16点)を取得するModbus(RTU)のコマンド
0x02 0x02 0x00 0x80 0x00 0x10 0x78 0x1d
に対するレスポンスは下記のようになります。
0x02 0x02 0x02 0x06 0x00 0xfe 0x18
// スレーブアドレス: 0x02 (R3-NMW1-N(920MHz無線通信カード)の内部通信バスの局番: 2)
// ファンクションコード: 0x02 (Read Input Status)
// データバイト数: 0x02
// データ: 0x06 (接点のON/OFF(8点分)のデータ)
// データ: 0x00 (接点のON/OFF(8点分)のデータ)
// CRC: 0xfe 0x18
・WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)から、アナログ電圧(1ch)と積算パルス数を取得するModbus(RTU)のコマンド
0x03 0x04 0x00 0x00 0x00 0x04 0xf0 0x2b
に対するレスポンスは下記のようになります。
0x03 0x04 0x08 0xfe 0x0c 0x00 0x00 0x00 0x91 0x00 0x00 0x3c 0x90
// スレーブアドレス: 0x02 (WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)の局番: 3)
// ファンクションコード: 0x04 (Read Input Register)
// データバイト数: 0x08
// データ1: 0xfe 0x0c (アナログ電圧のデータ)
// データ2: 0x00 0x00 (未使用)
// データ3: 0x00 0x91 (積算パルスのデータ(下位))
// データ4: 0x00 0x00 (積算パルスのデータ(上位))
// CRC: 0x3c 0x90
補足)WL40W1-US1仕様書を参考にすると、 アナログ電圧のデータは、電圧のレンジ(設定による)の-5%~105%を2の補数で表記されています。
●8.920MHz無線経由でリモートI/Oと通信する仕様の確認
8.1.920MHz無線経由の通信のデータ構造
Armadillo-IoTから920MHz無線を経由してリモートI/Oと通信するには、920MHz無線(親機)と透過データというデータ構造で通信します。 透過データの構造は下記のようになっています。
このデータ構造において、Dataの箇所にリモートI/Oのコマンドを埋めることで、リモートI/Oと通信できます。
8.2.920MHz無線経由のリモートI/Oへのコマンドのデータ構造
前述の7.2のコマンドを上記の8.1の透過データに埋め込んだものが、Armadillo-IoTから920MHz無線(親機)に送信するデータになります。
・R7M-SV4(直流電圧/電流入力ユニット)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンド を920MHz無線の透過データに埋め込んだコマンド
0x7e 0x11 0x00 0x08 0x01 0x04 0x00 0x00 0x00 0x04 0xf1 0xc9 0x7e
// 0x01 0x04 0x00 0x00 0x00 0x04 0xf1 0xc9 が透過データ(リモートI/Oへのコマンド)
・R3-SV4S(直流電圧入力カード)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンド を920MHz無線の透過データに埋め込んだコマンド
0x7e 0x11 0x00 0x08 0x02 0x04 0x00 0x00 0x00 0x04 0xf1 0xfa 0x7e
// 0x02 0x04 0x00 0x00 0x00 0x04 0xf1 0xfa が透過データ(リモートI/Oへのコマンド)
・R3-DA16(接点入力カード)から、接点のON/OFF(16ch)を取得するModbus(RTU)のコマンド を920MHz無線の透過データに埋め込んだコマンド
0x7e 0x11 0x00 0x08 0x02 0x02 0x00 0x80 0x00 0x10 0x78 0x1d 0x7e
// 0x02 0x02 0x00 0x80 0x00 0x10 0x78 0x1d が透過データ(リモートI/Oへのコマンド)
・WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)から、アナログ電圧と積算パルス数を取得するModbus(RTU)のコマンド を920MHz無線の透過データに埋め込んだコマンド
0x7e 0x11 0x00 0x08 0x03 0x04 0x00 0x00 0x00 0x04 0xf0 0x2b 0x7e
// 0x03 0x04 0x00 0x00 0x00 0x04 0xf0 0x2b が透過データ(リモートI/Oへのコマンド)
8.3.920MHz無線経由のリモートI/Oからのレスポンスのデータ構造
上記8.3のデータに対して920MHz無線(子機)経由でリモートI/Oと通信が成功すると、920MHz無線(子機)からレスポンスが返ってきます。 Armadillo-IoTが920MHz無線(親機)からレスポンスを取得したデータは、 前述の7.3のレスポンスが上記の8.1の透過データに埋め込まれたものになっています。
・R7M-SV4(直流電圧/電流入力ユニット)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンドに対するレスポンス が920MHz無線の透過データに埋め込まれたレスポンス
0x7e 0x11 0x00 0x0d 0x01 0x04 0x08 0x0c 0x0e 0x13 0x87 0x13 0x87 0x13 0x87 0x84 0xda 0x7e
// 0x01 0x04 0x08 0x0c 0x0e 0x13 0x87 0x13 0x87 0x13 0x87 0x84 0xd が透過データ(リモートI/Oからのレスポンス)
・R3-SV4S(直流電圧入力カード)から、アナログ電圧(4ch)を取得するModbus(RTU)のコマンドに対するレスポンス が920MHz無線の透過データに埋め込まれたレスポンス
0x7e 0x11 0x00 0x0d 0x02 0x04 0x08 0x1f 0x1d 0x14 0x17 0x1f 0x78 0x14 0x1a 0xd9 0x15 0x7e
// 0x02 0x04 0x08 0x1f 0x1d 0x14 0x17 0x1f 0x78 0x14 0x1a 0xd9 0x19 が透過データ(リモートI/Oからのレスポンス)
・R3-DA16(接点入力カード)から、接点のON/OFF(16ch)を取得するModbus(RTU)のコマンドに対するレスポンス が920MHz無線の透過データに埋め込まれたレスポンス
0x7e 0x11 0x00 0x07 0x02 0x02 0x02 0x06 0x00 0xfe 0x18 0x7e
// 0x02 0x02 0x02 0x06 0x00 0xfe 0x18 が透過データ(リモートI/Oからのレスポンス)
・WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)から、アナログ電圧と積算パルス数を取得するModbus(RTU)のコマンド に対するレスポンス が920MHz無線の透過データに埋め込まれたレスポンス
0x7e 0x11 0x00 0x0d 0x03 0x04 0x08 0xfe 0x0c 0x00 0x00 0x00 0x91 0x00 0x00 0x3c 0x90 0x7e
// 0x03 0x04 0x08 0xfe 0x0c 0x00 0x00 0x00 0x91 0x00 0x00 0x3c 0x90 が透過データ(リモートI/Oからのレスポンス)
●9.920MHz無線経由でリモートI/Oからデータを取得するサンプルプログラム
手順3のとおり、Armadillo-IoTと920MHz無線(親機)は、シリアルで通信します。
そこで、Armadillo実践開発ガイド第2部6.5.1. シリアルエコーサーバー
をベースに、Armadillo-IoTから920MHz無線経由でリモートI/Oの電圧、接点情報等を取得し、
ログファイルに出力するサンプルプログラムを作成しました。
serial_oki920_msys920_data.tar.gz
<サンプルプログラムの用法>
添付のサンプルプログラムをATDE上に解凍して、serial_oki920_msys920_dataディレクトリ内でmakeすると、
serial_oki920_msys920_dataという実行ファイルができます。
serial_oki920_msys920_data <device> [0..3]
引数
device:デバイスファイル(※)
※)920MHz無線(親機)を接続しているコネクタに応じて設定。CON1の場合、"/dev/ttymxc3"。CON2の場合、"/dev/ttymxc0"。
[0..3]: リモートI/Oの指定
0: R7M-SV4(直流電圧/電流入力ユニット)
1: R3-SV4S(直流電圧入力カード)
2: R3-DA16(接点入力カード)
3: WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)
serial_oki920_msys920_dataを実行すると、取得したデータのログ表示と、
log_R7M-SV4.txt
log_R3-SV4S.txt
log_R3-DA16.txt
log_WL40W1-US1.txt
というファイルへ、電圧や接点情報等のデータを書き込みます。
補足)ログファイル名は、リモートI/Oの指定に応じたものになります。
補足)ログファイルの中身は手順10のクラウド側のアプリに合わせて、各データを&で区切っています。
下記例は、920MHz無線(親機)をArmadillo-IoTのアドオンインタフェースのCON2に接続した場合(デバイスファイル"/dev/ttymxc0")です。
・R7M-SV4(直流電圧/電流入力ユニット)から、アナログ電圧(4ch)を取得する 実行結果のログ
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_msys920_data /dev/ttymxc0 0
******** Modbus(RTU) Command without CRC********
0x01 0x04 0x00 0x00 0x00 0x04
******** Modbus(RTU) Command to oki920 ********
0x7e 0x11 0x00 0x08 0x01 0x04 0x00 0x00 0x00 0x04 0xf1 0xc9 0x7e
******** Received Data ********
0x7e 0x11 0x00 0x0d 0x01 0x04 0x08 0x0c 0x0e 0x13 0x87 0x13 0x87 0x13 0x87 0x84 0xda 0x7e
**** R7M-SV4 Data ****
Note) Below [V] is calculeted as Input Range DC:+-10[V]
Channel 0: 0x0c 0x0e: 3.086[V]
Channel 1: 0x13 0x87: 4.999[V]
Channel 2: 0x13 0x87: 4.999[V]
Channel 3: 0x13 0x87: 4.999[V]
ログファイルの内容
[root@armadillo-iotg (ttymxc1) ~]# cat log_R7M-SV4.txt
r7v0=3.086&r7v1=4.999&r7v2=4.999&r7v3=4.999
・R3-SV4S(直流電圧入力カード)から、アナログ電圧(4ch)を取得する 実行結果のログ
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_msys920_data /dev/ttymxc0 1
******** Modbus(RTU) Command without CRC********
0x02 0x04 0x00 0x00 0x00 0x04
******** Modbus(RTU) Command to oki920 ********
0x7e 0x11 0x00 0x08 0x02 0x04 0x00 0x00 0x00 0x04 0xf1 0xfa 0x7e
******** Received Data ********
0x7e 0x11 0x00 0x0d 0x02 0x04 0x08 0x1f 0x1d 0x14 0x17 0x1f 0x78 0x14 0x1a 0xd9 0x15 0x7e
**** R3-SV4S Data ****
Note) Below [V] is calculeted as Input Range DC:+-10[V]
Channel 0: 0x1f 0x1d: 7.965[V]
Channel 1: 0x14 0x17: 5.143[V]
Channel 2: 0x1f 0x78: 8.056[V]
Channel 3: 0x14 0x1a: 5.146[V]
ログファイルの内容
[root@armadillo-iotg (ttymxc1) ~]# cat log_R3-SV4S.txt
r3v0=7.965&r3v1=5.143&r3v2=8.056&r3v3=5.146
・R3-DA16(接点入力カード)から、接点のON/OFF(16ch)を取得する 実行結果のログ
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_msys920_data /dev/ttymxc0 2
******** Modbus(RTU) Command without CRC********
0x02 0x02 0x00 0x80 0x00 0x10
******** Modbus(RTU) Command to oki920 ********
0x7e 0x11 0x00 0x08 0x02 0x02 0x00 0x80 0x00 0x10 0x78 0x1d 0x7e
******** Received Data ********
0x7e 0x11 0x00 0x07 0x02 0x02 0x02 0x06 0x00 0xfe 0x18 0x7e
**** R3-SV4S Data ****
0x0600
ログファイルの内容
[root@armadillo-iotg (ttymxc1) ~]# cat log_R3-DA16.txt
r3da=0x0600
・WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)から、アナログ電圧(1ch)と積算パルス数を取得する 実行結果のログ
[root@armadillo-iotg (ttymxc1) ~]# /root/serial_oki920_msys920_data /dev/ttymxc0 3
******** Modbus(RTU) Command without CRC********
0x03 0x04 0x00 0x00 0x00 0x04
******** Modbus(RTU) Command to oki920 ********
0x7e 0x11 0x00 0x08 0x03 0x04 0x00 0x00 0x00 0x04 0xf0 0x2b 0x7e
******** Received Data ********
0x7e 0x11 0x00 0x0d 0x03 0x04 0x08 0xfe 0x0c 0x00 0x00 0x00 0x91 0x00 0x00 0x3c 0x90 0x7e
**** WL40W1-US1 Data ****
Note) Below [V] is calculeted as Input Range DC:+-10[V]
Voltage: 0xfe 0x0c: -0.500[V]
Pulse: 145
ログファイルの内容
[root@armadillo-iotg (ttymxc1) ~]# cat log_WL40W1-US1.txt
wl40volt=-0.500&wl40pulse=145
<サンプルプログラムの補足>
serial_oki920_msys920_data.c
(Armadillo実践開発ガイド第2部 6.5.1. シリアルエコーサーバーをベースに今回のサンプル特有の箇所を抜粋します。)
この実行ファイルをArmadillo-IoTに置いて、シリアル通信のデバイスファイルとリモートI/Oを指定する番号を引数として実行します。
/**** sample: Modbus(RTU) command: begin ****/
// 手順7.2のリモートI/OへのModbus(RTU)コマンド。CRCは含まない。
/**** sample: Modbus(RTU) command: end ****/
/**** sample: oki920/R3 command: begin ****/
// 手順8.1の920MHz無線経由でModbus(RTU)コマンドを送るための透過データの雛形。
/**** sample: oki920/R3 command: end ****/
/**** sample: calcurate CRC: begin ****/
// CRCを計算する関数
*** sample: calcurate CRC: end ****/
/**** sample: variable: begin ****/
unsigned char src_6byte[6]; // CRC計算の元データ
unsigned char crc_2byte[2]; // CRC計算結果
int sample_mode; // リモートI/Oの指定
float r7_volt[4]; // R7M-SV4(直流電圧/電流入力ユニット)のアナログ電圧(4ch)
float r3_volt[4]; // R3-SV4S(直流電圧入力カード)のアナログ電圧(4ch)
unsigned char r3_da[2]; // R3-DA16(接点入力カード)の接点状態(16ch)
float wl40_volt; // WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)のアナログ電圧
int wl40_pulse; // WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)の積算パルス
/**** sample: variable: end ****/
/**** sample: make cmd_toka_8Byte(0x7e 0x11 0x00 0x08 [8Byte] 0x7e): begin ****/
// Modbus(RTU)コマンドの920MHz無線通信の透過データへの埋め込み。
/**** sample: make cmd_toka_8Byte(0x7e 0x11 0x00 0x08 [8Byte] 0x7e): end ****/
/**** sample: Command: Modbus(RTU) via oki920: begin ****/
// Modbus(RTU)コマンドを組み込んだ920MHz無線通信の透過データへの送信
/**** sample: Command: Modbus(RTU) via oki920: end ****/
/**** sample: receive: begin ****/
// 920MHz無線通信の透過データの処理
/**** sample: get sensor data and calculate : begin ****/
// 手順8.3に基づいて、920MHz無線通信の透過データからリモートI/Oのデータを抽出。
// 手順7.3に基づいて、リモートI/Oのデータから計算、ログ表示、ログファイルへ出力。
// アナログ電圧->2の補数を用いて10進数化して、[V]で表記。
// 接点(16ch)->16進数で表記。
// 積算パルス->10進数化して、[回]で表記。
/**** sample: get sensor data and calculate : end ****/
●10.クラウド(Heroku)側のアプリの準備
10.1.準備
まず、Armadillo-IoT + Heroku(Node.js)でHello World のとおり、 Armadillo側からのデータ送信と動作確認まで行ってください。 以下、この手順を実行したことをベースに説明します。 よって以下では、ATDE5の ~/temp/myapp がクラウド(Heroku)側のアプリ用のディレクトリとします。
10.2.サンプル
クラウド(Heroku)側のアプリのサンプルソースを添付します。 myapp_msys920_20160318.tar.gz を解凍して、myapp_msys920_20160318ディレクトリの中身を ~/temp/myapp ディレクトリの下にコピーしてください。
<サンプルソースの説明>
今回のサンプル特有の部分のみ説明します。
app.js
・HerokuのURL(***.herokuapp.com)にアクセスした際、index.ejsを表示するようにします。 表示の際、index.ejsに電圧、接点情報などを与えています。
app.get('/', function(req, res){
res.render('index',
{
r7v0: r7v0, r7v1: r7v1, r7v2: r7v2, r7v3: r7v3,
r3v0: r3v0, r3v1: r3v1, r3v2: r3v2, r3v3: r3v3,
r3da: r3da,
wl40volt: wl40volt, wl40pulse: wl40pulse
});
});
・HerokuのURL(***.herokuapp.com/series)にポストされたデータ(※)をパースして、上記のindex.ejsに渡す変数に代入しています。 ※)上記サンプルアプリ(serial_oki920_msys920_data)を実行時のログファイル 例えば、 log_R7M-SV4.txt の
r7v0=3.086&r7v1=4.999&r7v2=4.999&r7v3=4.999
という形式のデータです。"&"で電圧、接点情報などを区切っています。
app.post('/series', function(req, res) {
console.log('post:/series');
r7v0 = req.body.r7v0; // R7M-SV4(直流電圧/電流入力ユニット)のアナログ電圧(ch0)
r7v1 = req.body.r7v1; // R7M-SV4(直流電圧/電流入力ユニット)のアナログ電圧(ch1)
r7v2 = req.body.r7v2; // R7M-SV4(直流電圧/電流入力ユニット)のアナログ電圧(ch2)
r7v3 = req.body.r7v3; // R7M-SV4(直流電圧/電流入力ユニット)のアナログ電圧(ch3)
r3v0 = req.body.r3v0; // R3-SV4S(直流電圧入力カード))のアナログ電圧(ch0)
r3v1 = req.body.r3v1; // R3-SV4S(直流電圧入力カード))のアナログ電圧(ch1)
r3v2 = req.body.r3v2; // R3-SV4S(直流電圧入力カード))のアナログ電圧(ch2)
r3v3 = req.body.r3v3; // R3-SV4S(直流電圧入力カード))のアナログ電圧(ch3)
r3da = req.body.r3da; // R3-DA16(接点入力カード)の接点情報(16ch分)
wl40volt = req.body.wl40volt; // WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)のアナログ電圧
wl40pulse = req.body.wl40pulse; // WL40W1-US1(920MHz無線(子局)+少点数入出力ユニット)の積算パルス数
res.send("Received\n");
});
view/index.ejs
・上記app.get('/', function(req, res)により、受け取ったリモートI/Oのセンサーデータを表示するhtmlです。
10.3.サンプルの実行
下記のコマンドで、クラウド(Heroku)にアップロードします。
[atde ~/temp/myapp]$ git add --all
[atde ~/temp/myapp]$ git commit -m "msys920"
[atde ~/temp/myapp]$ git push heroku master:master
10.4.アプリの動作確認 Webブラウザで https://***.herokuapp.com (***.herokuapp.comの部分は、手順10.1で確認したHerokuのURL) を実行すると、冒頭のWebブラウザの写真のように表示されます。 (ここまでの手順では、データを受信してないので、各値はオール0になります。)
●11.920MHz無線経由でリモートI/Oから取得したデータをクラウド(Heroku)経由で見る
920MHz無線経由でリモートI/Oから取得したデータをクラウドに送信するスクリプト send_msys920.sh を添付します。
このスクリプトをArmadillo-IoTの/rootディレクトリに置いて、実行権限をつけてください。 サンプルプログラムserial_oki920_msys920_dataも Armadillo-IoTの/rootディレクトリに置いて実行します。
[root@armadillo-iotg (ttymxc1) ~]# chmod +x send_msys920.sh
[root@armadillo-iotg (ttymxc1) ~]# ls /root
send_msys920.sh
serial_oki920_msys920_data
send_msys920.shは、下記のように使用します。
send_msys920.sh <device> <HerokuのURL>
引数
device:シリアルインタフェースのデバイスファイル("/dev/ttymxc0")
HerokuのURL:手順10で確認したHerokuのURL
例)920MHz無線(親機)をArmadillo-IoTのCON2(/dev/ttymxc0)に接続し、 HerokuのURLが***.herokuapp.comの場合、下記のように実行します。
[root@armadillo-iotg (ttymxc1) ~]# ./send_msys920.sh /dev/ttymxc0 https://***.herokuapp.com/series
上記のスクリプトを実行すると、Armadillo-IoTは920MHz無線経由でリモートI/Oから
電圧、接点情報などを10秒毎に取得し、算出値を書き込んだログファイル
log_R7M-SV4.txt
log_R3-SV4S.txt
log_R3-DA16.txt
log_WL40W1-US1.txt
から読みだして、クラウド(Herokuのhttps://***.herokuapp.com/series)に送信します。
Webブラウザで、https://***.herokuapp.comにアクセスすると、Armadillo-IoTが送信したリモートI/Oのデータが 冒頭のWebブラウザの写真のように見ることができます。
補足)
Webブラウザの表示の更新には再読み込みが必要です。
今回の設定の場合は、10秒毎にリモートI/Oのデータを取得しているので、
Webブラウザの表示の更新間隔は10秒以上になります。
クラウド(Heroku)側のアプリがデータを受信した場合は、"Received"という文字をArmadillo-IoTに送信するので、
クラウド(Heroku)側が受け取ったかどうかを、Armadillo-IoTの標準出力で確認することができます。