PLCが出力した接点データを Amazon DynamoDB に格納

システム構成

今回、SmartFitPRO Basicを利用して、IDEC製PLC(FT1A-H24RA)の接点出力データをAmazon DynamoDBに格納することを目指します。
構成は下図のようにします。

image.png

AWS、SORACOMプラットフォームの各設定方法は下記HPを参考にさせて頂きました。

AWS Lambda を実行し Slack へ通知する

準備するもの

ハードウェア

品名数量備考
PLCユニット1今回はIDEC製PLC(FT1A-H24RA)を使用します。
IoTゲートウェイSmartFitPRO Basicスターターキット1LTE通信可能なルーターです。SIMカードとセットになっています。
特定地域向け IoT SIM (plan-D)サイズ:マイクロ(データ通信のみ/D-300MB)1上記キットとセットになっています。
設定用PC1SmartFitPRO Basicの設定に使用します。対応OSはWindows 10です。
設定・電源供給用USBケーブル1設定用PCとSmartFitPRO Basicの接続に利用します。SmartFitPRO BasicのUSBポートはUSB Type-Cです。設定時はデータ通信可能なUSBケーブルをご用意ください。
接点入力用ケーブル1PLCとSmartFitPRO Basicの接続に利用します。SmartFitPRO Basicに同梱されています。
遠隔監視用PC1インターネット接続可能で最新Webブラウザでサイト閲覧が自由にできること。

ソフトウェア

品名数量価格備考
SmartFitPROSettingTool_SoracomStore.exe1無料SmartFitPRO Basicの設定ソフトウェアです。保存先は任意です。
SmartFitPROSetting_Basic.csv1無料SmartFitPRO Basicの初期パラメータcsvファイルです。

上記ソフトウェアはSmartFitPRO資料ページからダウンロードできます。

必要なクラウドサービスアカウント

サービス名アカウント作成方法
SORACOMアカウントSORACOMアカウントの作成(JP)
AWSアカウントAWSアカウント作成の流れ

利用するクラウドサービス

サービス名概要
SORACOM Air for セルラーIoT 向けのコネクティビティを提供するサービスです。ユーザーコンソールや API を利用して各種設定の変更や、通信量を監視するなど IoT デバイスを一元管理することができます。
SORACOM FunkSORACOMが提供するAWS、Azure、Google Cloudといったパブリッククラウドが提供するFaaS (Function as a Service)のFunctionを呼び出すサービスです。今回はAWS Lambdaを呼び出すのに利用します。
Amazon DynamoDBAmazonが提供するフルマネージドでサーバーレスなkey-value NoSQLデータベースです。このデータベースにPLCの接点データを格納します。
AWS LambdaAmazonが提供するサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。PLCの接点データをAmazon DynamoDBへ格納するFunctionとして利用します。

(※)各種クラウドサービスに必要な費用は下記HPを参照ください。

SORACOMの課金体系
AWSの料金
AWS Lambda料金
Amazon DynamoDB料金

ステップ1:Amazon DynamoDBの作成

PLCのデータを保存するAmazon DynamoDBを作成します。

1. Amazon DynamoDBの「テーブルの作成」画面にアクセスします。
2. テーブル名は任意ですが、今回はテーブル名を「PLC_Database」、パーティションキーを「time」「文字列」とします。
テーブル名とパーティションキーはLambdaコード作成の際に使用するので、変更した場合はメモしておきます。
image.png

3.「テーブルの作成」をクリックします。

これでPLC接点データの保存用テーブルが作成できました。

ステップ2:AWS Lambdaの作成

続いて、AWSに届いたデータを作成したテーブルへ送信するAWS Lambdaの関数を作成します。
1. AWS Lambdaの「関数の作成」画面にアクセスします。
2. 「一から作成」をクリックし、以下の項目を設定します。

項目説明
関数名関数名は任意ですが、ここでは「PLCdata-to-Dynamodb」とします。
ランタイム「Python x.x」を選択します。最新のサポート対象のPythonバージョンを選択してください。
アーキテクチャ「arm」を選択します。
image.png

3.「関数の作成」をクリックします。
4.「コードソース」に以下のサンプルプログラムを入力します。
  「payload」の「time」は「ステップ1:Amazon DynamoDBの作成」で作成したテーブルのパーティションキー名にしてください。

import json
from datetime import datetime, timedelta, timezone
import boto3
import os

TZ = timezone(timedelta(hours=+9), 'JST')
TABLE_NAME = os.environ['DYNAMODB_TABLE_NAME']
dynamodb = boto3.resource('dynamodb')

