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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/251284e3-3762-4ef0-3e38-a3f5491d64d1.png)


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

[AWS Lambda を実行し Slack へ通知する](https://users.soracom.io/ja-jp/docs/funk/aws-lambda/)

# 準備するもの

#### ハードウェア
|品名 |数量 |備考 |
|----|-----|-----|
|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資料ページ**](https://www.kyokko.co.jp/iot-solution/smartfit-pro?section=4)からダウンロードできます。

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

|サービス名 |アカウント作成方法        |
|-------------|-----------------|
|SORACOMアカウント |[SORACOMアカウントの作成(JP)](https://soracom.github.io/iot-recipes/create-account-soracom-jp/#0)　|
|AWSアカウント |[AWSアカウント作成の流れ](https://aws.amazon.com/jp/register-flow/) |


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

|サービス名 |概要        |
|-------------|-----------------|
|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の課金体系](https://soracom.jp/pricing/)
・[AWSの料金](https://aws.amazon.com/jp/pricing/?aws-products-pricing.sort-by=item.additionalFields.productNameLowercase&aws-products-pricing.sort-order=asc&awsf.Free%20Tier%20Type=*all&awsf.tech-category=*all)
・[AWS Lambda料金](https://aws.amazon.com/jp/lambda/pricing/)
・[Amazon DynamoDB料金](https://aws.amazon.com/jp/dynamodb/pricing/)

# ステップ１:Amazon DynamoDBの作成
PLCのデータを保存するAmazon DynamoDBを作成します。

１．	Amazon DynamoDBの「テーブルの作成」画面にアクセスします。
２．	テーブル名は任意ですが、今回はテーブル名を「PLC_Database」、パーティションキーを「time」「文字列」とします。
テーブル名とパーティションキーはLambdaコード作成の際に使用するので、変更した場合はメモしておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/88a577d7-3032-bcec-dc8c-4adc9a0a4d6c.png)

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

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


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/53fdf854-e9b1-8b11-f491-a1c435125166.png)

３．「関数の作成」をクリックします。
４．「コードソース」に以下のサンプルプログラムを入力します。
　 「payload」の「time」は「[ステップ１：Amazon DynamoDBの作成](#ステップ１amazon-dynamodbの作成)」で作成したテーブルのパーティションキー名にしてください。

```python
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)

```
５．「デプロイ」をクリックします。
６．上記コードではデータを保存するDynamoDBのテーブル名を環境変数として取り込んでいるため、環境変数を設定します。
７．「設定」⇒「環境変数」⇒「編集」の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/1afae3e9-fa0f-a87b-fc22-feccc13c7044.png)

８．「キー」に「DYNAMODB_TABLE_NAME」、値に「[ステップ１：Amazon DynamoDBの作成](#ステップ１amazon-dynamodbの作成)」で作成したテーブル名を入力して「保存」をクリックします。
　　「キー」値はコードで指定しているため、変更しないようにしてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/6b4173ad-da79-915a-d385-4360a1255148.png)

次に作成した関数に「[ステップ１：Amazon DynamoDBの作成](#ステップ１amazon-dynamodbの作成)」で作成したテーブルにデータを保存する(PutItem)権限を与えます。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/cf57295f-bb62-8c17-31f4-4b1504e53d0a.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/810b5c22-146a-f749-ad6a-446eb6de708b.png)

１２．以下の項目を設定します。
|項目 |説明 |
|----|-----|
|サービス |「サービスの選択」をクリックして、「DynamoDB」をクリックします。 |
|アクション |「フィルタアクション」に「putitem」と入力し、「PutItem」にチェックを入れます。 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/fd071a6a-0d0e-7d0b-e04f-a5d0f8a1ed60.png)

１３．「リソース」⇒「指定」⇒「ARNの追加」の順にクリックします。
１４．「Region」にDynamoDBを作成したリージョン名を入力します。
　　　DynamoDBコンソールからリージョン名は確認出来ます。
１５．「Table name」に「[ステップ１：Amazon DynamoDBの作成](#ステップ１amazon-dynamodbの作成)」で作成したテーブル名を入力します。
１６．「追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/6e252fc3-1ae1-083e-ea62-0f609a7dd1d1.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/dc242e96-8e51-0728-6a9c-b3eda7799397.png)

これで作成した関数に「[ステップ１：Amazon DynamoDBの作成](#ステップ１amazon-dynamodbの作成)」で作成したテーブルにデータを保存する権限が与えられました。

１９．Lambdaコンソールに戻って、この関数のARNをコピーします。
　　このARNはこれ以降、${lambda_func_arn}と表記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/57016c4b-3a5b-cd1c-e152-d84b9337b65e.png)


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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/a848a7ba-e1ad-15bd-c6b9-5cd45786e29c.png)


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


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/e7a520ed-ff69-1543-3f91-1f57cca07681.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/4b94f28e-9088-31e3-9728-00e62d9a90a2.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/ff6a6d6f-8ba3-934f-af89-4f17d4804826.png)


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

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

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

６．以下の項目を設定します。
|項目 |説明 |
|----|-----|
|サービス |「サービスの選択」をクリックして、「Lambda」をクリックします。 |
|アクション |「フィルタアクション」に「InvokeFunction」と入力し、「InvokeFunction」にチェックを入れます。 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/9379ade0-5afb-ad71-b905-6c7a00bb83b2.png)

７．「リソース」⇒「指定」⇒「ARNの追加」の順にクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/5fce34bc-e16d-9821-5b93-a5374bc1a381.png)
「ARNの追加」画面が表示されます。
８．「Lambda_functionのARN設定」に${lambda_func_arn}を入力して、「追加」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/2653d17a-721e-bd47-e69e-323c57040300.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/7580e6cc-53f0-7431-910d-ae541a43d583.png)



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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/86f91cbc-ddf7-d581-a726-e23335d4ccf2.png)

