PythonでPLC(シーケンサ)のプログラム・データと通信しました。
「ラズベリーパイ(raspberry pi)」+「CODESYS」上で動作・デバッグしています。
誰でも簡単に実行することができます。
PythonのスクリプトでCODESYSは実行できる
今までの記事で「ラズベリーパイ(raspberry pi)」+「CODESYS」によるシーケンス制御を行ってきました。そして今回は最近主流のプログラミング言語「Python」でスクリプト実行できますので、その手段を紹介したいと思います。
Pythonで簡単な実行例を紹介します
今回のゴールとしてはPLC(シーケンサ)が動いている最中に「Python」で内部変数(データの一部)を読み取りたいと考えています。
具体的には「SWを押している時間」を取り込む簡単な例を紹介します。他にも「生産個数」「出力回数・時間」をカウントしたい場合にいくらでも応用できる例となっています。
Python未経験の方でも大丈夫です
あとPythonのインストール・実行環境が無い未経験の方でも大丈夫です。今回の記事は簡単な導入・例にしましたのでメモ帳・テキストベースの編集でも対応可能です。
必要な方は下記リンク先からPythonをダウンロード・インストールしてもらっても構いません。
ちなみに筆者も少し前までPythonを始めプログラム自体が全くの未経験でしたが、少しづつですが使えるようになってきています。その際の記事は下記となります
CODESYSをダウンロード・インストールする
今回使うソフトウェアPLCの「CODESYS」のダウンロード・インストール方法に関しては記事「PLC(シーケンサ)・ラダーがフリーで使える!おススメ入門ソフト」に記載しましたのでリンク先から参照をお願いします
CODESYSをラズベリーパイで使う方法
「CODESYS」をラズベリーパイ(raspberry pi)で使う方法に関しては記事「ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた」に記載しましたのでリンク先から参照をお願いします
今回のシーケンス制御で使うのはST言語
今回のプログラム内容は記事「ソフトウェアPLC「CODESYS」の使い方まとめ」の最後で動かしたST言語のプログラム(ラッチ(自己保持)回路 リセット付き)を少しアレンジします。
ST言語を選んだ理由はせっかくプログラミング言語のPythonを使うのでソフトウェアに関連する言語の方がいいからと考えたからです。
そのためST言語の使い方は前記事と同じになりますのでリンク先から参照をお願いします
Pythonのスクリプトを作る
実際に動かす前にPythonのスクリプトを作っておきます。今回のプログラム内容は下記です。※取得する変数はX003にしており、スクリプト起動後10秒後に値を読み取るようにしています。
# current project
proj = projects.primary
# set "current.project" to active application
app = proj.active_application
onlineapp = online.create_online_application(app)
# wait 10 second
system.delay(10000)
# read value of SW1
value = onlineapp.read_value("PLC_PRG.X003")
# display value in message view or command line
print(value)
※「#」でコメント文残していますので大体何をやっているか分かると思いますが、もし詳細知りたい場合は「CODESYS」のヘルプページで「Creating Python Scripts」で検索お願いします。
(ちなみに筆者は「機能の一部分」しか使えていないです…)
初心者・未経験者向けpythonスクリプトの作り方
もしPython未経験の方はテキスト(メモ帳)を開いてもらって、「~~~.py」で保存してください。~~~は好きな名前でいいです。筆者は「Python_ReadVariable.py」としています
ST言語のプログラムを変更する
今回の「SWを押したときの時間」を測定したいため「ソフトウェアPLC「CODESYS」の使い方まとめ」で作成したST言語のプログラムを変更します。といっても2行「X003」の追記だけです。
今回は「IF X001=1~」の状態、つまり「SW1を押した分」だけX003の数字が増えていく(+1されていく)プログラムとしています
PLCのサイクルタイム・スキャンタイムを設定・変更する
今回SWを押している時間の「X003」カウントは制御周期(サイクルタイム・スキャンタイム)の時間に影響されます。そのためカウントしやすいPLCの制御周期を10msか100msなどの時間に変更します。
「CODESYS」で制御周期の時間を変更するには「Main Task」で変更できます。今回は100msと遅めの周期にしています。
「CODESYS」はLinuxベースのソフトウェアPLCのため制御周期が確実に一定ではなく、周りのタスクに影響されます。ちなみに「CODESYS」がラズベリーパイ(raspberry pi)でサイクリックで設定できる最短の制御周期は50usです。(※msではなくusなので注意!)
49us以下にするとエラーが出ます。筆者が紹介しているようなプログラムは簡単なのでusでも対応できると思いますが、長いプログラム・複数タスクを抱えると難しくなると考えています。また何時かこの辺りも個別に記事にする予定です。
STのプログラムでラズベリーパイを動かす
前章までで準備が整ったので、実際に動かしていきます。今回筆者が作成したのPythonのスクリプトはプログラム動作中にデータを読み取るものですので予めラズベリーパイ(raspberry pi)で運転させておきます。
「CODESYS」をラズベリーパイ(raspberry pi)で動かす方法に関しては記事「ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた」に記載しましたのでリンク先から参照をお願いします
プログラムを動作させ、SW1を押しているときは(LEDが光ると同時に)「X003」がカウントアップしていきます。
先ほど設定した制御周期(サイクルタイム)100ms(0.1秒)でカウントアップされていきます
Pythonのスクリプトの実行方法
最後に本題のCODESYSでPythonのスクリプトを実行して「X003」の値を読み取っていきます
実行方法としては「メニューコマンド」「コマンドライン」「ツールバーのアイコン」の3択なのですが今回は一番楽な「メニューコマンド」から実行していきます。
プログラムの実行中に「ツール」⇒「スクリプト作成」⇒「スクリプトファイルの実行」で実行できます。※今回はログも見たいので実行前に「スクリプトトレースの有効化」もONしておきます
PythonでPLCのデータを読み取る必要性
正直今回は「CODESYSの画面上で既に「X003」の値を見れてるからわざわざPythonで読み取る必要ある?」と言われてしまいそうですが、例えば実使用の場合で
・とある時間・とある条件のときのPLCのパラメータ値を読み取りたい
・PythonでPLCの運転・停止・データ収集まで一括でPythonで管理したい
といった形で利用ができ、これからAI・IOTの時代で多くのデータを管理する際には非常に有効かと考えています
Pythonのスクリプト実行結果
結果を分かりやすくするためにSW1を押しながらPythonスクリプト実行をしてみます。
今回のスクリプトは起動後10秒ディレイの後に値を読み取りますので、「X003」カウントアップ続けますが、スクリプトのメッセージには10秒後の値が返ってきています。
動画でも上げてみました。動画を時系列で並べると下記流れですがやはり分かりづらい形になっています。※動画では10秒ディレイ前にも一度「X003」を読み出すように変更しています
3秒辺り… STプログラムを起動する
7秒辺り… SW1を押し続ける
18秒辺り… Pythonスクリプトを起動(10秒ディレイ前の「X003」の値がINT#104として返ってきてる)
28秒辺り… Pythonスクリプトが終了(10秒ディレイ後の「X003」の値がINT#203として返ってきてる)
PythonのスクリプトでPLCのデータを拾えていることが無事分かりました。
OPC UAを使えばPLCメーカー問わずにPythonで通信できる
他メーカのPLCでもOPC UAという環境を整えればPythonと接続できます。
OPC UAは簡単に言うと多くの産業ネットワークを超えて通信ができる規格です。
(下記は簡単なイメージ図です)
下記記事でPythonをOPC UAで使ってPLCと接続しています。(リンク先はこちら)
PythonでOPC UAを実装!クライアントを作ってサーバーに接続
MQTTでもPythonから通信できる
MQTTというプロトコルを使ってもPythonとPLCと通信することが可能です。
下記記事ではAWS(クラウド)経由させる形で紹介しています。(リンク先はこちら)
MQTTでPLCを制御!AWS(クラウド)経由で通信してみた
まとめ
如何でしたでしょうか。pythonでPLCと通信してデータを拾うことができました。
「pythonのスクリプトでPLC(シーケンサ)を一度通信してみたい!」という人には今回のように簡単に体験できます。
筆者が紹介したスクリプトは機能の一部で全ては紹介できていないですので、よろしければ皆様もぜひトライして見てください。
今回はここまでにしたいと思います。ご覧戴き、ありがとうございました。
次の記事ではデータを読み込むだけでなくpythonのスクリプトでPLC(シーケンサ)を起動・停止まで行っています。よろしければご覧ください
コメント