シーケンス制御講座「いいプログラム、悪いプログラム」
基礎からはじめるシーケンス制御講座
上級:いいプログラム、悪いプログラム
いいプログラムと悪いプログラムの違いは何でしょうか? 一言でいうと他の人がみて分かりやすいプログラムが一般的にいいプログラムと言われています。
見る人の技量にもよりますが、分かりにくいプログラムは本当に分かりにくく、条件等が回路のいろんな部分に書かれていて、他のユニットとの関係も複雑な条件で別の部分に書かれています。
このように他の人が見ても分かりにくいプログラムは、作成している本人も完全には理解していないケースがあるので、バグが大量に出てきます。バグを1つ解消したら別のバグが出てきてイタチゴッコになるというパターンです。
まず条件等は決まった所に書きます。ユニットの稼動条件であれば、そのユニットの頭に書けば分かりやすいでしょう。
このようにまず自分が分かりやすいように書くことが重要です。私は仕事上いろいろなプログラムを見る機会があります。やはり技術の差はでてきます。ひどい所になると、プログラムの話をしてもうまく通じません。
完成したプログラムを見ると根本的に理解していないようなものもあります。こんな装置もありました。
コンベアから製品を搬入、完成品を排出するのですが、搬入と排出のタイミングが悪いとプログラムが途中で止まってしまったり、おかしな動作をするのです。
これを直すために、コンベアの速度を調整したり、コンベアの停止タイミングを変更したりしているのです。分からない人ならこれで通用するかもしれませんが、私から見れば「バグを隠している」だけです。
プログラムはどのようなタイミングでも止まったらいけないのです。タイミングをわざとずらしたり、普段しないような動作を行っても動作し続ける、もし問題があるなら異常で停止させる。この装置のプログラムを作った人は技術よりも考え方が違うと言えます。
しかしバグが全くないプログラムを作るということはほぼ不可能です。複雑な設備になるほど出てきます。まずこのバグが出ないようなプログラムを作る。もし出た場合の処理も作る。プログラムの作り方でも改善できます。
設備が異常で停止したとき、異常リセットで解除するのが一般的です。この異常リセットの条件に異常中がついていることがあります。
異常リセットの役目が、異常時の自己保持を解除するだけであれば、この異常中の条件は必要ありません。もし、プログラム作成過程で異常中をつけるのを忘れた部分があった場合、その部分で異常が出ると解除できなくなってしまいます。
異常中でなくても、自己保持を解除するだけであれば動作は同じ(自己保持がかかっていないものを解除する動作はしますが)なので、自分でバグがでる確立をあげているのです。特に必要ない条件は、つけないことです。
次の例を見て見ます。前回使った回路を使用します。
この回路でハンドが閉じたときから、次に開くまでの間ブザーを鳴らすという動作を追加します。ハンドが閉じるのは「M2」が入ったときです。ハンドが開くのは「M6」が入ったときです。「M0」から「M9」は同時に入ることはありません。この場合どのような回路を追加しますか?
次の2つのような回路が一般的でしょうか?
2つの回路を紹介していますが、動作は同じになります、ハンドが閉じてからブザーが鳴り、ハンドが開くとブザーが止まります。動作が同じでも、イレギュラーな行為をしたときの動作は全く違います。つまりバグが潜んでいます。
まずは上の回路です。「M2」によって自己保持がかかり、「M6」によって解除しています。
一見問題はありませんが、もし「M5」辺りで異常が出て、原点復帰をしたらどうなるでしょうか?
ブザーは「M6」が入るまで止まらないので、止まりません。つまり「M6」が入らない場合は、自己保持が解除できないので、解除する接点をつける必要があります。
次に下の回路はどうでしょう。範囲指定していますが、「M2」から「M5」をORでくくった回路です。この場合異常で止まって原点復帰した場合はブザーも止まります。ブザーが止まらないバグは発生しないのです。
このようにプログラムの作り方でもバグが発生しやすくなったりします。ただし、上の回路は一般的に使用される方式なので、しっかり解除させる条件を入れましょう。例えば自動運転中という条件を入れるなどするのが一般的です。
プログラムを作成する人は、ほとんどの人がなぜか頑固です。そして頭でっかちな人が多いです。
そのためこちらから指摘しても聞いてくれないのがほとんどです。これからプログラムを始める方は、頭でっかちにならず、人の意見は積極的に聞いて、いいところを盗むようにしましょう。そうすれば成長も上達も早いと思います。
参考書
秀和システム
売り上げランキング: 70,884
秀和システム
売り上げランキング: 31,176