１３．作成したAWS IAMポリシーにチェックを入れて、「次へ」をクリックします。
１４．「ロール名」にIAMロールの名前を入力して、「ロールを作成」をクリックします。
　　 ここでは「PLCdata_to_DynamoDB_role」とします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/c1621407-aafc-04ac-1e60-7fbfd204f3b2.png)

１５．作成したIAMロールの名前をクリックし、「ARN」をメモします。
　　　このARNはこれ以降、${iam_role_arn}と表記します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/0c326923-24f3-d749-d040-e8137a0acdeb.png)

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

# ステップ４：Funkのセットアップ
FunkからAWS Lambdaの関数を呼び出すための設定をSORACOMユーザーコンソールで行います。

## 認証情報ストアにAWS IAMロール認証情報を登録する
Funk から AWS Lambda の関数を呼び出すための認証情報を登録します。

１．認証情報ストアの「認証情報を登録」画面を表示します。
　　詳しくは、[認証情報を登録する](https://users.soracom.io/ja-jp/docs/credentials-store/usage/)を参照してください。
２．	以下の項目を設定します。
|項目 |説明 |
|---- | ----|
|認証情報ID |認証情報を識別するために任意の名前を入力します。ここでは「PLCdata-AWS-DynamoDB-cert」とします。 |
|種別 |「AWS IAMロール認証情報」を選択します。 |
|ロールARN |${iam_role_arn}を入力します。 |
|外部ID | ${external_id}を入力します。 |

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/f8043c5a-0e2c-5463-87e9-ca7cd743117e.png)

３．「登録」をクリックします。

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

Funk の設定はグループに対して行います
ここでは、グループの設定を変更する操作のみを説明します。グループの仕組みやグループを作成する操作について詳しくは、[グループ設定](https://users.soracom.io/ja-jp/docs/group-configuration/)を参照してください。

１．SIM グループ画面で [SORACOM Funk 設定] をクリックします。
　　SIM グループ画面を表示する操作について詳しくは、[グループの設定を変更する](https://users.soracom.io/ja-jp/docs/group-configuration/configure-group/)を参照してください。
２．スイッチをクリックして「ON」にします。
３．各項目を設定します。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/c7dfa2d8-47ed-a4eb-4bfd-4298508aedf8.png)


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

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

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

[SmartFitPRO Basic取り扱い説明書](https://www.kyokko.co.jp/iot-solution/smartfit-pro?section=4)

## SIMを挿入するため、ケースを開ける
ケース側面（下記写真）の爪部にマイナスドライバ等を差し込み、持ち上げ、ケースを外します。
反対側の２か所も同様に外し、最後にケース蓋を上方向に外します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/834d4f4d-2cee-c233-71cf-0da734466638.png)



## SIMを挿入
１．下記写真の、SIMスロット部のシルバーの部分を指で軽く上から抑え、手前（矢印）方向にスライドします。（ロックが外れます）
２～ ３) SIMスロットのカバーを上方向に持ちあげて、カバーを開けます。
４．SIMを写真のように置きます。
５．写真の②の部分を下に下ろします。
６．カバーを抑えながら、１）と逆の方向（奥方向）にスライドし、スロットをロックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/41e6014e-c6cc-be21-160e-0530b0254b0c.png)

## ソフトウェアパラメータの設定
SmartFitPRO Basicは工場出荷時、SORACOM Harvestに接続する設定となっているため、今回、設定をSORACOM Funkに接続する設定に変更します。

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/33020413-2548-66fb-463e-5ec8e20d9995.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/0888e1f3-57b1-97ee-bb92-3fa1dd2310ad.png)

４．「[設定ツールダウンロードページ](https://www.kyokko.co.jp/iot-solution/smartfit-pro?section=4)」からダウンロードしたzipファイル内の「readme_Basic.txt」に記載されている方法で「管理者モード」に移行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/76c40505-ccd1-069a-7753-a63f61d1d31e.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/57f0e918-0f33-cf04-25f9-7262ecbf2b7f.png)

６．各工場出荷時の設定が読み込まれるので、ここでは送信周期を「１０」（１０秒）から「６００」（１０分）に変更して、「書込」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/f21b85e4-5149-0de0-5b48-7f542116f177.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/dba684fe-a9ff-efa7-58e5-06436fe5c4d0.png)
９．設定アプリケーションを閉じます。１０．USBケーブルを外します。

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/cd7a5969-c613-cf21-63a9-434feb761015.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/5d8bf9eb-761b-a171-1caf-384af686c146.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/66aa2996-7947-660a-37ff-ff666b95e7e0.png)

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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/ff9b5ebf-5ace-b21c-d9d2-2e4de1c41443.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/ba6dc9a9-bbdf-00b4-e384-be13132b9f4d.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/ef2177b6-f9fc-c126-c6d7-f6b5ebd03889.png)

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/1ed5bd49-cf03-f764-47e5-a0fbfffedfd9.png)

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

# ステップ８：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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/2e58de96-00eb-c785-6df7-0d4647224c43.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/a92aa664-9e06-f6f8-243d-8fe3e831c5df.png)


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

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

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/2a59e3fb-bd56-f8ac-f0e3-5766820c78d9.png)


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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/a26e189a-1faf-f696-8549-6aa81e07925a.png)

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2975892/e9529792-a3f3-0e62-0475-1fc16e9642d0.png)

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

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

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