MQTTを使ってPLCを制御してみました。
AWS(クラウド)を経由していますので、世界中の何処のPLCにでも繋げれます。
設定方法からプログラム含めて紹介します。
MQTTでPLC制御!AWS(クラウド)経由で通信してみた
AWS(クラウド)を経由したMQTTの通信を行い、PLCを制御してみました。
PythonからMQTTのPub/Subのメッセージを通信をさせています。
テストとしてラズパイをPLCにしていますので誰でも同様に実施できます。
具体的には特定のメッセージが来たらラズパイのGPIOをON/OFFしています。
PythonからAWS(クラウド)経由でPLC(ラズパイ+ソフトウェアPLC)を制御できています。
実際にMQTTでPLCプログラムの出力(ラズパイのGPIO)をON/OFFしています。
設定方法からPython・PLCのプログラム含めて紹介していきます。
また今回の内容を「第3回 FA設備技術勉強会オンライン」で発表させていただきました。
その際の説明スライドが下記となっています。
クラウド経由でMQTTでPLCと通信するメリット・概要含めて説明しています。
実際のテスト動画は下記となっています。
PythonとMQTTでPLCを制御を出来ている様子が分かりやすいです。
是非一緒にご覧ください。
AWSが初めての方は登録から
AWSのサービス利用が初めての方は下記記事を参考に登録からお願いします。
AWSに登録して、ラズパイのGPIOの信号をクラウドに送信するまでの手順を紹介しています。
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
最終的にはラズパイからのメッセージをMQTTでAWSに通知させています。
AWSの登録・設定方法から、テストプログラム含めて記載しています。(リンク先はこちら)
ラズベリーパイをPLCにする方法
ラズベリーパイをPLCに設定する方法に関しては下記記事でまとめています。
シーケンス制御とラダーの始め方 ラズパイとCODESYSで入門
CODESYSというソフトを使うことでラズベリーパイをPLCにすることが可能です。
ラダーやシーケンス制御を簡単に始めることができます。(リンク先はこちら)
テストレベルならば無料で実施できます。
実際に今回のテストを同様に実施する方はラズパイにCODESYSのインストールをお願いします。
PLCとAWSを接続する方法
PLCとAWS(クラウド)の接続方法に関しては下記記事でまとめています。
AWS IoTとPLCの事例!ゲートウェイ無しで接続してみた
必要なソフト・ライブラリのリンク先、各設定方法含めて紹介しています。
実際にCODESYSとAWSを通信テストするまで記載しています。(リンク先はこちら)
MQTTからPLCの出力を制御をする
MQTTで特定のメッセージをPLCがSub(購読)したら出力をON/OFFさせます。
今回はラズベリーパイのGPIOを制御させます。
実際の一例として「GPIO17_ON」というメッセージをSubしたら、実際にGPIO17をONします。
PLC(CODESYS)側のプログラミングをしていきます。
下記記事で紹介したAWSとPLCを接続したプログラムに追記する形で記載していきます。
AWS IoTとPLCの事例!ゲートウェイ無しで接続してみた
CFCというプログラム言語で作成していきます。
※CFC…Continuous Function Chart_コンティニュースファンクション・チャート
CFCはファンクションブロックを繋げることでPLCのプログラムを作成していきます。
CFCのプログラム作成方法に関しては下記記事でも紹介しています。ご参考ください。
MQTTのSub(購読)のパラメータを確認する
AWSからMQTTでSub(購読)した場合、何処のパラメータに値が入るのかを確認します。
今回のプログラムではSTRING(文字列)型で「sSubscribeMessage」が該当しました。
メッセージをSub(購読)すると「sSubscribeMessage」に値が入ります。
EQ(equals)のファンクションブロックを使う
今回のプログラムは簡単なテストの一例ですので、あくまで参考でお願いします。
特定のメッセージと同値だった場合に出力すれば良いので、今回は「EQ(equals)」を使います。
ツールボックスをドラッグ&ドロップして「EQ」と入力すれば使えます。
今回は「GPIO17_ON」「GPIO22_ON」というメッセージが来た時に(Y001,Y002)出力をさせます。
PLCの入出力の設定をする
今回はラズベリーパイのGPIOでPLC出力をさせます。
「GPIOs」パラメータ箇所で「GPIO17」「GPIO22」の値を「Output」にします。
またGPIOs I/O マッピング箇所で該当箇所の出力を「Y001」「Y002」に設定します。
CODESYSをラズベリーパイのGPIO設定方法に関しては下記記事にも記載しています。
簡単なラダープログラムの入出力を制御しています。
ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた
出力回路を接続する
ラズパイの「GPIO17」「GPIO22」の箇所に出力回路を接続します。
今回は簡単に3.3VでLED点灯をさせます。発光LEDと抵抗(330Ω)を接続しておきます。
接続に関してはブレットボードやジャンパー線で対応しています
もし24Vリレーなどを動かしたい場合はトランジスタ・フォトカプラなどを使用して下さい。
下記記事で実際にラズベリーパイで24Vを駆動しています。
フォトカプラの使い方 ラズベリーパイで絶縁して24Vを動かしてみた
PLCのHMI画面を設定する
MQTTでPLCがSub(購読)した際、メッセージがHMIの画面で表示できるように設定します。
「テキストフィールド」でSTRING型などの文字列を表示できます。
テキスト箇所に「%s」、テキスト変数箇所に該当のパラメータ値を設定します。
また特定メッセージの際にHMIの画面でもLEDが点灯するようにしました。
CODESYSでのHMI画面の作り方(Visualization)に関しては下記記事でも紹介しています。
自由に入出力画面も作成できます。(リンク先はこちら)
PLC(シーケンサ)を無線化!遠隔操作・監視した事例を試してみた
PythonからMQTTのPub(発行)してテストする
Python側からメッセージをPub(発行)してテストを行います。
Pythonが使えるものならばパソコンでもラズパイでも何でもOKです。
(筆者はPython側もラズベリーパイで実施しています。)
Pythonのプログラムとしては下記を使用しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# Import SDK packages from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTClient # For certificate based connection myMQTTClient = AWSIoTMQTTClient("myClientID") # For Websocket connection # myMQTTClient = AWSIoTMQTTClient("myClientID", useWebsocket=True) # Configurations # For TLS mutual authentication myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 8883) # For Websocket # myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 443) # For TLS mutual authentication with TLS ALPN extension # myMQTTClient.configureEndpoint("YOUR.ENDPOINT", 443) myMQTTClient.configureCredentials("YOUR/ROOT/CA/PATH", "PRIVATE/KEY/PATH", "CERTIFICATE/PATH") # For Websocket, we only need to configure the root CA # myMQTTClient.configureCredentials("YOUR/ROOT/CA/PATH") myMQTTClient.configureOfflinePublishQueueing(-1) # Infinite offline Publish queueing myMQTTClient.configureDrainingFrequency(2) # Draining: 2 Hz myMQTTClient.configureConnectDisconnectTimeout(10) # 10 sec myMQTTClient.configureMQTTOperationTimeout(5) # 5 sec myMQTTClient.connect() myMQTTClient.publish("myTopic", "HELLO", 0) #myMQTTClient.subscribe("myTopic", 1, customCallback) #myMQTTClient.unsubscribe("myTopic") myMQTTClient.disconnect() |
下記記事で紹介したプログラムと基本的には同じです。
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
「myMQTTClient.publish…」箇所のメッセージを色々切り替えてテストしていきます。
(HELLO→GPIO17_ON→GPIO22_ON→GPIO17_ON…)
冒頭でも紹介しましたが、実際のテスト動画は下記となります。
PythonとMQTTでPLCを制御を出来ている様子が分かりやすいです。
是非一緒にご覧ください。
PLCのHMI画面でのテスト(HELLO)
テストではPythonとPLCの両方の画面を出して確認していきます。
最初に「HELLO」をPython側からPub(発行)する前の画面が下記です。
Pub(発行)前は「PLCのSub(購読)」のメッセージは空であることが分かります。
「HELLO」をPython側からPub(発行)した後の画面が下記です。
右下の「PLCのSub(購読)」に「HELLO」のメッセージが入っていることが分かります。
PLCのHMI画面でのテスト(GPIO**_ON)
Pythonのプログラムのメッセージ内容を修正します。(HELLO→GPIO17_ON)
「GPIO17_ON」をPython側からPub(発行)した後の画面が下記です。
右下の「PLCのSub(購読)」に「GPIO17_ON」のメッセージが入っていることが分かります。
またGPIO17_ONに紐づけた、左側のLEDも点灯しています。
再度プログラム修正してPythonから「GPIO22_ON」Pub(発行)したものが下記です。
右下の「PLCのSub(購読)」に「GPIO22_ON」のメッセージが入っていることが分かります。
またGPIO22_ONに紐づけた、右側のLEDも点灯しています。
PLCのプログラム・出力での確認
実際のPLCプログラム・出力でも正常動作できているかを確認します。
「GPIO17_ON」中は、PLCプログラムから(Y001)出力が「True」で動作OKでした。
GPIO17に配線した「緑LED」も点灯しています。
「GPIO22_ON」中は、PLCプログラムから(Y002)出力が「True」で動作OKでした。
GPIO22に配線した「赤LED」も点灯しています。
PLCプログラム・出力も問題なくMQTTから制御されていることが分かりました。
第3回 FA設備技術勉強会オンラインで発表させていただきました
今回の内容を「第3回 FA設備技術勉強会オンライン」で発表させていただきました。
(connpassでのリンク先はこちらから)
謝辞
FAの技術交流できる貴重な場を開催していただいたことに深く感謝申し上げます。
@fulhause様、また一般社団法人 次世代ロボットエンジニア支援機構 Scramble様含めた開催者・運営者・参加者の皆様には重ねてお礼申し上げます。
勉強会でいただいた意見・コメント
冒頭でも紹介した下記勉強会の資料に関しても貴重な意見をコメントいただきました。
忘備録含めてこのブログにも残しておきたいと思います。
(記事として書きやすいように質問・回答内容を多少修正させてもらっています。ご了承ください)
AWSの証明書の対応は大変?
はい、大変でした。何も情報ない所からAWS IoTの証明書対応はするのはかなり面倒でした。
ただ一度成功すれば、後は同じパターンで繋げば良いので、慣れ・経験もあるかと思います。
CODESYSとAWS IoTでを繋げるには下記記事で説明したようにCSRの対応が必要です。
AWS IoTとPLCの事例!ゲートウェイ無しで接続してみた
但し、紹介したCODESYSのCSR(証明書要求)での対応はあくまで一例です。
秘密鍵と公開鍵で実施するパターンもありますし、CA証明書を使うケースもあります。
また使用するPLC・ゲートウェイ次第では別のターンも考えられます。
一概に「この方法が確実」というものは無く、ケースバイケースで対応する必要があります。
もし実際に繋げる場合は使用するPLC・ゲートウェイのメーカに相談するのが一番かと思います。
メーカはユーザーが証明書の対応を楽にするために色々と機能を出しているはずです。
(そうでないとユーザーがデバイス1台1台に証明書を作成して、管理する羽目になるので…)
PLCプログラムは規格にあるFB(ファンクションブロック)で対応可能?
はい、PLCの規格(IEC61131-3)にあるFB(ファンクションブロック)でも対応可能でした。
FBでプログラム作成して、ビルド通して正常に動作すること確認しました。
(勉強会のその場で直ぐに回答できずに申し訳ない…)
今回の記事内ではCODESYSのサンプルを真似してCFCという言語で作成しました。
※CFC…Continuous Function Chart_コンティニュースファンクション・チャート
しかし、AWS IoTのライブラリのパラメータを見ると、FBで定義されています。
FBでエラー無くビルドも無事通り、AWS IoTとCODESYSを通信できました。
まとめ
今回はMQTTとPLC制御に関して紹介させていただきました。
記事をまとめますと下記になります。
PLCとクラウドを勉強するにもラズベリーパイ(raspberry pi)はちょうど良いデバイスかと思います。
是非皆さまも試してみて下さい。
コメント