OPENPLC#Podmanコンテナで始めるエッジPLC制御!(Node-RED×Modbus)

今回の記事ではパネルIPC上でPodmanコンテナを用い、Node-REDとOpenPLC(オープンソースPLCランタイム/IDE)を統合した構成です。

  • HMIは内蔵Chromiumで表示し、Node-RED Dashboardから操作・可視化。
  • 制御信号はModbus TCP/IPでやり取りし、同一プロトコルで接続します。
    • WAGOリモートI/O
    • Factory I/O(3Dシミュレーション)

それをセットアップできるまで詳しくSTEP BY STEPで説明します。

さ、FAを楽しもう。

前書き

いつも私の技術ブログとYouTubeチャンネルをご覧いただき、心より感謝申し上げます。また、いまFullさん(full@桜 八重 (@fulhause) / X)と共に毎週水曜日の夜にお届けしている「高橋クリス」ラジオ番組を運営しています。

技術は独り占めせず、届けるもの

私たちは工場の生産技術や制御に関する技術情報を、ブログや動画などで無料公開しています。「知識は誰でもアクセスできるべき」という信念のもと、現場で役立つ具体的なノウハウやトラブル事例などを発信してきました。すべて無料で続けているのは、「知らなかったせいで困る人」を少しでも減らしたいからです。

また、もしあなたの現場で…

  • 「このPLCとデバイスの組み合わせ、ちゃんと動くのかな?」
  • 「EtherCAT通信でうまくいかない部分を検証してほしい」
  • 「新しいリモートI/Oを試したいけど社内に検証環境がない」

など、困っている構成や試してみたいアイデアがあれば、ぜひお知らせください。機器の貸出や構成の共有が可能であれば、検証し、記事や動画で発信します(ご希望に応じて匿名対応も可能です)。

支援のかたち

現在、私達の活動はほぼ無償で続けており、記事や動画の制作には、時間と検証環境の整備が必要です。この活動を継続的にコンテンツを提供するためには、皆様の温かいご支援が大変重要です。

メンバーシップ(ラジオの応援)

Fullさんとのラジオをより充実させるための支援プランです。

https://note.com/fulhause/membership/join

Amazonギフトリスト

コンテンツ制作に必要な機材・書籍をリストにしています。

https://www.amazon.co.jp/hz/wishlist/ls/H7W3RRD7C5QG?ref_=wl_share

Patreon(ブログ・動画活動への応援)

月額での小さなご支援が、記事の執筆・検証環境の充実につながります。

https://www.patreon.com/user?u=84249391

Paypal

小さな支援が大きな力になります。

https://paypal.me/soup01threes?country.x=JP&locale.x=ja_JP

知ってたら助かること、届けたいだけです

あなたの応援が、知識の共有をもっと自由で持続可能なものにしてくれます。これからもどうぞよろしくお願いします。

soup01threes*gmail.com

https://x.com/3threes2

技術はひとりじゃもったいない。

Reference Link

Pixsys#Web Panel WP615 Part03_OpenPLCを使ってみよう
Pixsys#Web Panel WP615 Part02_Podman Containerを使いましょう
Beckhoff#TwinCAT3 TF6250 Modbus-TCP Server立ち上げよう
FactoryIO#Beckhoff TwinCAT3と連携しよう
FactoryI/O#Installation

OPENPLC V4 IDE!

OPENPLC IDE V4はまだBETAバージョンですが、こちらのLinkからDownloadできます。

https://github.com/Autonomy-Logic/openplc-editor/releases/tag/v4.0.1-beta

Implementation

WAGO Side

最初はWAGO Modbus TCP/IP Coupler側から設定します。

WAGO Modbus TCP/IP CouplerのWeb Serverにアクセスし、Fieldbus→Modbus Mappingをクリックします。

こちらは現在各SLOTにアクセスするために必要なModbus レジスタを確認できます。

次はNetwork→Protocolsをクリックします。

今回はWAGO Modbus TCP/IP CouplerのModbus Server Portを5120に変更します。

Factory I/O Side

次はFactory I/O 側を設定します。こちらは今回記事でセットアップした簡単なConveyorシステムです。

Factory I/O にModbus TCP ServerをセットアップするにはFILE→Driversをクリックします。

