シーケンス制御講座

構造化

プログラムを構造化することで、とてもシンプルになることがあります。1ダイクル中に同じ動作を複数繰り返す場合などは、繰り返す動作を1回書いておけば繰り返し使えます。

作成日:2016年05月10日
更新日:2022年10月13日

構造化とは

構造化というテクニックを使用してみたいと思います。ここで言う構造化はサブルーチンで、細かい動作を別の部分に書きます。つまりメインのプログラムは普通にスキャン(演算)していますが、普段必要ない処理をサブルーチン化しておいて、必要な場合だけ実行させます。このようにすると、メインプログラム部分がシンプルになり、デバッグも簡単になります。

又、構造化する部分は上手に作れば他のプログラムでも使用できます。プログラムの色々な箇所で同じ動作をさせているのであれば、構造化してシンプルにさせましょう。

引数と戻り値

構造化を実用的に使用するには、引数と戻り値を理解しておく必要があります。あるサブルーチンに値を与えて演算を実行させます。演算が終わると答えが返ってきます。与える値を引数といい、帰ってくる答えを戻り値と呼びます。

サブルーチン「P0」
a+100=b

例えば上のようなサブルーチンがあるとします。ここでaが引数です。つまり10→aとして演算させるとbには110が返ってきます。この110が戻り値です。

プログラム例

演算させる簡単なプログラムを製作してみます。

ここまでがメインのプログラムになります。CALLという命令が入っています。

そして次がサブルーチン部分になります。プログラムは先頭から演算していきENDで先頭に戻ります。サブルーチンを書くときはENDの前にFENDと書きます。プログラムはFENDで先頭に戻ります。このFENDとENDの間にプログラムを書くのです。この場合回路の左側に「P0」のように番号を書いてください。

それではプログラムの説明をします。まず「M100」が入れば「D0」に15を書き込みます。その後CALLでP0を実行しています。この命令が実行された瞬間プログラムの演算はFEND後の「P0」に飛びます。「P0」では「D0」の値を変換して計算しています。「D0」に値を書き込んで「P0」を実行するということで「D0」は引数となります。

そしてこのサブルーチンから抜けてメインのプログラムに戻す必要があります。この命令が「RET」です。リターンという意味で、CALLを実行した部分に戻します。

最後に演算結果を「D1」に書き込みますので、それを「D10」や「D20」に書き込んで完了となります。このようにすることで、メインのプログラム内に複雑な演算を書く必要がなくなるのでシンプルになります。また、計算式を変更したい場合もサブルーチン内の一箇所を変更することですべてに反映されるので、プログラムミスも少なくなります。

次は計算ではなくデータの移動を行って見ます。

この回路のポインタはP10にしておきます。この回路では引数はありますが、戻り値はありません。引数によって処理させる内容を変化させています。

まず引数が0以下の場合はエラーになるので実行させないようにします。引数の値から1を引いて、100をかけます。それをインデックスレジスタに書き込みます。

この動作でできることは、D100からD199の値を、引数によって違う位置に書き込んでいます。例えばD10に2を書き込んで実行すれば、D100~D199の値をD1100~D1199に書き込みます。このプログラムは単純で、このような構造化をする必要はありませんが、処理の内容が複雑になった場合このように書けばシンプルになります。例えば設備内に同じ動作を行う10台のステーションがあるとします。外部から読み込んだり、設定したデータを一時的にD100~D199に書き込んでおき、動作によって各ステーションにデータを移動する場合などに便利です。

実践的な構造化

すこし実践的な書き方をしてみたいと思います。 ネジを締める例で考えて見ます。ネジを締めるポイントにドライバーが移動したら、ドライバーを下降させネジを締めに行きます。このときネジ締めをする対象の高さ、ネジの種類が同じであれば動作は全く同じになります。 このネジを締めるという動作部分を構造化します。ここでは説明を前提としているため、ネジについては、ドライバビットの先端に自動的に装着されるものとします。

今回行う構造化は、CALL指令でプログラム外に書くのではなく、もっと手軽に使用できるようにそのままプログラムの中に書きます。 そのため毎スキャン演算しますので、高速な試験を行う設備などでは不向きとなります。

ネジを締める動作を書くと下記のようになると思います。

左が普通にだらだら書いた場合です。右はネジ締め部分だけを構造化しました。メイン制御部分には、ネジ締めポイントに移動とネジを締めるという動作しか書いていません。実際にネジを締める動作内容は別の部分に書いています。

サンプルのプログラムなのでそのままでは使用できませんが、雰囲気がわかればいいと思います。「M0」から動作が始まって「M2」がネジ締め開始となります。「M2」の接点は少し下にあり、「M310」のパルスを出しています。このパルスによってネジ締め動作を行います。ネジ締め動作が完了したら「M320」が0.1秒ONします。「M320」をメイン側の制御に返すとメインのステップは進む仕組みになっています。このネジを締める動作は一回しか書いていません。この部分を何回も使用しています。今回はCALL命令を使用していませんが、これが構造化であり、メイン制御側がだらだら読みにくくならない書き方です。さらにネジ締め動作を変更したい場合、この構造化した部分を変更すれば全部変更できるので大変便利です。作成するときも、デバッグするときも便利なので積極的に使っていきましょう。



図解入門 よくわかる最新 シーケンス制御と回路図の基本はKindle版(電子書籍)です。単行本ご希望の方は、フォーマットで単行本を選択してください。または、トップページよりご購入ください。

Copyright (C) 2010 シーケンス制御講座, All rights reserved.