オープンソースのPLCソフトウェアであるOpenPLC Editorで作成したプログラムをRaspberry Pi Pico Wで動作させてLEDのON、OFFを行う等の実験を行ったので紹介します。
FA機器の制御ではコントローラとしてPLC (プログラムロジックコントローラ)が多く使用されています。一般にPLCは市販の製品(三菱電機製、オムロン製、キーエンス製等)が使用されますが、ハードウェアも開発ツールも高価です。
OpenPLC EditorはフリーのPLC用言語編集ソフトで様々なマイコンボード等のハードウェアに対応しています。
ここでは、OpenPLC Editorが対応しているハードウェアの中でも安く入手出来ると思われるRaspberry Pi Pico Wを使用してみました。
Raspberry Pi Pico Wでデフォルトで入力I/O 8点、出力I/O 8点、アナログ入力3点、アナログ出力2点のPLCを構築出来ます。
Raspberry Pi Pico Wは2000円以下で入手出来、Wi-FiやBluetoothも使用出来るので、安価なIoTに対応したPLCを構築することが出来ると思います。
OpenPLC Editorに関して
FA機器の制御は、コントローラとしてシーケンサと呼ばれることが多いPLC (プログラムロジックコントローラ)が使用されることが多いです。
OpenPLC Editorはパソコン等にインストールして使用するPLCプログラミング用のエディターです。PLCプログラミングの規格であるIEC61131-3に対応しています。
IEC61131-3で規定されたPLC用のプログラミング言語としては、シーケンシャルファンクションチャート(SFC), ラダー図(LD), ファンクションブロック図(FBD), 命令リスト(IL), 構造化テキスト(ST)がありますが、FA機器の制御ではラダー図(LD)言語が使用されることが多いです。本実験でもラダー図言語を使用してみました。
OpenPLC EditorはPLC用のプログラム言語を様々なハードウェアに対応した言語にコンパイルして、そのハードウェアに転送することが出来ます。
対応しているハードウェアはArduino, ESP32, Raspberry Pi Pico等があります。
OpenPLC Editorに対応した安いハードウェアはRaspberry Pi Picoだと思われます。
Raspberry Pi Picoを使用した場合、デフォルトで8点の入力I/O、 8点の出力I/O、3点のアナログ入力、2点のアナログ出力を持つPLCを製作することが出来ます。本記事ではRaspberry Pi Picoに無線機能を搭載したRaspberry Pi Pico Wを使用しています。
OpenPLC Editorのパソコンへのインストール
今回の実験ではWindows 11パソコンにOpenPLC Editorをインストールしました。
OpenPLC Editorで作成したプログラムをRaspberry Pi Pico Wで実行するためには、他にArduino IDE関係のソフトウェアの一部分や、その他のソフトウェアが必要だったりするようですが、その他必要ソフトウェアは、Raspberry Pi Pico Wへのプログラム転送(Transfer to PLC)等を実行する過程で自動的にダウンロードされてインストールされるようです。
今回の実験ではOpenPLC Editorのソフトウェアしかインストールしていませんが、「Transfer to PLC」処理を実行すると、「ユーザー\ユーザー名\AppData\Local」内にArduino IDEのフォルダと思われるArduino15フォルダが作成されました。そのフォルダの内容は実際のArduino IDEをインストールした時に出来るArduino15ファルダ内の一部分でした。
今回の実験では、OpenPLC Editorのみをインストールするだけで、Raspberry Pi Pico Wにプログラムを転送して実行することが出来ました。
以下にOpenPLC Editorのインストール手順を示します。
1.OpenPLC EditorのWindows版は以下のサイトから無料でダウンロードすることが出来ました。
https://autonomylogic.com/download-windows
ダウンロードページは以下の様な画面です。
ここで、寄付をする場合は寄付金額を選択して「CONTRIBUITE & DOWNLOAD」をクリックします。寄付の支払い方法等の画面が表示されます。
寄付をしない場合は「JUST DOWNLOAD」をクリックすれば、即OpenPLC Editorをダウンロードすることが出来ます。
2.ダウンロードしたファイル「OpenPLC Editor for Windows.exe」をダブルクリックするとインストールソフトウェアが起動します。
3.以下の画面が表示されたら「Install」をクリックするとインストールが開始されます。私はデフォルト設定のままインストールしました。
4.画面上部に「OpenPLC Editor Setup: Completed」が表示されたら、「Close」ボタンをクリックすることでOpenPLC Editorのインストール完了します。
5.インストール終了後にOpenPLC Editorを起動します。初めての起動時は以下の様な画面が表示されて、必要な初期処理等が行われているようでプログラムの編集画面が表示されるまで時間がかかりました。
6.初期処理が終了すると以下の様なプログラム編集画面が表示されます。これでプログラムの編集が可能となります。
OpenPLCのRaspberry Pi Pico W対応
今回の実験ではOpenPLCを動作させるハードウェアとしてRaspberry Pi Pico Wを使用しました。
Raspberry Pi Pico Wに関してOpenPLCはデフォルトで表1の様にI/Oが対応しています。ロケーションの欄に書いてある%IX0.0等はI/Oに直接アクセスするための直接表現変数です。OpenPLC Editorでは入出力変数の定義画面で、I/Oを直接操作する変数を定義する場合にLocation欄に、この表記で記載します。
直接表現変数は「%」で始まり、次にI(入力)、Q(出力)で、「X」以降はビットアドレス、「W」以降はワードアドレス(16bit)を表します。
役割 | Raspberry Pi Pico WのI/O | ロケーション |
入力I/O | GP6, GP7, GP8, GP9, GP10, GP11, GP12, GP13 | %IX0.0~%IX0.7 |
出力I/O | GP14, GP15, GP16, GP17, GP18, GP19,GP20, GP21 | %QX0.0~%QX0.7 |
アナログ入力 | GP26, GP27, GP28 | %IW0~%IW2 |
アナログ出力 | GP4, GP5 | %QW0~%QW1 |
実験回路
今回の実験回路では、2個のスイッチをRaspberry Pi Pico WのI/OのGP6とGP7に接続、3個のLEDをGP18~GP20に接続しました。
一般にFA機器の制御ではDC24Vで動作するセンサやアクチュエータが使用されますが、今回はOpenPLCの動作実験と言うことで、Raspberry Pi Pico WのDC3.3VのI/Oに直接スイッチとLEDを接続しました。
図1に回路図、図2に実験装置の外観を示します。
ラダー図言語に関して
今回の実験では、プログラム言語としてラダー図言語(LD)を使用しました。ラダー図言語の原型はリレーシーケンス制御の回路図から来ています。
リレーシーケンス制御の回路に関して図3に記載します。
図3はスイッチとリレーを使用したリレーシーケンス制御の回路です。
リレーはコイルに電流が流れると、その磁力によって可動鉄片が引き付けられて動作して、可動鉄片に取り付けられた接点と固定の接点が接触することによってスイッチとなる素子です。
コイルに電流が流れた時に接点接触して電流が流れる構造のリレーをa接点のリレーと呼び、コイルに電流が流れて無い時に接点が接触していて、電流が流れた時に接点が離れる構造のリレーをb接点のリレーと呼びます。
ラダー図言語はこのリレーを使用した回路図から来ており、図3の回路をOpenPLC Editorで記載すると図4の様になります。
図4のラダー図の記号がスイッチの接点(a接点)を表します。がリレーのコイルを表します。
ラダー図ではSwitch、Relay等は変数で状態をTRUEとFALSEで表します。
図4で上側に書いてある表は変数の定義表でName欄のSwitchのLocation欄が%IX0.0となっていますが、%IX0.0は表1に記載した様に、Raspberry Pi Pico WのI/OのGP6 (9ピン)を表します。
また、Name欄のRelayのLocation欄が%QX0.0となっていますが、%QX0.0はRaspberry Pi Pico WのI/OのGP14 (19ピン)を表します。
実際にRaspberry Pi Pico WのI/OのGP6にスイッチ、I/OのGP14にリレーを接続すれば図3と同様の動作を行うことが出来ます。
但し、図3の電源電圧はDC24Vで書いてありますが、Raspberry Pi Pico WのI/Oの電圧はDC3.3Vなので全く同様にするためにはRaspberry Pi Pico WのI/Oの電圧レベルを変換する回路を設ける必要があります。
また、リレーに関してa接点とb接点の違いを図5、図6で説明します。
a接点のリレーは、コイルに電流を流した時に接点が閉じ、スイッチがONします。
b接点のリレーはコイルに電流が流れていない時に接点が閉じていてスイッチがONしています。
コイルに電流を流すと接点が開きスイッチがOFFします。
実験プログラムで使用したラダー図記号
ラダー図はリレーシーケンス制御の回路図を基にしていますが、実際のラダー図言語ではリレーシーケンス制御回路では実現出来ない演算や通信等様々な処理を行うことが出来るようになっています。
より複雑な機能はラダー図内でファンクションブロックを使用して行います。
表2で今回の実験で使用したラダー図の記号に関して記載します。この他にも演算や通信等様々な機能があります。詳細はIEC61131-3の規格書やOpenPLCの説明書等を参照して下さい。
記号 | 名称 | 説明 | 電気回路に例えると |
a接点 | VarNameの変数がTRUEなら左側の状態を、そうでなければFALSEを右側に伝達する。 | 押すと電流が流れるスイッチ。 | |
b接点 | VarNameの変数がFALSEなら左側の状態を、そうでなければFALSEを右側に伝達する。 | 押すと電流が切れるスイッチ。 | |
立ち上がり接点 | VarNameの変数がFALSE→TRUEに変化した時に、左の値を右に伝達する。その他の場合FALSEを右側に伝達する。 | 押した瞬間だけ電流が流れるスイッチ。 | |
立下り接点 | VarNameの変数がTRUE→FALSEに変化した時に、左の値を右に伝達する。その他の場合FALSEを右側に伝達する。 | 離した瞬間だけ電流が流れるスイッチ。 | |
コイル | 左側の値をVarNameの変数にコピーする。 | 電流が流れると鉄片を引き付けるコイル、その鉄片の動作でa接点やb接点を駆動する。 | |
否定コイル | 左側の否定値(FALSEとTRUEを入れ替える)をVarNameの変数にコピーする。 | 実際には存在しないが、電流が切れると鉄片を引き付けるコイル、その鉄片の動作でa接点やb接点を駆動する。 | |
セットコイル | 左側の状態がTRUE状態ならVarNameの変数をTRUEにする、そうでない場合は変数を変化させない。 | 電流が流れると鉄片を引き付けるコイル、メカ構造で一度鉄片を引き付けると電流が切れても引き付けっぱなしとなるコイル。その鉄片の動作でa接点やb接点を駆動する。 | |
リセットコイル | 左側の状態がTRUE状態ならVarNameの変数をFALSEにする、そうでない場合は変数を変化させない。 | 実際には存在しないが、電流が切れると鉄片を引き付けるコイル、一度鉄片を引き付けると電流が流れても引き付けっぱなしとなるコイル。 その鉄片の動作でa接点やb接点を駆動する。 | |
立ち上がり変化検出コイル | 左側がFALSE→TRUEに変化した時に、左側の値をVarNameの変数にコピーする、そうでない場合は変数を変化させない。 | 電流が流れ始めた瞬間だけ鉄片を引き付けるコイル。メカ構造で一度鉄片を引き付けると電流が切れても引き付けっぱなしとなるコイル。その鉄片の動作でa接点やb接点を駆動する。 | |
立下り変化検出コイル | 左側がTRUE→FALSEに変化した時に、VarNameの変数をTRUEにする、そうでない場合は変数を変化させない。 | 実際には存在しないが電流が切れ始めた瞬間だけ鉄片を引き付けるコイル。一度鉄片を引き付けると電流が流れても引き付けっぱなしとなるコイル。その鉄片の動作でa接点やb接点を駆動する。 | |
オンディレータイマ | 起動から設定時間経過後にTRUEを出力するタイマ。 プログラム中にタイマを複数使用する場合はInstaceNameを全て別の名称にする必要がある 【入出力】 IN:タイマ入力 TRUE タイマ起動、FALSE タイマリセット PT:設定時間(ms) Q:タイマ出力 TRUE タイマ出力ON、FALSE タイマ出力OFF ET:経過時間(ms) | 押してしばらくして電流が流れるスイッチ。入力信号が入ってしばらくすると出力信号が出される。 | |
パワーレール(電源ライン)左側 | リレーシーケンス制御回路の左側の電源ラインに相当する。 OpenPLCの場合、パワーレールから出る線の本数を設定により変更することが出来る。 | プラスの電源ライン。 | |
パワーレール(電源ライン)右側 | リレーシーケンス制御回路の右側の電源ラインに相当する。OpenPLCの場合、パワーレールから出る線の本数を設定により変更することが出来る。 | マイナスの電源ライン。 |
ラダー図言語プログラムの作成方法
最初に、今回の実験では押し釦スイッチでLEDを点灯させる簡単なプログラムをラダー図言語で作成してみました。実験回路は図1の物を使用しています。
図7がOpenPLC Editorで作成したラダー図言語プログラムの画面です。
図7のプログラムは2個のスイッチ(SW1,SW2)と1個のLED(LED1)を使用しています。
SW1を押すとLED1が点灯し、SW2を押すとLEDが消灯します。
プログラム動作動画
このラダー図言語プログラムのOpenPLC Editerでのシミレーションと、実機動作の動画を以下に示します。
プログラム作成手順
以下で今回作成した図7のプログラム作成手順を説明します。
1.OpenPLC Editorでは、作成したプログラムは全てフォルダ名で管理されます。
プログラムを入れるフォルダをパソコン内に作成しておきます。
そのフォルダ名は作成するプログラムの機能に関係する名称にするのが良いと思われます。
2.OpenPLC Eidtorを起動してFile→Newをクリックします。
3.フォルダー名を指定する画面が表示されますので、1.で作成したフォルダー名を指定します。
4.下図の様に「Create a new POW」の画面が表示されますので、Language欄にLD(ラダー図)を選択してOKをクリックします。
5.左のProject欄のProgram0をダブルクリックするとラダー図の編集画面が表示されます。
ラダー図の編集画面は上側が変数定義表、下側がラダー図作製欄となっています。
6.最初に変数の定義を行います。右上部のをクリックすると編集行が追加されます。
最初の行に下図のようにSW1に関して入力します。Location欄の%IX0.0はRaspberry Pi Pico WのI/Oで表1に示したようにGP6に相当します。
7.更にをクリックして行を追加して、下図の様にSW2とLED1に関して入力します。SW2のLocation欄の%IX0.1はRaspberry Pi Pico WのI/Oで表1に示したようにGP7に相当します。LED1のLocation欄の%QX0.4はRaspberry Pi Pico WのI/Oで表1に示したようにGP18に相当します。
8.次にラダー図作成を行います。最初に左側のパワーレール(電源線)を置きます。
画面上側のツールボックスのをクリックした後に、ラダー図作成欄をクリックすると、パワーレール設定画面が表示されます。
Left PowerRailを選択し、Pin numberを2にしてOKをクリックします。Pin numberを2にしたのは、パワーレールから2本の線を出すためです。
9.パワーレールが表示されるので、ドラッグして下図の様に画面の左の方に置きます。
10.画面上側のツールボックスのをクリックした後にラダー図作成欄をクリックすると、下図の様な接点の設定画面が表示されます。
ModifierにNomalを選択して、VariableにSW1を選択後にOKボタンをクリックするとSW1のa接点記号が表示されます。ModifierのNormalがa接点、Negatedがb接点を表します。
11.同様の操作で下図の様にSW2のb接点、LED1のa接点を置きます。SW2はModifierをNegatedに設定することによってb接点とすることが出来ます。
12.画面上側のツールボックスのをクリックした後にラダー図作成欄をクリックすると、下図の様なコイルの設定画面が表示されます。ModifierにNomalを選択して、VariableにLED1を選択後にOKボタンをクリックするとLED1のコイルが表示されます。
13.パワーレール、SW1のa接点、SW2のb接点、LED1のa接点、LDE1のコイル、それぞれをドラッグして下図の様な位置に配置にします。
14.再び画面上側のツールボックスのをクリックした後にラダー図作成欄をクリックしてパワーレールの設定画面を表示します。
TypeにRight PowerRailを選択してPin numberを1に選択してOKをクリックすると、右側のパワーレールが表示されます。
15.左のパワーレール、SW1のa接点、SW2のb接点、LED1のa接点、LED1のコイル、右のパワーレールの位置関係を下図の様にします。
これで部品配置は終了しました。これからは部品間を接続します。
16.左のパワーレールのライン引き出し付近をクリックすると点が表示されます。
その点をドラッグしてSW1まで引っ張るとパワーレールとSW1を接続することが出来ます。
↓
↓
17.同様の方法で下図の様に部品間を接続します。
18.最後にLED1のa接点からSW2のb接点へ、下図の様に線が重複してもドラッグして接続します。
19.以上でラダー図言語プログラム作成は完了です。
プログラムシミュレーション手順
作成したラダー図言語プログラムはシミュレーション機能を使用して動作を確認することが出来ます。
手順を以下に示します。
1.画面上側のツールボックスのをクリックするとシミュレーション処理が開始されます。
2.シミュレーションが開始されると画面下側のPLC Log欄にPLC startedと表示されます。
画面右側の「Config0.Res0.instance0」と表示されている欄の右側の(Debug instance)をクリックするとラダー図の記号やラインの色が変わります。
3.下図で各記号を結ぶラインの色が緑になっている部分はTRUEの部分でリレーシーケンス制御回路の場合は電気が来ている部分です。
4.SW1の部分を右クリックして、Force Trueを選択します。
これはシュミレーション的にSW1をTRUEにします。
SW1をTRUEにすることはリレーシーケンス制御回路ではSW1をONする事です。
5.SW1をTRUEにすると全てのラインが緑色に変わりLED1のコイル部分も緑色に変わります。
これはLED1がTRUEになったことを示します。リレーシーケンス制御回路ではリレーのコイルに電流が流れたことを示します。
実際のI/OにLEDが接続されている場合は点灯します。
6.SW1の部分を右クリックして、Force Falseを選択して、SW1をFALSEにします。
7.SW1をFALSEにするとSW1の右側のラインの色は黒となります。ラインが黒の部分はFALSEの部分です。(電気が来てない部分)
但しSW1の下のLED1のa接点の右側ラインが緑色でTRUEのままで、結果としてLED1のコイルは緑色のままでTRUEとなったままです。
このようにコイル自体の接点でコイル状態をTRUEに保つことを自己保持と呼びます。
自己保持は状態を保つのに使用されます。
8.SW2の部分を右クリックして、Force Trueを選択します。
9.SW2をTRUEにした場合にSW2はb接点なのでSW2の右側ラインはFALSEとなりLED1コイルも黒色となりFALSEとなります。実際のI/OにLEDが接続されている場合は消灯します。
10.以上の様な方法で、ラダー図の動きをシュミレーションすることが出来ます。
シュミレーション機能の終了は画面上のをクリックします。
Raspberry Pi Pico Wへのプログラムの書き込み手順
プログラムをシミュレーションして問題が無い場合は、Raspberry Pi PicoWとパソコンをUSBケーブルで接続して、パソコンからRaspberry Pi Pico Wにプログラムを書き込みます。
以下でプログラム書き込み手順を説明します。
1.Raspberry Pi Pico WとパソコンをUSEケーブルで接続します。
2.パソコンとRaspberry Pi Pico WのUSB通信は、パソコンではシリアルポートの通信として扱われます。
以下の様にパソコンのコントロールパネルでデバイスマネージャを開きます。
3.ポート(COMとLPT)を開いて、本例では「USBシリアルデバイス(COM3)」のCOM3がRaspberry Pi Pico Wとシリアル通信接続するCOMポートとなります。このCOM3を覚えておきます。
4.COMポート名を確認したらデバイスマネージャーは閉じます。
5.OpenPLC Editorの画面で上部にあるをクリックすると、コンパイル等が行われた後に、PLCへの転送操作画面が表示されます。
6.下記PLCへの転送操作画面が表示されたら、Board Type欄のをクリックするとBoard Typeの一覧表が表示されます。
その中から「Raspberry Pico W[NOT INSTALLED]」を選択します。
ここで[NOT INSTALLED]となっているのはRaspberry Pi Pico W関係に必要なソフトウェアがインストールされてないことを表しています。
これらのソフトウェアは、PLCへの転送を実行するとその過程で自動的にダウンロードされてインストールされます。
COM portの欄は、デバイスマネージャーで確認した本例ではCOM3を選択します。
「Transfer to PLC」ボタンをクリックするとRaspberry Pi Pico Wへのプログラム転送処理が開始されます。
7.「Transfer to PLC」ボタンをクリックすると、Raspberry Pi Pico Wに対応した言語にプログラムがコンパイルされて転送されますが、初めての転送では必要なソフトウェア等がダウンロード、インストールする処理等が実施されます。よって初めての転送では多少時間がかかります。
途中エラーが発生することなしに、最後に「Done!」が表示されれば、Raspberry Pi Pico Wへのプログラム転送は完了です。
尚、プログラム転送完了後、上のBord Type欄を見ると、「Raspberry Pico W [4.0.2]」となっております。
[NOT INSTALLED]→[4.0.2]となりRaspberry Pi Pico W関係のソフトウェアがインストールされたことが分ります。
8.プログラムの転送を終了するとRaspberry Pi Pico Wはプログラムの実行を開始して動作が可能と成ります。
自己保持を使用して状態変異するラダー図言語プログラム例(LED順次点灯)
次に、自己保持を使用して状態を遷移させて行くプログラムを作成して動作させてみたので紹介します。
下図の様にコイル自体の接点でコイルの状態をTRUEに保つことを自己保持と呼びます。
自己保持を利用することによって、状態が遷移するプログラムを作成することが出来ます。
ここでは、3個のLEDを使用して、LEDが順次点灯するプログラムを作成しました。
プログラム動作
2個のスイッチ(SW1、SW2)と3個のLED(LED1、LED2、LED3)を使用します。SW1を押すと以下の動作を繰り返します。
LED1点灯→0.7秒待ち→LDE1消灯しLED2点灯→0.7秒待→LED2消灯しLED3点灯→0.7秒待ち→LED3消灯しLED1点灯→……..繰り返し
SW2を押すと、どのタイミングで押しても、LED3が消灯した時点でLEDの順次点灯が停止します。
変数定義
変数の定義を以下に示します。
ラダー図プログラム
ラダー図プログラムを以下に示します。
【動作原理】
以下の様な原理でLEDの順次点灯動作を繰り返します。
1.SW1のa接点がON (TRUE)すると、LED1のコイルがTRUEとなりLED1が点灯します。
2.一度LED1が点灯(TRUE)すると、LED1は自己保持されて点灯し続けます。
3.LED1が700ms点灯すると、タイマ TON1の出力に接続されたLED1_TIMコイルがTUREとなり、そのa接点のTRUEで次のブロックでLED2のコイルがTRUEとなりLED2が点灯します。
4.LED2が点灯(TRUE)すると、そのb接点でLED1が消灯します。
5.一度LED2が点灯(TRUE)すると、LED2は自己保持されて点灯し続けます。
6.LED2が700ms点灯すると、タイマ TON2の出力に接続されたLED2_TIMコイルがTUREとなり、そのa接点のTRUEで次のブロックでLED3のコイルがTRUEとなりLED3が点灯します。
7.LED3が点灯(TRUE)すると、そのb接点でLED2が消灯します。
8.一度LED3が点灯(TRUE)すると、LED3は自己保持されて点灯し続けます。
9.LED3が700ms点灯すると、タイマ TON3の出力に接続されたLED3_TIMコイルがTUREとなり、そのa接点のTRUEで最初のブロックのLED1のコイルがTRUEとなりLED1が点灯します。
10.LED1が点灯(TRUE)すると、そのb接点でLED3が消灯します。
11.以上の動作を繰り返します。
12.SW2のa接点がON(TRUE)すると、CycleStopコイルがTRUEになります。
このCycleStopのb接点の働きで、LED3がTRUEになった次に、LED1がTRUEになるのを阻止しています。これによってLEDの順次点灯動作が停止します。
LED順次点灯プログラム動作の動画
以下は、上記プログラムを動作した場合の動画です。シミレーションと実機動作の両方を撮影しました。
最後に
OpenPLC Editorで作成したラダー図言語プログラムをRaspberry Pi Pico Wへ転送して実行することが出来ました。
非常に安価にPLCの機能が実現出来るので、いろいろな用途に使用出来ると思います。
今まで筆者は市販のPLCしか使用したことが無くて、OpenPLCの使用は初めてです。何か誤りや考え違いがあるかもしれませんがご容赦お願い致します。