HOME > ソフテックだより > 第347号(2020年2月5日発行) 技術レポート「PLCプログラミング言語の比較」

「ソフテックだより」では、ソフトウェア開発に関する情報や開発現場における社員の取り組みなどを定期的にお知らせしています。
さまざまなテーマを取り上げていますので、他のソフテックだよりも、ぜひご覧下さい。

ソフテックだより(発行日順)のページへ
ソフテックだより 技術レポート(技術分野別)のページへ
ソフテックだより 現場の声(シーン別)のページへ

「ソフテックだより」では、みなさまのご意見・ご感想を募集しています。ぜひみなさまの声をお聞かせください。


ソフテックだより 第347号(2020年2月5日発行)
技術レポート

「PLCプログラミング言語の比較」

1. はじめに

PLCのプログラミング言語は、弊社の開発実績を見るとラダー言語が多くを占めていますが、ここ最近はラダー言語以外を使用する機会が増えてきました。
筆者は、PLC用アプリケーション開発を中心として担当してきましたが、IEC 61131-3のST言語を使用した開発の経験もございます。

本技術レポートでは、この経験をもとに、PLCプログラミング言語を紹介し比較してみたいと思います。
具体的な例を挙げて実装してみることで、より詳しく各言語の違いが見えてくることと思います。

2. PLCプログラミング言語

PLCプログラミング言語について、過去のソフテックだよりで取り上げていました。
抜粋して要約すると以下の通りです。

第261号(2016年7月6日発行)技術レポート『各社PLC比較 〜IEC 61131-3 編〜』

PLCのプログラミング言語は、PLC登場以降しばらくベンダが独自に発展させてきた背景がある。
ベースは同じラダーだが、ベンダごとに仕様が異なるという状況がずっと続いていた。
そんな中、1993年にIEC(国際電気標準会議)が「IEC61131-3」を発行。国際規格として標準化した。

この「IEC61131-3」では、PLCプログラミング言語は5種類定義されています。次の表にて解説します。

名称 解説 イメージ
IL
Instruction List
インストラクション・リスト
マイコンで言うアセンブラに相当するものです。
容量・速度を重視したプログラムを作る場合に有効でしたが、近年のハードウェア性能の向上で使用する機会は少なくなっています。
IEC61131-3第3版からは非推奨の言語となりました。
ILイメージ
LD
Ladder Diagram
ラダーダイアグラム
日本国内で最も普及しているプログラミング言語です。
リレーシーケンスを仮想的に表現したものであり、インターロック回路などビット信号のON/OFFを扱う処理に向いています。
システムが大規模になるほど可読性の悪いプログラムになりやすく、複雑な演算や文字列処理の記述も不得意としています。
LDイメージ
ST
Structured Text
ストラクチュアド・テキスト
構造化テキスト言語で高級言語に慣れたエンジニアに向いています。
複雑な演算や文字列処理の記述を得意としています。

247号(2015年12月2日発行)技術レポート「ST言語を使用したPLCプログラミング」

STイメージ
FBD
Function Block Diagram
ファンクションブロック・ダイアグラム
DCS(Distributed Control System)で用いられているグラフィック言語で、計装分野で主に用いられてきましたが、可読性が良いということでPLCでも使われるようになりました。
ファンクションと呼ぶ箱の左側が入力パラメータ、右側が出力パラメータとなり、データの流れが分かり易いというメリットがあります。

第263号(2016年8月3日発行)技術レポート「FBD言語を使用したPLCプログラミング」

FBDイメージ
SFC
Sequential Function Chart
シーケンシャル・ファンクション・チャート
状態遷移を記述するのに特化した言語です。
SFC自体は演算やデータの入出力を行わず、LDやSTなどとセットで用いられるため、厳密には言語ではなく要素と定義されています。
各工程の遷移条件、工程内部の処理を分けて記述できる点がメリットです。

第17号(2006年5月10日発行)技術レポート「ラダーとSFCの組み合わせ使用について」

SFCイメージ

ST言語のような高級言語ライクな記述方法は、「IEC61131-3」とは別に、各PLCベンダが独自に「スクリプト」という形でもリリースされています。
過去のソフテックだよりでキーエンス製PLCのスクリプトについて紹介しています。
137号(2011年5月11日発行)技術レポート「ラダーとスクリプトの組み合わせ使用について」

3. PLCプログラミング言語の比較

2章で紹介したPLCプログラミング言語の中で、LD、ST、FBDを取り上げて比較していきます。
ILは、IEC61131-3第3版から非推奨な言語となりましたので比較から除外しています。
SFCも、単体で動作する言語ではなく、LDやSTとセットで使用するものなので比較からは除外しています。

3.1 具体的な制御の例

具体例をターゲットとしてプログラムを作成していきます。
図を交えながら以下に仕様をまとめます。

タッチパネルに「運転」スイッチと「停止」スイッチがあります。

具体例

