2が異常完了のようにです。この値が0ということを動作条件に入れておきます。「ネジを締めるST」は「D1202」が0のときでワーク検出しているときのように、まだ動作していない場合を条件に追加しておきます。しないと動作完了しても、何回も動作してしまうからです。次に各ユニットの動作をすべて書き上げてください。ここで重要なのは条件分岐の考え方です。「カバーを置く」ユニットでみてみます。置くカバーの種類をあらかじめ設定するプログラムでは、設定にあったカバーを置く必要があります。これは単純に別プログラムで動作すればいいのですが、この動作プログラムをメイン部分とサブの部分に分けてかんがえて見ましょう。メイン部分はでは1カバーを取りに行く2ハンドを下降する3ハンドを閉めてカバーをつかむ4ハンドを上昇する5カバーを置く位置まで持ってくる6ハンドを下降する7ハンドを開いてカバーを置く8ハンドを上昇する91サイクル完了もしカバーの種類によって別プログラムを作る場合は、上記の動作をカバーの種類分作る必要があります。違うのは1のカバーを取りに行く場所が違うだけで、他の動作は同じはずです。上記の動作の1の部分で、「カバーを取りに行け」という指令を内部リレーで出し、その内部リレーとカバーの種類の設定で場所を変化させるのです。この場所を変化させている部分をサブとします。この部分に位置情報と実行指令を出すのです。実行指令と一緒に送る位置情報などの値を引数と呼びます。移動が完了したら、移動完了の信号をメイン部分に返して、次のステップに進ませます。これが簡単なサブルーチンの考え方です。ステップ制御で説明した書き方でサンプルをかいてみます。簡単に書きましたが、最初の5ステップ目では機種設定をビット出力に変更しています。21ステップからが動作制御になりますが、最初の条件はサンプルプログラムなので動かないようにしています。ここに動作条件をいれてください。次の「M101」の部分です。ここではカバーを取に行く位置まで移動しなさい。いう命令しか書いていません。どこに取に行くかというと、52ステップから書いています。今回はダイヤディックやIAIのロボシリンダを想定しています。52ステップでは「M101」がONするとともに、機種設定された位置を書き込んで、さらに移動パルスを出しています。次の68ステップで、移動パルスを受けたら移動位置の出力をロボット側に出し、0.1秒後に移動指令を出しています。一応この部分は自分で自己保持を解除する仕組みにしています。次はサブルーチンを使わない条件分岐です。細かい条件分岐がたくさんある場合は便利です。「ネジを締める」部分で見てみましょう。ネジを締める箇所が全部で1~6ポイントあるとします。機種によって締める箇所を変更します。簡単に書きましたが、機種によって上記のように締め付け箇所を変更します。このとき何も考えずにプログラムを書くと、機種の数だけプログラムを書いてしまいます。悪い例として、無理やり一個のプログラムで実行させようとして、複雑になりすぎてしまうことがあります。一個のプログラムにした場合このような書き方だと、一個の動作に対して、多数のサイクル完了ができてしまいます。これは非常に悪い書き方です。理由は、今実際にどの部分をプログラムが動作しているのかが非常に分かり難い。プログラムの構成が不安定になりやすく、バグが潜みやすいことです。普段は問題なく動作していても、何かのタイミングで動作不能になる可能性が大きくなります。プログラムは複雑に分岐する必要がない場合は、一個のプログラムにすべての動作を書いて、必要ない部分をパスさせる方向で考えて見ましょう。ここでは1~6ポイントのすべてのネジ締めを行うプログラムを作ります。機種2の場合、56のネジ締めをパスさせ、サイクル完了させます。ここで重要なのは、6ポイントの締め付け動作の後にサイクル完了信号を書きます。どの機種がきても、必ずこのサイクル完了を通って終了します。機種2で4のネジ締めを行った後、別のサイクル完了信号を書くのではなく、6のネジ締めの後のサイクル完了信号を利用するのです。これにより、プログラムが実行して、サイクル完了信号が入って完了するという一つの流れが出来上がります。この書き方だと、プログラムは分岐せずまっすぐ進むため、今どの部分で動作しているか等が把握しやすいと思います。条件分岐により、同じような動作を何個も書く必要がないので、見た目もシンプルになります。必要ない部分はパス(飛ばす)させればいいので、動きも自由に変更できます。この制御はステップ制御で説明した書き方だと簡単に実現できます。上記のように動作制御している「D0」の値を書き換えてしまえば簡単に制御をパスできます。これを歩進制御で説明した回路で行う場合少し工夫が必要です。順番に自己保持をかけているので、パスするタイミングで、パスしたい部分に一気に自己保持をかけてしまうか、パスしたいタイミングで新たに別コイルで自己保持をかけ、そのコイルを利用してパス先の自己保持が入るようにするかです。やり方はいろいろありますが、制御するものによってはできない場合がありますので、制御するものにあわせて行うことが大切です。プログラムを構造化する先ほど「同じ動作を何度も書く必要がない」という言葉が出てきましたが、実際には二度でも書きたくはありません。構造化の部分で説明していますので、大きいプログラムになるほど、できるだけ構造化して分かりやすいプログラムにすることを心がけましょう。