PATLITE LA6-POEはPOEに対応した積層情報表示灯です。
本製品は、PoEにより電源供給/ネットワーク接続されるとともに、PNS/PHN互換コマンド/HTTPによる制御に加え、Modbus/TCPでの制御が可能です。
今回は、本製品をOpenBlocks IoTシリーズの標準ファームウェア3.3.2よりmodbus client接続設定を行い、MQTTおよびAzure IoT Hub経由でのJSONメッセージによるリモート制御の方法について説明します。
初期設定について
今回はお借りした機器の設定のまま利用しましたので、
PATLITE LA6-POE IP address : 192.168.10.1/24
としてネットワーク回りの設定を行っています。
OpenBlocksはeth0をWAN側の接続に使用し、eth1をLA6-POE接続用に使用します。
BX/EX/VX1の場合は、WAN側接続にWiFiもしくはLTE/3Gを利用し、ローカル側のネットワークに有線LANを割り付ける必要があります。(BXシリーズの場合、USB二股ケーブルにUSBイーサネットアダプタを接続します)
ローカルのLANには192.168.10.xxx (xxxは1以外)を設定して下さい。
Modbusクライアントの送受信設定
アプリ設定により、デフォルトアプリ起動制御内のPD Handler MODBUS Clientを「使用する」に、アプリ起動制御内もPD Handler MODBUS Clientを「使用する」に設定します。
Modbus(C)登録タブにより、クライアントデバイスの登録を行います。
LA6-POEをデバイス番号mdcdev_0000001として登録しました。
送受信設定
今回はAzureからAzure IoT Hubからのメッセージ送受信を行うとともに、ローカル側でもテストを行えるように、Node-REDのMOSCAノードによるMQTTブローカーを利用し、標準のMQTT接続によるメッセージ送受信も行いました。
Azure IoT Hubの送受信設定
利用するAzure IoT Hub名を始めとした各種設定を行います。
MQTTサーバー設定
OpenBlocks本体側にもMQTTサーバを起動するため、以下の送受信設定を行います。
送信先ホスト: localhost クライアントID: test トピックプレフィックス: pub_root 受信トピックプレフィックス: sub_root プロトコル: tcp ポート番号: 1883
インターバルは今回は0に設定しています。
Modbusクライアントデバイス設定
前項で設定したmodbusクライアントデバイスに対しての送受信設定を行います。
定期的なステータスレポートを兼ねて、今回は30分毎に点灯状況とブザーの状況のレジスタ読み出しを行っています。
LA6-POEのレジスタは、コマンド送受信による開始アドレスは0からとなり、解説にあるレジスタアドレス1からのデータ(符号なし16ビット整数)が順に割り付けられます。
送受信設定として、iothubおよびmqttにチェックをし、iothub(Azure IoT Hub)については、Azureポータルにて設定したデバイスのIDとプライマリーキーを、MQTTについてはユニークID(任意)を設定します。
受信設定: 有効 読み込み方法: レジスタ出力 (function=3) データタイプ: 符号なし16ビット整数 読み込み開始アドレス: 0 読み込みレジスタ数: 6 ユニットID: 1 取得時間間隔: 1800 使用プロトコル: TCP 接続アドレス: 192.168.10.1 接続ポート: 502 送受信設定: iothubとmqttにチェック デバイスID(iothub): Azure IoT Hubにて登録したデバイスID デバイスキー(iothub): Azure IoT Hubにて登録したデバイスのプライマリーキー ユニークID(mqtt): 00001
Node-REDを使用したローカルテスト
本体内のNode-REDに接続し、未導入であれば、node-red-contrib-mqtt-brokerを追加します。
MQTTノードを使用して、LA6-POEをmodbus制御するためのJSONデータを送受信します。
OpenBlocks IoTシリーズの標準ファームウェア(3.3.2)のModbus Handler Clientのデータハンドリングに関しては、以下のマニュアルに従って設定します。
Modbus/TCPによるデータハンドリングを行う場合のJSON形式のメッセージ構造は以下の様になります。
(以下の例は今回の設定値ではありません)
Write Single Registerの例
{“protocol”:”tcp”,”node”:”127.0.0.1″,”port”:502,”unit”:1,”address”:10,”function”:”0x06″,”values”:[99]}
Write Multiple Registersの例
{“protocol”:”tcp”,”node”:”127.0.0.1″,”port”:502,”unit”:1,”address”:10,”function”:”0x10″,”number”:2,”values”:[99,88]}
以下のサンプルフローでは、mqttサーバ経由で、LEDユニット1~5までの制御レジスタに対して、点灯、点滅、消灯のコマンドを送信しています。
[{"id":"564d3141.2436e","type":"mosca in","z":"38faf32f.7487fc","mqtt_port":1883,"mqtt_ws_port":8080,"name":"","username":"","password":"","dburl":"","x":210,"y":120,"wires":[["42cdbfb5.14a36"]]},{"id":"42cdbfb5.14a36","type":"debug","z":"38faf32f.7487fc","name":"","active":false,"console":"false","complete":"false","x":440,"y":120,"wires":[]},{"id":"a79f1295.c7fcc","type":"mqtt in","z":"38faf32f.7487fc","name":"","topic":"pub_root/00001","qos":"2","broker":"417e1815.164238","x":400,"y":360,"wires":[["c23d25f4.8297e8"]]},{"id":"c23d25f4.8297e8","type":"debug","z":"38faf32f.7487fc","name":"","active":true,"console":"false","complete":"false","x":580,"y":280,"wires":[]},{"id":"38e5cace.462bc6","type":"mqtt out","z":"38faf32f.7487fc","name":"","topic":"sub_root/00001","qos":"","retain":"","broker":"417e1815.164238","x":590,"y":220,"wires":[]},{"id":"54cc2a32.669754","type":"inject","z":"38faf32f.7487fc","name":"全点灯","topic":"","payload":"{\"protocol\":\"tcp\",\"node\":\"192.168.10.1\",\"port\":502 ,\"unit\":1,\"address\":0,\"function\":\"16\",\"number\":5,\"values\":[257,257,257,257,257]}","payloadType":"json","repeat":"","crontab":"","once":false,"x":210,"y":180,"wires":[["38e5cace.462bc6"]]},{"id":"9c36b5c2.f63228","type":"inject","z":"38faf32f.7487fc","name":"全点滅","topic":"","payload":"{\"protocol\":\"tcp\",\"node\":\"192.168.10.1\",\"port\":502 ,\"unit\":1,\"address\":0,\"function\":\"16\",\"number\":5,\"values\":[258,258,258,258,258]}","payloadType":"json","repeat":"","crontab":"","once":false,"x":210,"y":240,"wires":[["38e5cace.462bc6"]]},{"id":"c4617601.076cb8","type":"inject","z":"38faf32f.7487fc","name":"全消灯","topic":"","payload":"{\"protocol\":\"tcp\",\"node\":\"192.168.10.1\",\"port\":502 ,\"unit\":1,\"address\":0,\"function\":\"16\",\"number\":5,\"values\":[256,256,256,256,256]}","payloadType":"json","repeat":"","crontab":"","once":false,"x":210,"y":300,"wires":[["38e5cace.462bc6"]]},{"id":"417e1815.164238","type":"mqtt-broker","z":"","broker":"127.0.0.1","port":"1883","clientid":"","usetls":false,"compatmode":true,"keepalive":"60","cleansession":true,"willTopic":"","willQos":"0","willPayload":"","birthTopic":"","birthQos":"0","birthPayload":""}]
コマンド送信に対し、以下のレスポンスを受信します。
{“time”:”2019-09-26T15:03:35.648+09:00″,”reply_to”:”ffb15d3b141e865d00f4bc04b9c9471d”,”result”:”done”,”memo”:”LA6-POE”,”protocol”:”tcp”,”node”:”192.168.10.1″,”port”:502,”unit”:1,”address”:0,”function”:16,”data_type”:”uint16_t”,”values”:[257,257,257,257,257]}
上記のフローにより、LA6-POEの点灯制御をMQTTサーバ経由で行えることを確認しました。
Azure IoT Hubからのコマンド送信
前前項にてAzure IoT Hubへの送受信設定は正しく行われている前提で、クラウドからのコマンド送信のテストを行います。デバイスに対するメッセージ送信のプログラムとしては、mosquittoやmqtt.fxなどが有名ですが、azure iot hubに関してはSASトークンの発行の手間などを考えると、node-redのazureiothubノード(node-red-contrib-azure-iot-hub)や、Microsoftから提供されるDevice Explorerを利用するのが簡単です。
Device Explorerの場合、以下の画面のように、Message to Deviceのタブより、送りたいデバイスを選択し、上記のJSONメッセージを入力してSendボタンを押すことにより、デバイスにメッセージが送信されます。
レスポンスをDataタブより確認します。あらかじめデバイスを選択しMonitorボタンを押しておいてください。
上記の手順により、Azureからのリモート制御の確認を行いました。
最後に
今回LA6-POEのModbus/TCPでの接続については、ゲートウェイ側に同様の機能を実現するためのプログラムを用意する必要がありますが、今回の例では本体の標準機能の設定のみでクラウド側からの遠隔操作を可能としており、システムの開発におけるゲートウェイ側の開発工数を削減することが出来るかと思います。
本製品は、近くOpenBlocks IoTシリーズの標準対応センサーデバイスとして記載する予定です。
お問い合わせはこちらから
※本記事は弊社後藤がQiitaにも投稿しています。よろしければこちらもご覧ください。
コメント