AWS IoTとPLCを接続してみました。細かい設定方法含めて紹介します。
ラズベリーパイをPLCにして、クラウドのAWSに直接MQTT通信しています。
誰でも同様にPLCとクラウドを繋げることが可能です。
AWS IoTとPLCの事例!ゲートウェイ無しで接続してみた
AWS(アマゾンのクラウド)とPLC(工場で使われるコントローラ)を繋げてみました。
AWSとMQTTでPLCがメッセージをPub(発行)/Sub(購読)できています。
本来、PLCにはMQTT通信する機能はなくゲートウェイ(中継器)が必要です。
今回はラズパイをPLC化することで、ゲートウェイ無しで直接AWSに接続しています。
今回のテストレベルならば無料枠内で十分に実施出来ました。
クラウド(AWS)とPLCを繋げてテストしたい人向に良い事例かと思います。
PLC・AWSの設定方法からテストプログラムまで詳細を紹介していきます。
また今回の内容を「第3回 FA設備技術勉強会オンライン」で発表させていただきました。
その際の説明スライドが下記となっています。
AWSにPLCに繋げるメリット・概要含めて説明しています。
実際のテスト動画も紹介していますので是非一緒にご覧ください。
AWSとPLCの間でMQTTのPub/Subの通信が実際に出来ています。
AWSが初めての方は登録から
AWSのサービス利用が初めての方は下記記事を参考に登録からお願いします。
AWSに登録して、ラズパイのGPIOの信号をクラウドに送信するまでの手順を紹介しています。
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
最終的にはラズパイからのメッセージをMQTTでAWSに通知させています。
AWSの登録・設定方法から、テストプログラム含めて記載しています。(リンク先はこちら)
ラズベリーパイをPLCにする方法
ラズベリーパイをPLCに設定する方法に関しては下記記事でまとめています。
シーケンス制御とラダーの始め方 ラズパイとCODESYSで入門
CODESYSというソフトを使うことでラズベリーパイをPLCにすることが可能です。
ラダーやシーケンス制御を簡単に始めることができます。(リンク先はこちら)
テストレベルならば無料で実施できます。
実際に今回のテストを同様に実施する方はラズパイにCODESYSのインストールをお願いします。
PLCとクラウドを接続する方法
「PLC」と「(AWSなどの)クラウド」を接続する方法に関しては多種多様です。
おそらく一概に「この接続方法が正しい」というものは無いと思います。
あくまで今回のテストも一例ということをご了承ください。
下記のようにハード・ソフトで様々なシチュエーションが考えられます。
- 使用するPLCで接続IF(LAN?、RS-485?、フィールドバス?…)が異なる
- 使用するプロトコル(OPC UA?、MQTT?、https?)が異なる
別記事になりますが、OPC UAでクラウド(AWS)を接続する方法も紹介しています。
AWSでOPC UAの使い方!Greengrassで接続してみた
産業用・IoTゲートウェイからクラウドに接続
工場で使われている標準的なPLC(シーケンサ)ではクラウドと「直接」の接続は難しいです。
例えば、筆者所有のPLCの三菱FX3Gにはクラウドと直接接続できるIFはありません。
何かしらオプション対応が必要になります。
そのため、中継器(ゲートウェイ)を挟んでクラウドに接続するのが一つの手段かと思います。
下記のような専用のIoTゲートウェイを使えば、IFを集約してクラウドにデータを送れます。
しかし専用のゲートウェイ単体で数万~数十万するので一個人では購入するのが難しいです。
メーカのPLCからクラウドに直接接続
最新のPLCにはOPC UAやMQTTといったIoT関連のプロトコル通信ができるものもあります。
但し、基本的には「最新」かつ「高機能」なPLCにしか搭載しておりません。
最新のPLCに関しても一個人で購入するのがコスト的に非常に厳しいです。
CODESYSでクラウドに直接接続
今回は個人のテスト的にPLCからクラウドに接続できる環境が欲しいだけです。
そのためソフトウェアPLCの「CODESYS」で対応していきます。
CODESYSならば最新の高い機器を購入しなくとも、ソフトを修正するだけです。
ラズパイの無線機能を使い、ゲートウェイ無しで直接クラウドと接続していきます。
AWSにMQTTで接続する
ラズベリーパイ+CODESYSでクラウドに接続するにしても色々選択肢があります。
- クラウド先…AWS(アマゾン)、GCP(グーグル)、Azure(マイクロソフト)、…等々
- プロトコル…OPC UA、MQTT、…等々
今回のテストでは「AWS」に「MQTT」で接続していきます。
「MQTT」に関してはPub/Sub型で軽量のデータ配信を行います。
ざっくり言うと、今回はAWS介してPLC含めて多くの機器にメッセージを渡せるようになります。
CODESYSにIoTのライブラリをインストール
ソフトウェアPLCのCODESYSもデフォルト設定ではクラウドに接続できません。
必要なライブラリなどダウンロード・インストールして対応していきます。
今回使うソフトもテストレベルならば無料で実施できます。
AWSと接続するIoTのパッケージも30分の接続までは無料です。
30分後も自動的に接続が切れるだけで、再度接続すればまた無料でテストが出来ます。
最新のソフトVerに更新するのをおすすめします
筆者も結構躓いたのですが、最新のソフトVerで無いとエラーが出る場合が多いです。
(ビルド通らず苦戦していたところが、最新のソフトVerだと通った例も多数ありました)
エラーログの一例が下記です。(あくまで一例です。これ以外にも沢山出ました)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
------ ビルドが開始しました:アプリケーション: Device.Application ------- コードに型を割り当て... [警告] aws_test: ライブラリ マネージャ [Device: PLC ロジック: Application]: C0100: ライブラリ SoftMotion_BusTaskInterval がライブラリ マネージャーに追加されていない、または有効なライセンスが見つかりません [警告] aws_test: ライブラリ マネージャ [Device: PLC ロジック: Application]: C0100: ライブラリ CmpTargetVisu がライブラリ マネージャーに追加されていない、または有効なライセンスが見つかりません [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0077: 不明な型: 'SysSocket2.SOCK_HOSTENT' [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0032: 型 '不明な型: 'SysSocket2.SysSockGetHostByName(szHostName := _psHostname^, pHost := ADR(strHostent))'' は型 'UDINT' に変換できません [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0035: 'SysSocket2.SysSockGetHostByName' ではなくプログラム名、関数、またはファンクション ブロック インスタンスが必要です [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0063: 'syssocket2, 3.5.16.0 (system)' には 'SysSockGetHostByName' の定義が含まれていません [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0231: この場所には型 'BOOL' の式が必要です [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0077: 不明な型: '(strHostent.pAddrList <> 0)' [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0077: 不明な型: 'strHostent.pAddrList' [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0077: 不明な型: 'SysSocket2.SOCK_HOSTENT' [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0032: 型 '不明な型: 'strHostent.pAddrList^'' は型 'POINTER TO UDINT' に変換できません [エラー] mqtt client sl, 1.0.2.0 (3s - smart software solutions gmbh): CyclicAction [MQTTClient]: C0077: 不明な型: 'SysSocket2.SOCK_HOSTENT' コンパイル完了 -- 10 個のエラー、2 個の警告 |
他のソフトもですが、近年IoT関連のライブラリ・パッケージの更新は非常に速いです。
ソフトウェアは最新のVerでテストすることをおすすめします。
筆者はCODESYS本体含めて必要ソフトウェア・ライブラリを全て最新Verにしました。
- CODESYS本体(CODESYS Development System V3)
- ラズベリーパイのパッケージ(CODESYS Control for Raspberry Pi MC SL)
- IOT関連のパッケージ(IIoT libraries SL)
- セキュリティのパッケージ(CODESYS Security Agent)
CODESYS Development System V3
CODESYS本体のダウンロード・インストール方法は下記記事をご参考ください。
ラズベリーパイのパッケージのインストール方法まで記載しています。
PLC(シーケンサ)・ラダーがフリーで使える!おすすめ入門ソフト
CODESYS Control for Raspberry Pi MC SL
CODESYSをラズベリーパイで動かす方法に関しては下記記事をご参考ください。
ラズパイのGPIOをラダーで制御しています。
ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた
IIoT libraries SL
CODESYSにクラウドと接続できるIoT関連のライブラリがあるのでインストールします。
ライブラリのダウンロード先は下記です。
https://store.codesys.com/application/iiot-libraries-sl.html
CODESYS Security Agent
AWS関連の証明書を発行するにはセキュリティのパッケージのインストール必要でした。
ライブラリのダウンロード先は下記です。
https://store.codesys.com/codesys-security-agent.html
CODESYSとAWSを接続してみる
CODESYSの本体を起動して、AWSの接続するためのプログラムを作ります。
今回はライブラリ本体のサンプルプログラムを参考にさせていただきます。
恐らくIoT関連のライブラリをインストール後には下記フォルダが作成されています。
「C:\Users\***\AWS IoT Core Client SL\」
AWSのサンプルプログラムは入っていますが、下記理由でそのままの使用は難しいです。
- ラズベリーパイ用のプロジェクトでない
- (Pub/Sub以外の)余分なアプリケーションまで入っている
- AWSの設定などは各個人のパラメータを入力する必要がある
あくまでサンプルプログラムは参考にする形で、新規でプログラムを作成していきます。
AWSに通信するプロジェクト・ライブラリを用意する
サンプルプログラムがラダー言語やST言語ではなく「CFC」で作成されています。
他の言語でも作れるとは思いますが、まずは最初ということで同様にCFCでプログラムします。
※CFC…Continuous Function Chart_コンティニュースファンクション・チャート
CFCはファンクションブロックを繋げることでPLCのプログラムを作成していきます。
CFCのプログラム作成方法に関しては下記記事でも紹介しています。ご参考ください。
CFCのプロジェクトを作成する
最初にプロジェクトを作成します。「ファイル」→「新規作成プロジェクト」を選びます。
標準プロジェクトを選択して、任意のプロジェクト名を入力します。
デバイスはラズベリーパイにしておく
使用するデバイスはラズベリーパイ、またPLCの言語はCFCに設定します。
- デバイス…「CODESYS Control for Raspberry Pi MC SL」
- PLC_PRGの言語…「コンティニュースファンクション・チャート(CFC)」
AWSのライブラリを追加する
AWSのライブラリをプロジェクトに追加します。
「ライブラリマネージャー」→「ライブラリの追加」を選択します。
そこで「aws」検索すると「AWS IoT Client SL」のライブラリ出てきますので選択します。
Visualizationの機能を追加する
AWSと通信テストの際に、状態が分かるHMI(画面)を作れるように設定します。
「Application」を右クリック⇒「オブジェクトの追加」⇒「ビジュアリゼーション」を選択します。
「ビジュアリゼーションのオブジェクトの作成」のウインドウが出ます。
チェックを入れて進めば、CODESYSでHMI(画面)を作成できるようになります。
CODESYSでのHMI画面の作り方(Visualization)に関しては下記記事でも紹介しています。
自由に入出力画面も作成できます。(リンク先はこちら)
PLC(シーケンサ)を無線化!遠隔操作・監視した事例を試してみた
AWSにMQTTでPub/Subするプログラムを作成する
AWSでMQTTに通信させるにも手段が複数あります。(「Pub/Sub」か「DeviceShadow」)
今回は一番基本的な「Pub/Sub」でプログラムを作成していきます。
※Pub/Sub…Publish(発行)/Subscribe(購読) メッセージの通信ができるプロトコル
これからPLCの(CFC)プログラミングを実施していきます。
2個CODESYSを開いて、片方でサンプルプログラムを開いた方が良いと思います。
※適宜必要なプログラム・ブロックをコピーしたり、参考にすると(筆者は)楽できました。
AWSIoTClientを作成する
PLC_PRG(PRG)箇所でCFCのプログラミングが出来ます。
ツールボックスの「ボックス」をドラッグ&ドロップします。
そして「???」をクリックすると、どのファンクションブロックを使うかを選択できます。
入力アシスタントで「AWS_IOT」の中から「AWSIoTClient」を選びます。
サンプルプログラム同様にパラメータの必要箇所は入力ブロックで埋めておきます。
AWSIoTClientで一番重要なパラメータとしては下記辺りだと思います。
AWSの各個人の登録内容を入力する必要があります。
- Clientid(クライアントID)…AWSで登録するモノの名前
- Hostname(ホストネーム)…AWSのエンドポイントのURL
一応筆者はWillTopic(トピック)…AWSで使うトピックも合わせておきました。
他はサンプルプログラムと基本同じです。
未接続の箇所関してはオプション箇所か、画面のVisualization側で対応しています。
AWSIoTSubscribeを作成する
「AWSIoTClient」と同様に「AWSIoTSubscribe」も作成します。
「AWSIoTSubscribe」でメッセージを受信します。
サンプルプログラム同様にパラメータの必要箇所は入力ブロックで埋めておきます。
AWSIoTPublishを作成する
「AWSIoTPublish」も作成します。「AWSIoTPublish」でメッセージを送信します。
サンプルプログラム同様にパラメータの必要箇所は入力ブロックで埋めておきます。
各パラメータの設定
どのTopic(トピック)にメッセージをPub/subするのか含めてパラメータ設定しておきます。
ブロックを編集していた上の箇所に各変数・パラメータを定義・設定できる箇所があります。
今回筆者が設定したパラメータは下記です。サンプルプログラムから少し修正したレベルです。
1 2 3 4 5 6 7 8 9 10 11 |
PROGRAM PLC_PRG VAR AWSIoTClient_0: AWS_IOT.AWSIoTClient; // Function block to connect to AWS IoT Core AWSIoTPublish_0: AWS_IOT.AWSIoTPublish; // Function block to publish messages sPublishMessage : STRING := 'Hello AWS from CODESYS'; // Message to publish wsPublishTopic : WSTRING(1024) := "myTopic"; // Topic of the message to publish AWSIoTSubscribe_0: AWS_IOT.AWSIoTSubscribe; // Function block to subscribe a topic sSubscribeMessage : STRING; // The subscribed message (received message) wsSubscribeFilter : WSTRING(1024) := "myTopic"; // Topic filter of the subscriber (+ and # allowed) wsLastWillMessage : WSTRING := "myPayload"; // The last will message END_VAR |
Visualizationの設定
AWS IOTのファンクションブロック用にHMIの画面(Visualization)が用意されています。
「デバイス」→「Visualization」を選択します。
そして右側のツールボックスのタブを「ビジュアライゼーション ツールボックス」にします。
「AWS_IOT」のツールボックスが確認できます。
CFCで作ったブロックの3つに対応したツールボックスを選択していきます。
- AWSIoTClient…Visu_AWSIoTClient
- AWSIoTSubscribe…Visu_AWSIoTSubscribe
- AWSIoTPublish…Visu_AWSIoTPublish
ドラッグ&ドロップするとき、CFCのどのブロックを参照するか確認されます。
※~パラメータを貼り付けというウインドウが出てくるはずです。
値の箇所に、CFCでプログラミングしたものを選択します。
ビルドしてエラー無いことを確認します。
Visualizationの設定まで終えたら、一度ビルトしてプログラムとして問題ないか確認します。
「ビルド」のタブから「ビルド」を選びます。問題なければ0個のエラーになるはずです。
CODESYSでAWS用のCSRを発行する
現在の状態だと、ラズパイ+CODESYSとしてはAWSと通信できる状態になっています。
但しAWS側からは接続して良いデバイスか不明のため、証明書をやりとりする必要があります。
イメージとしては下記形のようにCSRとCRTを受け渡しします。
AWSで証明書を作成するためにもCODESYSでCSRを発行していきます。
この手順に関してはCODESYSのIOT関連のライブラリパッケージのデータシートに載っています。
下記リンク先に「Download all Product Data Sheets (.zip)」があります。
その中の「AWS IoT Core Client SL_en.pdf」に記載がありました。
https://store.codesys.com/application/iiot-libraries-sl.html
ラズベリーパイにログインする
ラズベリーパイへのログイン方法に関しては下記記事を参照ください。
一度ラズベリーパイにCODESYSをインストールする必要があります。
ラズベリーパイに電源を入れて、CODESYSからログインします。
正常なプログラムでラズパイと通信できていればプログラムがダウンロードされます。
CSRファイルを作成する
ログイン後に「デバイス」→「PLCシェル」を選びます。
その後右下にある「…」から「cert-getapplist」を選ぶと証明書リストが出てきます。
証明書リストが出来た後に、右下の「…」から「cert-createcsr」を選択します。
ラズベリーパイ内にCSR証明書が作成されます。
今回CSR証明書を必要としているのは、CFCのクライアントIDの名前になっています。
筆者の場合「codesys」と入力しているため4番が該当します。
(現時点ではCert Availableが「False」となっています)
その後「デバイス」→「ファイル」のタブを選択して「cert/export」を開きます。
ラズベリーパイの該当のCSRファイルをPC側にコピーします。
OpenSSLでCSR証明書を変換する
ラズべリーパイからコピーしたCSR証明書はそのままではAWSに使えないということです。
OpenSSLで一度変換する必要があります。
正式な手順書では下記OpenSSLの大元のHPが紹介されていました。
但し、下記サイトからだとWindows用のOpenSSLのリンク先はありません。
今回は下記サイトからWindows用のOpenSSLをダウンロードして実行します。
https://slproweb.com/products/Win32OpenSSL.html
データシートの手順書だと下記の参考コマンドでした。
そのためコマンドプロンプトで上記同様なコマンドを入力することで対応しました。
無事に変換されたCSR証明書が作成されました。
AWS IoTでCSRから証明書を作成する
AWSで証明書を作成していきます。
AWSの中でもサービスは多くありますが、今回は「AWS IoT」というサービスを使います。
冒頭でも紹介しましたが、AWS IoTの基本的な設定方法は下記記事をご参考ください。
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
AWS IoTでCODESYSで使うラズパイを登録
AWS IoTの画面を開いたら、左の一覧から「管理」→「モノ」を選択します。
モノの画面の右上にある「作成」をクリックして進めていきます。
そしてAWS IOTモノを作成する画面で「単一のモノを作成する」を選択します
CFCで作成したプログラムのクライアントIDと同じ名前で登録しています。
CSRをアップロードして証明書を作る
次に「モノに証明書を追加」の画面が出てきます。
今回は「CSRによる作成」で先ほどOpenSSLで作成したCSRをアップロードします。
ポリシーに関しては、下記記事で作成したものを使っています。
※アクションに「iot:*」リソースAPNに「*」に設定したものです。
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
ポリシーとはざっくりいうと、AWSへのアクセス権限を管理するリストみたいなものです。
今回はテスト用にAWS IoT関連ならば、何でもできるポリシーを使っています。
証明書とルート証明書をダウンロードする
登録は基本的に終わりましたので、後は証明書をダウンロードを行います。
証明書をダウンロードする
AWS IoTの画面の左一覧から「管理」→「モノ」を選び、今回登録したものを選択します。
そしてセキュリティの画面で証明書が出来ていますのでクリックします。
証明書の画面で右上のアクションで「ダウンロード」を選択します。
これでCODESYSのCSRからAWSの証明書を発行できました。
ルートCAをダウンロードする
あとルートCAという証明書もダウンロードしておきます。
ルートCAに関して今回は「RSA 2048 bit key: Amazon Root CA 1」をダウンロードしました。
下記AWSのリンク先からダウンロードが出来ます。
https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/server-authentication.html
AWSのエンドポイントを確認しておく
※既にプログラム作成中に対応済の方は読み飛ばしてください
AWSのエンドポイントのURLを控えておきます。AWS IoTを使う際に必要な情報となります。
左一覧にある「設定」を選ぶと、エンドポイントのURLがあります。
CFCのプログラムでエンドポイントURLをHostname(ホストネーム)として使っています。
CODESYSに証明書をインストールする
CODESYSにAWSからの証明書をインストールしていきます。
ラズベリーパイにログインした状態でセキュリティ画面を開きます。
証明書の管理画面が出てきますので下記2個の証明書をインストールしていきます。
- Own Certificates…CSRからAWSで作成した証明書(***-certificate.pem.crt)
- Trusted Certificates…ルートCA(AmazonRootCA1.pem)
PC側のファイルをラズパイにダウンロードしていきます。
その後は一度ラズパイとCODESYSをリセットさせるか、再起動させます。
AWSとPLC(CODESYS)の通信テスト
ラズベリーパイにログインしてプログラムを起動します。
実際にAWSと通信テストを行います。CFCのプログラム画面は下記形になります。
AWSIoTとMQTT(Pub/sub)通信するためにClientとSubscribeとPublishの3つがあります。
Visualization(HMI)の画面は下記形になります。
冒頭でも紹介しましたが、動画で見ると実際にMQTTのPub/Subの様子が分かります。
AWS⇔CODESYS間でメッセージがやり取りされていることが確認できます。
是非一緒にご覧ください。
AWSIoTClientをテストする
プログラム起動して、最初にAWSIoTClientを動作させます。
xEnable箇所をクリックすると「xBusy」と「xConnectedToBroker」のランプが点灯します。
※「xConnectedToBroker」のランプが点灯しない場合はAWSと通信が出来ていません。
AWSIoTPublishをテストする
次にAWSIoTPublishを動作させます。
PLC(CODESYS)側からAWSにメッセージをPub(発行)します。
今回は「Hello AWS from CODESYS」というメッセージを送ります。
PLC側からPub(発行)させますのでAWSのテスト画面で確認しています。
AWS IoTの画面で左の一覧から「テスト」を選択します。
MQTTクライアントの画面が出てきます。
そしてPLC(CODESYS)の画面でPubのスイッチ(xExecute)をONします。
AWSの画面で「Hello AWS from CODESYS」と表示されます。
AWSIoTSubscribeをテストする
最後にAWSIoTSubscribeを動作させます。
PLC(CODESYS)側がAWSからメッセージをSub(購読)します。
PLC(CODESYS)の画面でAWSIoTSubscribeのxEnableをONします。
正常に動作している場合は「xBusy」と「xSubscribeActive」が点灯します。
その後AWS側からメッセージを送るとPLCのパラメータ箇所に値が入っています。
「sSubscribeMessage」の箇所がSub(購読)したメッセージが表示されます。
AWS経由のMQTT通信テスト
今回の応用としてAWS(クラウド)を経由したMQTTの通信を行い、PLCを制御してみました。
具体的には特定のメッセージが来たらラズパイのGPIOをON/OFFしています。
PLCプログラムの改造方法含めて下記記事で紹介しています。(リンク先はこちら)
MQTTでPLCを制御!AWS(クラウド)経由で通信してみた
まとめ
今回はAWS IoTとPLCの接続に関して紹介させていただきました。
記事をまとめますと下記になります。
PLCとクラウドを勉強するにもラズベリーパイ(raspberry pi)はちょうど良いデバイスかと思います。
是非皆さまも試してみて下さい。
コメント