PythonでPLC(シーケンサ)と通信してデータを読み出す方法

Python

PythonでPLC(シーケンサ)のプログラム・データと通信しました。「ラズベリーパイ(raspberry pi)」+「CODESYS」上で動作・デバッグしていますので、誰でも簡単に実行することができます。

 

PythonのスクリプトでCODESYSは実行できる

今までの記事で「ラズベリーパイ(raspberry pi)」+「CODESYS」によるシーケンス制御を行ってきました。そして今回は最近主流のプログラミング言語「Python」でスクリプト実行できますので、その手段を紹介したいと思います。

 

Pythonで簡単な実行例を紹介します

今回のゴールとしてはPLC(シーケンサ)が動いている最中に「Python」で内部変数(データの一部)を読み取りたいと考えています。

 

具体的には「SWを押している時間」を取り込む簡単な例を紹介します。他にも「生産個数」「出力回数・時間」をカウントしたい場合にいくらでも応用できる例となっています。

 

Python未経験の方でも大丈夫です

あとPythonのインストール・実行環境が無い未経験の方でも大丈夫です。今回の記事は簡単な導入・例にしましたのでメモ帳・テキストベースの編集でも対応可能です。

 

必要な方は下記リンク先からPythonをダウンロード・インストールしてもらっても構いません。

Welcome to Python.org
The official home of the Python Programming Language

 

ちなみに筆者も少し前までPythonを始めプログラム自体が全くの未経験でしたが、少しづつですが使えるようになってきています。その際の記事は下記となります

未経験・社会人向け! Pythonと機械学習の勉強方法・始め方
未経験で社会人である筆者がPythonと機械学習を学ぶにあたって「今回の勉強方法はかなり実用的かつ効率的!」と強く実感した内容でしたので紹介したいと思います。 UdemyがPythonと機械学習の始め方に最適! 結論から言いますとの講座...

 

CODESYSをダウンロード・インストールする

今回使うソフトウェアPLCの「CODESYS」のダウンロード・インストール方法に関しては記事「PLC(シーケンサ)・ラダーがフリーで使える!おススメ入門ソフト」に記載しましたのでリンク先から参照をお願いします

PLC(シーケンサ)・ラダーがフリーで使える!おすすめ入門ソフト
ラズベリーパイをPLC(シーケンサ)として使う準備編で「PLC(シーケンサ)・ラダーがフリーで使える!おすすめ入門ソフト」を紹介します フリーでラダーのプログラムを実際に動かす手順を紹介しています。「自分でPLC(シーケンサ)...

 

CODESYSをラズベリーパイで使う方法

「CODESYS」をラズベリーパイ(raspberry pi)で使う方法に関しては記事「ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた」に記載しましたのでリンク先から参照をお願いします

ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた
ラズベリーパイをPLC(シーケンサ)として使う実践編で「ラズベリーパイでPLC(シーケンサ)・ラダーの使い方を学んでみた」を紹介します ラズベリーパイでラダーのプログラムを実際に動かす手順を紹介しています。「自分でPLC(シーケンサ)...

 

今回のシーケンス制御で使うのはST言語

今回のプログラム内容は記事「ソフトウェアPLC「CODESYS」の使い方まとめ」の最後で動かしたST言語のプログラム(ラッチ(自己保持)回路 リセット付き)を少しアレンジします。

 

ST言語を選んだ理由はせっかくプログラミング言語のPythonを使うのでソフトウェアに関連する言語の方がいいからと考えたからです。

 

そのためST言語の使い方は前記事と同じになりますのでリンク先から参照をお願いします

ソフトウェアPLC「CODESYS」の使い方まとめ
実質フリー(無料)で使えるのソフトウェアPLC「CODESYS」の使い方をまとめました。 「CODESYS」はラズベリーパイでデバッグできるため「自分でPLC(シーケンサ)を色々触ってみたい!」という方におすすめな記事となっています。...

 

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のデータを拾えていることが無事分かりました。

 

まとめ

如何でしたでしょうか。pythonでPLCと通信してデータを拾うことができました。

「pythonのスクリプトでPLC(シーケンサ)を一度通信してみたい!」という人には今回のように簡単に体験できます。

 

筆者が紹介したスクリプトは機能の一部で全ては紹介できていないですので、よろしければ皆様もぜひトライして見てください。

今回はここまでにしたいと思います。ご覧戴き、ありがとうございました。

 

次の記事ではデータを読み込むだけでなくpythonのスクリプトでPLC(シーケンサ)を起動・停止まで行っています。よろしければご覧ください

raspberry piをPLC(シーケンサ)にしてpythonで制御してみた
PythonのスクリプトでPLC(シーケンサ)を起動・停止まで行います。環境は「ラズベリーパイ(raspberry pi)」+「CODESYS」上で動作・デバッグしています。 PythonのスクリプトでPLCを起動・停止させる ...

 

コメント