DriversにModbus TCP/IP Serverを選択し、Factory I/O ステーションにある入出力をModbus Serverと紐付けてください。

次は右上にあるCONFIGURATIONをクリックします。

あとはFactory I/OのPort番号・Slave IO・使用するNetwork Adapterなどを設定しましょう。

またI/O PointsでレジスタのOFFSET・使用する数を設定してください。

OPENPLC Side

最後はOPENPLC側を設定しましょう!

Modbus TCP Server Configuration

最初にOPENPLCのWeb Serverにアクセスします。DefaultのUser Name・Passwordは:

  • username:openplc
  • password:openplc

左のTool barにあるSettingsをクリックします。

Enable Modbus ServerをCheck入れ、またOPENPLC のModbus Serverの使用PORTを設定します。今回の例では5300を使用します。

WAGO Configuration

次はOPENPLCにWAGO Modbus TCP/IP Coulperのアクセスを設定します。

OPENPLCのWEB SERVERにあるSlave Devicesをクリックします。

こちらはOPENPLCがアクセスするModbus Slaveの設定画面になります。新しいModbus Slaveを追加する場合は、Add new deviceをクリックしてください。

こちらはModbus Slaveの設定画面です。

左側では該当するModbus SlaveのSlave ID・IPアドレスとPORTを設定できます。

  • Device TypeをGeneric Modbus TCP Devicesに設定します。
  • Slave IDは255でOKです。
  • IPアドレスとPortは実機に合わせてください。

例えばPORTですが、今回WAGO Modbus TCP/IP Couplerに5120に設定しましたので、OPENPLCにもそれに合わせて行きましょう。

右側にはアクセスModbus Slaveのレジスタの先頭アドレスと数です。

Factory IO Configuration

今度はModbus TCPからFactory I/Oのアクセスを設定します。

左側では該当するModbus SlaveのSlave ID・IPアドレスとPORTを設定できます。

  • Device TypeをGeneric Modbus TCP Devicesに設定します。
  • Slave IDは255でOKです。
  • IPアドレスとPortは実機に合わせてください。

右側にはアクセスModbus Slaveのレジスタの先頭アドレスと数です。

Create new project

よし!これからOpenPLC Editor V4を立ち上げましょう!

こちらはOPENPLC Editor V4の起動画面になります。

New Projectで新規プロジェクトを作成します。

そしてPLCプロジェクトやライブラリの作成選択画面が表示されます。

PLC Projectを選択→Nextで進みます。

次はプロジェクト名とPathの設定画面になります。

ここで適当なプロジェクト名を入力します。

次はそのOPENPLCプロジェクトの保存先を設定するため、Choose Pathをクリックします。

保存先を設定しましょう。

Nextで進みます。

次は初期プログラムの言語・そして周期を設定します。

ラダー・IL・STにも選択できます。

次はプログラムの実行周期を設定します。

アプリケーションに合わせてサイクルタイムを設定します。

最後はCreate Projectをクリックし新規プロジェクトを作成しましょう!

Done!

Add New POU

左にある+ボタンをクリックし新規プログラムを作成します。

Programを選びます。

次はPOU名・そして実装言語を設定し、Createをクリックします。

Done!

Resources

次は先程設定したModbus Slaveを読み書きしたいので、Resourceをクリックします。

自分のやり方ですが、こちらのGlobal Variables画面で必要な変数を一括設定します。

MODBUS

Location欄にSlaveのアドレスを設定しましょう。

このアドレスはSlave Devicesの画面から確認できます。

Tasks

次はTaskstで周期を設定し、Instanceで呼び出しするプログラムを設定しましょう。

Program

最後はプログラムを作成します。

VAR

最初に変数を定義しましょう。ここでFilter機能を活用します。

下図のようにExternal変数のみが表示されます。Externalは外部変数に該当します。

なので、Externalに設定された変数は絶対Global Variablesと同じ変数名とデータ・タイプにする必要があります。

Code

こちらは今回記事で作成したコードです。

(**)

xGoManualMode:=gWagoCouplerDI00;

xGoAutoMode:=gWagoCouplerDI01;

xFacotryIOInputsItemReady:=gxFacotryIOInputsItemReady;

xFacotryIOInputAtEntry:=gxFacotryIOInputAtEntry;

