AWSとMQTT接続する

概要

アマゾン ウェブサービス(AWSクラウド) のIot CoreにPLCをMQTT接続してメッセージの交換をしてみます
IoT Coreへデータを送ることが出来ればAWSの各サービス(Lambda、DynamoDBなど)でデータを扱えるようになります
一例としてPLCからDynamoDBへデータをInsertする方法を別ページに書いています
AWS
構成
AWS
対象のPLC
NX102
NX1P2

準備

AWS側の準備
AWSのアカウント作成してIoT Coreでクライアント証明書と秘密鍵をダウンロードします
手順は使い方ナビのAWS IoTCoreにMQTT接続するための準備を参考にしてください

PLCのライブラリのダウンロード
PLCで使うMQTTライブラリをダウンロードします
ダウンロードはこちらから
https://www.fa.omron.co.jp/product/special/sysmac/sysmac-library/index2.html
MQTTLib


PLCのネットワークの設定
SysmacStudioでPLCのネットワークの設定を次のように設定ます

PLCのCPUユニットのセキュアソケット設定
簡単な流れは
  1. PLCをProgramモードにする
  2. C:\ProgramData\Omron\Sysmac Studio\StartMenu\Sysmac Studio\Toolsフォルダの「セキュアソケット設定コマンド」ショートカットを実行します
    (もしくはC:\ProgramData(x86)\Omron\Sysmac Studio\StartMenu\Sysmac Studio\Tools)
  3. 証明書とキーファイルをPLCに転送します
    C:\ProgramData\Omron\Sysmac Studio\StartMenu\Sysmac Studio\Tools\TLSSettingTool>tlsconfig setSessionInfo /id 0 /key "C:\private\xxx-private.pem.key" /cert "C:\certs\xxx-certificate.pem.crt" /ip:192.168.10.201 /f
    (xxx-private.pem.keyとxxx-certificate.pem.crt のxxx部分はダウンロードしたファイルのファイル名に合わせます ファイル名が長い場合は変更しても構いません)
NOTE
コマンドプロンプトで手打ちがめんどくさい場合はファイル名を入力するところでエクスプローラからファイルを摘まんでコマンドプロンプトへドラッグするとファイル名が入力されます



詳しい手順はMQTTライブラリのマニュアルの「A-3-6 CPUユニットのセキュアソケット設定」を参照して下さい
ライブラリのマニュアルはセットアップ後にC:\OMRON\Data\Lib\MQTT_Commフォルダの下に作成されています

PLCの設定

MQTTライブラリの追加
SysmacStudioのメニューから[プロジェクト]-[ライブラリ]-[ライブラリ参照]を選んでライブラリ参照ダイアログでダウンロードしたMQTTライブラリを追加します

プログラムの作成

AWSと接続
MQTTクライアント(MQTTClient)でAWSと接続を確立します
trigger1をONにしてConnectedがONになれば接続中となります
接続中の状態でメッセージの交信が可能となります



ConnectionSettings.IpAdrはAWS IoTの設定画面のエンドポイントを記入します


MQTTClientの入力の説明
入力変数 説明
ClientID 任意の文字列
ConnectionSettings.IpAdr AWS IoTのエンドポイントを記述
ConnectionSettings.PortNo TLSUse=trueのとき8883
TLSUse=falseのとき1883
ConnectionSettings.TLSUse セキュアソケット通信を使用する
ConnectionSettings.TLSSessionName TLSSession0~59
コマンドプロンプトで「tlsconfig setSessionInfo /id 0 ....」と設定したidの番号をTLSSessionの後ろに付けます
ConnectionSettings.UserName 証明書を使うときは不要
ConnectionSettings.Password 証明書を使うときは不要
ConnectionSettings.WillCfg.WillFlag Will機能を使用する
ConnectionSettings.CleanSession 接続切断後に再接続時にクリアして接続
KeepAlive キープアライブタイマ(s)
Timeout タイムアウト(s)
DiscardMsgTime メッセージは気時間(ms)


PLCからメッセージを送信する
パブリッシュ命令(MQTTPubString)でメッセージを送信します

AWSのMQTTテストクライアントを使って受信データを確認します

「トピックをサブスクライブする」タブのトピックフィルターに"test/#"を入力して[サブスクライブ]をクリックすると下のサブスクリプションに"test/#"が追加されます
これで受信待ち状態になっています

NOTE
#はワイルドカードです
受信するトピックの名前が"test/"で始まるトピックを受信したときにメッセージが表示されます



PLCではtrigger2をONにしてメッセージ({"message":"Hello!"})を送信します



MQTTSubStringの入力の説明
入力変数 説明
ClientReference MQTTClientのClientReferenceと共通の変数
PacketID パケットID
MsgType 0=PUBLISH
1=PUBREL
PubMsg 送信メッセージ
PubSettings.PubQoS QoSレベル
PubSettings.RetainFlag メッセージを保持
Topic トピック名
Timeout タイムアウト

AWS側で受信すると受信したメッセージが表示されます




PLCでメッセージを受信する
サブスクライブ命令(MQTTSubString)でメッセージを受信します

PLCではtrigger3をONにしてメッセージの受信を待ちます

MQTTSubString命令はEnable入力なのでtrigger3がONしている状態で受信待ち状態になります



MQTTSubStringの入力の説明
入力変数 説明
ClientReference MQTTClientのClientReferenceと共通の変数
SubQoS 0=PUBLISH
1=PUBREL
Topic トピックを指定
Timeout タイムアウト

AWSのMQTTテストクライアントからメッセージを送信します

「トピックに公開する」タブのトピック名に"test/message1"と入力して、メッセージペイロードに送信メッセージを記入して[発行]をクリックします
サブスクリプションに送信したメッセージが表示されます

PLCはメッセージを受信すると出力変数に受信メッセージが入ります

MQTTSubStringの出力の説明
出力変数 説明
Subscribed TRUE サブスクライブ中
RcvMsg {$L $"message$": $"AWS IoT コンソールからの挨拶$"$L} 受信メッセージ
Status 0 実行状態
Recieved 受信時TRUE メッセージ受信
RcvTopic test/message1 トピック名

ダウンロード

PLCのサンプルプロジェクト sampleIIot_AWS.zip

ダウンロードされたときは利用規約に同意したものとみなします