def lambda_handler(event, context):

    payload = {
            'time': datetime.now(TZ).strftime('%Y/%m/%d %H:%M:%S'),
            'devicetype':       str(event.get('devicetype')),
            'fw_ver':           str(event.get('fw_ver')),
            'message_type':     str(event.get('message_type')),
            'timestamp':        str(event.get('timestamp')),
            'device_state':     str(event.get('device_state')),
            'di0':              str(event.get('di0'))        
    }

    dynamodb.Table(TABLE_NAME).put_item(Item=payload)

5.「デプロイ」をクリックします。
6.上記コードではデータを保存するDynamoDBのテーブル名を環境変数として取り込んでいるため、環境変数を設定します。
7.「設定」⇒「環境変数」⇒「編集」の順にクリックします。
image.png

8.「キー」に「DYNAMODB_TABLE_NAME」、値に「ステップ1:Amazon DynamoDBの作成」で作成したテーブル名を入力して「保存」をクリックします。
  「キー」値はコードで指定しているため、変更しないようにしてください。

image.png

次に作成した関数に「ステップ1:Amazon DynamoDBの作成」で作成したテーブルにデータを保存する(PutItem)権限を与えます。

9.「設定」⇒「アクセス権限」の順にクリックします。

image.png

10.「実行ロール」に関数作成時に自動で作成されたロールが表示されているので、クリックします。
11.新しいウィンドウでIAMロールコンソールが開かれるので、「許可を追加」⇒「インラインポリシーを作成」の順にクリックします。

image.png

12.以下の項目を設定します。

項目説明
サービス「サービスの選択」をクリックして、「DynamoDB」をクリックします。
アクション「フィルタアクション」に「putitem」と入力し、「PutItem」にチェックを入れます。
image.png

13.「リソース」⇒「指定」⇒「ARNの追加」の順にクリックします。
14.「Region」にDynamoDBを作成したリージョン名を入力します。
   DynamoDBコンソールからリージョン名は確認出来ます。
15.「Table name」に「ステップ1:Amazon DynamoDBの作成」で作成したテーブル名を入力します。
16.「追加」をクリックします。

image.png

17.「ポリシーの確認」をクリックします。
18.「名前」にAWS IAMポリシーの名前を入力して「ポリシーの作成」をクリックします。
   ポリシー名は任意ですが、ここでは「PLCdata_To_DynamoDB_Lambda_policy」とします。

image.png

これで作成した関数に「ステップ1:Amazon DynamoDBの作成」で作成したテーブルにデータを保存する権限が与えられました。

19.Lambdaコンソールに戻って、この関数のARNをコピーします。
  このARNはこれ以降、${lambda_func_arn}と表記します。
image.png

ステップ3:IAMロールの作成

Funkが動作するSORACOMプラットフォームのAWSアカウントに対して、作成したLambdaの実行を許可するためのAWS IAMロールを作成します。

1.IAMコンソールにアクセスして、「アクセス管理」⇒「ロール」の順にクリックして、「ロールを作成」をクリックします。

image.png

2.「AWSアカウント」⇒「別のAWSアカウント」の順にクリックし、「アカウントID」にSORACOMプラットフォームのAWSアカウントIDを入力します。
  Funkが動作するSORACOMプラットフォームのAWSアカウントのIDはカバレッジタイプによって異なります。
 ・日本カバレッジ:762707677580
 ・グローバルカバレッジ:950858143650

image.png

3.「外部IDを要求する」にチェックを入れ、「外部ID」に任意の文字列を入力します。
  「外部ID」に入力した文字列はこれ以降、${external_id}と表記します。
(例: External-ID-Mej73gfhrFhimGKb)

image.png

4.「次へ」をクリックします。
  「許可を追加」画面が表示されます。
5.「ポリシーの作成」をクリックします。

image.png

別のウィンドウまたは別のタブで「ポリシーの作成」画面が表示されます。

ここからは「ポリシーの作成」画面でポリシーを作成します

「ポリシーの作成」画面の操作が終わったら、[ポリシーの作成] が表示されている「許可を追加」画面に戻ってきて IAM ロールを作成する操作を続けます。画面を閉じないでください。

6.以下の項目を設定します。

項目説明
サービス「サービスの選択」をクリックして、「Lambda」をクリックします。
アクション「フィルタアクション」に「InvokeFunction」と入力し、「InvokeFunction」にチェックを入れます。
image.png