xFacotryIOInputAtExit:=gxFacotryIOInputAtExit;

gxFacotryIOOutputEmitter:=xFactoryIOOutputEmitter;

gxFacotryIOOutputLEDYellow:=xManualMode;

fbFlashingTimer1(

IN := xfbFlashingTimer1IN,

PT := T#1s,

Q => xfbFlashingTimer1Q,

ET => tfbFlashingTimer1ET

);

fbFlashingTimer2(

IN := not xfbFlashingTimer1Q,

PT := T#1s,

Q => xfbFlashingTimer2Q,

ET => tfbFlashingTimer2ET

);

xfbFlashingTimer1IN:= xfbFlashingTimer2Q;

gxFacotryIOOutputLEDGreen:=xAutoMode;

if not xFactoryIOOutputEmitter then

gxFacotryIOOutputLEDGreen:=xAutoMode & xfbFlashingTimer2Q;

end_if;

(**)

fbrg0 (

CLK := xFacotryIOInputsItemReady,

Q => xfbrg0

);

fbrg1 (

CLK := xFacotryIOInputAtEntry,

Q => xfbrg1

);

ton1 (

IN := xFacotryIOInputAtEntry & xFacotryIOInputAtExit,

PT := T#5s,

Q => xton1q,

ET => xton1et

);

ton2 (

IN := xFacotryIOInputsItemReady & xFacotryIOInputAtEntry,

PT := T#5s,

Q => xton2q,

ET => xton2et

);

(**)

if xGoAutoMode then

xAutoMode:=True;

xManualMode:=False;

elsif xGoManualMode then

xManualMode:=True;

xAutoMode:=False;

end_if;

(**)

if xAutoMode then

if xfbrg0 then

xAutoRunConvery1:=True;

end_if;

if xton2q then

xAutoRunConvery1:=False;

end_if;

if xfbrg1 then

xAutoRunConvery2:=True;

end_if;

if xton1q then

xAutoRunConvery2:=False;

end_if;

end_if;

(**)

gxFacotryIOOutputConveyor1:=False;

if xAutoMode then

gxFacotryIOOutputConveyor1:=xAutoRunConvery1;

gxFacotryIOOutputConveyor2:=xAutoRunConvery2;

end_if;

gWagoCouplerDO00:=xAutoRunConvery1;

gWagoCouplerDO01:=xAutoRunConvery2;

gWagoCouplerDO02:=gxFacotryIOOutputLEDGreen;

ランタイムにプログラムをアップロードする

次はOpenplc RuntimeのWeb serverにアクセスします。Openplc RuntimeのWeb Serverは以下になります:

http://IP Address:8180/

また、DefaultのUser NameとPasswordにもopenplcです。

プログラムをUploadするにはPrograms→Chooseをクリックします。

先ほどOpenplc Editorで生成したプログラムFILEを選択します。

Done!

次はUpload ProgramをクリックしプログラムをRuntimeにインストールしましょう。

そしてProgram Infoの設定画面が表示されます。

Name欄でプログラム名を入力し、Upload Programをクリックします。

しばらく待ちます…

Done!そして”Go to Dashboard”ボタンをクリックします。

PLCの起動

次は”Start PLC”ボタンをクリックしPLC Runtimeを起動します。

Done!!

Node-Red Side

最後はNode-Red側ですね。

こちらは今回使用したNodeです。

こちらは今回のFlowです。

Modbus TCP ServerのPortは5300で、最初にOPENPLCのModbus TCP Serverを5300に設定しましたから。

次は箱の生成スタートとストップのボタンです。

箱生成スタートのボタンをクリックしたら、Payloadを1に書き込みます。

箱生成停止のボタンをクリックしたら、Payloadを0に書き込みます。

最後がFC5を使用しコイルにデータを書き込みます。

Result

こちらの動画で動作確認できます。

Node-RedからTrue/Falseのデータ返答が来ました。

Node-RedにあるOpen Dashboardボタンをクリックします。

PixsysのIPC パネルと同じWeb 画面が見えます。

こちらのLinkからプロジェクトをDownloadできます。

https://github.com/soup01Threes/PlayGround/blob/main/Tokyo-MarkerFair-2025.zip

シェアする

  • このエントリーをはてなブックマークに追加

フォローする