「運転」スイッチが押されたらコンベアが動き出し、荷物が右側へ動いていきます。
ただし、コンベアが動き出すには、「在荷Bの位置に荷物が無い状態」という条件があります。

具体例「運転」

動作中に「停止」スイッチを押すと、コンベアはその場で停止します。

具体例「停止」

「在荷Bセンサー」が荷物を検知してもコンベアは停止します。

具体例「在荷Bセンサー」

動作中の時間をカウントし「○分○秒」の形式でタッチパネルに表示します。

3.2 プログラム

この仕様を実現するプログラムを、LD/ST/FBDそれぞれの言語で作成しました。
下図に並べて表示しています。

なお、プログラムの作成には、三菱電機製ツール「GX Works3」を使用しました。
付属する「GX Simulator3」にて動作確認を行っています。

LD ST FBD
クリックで拡大 クリックで拡大 クリックで拡大

プログラム中で、ピンクの文字で表現されているものが「変数」を表しています。
「変数」の名称と役割を下表にまとめます。

変数名 データ型 内容
在荷B ビット 在荷Bセンサーからの入力。
在荷有りでON、無しでOFFとなる。
運転SW ビット タッチパネルの運転スイッチが押されている状態を表す。
押している間だけONとなる。
停止SW ビット タッチパネルの停止スイッチが押されている状態を表す。
押している間だけONとなる。
コンベア運転 ビット コンベアへの出力信号。
ONを出力している間、コンベアが運転する。
動作カウント ワード 動作中にカウント値を格納するための入れ物。
分 ワード タッチパネルに表示する動作時間。
「分」の位。
秒 ワード タッチパネルに表示する動作時間。
「秒」の位。

次章より、GX Simulator 3 上で動かしている画面を見ながら、1言語ずつ解説していきます。

3.3 LD(ラダー)言語

LD言語

LD(ラダー)言語では、ビット型の変数は、接点という形で表現します。
青色で塗りつぶされている接点がONを表しています。塗りつぶされていない接点がOFFです。

図中の番号部分を簡単に説明します。

(1)
コンベアが動き出せる条件「Bの位置に荷物が無いこと」に相当します。
(2)
動き出せる条件が成立している状態で「運転スイッチ」が押されると、コンベア運転制御を行います。
(3)
「コンベア運転」出力を自己保持することで「運転スイッチ」を押し続けなくてもコンベアは動作します。上図は「運転スイッチ」が一度押されて離された後の状態です。
(4)
コンベアを停止させる条件です。「停止スイッチ」が押されるか、Bの位置まで荷物が到着するか、どちらかの状態となると自己保持している「コンベア運転」の出力をOFFします。
(5)
「コンベア運転」出力を行う立ち上がり1回だけ、動作カウントを0クリアしています。
(6)
「SM412」は1秒周期でON/OFFを繰り返す三菱PLCの特殊リレーです。これを利用して秒単位のカウンタを作っています。
(7)
動作カウントを60で割り商を「分」、余りを「秒」へ格納することで、「〇分〇秒」の形式に分解しています。タッチパネルが表示するデータです。

3.4 STのプログラム

STのプログラム

ST言語はテキスト形式となります。
LD(ラダー)言語の接点のような記号はありませんので、変数名の背景色でON/OFFを表現しています。
背景色が青い変数はONを表しており、枠だけ表示されているのがOFFを表しています。
ワードデータの値は、プログラムとは別に右側の領域に表示しています。

(1)
2つのIF文で、LD(ラダー)言語でコンベア運転制御を行っていた自己保持回路に相当します。
ST言語の構文を用いてTRUE、FALSEを代入する処理としましたが、LD(ラダー)言語のコイルに相当するOUT命令を使用することも可能です。その場合は以下のプログラムとなります。

image15

LD(ラダー)言語では視覚的にすっきりとしていても、ST言語で同様の書き方とすると、括弧のネストが多くなり分かりにくくなってしまいます。この場合には、ST言語の構文のみで表現した方がシンプルなプログラムとなりました。
 
(2)
「コンベア運転」出力の立ち上がりを検出し、一度だけ0クリアするようにしています。
また、LD言語同様、三菱PLCの1秒クロック信号を利用して動作カウントを増加させています。

この部分は、LD(ラダー)言語となるべく1対1になるように置き換えました。
ST言語の構文のみで記述することも可能ですが、その場合には、立ち上がりを検出するために前回値を保持する変数が別途必要となってしまいます。
今回はMOVP命令、INCP命令といった立ち上がり1度だけ処理する三菱PLCの命令を用いることで、少ないコードで実現しています。
 
(3)
LD同様、動作カウントを60で割り算することで、タッチパネル表示用のデータを作っています。

ST言語では、変数単体のON/OFFは色で分かりますが、「(停止条件 = OFF)」というような条件式が成立しているかどうかが視覚的には分からないというデメリットがあります。
そのため、IF文の中が実行されているのかなど今動作している場所が直観的に分かりづらいように思います。