7.「リソース」⇒「指定」⇒「ARNの追加」の順にクリックします。
image.png
「ARNの追加」画面が表示されます。
8.「Lambda_functionのARN設定」に${lambda_func_arn}を入力して、「追加」をクリックします。

image.png

9.「次のステップ:タグ」⇒「次のステップ:確認」の順にクリックします。
10.「名前」にAWS IAMポリシーの名前を入力して「ポリシーの作成」をクリックします。
   ポリシー名は任意ですが、ここでは「PLCdata_To_DynamoDB_policy」とします。

image.png

11.ポリシー画面が表示されているウィンドウまたはタブを閉じて、「許可を追加」画面に戻ります。
12.「更新ボタン」をクリックして手順12で入力したAWS IAMポリシーの名前をテキストボックスに入力して、Enterキーを押します。

image.png

13.作成したAWS IAMポリシーにチェックを入れて、「次へ」をクリックします。
14.「ロール名」にIAMロールの名前を入力して、「ロールを作成」をクリックします。
   ここでは「PLCdata_to_DynamoDB_role」とします。
image.png

15.作成したIAMロールの名前をクリックし、「ARN」をメモします。
   このARNはこれ以降、${iam_role_arn}と表記します。
image.png

これでAWSでの設定は完了です。

ステップ4:Funkのセットアップ

FunkからAWS Lambdaの関数を呼び出すための設定をSORACOMユーザーコンソールで行います。

認証情報ストアにAWS IAMロール認証情報を登録する

Funk から AWS Lambda の関数を呼び出すための認証情報を登録します。

1.認証情報ストアの「認証情報を登録」画面を表示します。
  詳しくは、認証情報を登録するを参照してください。
2. 以下の項目を設定します。

項目説明
認証情報ID認証情報を識別するために任意の名前を入力します。ここでは「PLCdata-AWS-DynamoDB-cert」とします。
種別「AWS IAMロール認証情報」を選択します。
ロールARN${iam_role_arn}を入力します。
外部ID${external_id}を入力します。
image.png

3.「登録」をクリックします。

Funkを有効化する

IoT SIMに対してFunkを有効化します。

Funk の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、グループ設定を参照してください。

1.SIM グループ画面で [SORACOM Funk 設定] をクリックします。
  SIM グループ画面を表示する操作について詳しくは、グループの設定を変更するを参照してください。
2.スイッチをクリックして「ON」にします。
3.各項目を設定します。

項目説明
サービス「AWS Lambda」を選択します。
関数のARN${lambda_func_arn}を入力します。
認証情報認証情報ストアにAWS IAMロール認証情報を登録するで登録した認証情報を選択します。
送信データ形式ここでは「JSON」を選択します。
image.png

4.「保存」をクリックします。
5.IoT SIM が所属するグループを切り替えます。

これでIoT SIM の Funk の設定が完了しました。

ステップ5:SmartFitPRO Basicのセットアップ

下記からダウンロードできるSmartFitPRO Basicの取り扱い説明書を参照して、SmartFitPROのセットアップを行っていきます。

SmartFitPRO Basic取り扱い説明書

SIMを挿入するため、ケースを開ける

ケース側面(下記写真)の爪部にマイナスドライバ等を差し込み、持ち上げ、ケースを外します。
反対側の2か所も同様に外し、最後にケース蓋を上方向に外します。

image.png

SIMを挿入

1.下記写真の、SIMスロット部のシルバーの部分を指で軽く上から抑え、手前(矢印)方向にスライドします。(ロックが外れます)
2~ 3) SIMスロットのカバーを上方向に持ちあげて、カバーを開けます。
4.SIMを写真のように置きます。
5.写真の②の部分を下に下ろします。
6.カバーを抑えながら、1)と逆の方向(奥方向)にスライドし、スロットをロックします。
image.png

ソフトウェアパラメータの設定

SmartFitPRO Basicは工場出荷時、SORACOM Harvestに接続する設定となっているため、今回、設定をSORACOM Funkに接続する設定に変更します。

1.先端の細いピンセット等でSmartFitPRO BasicのSWを押しながら、PCとUSBケーブルを接続します。

image.png

緑LEDが約1s間隔で点滅したら、設定モードに移行しています。

2.設定アプリケーション「SmartFitPROSettingTool_SoracomStore.exe」を実行します。
3.「接続」をクリックします。

image.png

4.「設定ツールダウンロードページ」からダウンロードしたzipファイル内の「readme_Basic.txt」に記載されている方法で「管理者モード」に移行します。

