HOME > ソフテックだより > 第209号(2014年5月7日発行) 技術レポート「PLCの構造化プログラミングについて」

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

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


ソフテックだより 第209号(2014年5月7日発行)

技術レポート

「PLCの構造化プログラミングについて」

1. はじめに

近年の制御システムでは、PLC(Programmable Logic Controller)の高性能化のおかげで、対応できる事が格段に増え、中〜大規模のプログラムも珍しくなくなりました。
それに伴い、PLCソフト開発における、プログラム標準化・開発高効率化・品質向上を目的とする構造化プログラミング(※1)が注目されています。

国内でも、ある程度構造化プログラミングを目にする機会が増えてきましたが、まだまだシンプルラダーでのプログラミングが主流だと言わざるをえません。
ところが、国外では既にIEC言語による構造化プログラミングが主流となっております。

構造化プログラミングが気になる、または取り組みたいけれども、実際どうなのか?と足踏みをされている方も多いのではないでしょうか?

そこで本メルマガでは、三菱電機製PLCエンジニアリングツール『GX Works2(※2)』を使用した場合の、構造化プログラミングについてご紹介してみたいと思います。今後、構造化プログラミングに取り組む事を考えている方にとって、少しでも参考にしていただく事ができればと思います。

2. 構造化プログラミングのポイント①:ラベルプログラミング

構造化プログラミングのポイントとして、『プログラムの部品化/階層化』『ラベルプログラミング』の2つがあげられますが、『プログラムの部品化/階層化』は、シンプルラダーによるプログラミングでもある程度実現する事は可能ですので、ここでの説明は省略します。

2-1. ラベルプログラミング

デバイス直接指定ではなく、ラベルプログラミングについて紹介します。
ラベルプログラミングとは、プログラムで使用する信号/データを、ラベル(変数)として定義し、そのメモリ割付(ラベルとデバイスの紐付け)は、エンジニアリングツールにより自動割付される事になります。

2-2. ラベルの種類

ラベルには、グローバルラベルとローカルラベルがあります。

[グローバルラベル]

グローバルラベルは、その名の通り、登録している全プログラムで使用する事が可能です。

[ローカルラベル]

ローカルラベルは、宣言したプログラムの中だけで使用できるラベルです。
他のプログラムで使う事は出来ません。
2-3. データ型

ラベルは、ビット長、処理方法、扱うデータの範囲によって、データ型に分類されます。

[データ型] [値の範囲]
1.ビット型 0(false)/1(true)
2.符号付ワード型 -32768 〜 32767
3.符号付ダブルワード型 -2147483648 〜 2147483647
4.符号無ワード型 0 〜 65535
5.符号無ダブルワード型 0 〜 4294967295
6.単精度実数型 -2128 〜 -2-126/0/2-126 〜 2128
7.倍精度実数型 -21024 〜 -2-1022/0/2-1022 〜 21024
8.文字列 最大255文字(可変)
9.時間 -24d20h31m23s648ms 〜 24d20h31m23s647ms
2-4. ラベルを使う場合のメリット

ラベルを使えばどういうメリットがあるかについてまとめます。

[プログラムの流用が容易]

PLC固有のデバイスに依存せずに済むため、PLCメーカ間、または同一メーカ内の機種スペックの違いに関わらず、プログラムを移植する事が容易になります。
ラベルプログラミングで作成したマスタプログラムを管理しておけば、PLC機種に関わらず同じ機能シーケンスを展開する事が可能になります。

[デバイスミス/デバイス重複使用の防止]

ラベル毎にデータ型を定義し、エンジニアリングツールでラベルとデバイスの紐付けを自動で行いますので、同じデバイスを複数の異なる目的で使ってしまう等の間違いを防ぐ事ができます。

[変数名の共有が可能]

案件によっては、PLCと市販SCADA(Supervisory Control And Data Acquisition)を組み合わせてシステム構築をする場合もあると思いますが、SCADAとPLCで変数名の共有ができます。
いちいち変数名とデバイスの紐付け表を確認する事なく、同じ変数名でそれぞれの処理確認をする事ができます。

いずれも、PLC固有のデバイスでの開発時には『今回はどう対処しようか?』などと頭を悩ませるところではないでしょうか?

2-5. ラベルを使う場合のデメリット

ラベルを使えばどういうデメリットがあるかについてまとめます。

[コンパイル時に注意]

構造化プログラムでは、プログラムを作成したら必ずコンパイルが必要となりますが、ラベルを使用している場合、コンパイルするときには注意が必要です。
プログラム変更後、変更部分のみコンパイルする分には問題ありませんが、うっかりプログラムの全コンパイルを行ってしまうと、メモリ割付(ラベルとデバイスの紐付け)が再度実行されてしまい、全てのラベルに変更前とは別のデバイスが紐付けられる(ラベルの値が変わる)ことになります。
そうなってしまうと、数値情報(ex.レシピ情報、設備動作設定値、異常判定値など)を扱うラベルについては、数値の再チェック&再設定を行わなければならないですし、最悪のケースとしては、数値を再設定しないまま設備を動かしてしまい、重大なトラブルを発生させてしまう可能性もあります。