タッチパネル表示用の「分」と「秒」を作っている箇所に着目すると、LD(ラダー)言語よりも計算内容が分かりやすいというメリットがあります。

3.5 FBDのプログラム

FBDのプログラム

GXWorks3では正確にはFBD/LD言語という名称となっています。
FBD言語だけでなく、LD言語も織り交ぜて記述することができるためです。

今回のような例では、本来ならLD言語の方が向いている内容ではありますが、言語の比較を行うため敢えてFBDのみで記述しています。 プログラムはST言語で記述したものと、ほとんど1対1で対応させています。

(1)
ST言語同様、2つのブロックでコンベア運転出力を行っています。
(2)
MOVP命令、INCP命令を用いることで、動作カウントの0クリア、カウント処理を行っています。
(3)
動作カウントを60で割り算することで、タッチパネル表示用のデータを作っています。

モニタの値は、ビット型もワード側も変数名のすぐ下に表示されます。 FBD同士を接続する線が青色となることで、条件が成立していることがST言語よりも視覚的に分かりやすいという特徴があります。

3.6 考察

以上のように、具体的な仕様を提示して、3言語でプログラム製作を行ってみました。
実際に作ってみて感じたことを、製作者担当者、メンテナンス担当者の2つの視点でまとめます。

3.6.1 製作担当者の視点

LD言語とFBD言語は、グラフィカルな言語ですので、記号を配置して変数名(デバイスアドレス)を割り当てていくという作業がメインとなります。
ST言語のように文字を書いていく作業に比べると、LD/FBDは少し特殊な入力作業となりますが、なるべく効率良く入力できるように各社プログラミングツールで工夫されていますので、プログラマがツールの使い方をしっかりと習得すれば、ST言語に劣らず高速なプログラミングが可能となります。

大きくメリットだと感じたのは、ST言語のテキスト形式であるという特徴です。
テキスト形式なので、外部テキストエディタを利用して、コピーアンドペーストによる入力も可能です。
更に、WinMerge(オープンソースのWindows 用比較・マージツール)のような、テキストを扱う外部ツールも利用可能となります。

筆者が過去に担当したST言語案件では、WinMergeを利用してバージョンごとの変更箇所を確認したり、差分を見ながらマージしたりなど、外部ツールが大活躍しました。
更に、ST言語のコードを一部自動生成するような効率化ツールも開発しており、テキスト形式である自由度を大いに生かすことができたと思います。

3.6.2 メンテナンス担当者の視点

PLC自体のメリットのひとつに「今動作しているプログラムをリアルタイムでモニタできる」というものが挙げられます。
リアルタイムでモニタしながら、問題があればその場でプログラムを変更できることもPLCの強みです。

PC用アプリケーションは現地でソースコードが利用されることはありませんが、PLCはこのメリットがありますので納品したプログラムは現地でも活躍することが多くあります。
そのため、現地でPLCプログラムを利用する人、例えば工場のメンテナンス担当者の視点においても、見やすいプログラムを作るということが重要となります。

言語の違いでモニタしやすさにどのような違いあるのでしょうか?

3種類の言語で製作してみて、さすがグラフィック言語だけあって、LD言語とFBD言語は視覚的に分かりやすいと感じました。
ビットのON/OFF信号の見やすさはLD言語が長けており、FBD言語はデータの流れが分かりやすいと感じました。
今回は敢えてFBD言語のみで記述してみましたが、ビット信号を扱う部分はLD言語を併用するなど、よりモニタしやすいプログラムを作ることが可能であると思いました。

ST言語は、変数単体の値はモニタできますが、「変数A = TRUE」のような式が成立していることが視覚的に分からない。複雑なビット変数の論理演算となると、成立していることが分かりにくいという特徴がありました。
逆に、計算式は直観的に分かりやすいので、今回例には挙げませんでしたが文字列処理など、ST言語が得意な処理内容では活躍できると思いました。
本レポートでは触れませんでしたが、LD(ラダー)言語からST言語で記述したブロックを呼び出すなど、各言語を連携させて使用することも可能です。

4. おわりに

具体的な例を用いてLD/ST/FBD言語を比較して見てみました。
各言語で得意・不得意があることがお分かり頂けたかと思います。

IEC 61131-3を推進するPLCopenの資料にも「実装する処理や好みに合わせて記述方法を選択できる」とあります。
製作者の力量やターゲットとなる仕様に合わせて、最適な選択が必要になるかと思います。
本技術レポートが少しでも言語選択のお役に立てればと思います。

(M.S.)

[参考文献]
『進化を続けるPLCの国際標準プログラミング 〜IEC 61131-3の最新動向〜』PLCopen Japan
『MELSEC iQ-R プログラミングマニュアル(プログラム設計編)』三菱電機

関連ページへのリンク

関連するソフテックだより

「ソフテックだより」では、みなさまのご意見・ご感想を募集しています。ぜひみなさまの声をお聞かせください。

ページTOPへ