image.png

5.「インポート」と押して、設定パラメータファイル「SmartFitPROSetting_Basic.csv」を選択します。

image.png

6.各工場出荷時の設定が読み込まれるので、ここでは送信周期を「10」(10秒)から「600」(10分)に変更して、「書込」をクリックします。

image.png

7.「LTE/Cloud Setting」タブ⇒「TCP/UDP」タブの順にクリックします。
8.下記設定を変更して、「書込」をクリックします。

項目説明
エンドポイント「harvest.soracom.io」⇒「uni.soracom.io」に変更します。
エンドポイント(HTTP)「http\://harvest.soracom.io」⇒「http\://uni.soracom.io」に変更します。
PORT「8514」⇒「23080」に変更します。

image.png
9.設定アプリケーションを閉じます。10.USBケーブルを外します。

これでソフトウェアパラメータの設定は完了です。

SmartFitPRO Basic起動

今回はそのままPCからSmartFitPRO Basicに給電するため、再度、USBケーブルでSmartFitPROとPCを接続します。

image.png

下図の緑LEDが不規則に点滅した後、10秒に1回程度の点滅に落ち着きます。

image.png

これで初回起動時の通信が完了しました。

ステップ6:Amazon DynamoDBのデータ確認

SmartFitPRO BasicからSORACOM Funkを通して、Amazon DynamoDBへデータが送信されているはずなので、Amazon DynamoDBを確認しにいきます。

1.「Amazon DynamoDB」コンソールにアクセスして、「テーブル」⇒「項目の探索」の順にクリックします。
2.作成した「PLCdata_Database」をクリックします。

image.png

SmartFitPRO Basicからの送信された各種データが「返された項目」で確認できます。
「message_type」が「1」で起動時の送信であることが分かります。

これでSmartFitPROのセットアップは完了です。

ステップ7:PLCのセットアップ

今回はIDEC製PLC「FT1A-H24RA」を使用します。
PLCプログラム作成に必要なアプリケーションは購入時に付属されているため、インストール方法等については解説しません。

image.png

PLCプログラムの作成

18信号入力、8接点出力が可能な「FT1A-H24RA」を使用して、下記構成でプログラムを作成します。

image.png

実際に作成したラダー図が下図になります。

image.png

SmartFitPRO Basic用には最上段の「I0017」、「I0000」、「Q0000」のみで問題無いですが、SmartFitPRO Standardにも接続する予定なので、各ポートも同様の構成でラダー図を作成しています。

PLCとSmartFitPRO Basicの接続

PLCとSmartFitPRO Basicを構成図通りに接続します。

image.png

これで全ての準備が完了しました。

ステップ8:PLCの出力変化でDynamoDBにデータが送られるか確認する

SmartFitPRO BasicはPLCの出力データの変化をトリガーにして、発報する仕組みになっています。
今回はトグルSWのON/OFFでデータが送付されるかを確認します。

PLCのI0とI17をON

まず、発報禁止命令を停止するため、I17のSWをONします。
そして、I0のSWをONすることでPLCからSmartFitPRO BasicにOFF⇒ONの出力変化信号が送信されます。

image.png

SW操作後、しばらくするとSmartFitPRO Basicの緑LEDが点滅します。
緑LEDの点滅が落ち着いたら、送信が完了しているはずなので、DynamoDBにデータが送られているか確認します。

image.png

無事、DynamoDBに新しいデータが送られていることが確認できます。

ここで注目すべきは「di0」はSmartFitPRO BasicのDI0に入力されたデータで、すなわち、PLCのI0の状態がONになっていることが分かります。
「message_type」は「接点入力変化による発報」を意味する「3」になっています。

では、PLCのI17のSWをONにしたまま、I0のON/OFFを繰り返して、データを蓄積してみます。

image.png

十分データが蓄積されると、このままでは分かりづらいと思います。
そこで蓄積したデータをCSVでダウンロードします。

image.png

ダウンロードしたCSVを開いて、「di0」のグラフを作成してみます。

image.png

これでPLCのI0がいつONになって、いつOFFになったのかが分かりやすくなったかと思います。

最後に

以上より、PLCが出力した接点データを Amazon DynamoDB に格納することができました。

今回はPLCのトグルSWを利用しましたが、例えば、ここに生産設備が接続されていて異常時に入力されるとすると、いつ生産設備に異常が起きて、いつ異常が解消したのかが、遠隔で分かるようになるかと思います。

TOP