[ラベルに慣れるまで]

ラベルプログラミングに慣れないうちは、どういうラベルを定義しようか?そのラベル名をどう名づけようか?など、悩むことが多いです。
3. 構造化プログラミングのポイント②:ファンクションブロックの活用

プログラム言語ですが、IEC言語の一つであるFB(Function Block)が比較的使いやすいと思います。
FBは、入力パラメータと出力パラメータを持つ、関数のようなものです。シンプルラダーで言うと、シーケンス命令を除く、基本/応用命令はすべてFBとして使用できます。
また、複数の機能を組み合わせた制御(処理)をFB化する事で、1つの命令のように簡略化する事ができます。

3-1. FBを使う場合のメリット

FBを使えばどういうメリットがあるかについてまとめます。

[プログラムが見やすい/分かりやすい]

シーケンス回路記号とFBを組み合わせる事で、一つ一つの機能・処理がシンプルラダーよりも分かりやすくなると思います。入力と出力が明確になっている標準的なFBを見れば、そこで何をしているかは容易に想像がつきます。

※下記は、加算FB使用例です。

FB使用例
図1. FB使用例

FBにおける”EN”は実行条件、”ENO”は実行結果です。
いずれもビット型ラベルを指定します。”ENO”は指定しなくても良いです。

ラダープログラムしか作成した事の無い方でも、FBであれば抵抗なく入っていけるものと思います。

[複雑な処理はFB化]

複雑な処理は、ラダーでダラダラ書くよりもFBとして部品化してしまい、必要に応じてプログラム内で使う事ができます。FBの中身をデバッグする必要はありませんし、複数の案件で使用可能な複雑処理・便利処理をFBとして登録しておけば、入力と出力を指定してFBを使うだけで、簡単に結果を得る事ができます。

[流用性の高さ]

複雑処理・便利処理をFBとして登録しておけば、必要なときにそのFBを流用し、用途に応じて入力と出力のみを変更するだけなので、使い勝手が良いです。

4. 構造化プログラミングのポイント③:その他

ポイント①とポイント②では、ラベル及びファンクションブロックFBを利用したプログラミングに触れてきましたが、実際にはいろいろな事ができます。

4-1. IEC言語

FB及びLD(Ladder Logic)の他、IL(Instruction List)/ST(Structured Text)/SFC(Sequential Function Chart)と5種類の言語があります。
それぞれメリット/デメリットはありますが、得意なところを組み合わせて使うのが良いです。

全面的に切り替えるのはまだ先になるかもしれませんが、私はLDとFBの組み合わせがしっくりときました。
他にも、ST言語を取り入れていきたい考えもありますので、この話はまた次回触れてみたいと思います。

4-2.プログラム実行(タスク)

シンプルラダーの場合は、登録したプログラムブロック順に、実行タイプ(待機/スキャン/初期/定周期)に従って実行していくのみですが、構造化プログラムでは、タスクという考え方を持つことができます。

具体的には、小さなプログラムを部品として複数組み合わせてプログラムブロックとする事ができ、しかもその中で部品毎に実行条件(常時実行/イベント起動/周期起動)を指定する事ができます。
条件次第では、複数の部品が同時に実行される可能性もありますが、この場合は部品毎に優先順位を決めて、どちらが先に実行するか?など自由度の高い処理の組み合わせが可能です。
プログラム部品は、たとえばAのプログラムブロックとBのプログラムブロックに登録する事も可能です。部品という単位で1スキャン中に何度も実行する事が可能ですので、こういう点でも自由度が高いです。
(最上位のプログラムブロックは、2重登録して2回実行するという事は出来ません)

5. おわりに

構造化プログラミングという視点で、今回は初歩的な部分に触れてみました。
実際には、細かい制約がいくつもあり、スペシャリストになるには多数の経験を積んでいく必要がありますが、PLCの世界でもラベルプログラミング、FBを使ったプログラミングがどんどん増えていますので、興味がある方は、簡単なところからでも取り組んでいただければと思います。
弊社もIEC言語には積極的に取り組んでいく予定ですので、もしご質問などございましたら、お気軽にお問い合わせいただければと思います。

(Y.S.)

[参考文献]
三菱電機 −
MELSEC-Q/L/F 構造化プログラミングマニュアル(基礎編)
[注釈]
※1
構造化プログラミングの定義については、ソフテックだより第61号「見やすい・わかりやすいラダーにするために4 〜構造化プログラミング〜」をご覧ください。
※2
GX Works2は、国際規格IEC61131−3(JIS B 3503)に準拠しており、『構造化プロジェクト』という、構造化プログラミングを前提としたプログラム形態を標準サポートしています。
国際規格IEC61131−3(JIS B 3503)は、国際電気標準会議(IEC)が1993年12月に発行したPLCプログラミング言語の標準規格です。
プログラム言語だけでなく、プログラムを構成する要素、変数、などの定義も標準化の対象としています。国内ではPLCopen Japanが普及活動を行っています。

関連ページへのリンク

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

ページTOPへ