2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-02-02

システム構成

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

ソフトウェア

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

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

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

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

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

サービス名 概要
SORACOM Air for セルラー IoT 向けのコネクティビティを提供するサービスです。ユーザーコンソールや API を利用して各種設定の変更や、通信量を監視するなど IoT デバイスを一元管理することができます。
SORACOM Funk SORACOMが提供するAWS、Azure、Google Cloudといったパブリッククラウドが提供するFaaS (Function as a Service)のFunctionを呼び出すサービスです。今回はAWS Lambdaを呼び出すのに利用します。
Amazon DynamoDB Amazonが提供するフルマネージドでサーバーレスなkey-value NoSQLデータベースです。このデータベースにPLCの接点データを格納します。
AWS Lambda Amazonが提供するサーバーをプロビジョニングしたり管理しなくてもコードを実行できるコンピューティングサービスです。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を利用しましたが、例えば、ここに生産設備が接続されていて異常時に入力されるとすると、いつ生産設備に異常が起きて、いつ異常が解消したのかが、遠隔で分かるようになるかと思います。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?