(57)【特許請求の範囲】
【請求項１】
制御対象機器のシーケンス動作を記述した動作フローに基づいて生成されるシーケンスプログラムの共通処理ルーチンに対する指令入力処理の自動生成方法であって、
前記動作フローの要素毎に前記要素が実行可能な状態か否かを示す活性情報と、前記要素が実行済みか否かを示す実行済情報と、前記要素の実行を保留状態にする保留情報とを生成し、
前記動作フローの各要素に対応させて前記要素の活性情報が活性、かつ実行済情報が未実行のとき前記要素の処理を実行し、前記要素の実行済情報を実行済みにするステップ処理と、前記要素の活性情報が活性、実行済情報が実行済み、かつ保留情報が非保留のとき、前記要素の活性情報を非活性、実行済情報を未実行に変更し、実行権を次の要素に移動させるトランジション処理とを生成し、
前記制御対象機器である部品の指令入力画面において指定された指令のみを有効にし、他の指令を無効にして指令の排他管理を行う処理を、前記共通処理ルーチンをコールするメインルーチンの中の前記指令入力処理として生成する共通処理ルーチンに対する指令入力処理の自動生成方法。
【請求項２】
前記部品の指令の初期化を行った後、前記部品の指令入力画面において指定された指令のみを有効にする前記指令入力処理を、前記メインルーチンの前記要素の処理の一部として生成する請求項１記載の共通処理ルーチンに対する指令入力処理の自動生成方法。
【請求項３】
前記ステップ処理とトランジション処理とを生成するステップは、前記各要素に対して前記要素の活性情報が活性、かつ実行済情報が実行済みか否かを判別するステップと、前記要素の活性情報が活性、かつ実行済情報が未実行のとき、前記実行済情報を実行済にするステップとからなるステップ処理と、前記要素の活性情報が活性、実行済情報が実行済み、かつ保留情報が非保留か否かを判別するステップと、前記要素の活性情報が活性、実行済情報が実行済み、かつ保留情報が非保留のとき、活性情報を非活性、かつ実行済情報を未実行に変更し、次の要素の活性情報を活性にして実行権を次ぎの要素に移動させるステップとからなるトランジション処理とを生成する請求項１または２記載の共通処理ルーチンに対する指令入力処理の自動生成方法。
【請求項４】
制御対象機器のシーケンス動作を記述した動作フローに基づいてシーケンスプログラムを自動生成するシーケンスプログラムの自動生成装置であって、
前記動作フローの要素毎に前記要素が実行可能な状態か否かを示す活性情報と、前記要素が実行済みか否かを示す実行済情報と、前記要素の実行を保留状態にする保留情報とを生成する実行情報生成手段と、
前記動作フローの各要素に対応させて前記要素の活性情報が活性、かつ実行済情報が未実行のとき前記要素の処理を実行し、前記要素の実行済情報を実行済みにするステップ処理と、前記要素の活性情報が活性、実行済情報が実行済み、かつ保留情報が非保留のとき、前記要素の活性情報を非活性、実行済情報を未実行に変更し、実行権を次の要素に移動させるトランジション処理とを生成するステップ及びトランジション処理生成手段と、
前記制御対象機器である部品の指令入力画面において指定された指令のみを有効にし、他の指令を無効にして指令の排他管理を行う処理を、前記共通処理ルーチンをコールするメインルーチンの中の前記指令入力処理として生成する指令入力処理生成手段とを備えるシーケンスプログラムの自動生成装置。
【請求項５】
前記指令入力処理生成手段は、前記部品の指令の初期化を行った後、前記部品の指令入力画面において指定された指令のみを有効にする処理を、前記メインルーチンの前記要素の処理の一部として生成する請求項４記載のシーケンスプログラムの自動生成装置。
【請求項６】
前記ステップ及びトランジション処理生成手段は、前記各要素に対して前記要素の活性情報が活性、かつ実行済情報が実行済みか否かを判別するステップと、前記要素の活性情報が活性、かつ実行済情報が未実行のとき、前記実行済情報を実行済にするステップとからなるステップ処理と、前記要素の活性情報が活性、実行済情報が実行済み、かつ保留情報が非保留か否かを判別するステップと、前記要素の活性情報が活性、実行済情報が実行済み、かつ保留情報が非保留のとき、活性情報を非活性、かつ実行済情報を未実行に変更し、次の要素の活性情報を活性にして実行権を次の要素に移動させるステップとからなるトランジション処理とを生成する請求項４または５記載のシーケンスプログラムの自動生成装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、共通処理ルーチンに対する指令入力処理の自動生成方法、プログラムの自動生成装置及び自動生成プログラムを記録した記録媒体に関する。
【０００２】
【従来の技術】
機械の動作、あるいは工場のコンベア制御などのためにプログラマブルコントローラが用いられている。プログラマブルコントローラにより機器を制御するためには、プログラマブルコントローラの制御動作を定めるシーケンスプログラムを作成する必要がある。シーケンスプログラムを作成する場合、プログラミング知識の無い機械技術者が機械の動作仕様を動作フローで記述し、これを元にプログラミング担当者がシーケンスプログラムのフローチャートを作成していた。この場合、２つのフローは各要素の意味が異なっているので、プログラミング担当者が動作フローの各要素の内容を解釈してプログラムフローを作成する必要がある。これはプログラム開発そのものであり、プログラミング担当者に依存したものとなり、動作フローとプログラムフローとを完全に一致させることは困難であった。そこで、このような問題点を解決するために、本発明者は、先に特願平９−３５４５２２において、制御対象機器のシーケンス動作を記述した動作フローからシーケンスプログラムを自動生成する方法を提案した。
【０００３】
ところで、上記の出願において、コンベア、ロボット等に対する共通処理ルーチンを部品として定義しているが、それらの部品に対する制御指示を指令として定義することが考えられる。実行可能な指令を複数持つ部品において同時に複数の指令を与えることが許されない場合、この部品に対して同時に複数の指令が与えられないように指令を排他管理する必要が生じる。
【０００４】
図２３は、ロボット１、２の部品に対して停止、搬入、搬出の指令を定義した場合の入出力端子を示す図であり、図２４は部品の内部処理を示す図である。
図２３に示すように停止、搬入等の指令端子を部品に設けた場合、図２４に示すように部品の内部処理として指令の排他管理を行うｎＣ１チェック処理と、そのチェック結果がエラーであった場合に、エラー出力を行うエラー出力処理を部品の内部処理としてユーザが作成する必要がある。
【０００５】
【発明が解決しようとする課題】
しかしながら、部品の内部処理として指令の排他管理を行うチェックプログラムを作成するようにすると、プログラムの作成に慣れていないユーザは、停止、搬入等の指令処理プログラムを作成することは行っても、チェックプログラムの作成を忘れ、機器の制御に不都合が生じることが考えられる。
【０００６】
また、部品の内部処理としてチェックプログラムを作成する方法は、部品毎にエラー情報をメインルーチンに出力する必要があり、それに対応してメインルーチン側で各部品のエラー情報を記憶するための変数を定義し、その変数を記憶するメモリ領域を確保しておく必要が生じる。これに加えて、メイン処理内に部品エラーに対する処理を記述する必要が有る。これは、部品の数が増えると、それにつれて必要なメモリ容量も増大するので、メモリを有効に活用する上で問題となる。
【０００７】
本発明の課題は、共通処理ルーチンに対する指令入力処理を自動的に生成できるようにすることである。
【０００８】
【課題を解決するための手段】
本発明は、制御対象機器のシーケンス動作を記述した動作フローに基づいて生成されるシーケンスプログラムの共通処理ルーチンに対する指令入力処理の自動生成方法であって、前記動作フローの要素毎に前記要素が実行可能な状態か否かを示す活性情報と、前記要素が実行済みか否かを示す実行済情報と、前記要素の実行を保留状態にする保留情報とを生成し、前記動作フローの各要素に対応させて前記要素の活性情報が活性、かつ実行済情報が未実行のとき前記要素の処理を実行し、前記要素の実行済情報を実行済みにするステップ処理と、前記要素の活性情報が活性、実行済情報が実行済み、かつ保留情報が非保留のとき、前記要素の活性情報を非活性、実行済情報を未実行に変更し、実行権を次の要素に移動させるトランジション処理とを生成し、前記制御対象機器である部品の指令入力画面において指定された指令のみを有効にし、他の指令を無効にして指令の排他管理を行う処理を、前記共通処理ルーチンをコールするメインルーチンの中の前記指令入力処理として生成する。
【０００９】
この発明によれば、共通処理ルーチンに同時に異なる指令が与えられる等の不都合が生じない。
【００１０】
また、各共通処理ルーチンの内部にチェックプログラムを作成した場合には、チェック結果がエラーのとき、エラー情報がメインルーチンに通知されるので、それぞれの共通処理ルーチンのエラー情報を記憶する領域をメモリに確保しておく必要がある。請求項２記載の発明では、排他管理を行うプログラムをメインルーチンの一部として生成するので、共通処理ルーチンからメインルーチンにエラー情報を通知する必要が無くなる。従って、メモリに共通処理ルーチンからのエラー情報を記憶する領域を設ける必要が無くなり、メモリ容量を節約できる。これに加えて、メインルーチンに部品エラーに対する処理を記述する必要がなくなる。
【００１１】
【発明の実施の形態】
以下、本発明の実施の形態を図面を参照して説明する。本発明の前提となる、制御対象機器のシーケンス動作を記述した動作フローからシーケンスプログラムを自動生成する方法について説明する。
【００１２】
図１は、本発明の実施の形態のシーケンスプログラム作成装置のブロック図である。
ユーザがキーボード１１、マウス１２を操作して動作フローの要素と要素の接続情報を入力すると、装置本体１３内のフロー作画処理部１５が入力されたデータに応じた動作フローをディスプレー１４に表示すると共に、各要素の要素データをネット（ｎｅｔ）ファイル１６に書き込む。なお、動作フローで記述され、シーケンスプログラムで使用されるロボット、コンベア等の部品は部品データベース１７に格納される。
【００１３】
コンパイラ１８は、ネットファイル１６の要素データ及び部品データベース１７の部品データに基づいて、図２に示す処理、つまり各要素の処理順序を決める処理順序ファイルの生成処理ＳＴ２０１、処理順序ファイルに基づいて後述するステップ処理及びトランジション処理を生成するフロー要素処理生成処理ＳＴ２０２、部品データベース１７の部品ファンクションブロックＦＢの起動法、タスク指定に従って部品処理を生成する部品処理生成処理ＳＴ２０３及びネットファイル１６の要素データから範囲指定データを探し、範囲指定がなされている場合に、範囲指定番号毎に範囲指定処理を生成する範囲指定処理生成処理ＳＴ２０４を実行する。
【００１４】
これによりコンパイラ１８によりフロー要素処理、部品処理、範囲指定処理等からなるシーケンスプログラム１９が生成され、プログラマブルロジックコントローラＰＬＣ２０に出力される。
【００１５】
ネットファイル１６とは、フロー作画処理部１５により動作フローの要素毎に作成される要素データが複数集まって構成されるファイルであり、一定の規則のもとに要素の配列順に定められる要素番号と、要素の種別（例えば、開始、指令、待ち、並列分岐、選択分岐、並列合流、選択合流、ＥＮＤ、ＲＥＴＵＲＮ、ＲＥＰＥＡＴ）と、来先要素数と、来先要素番号と、行先要素数と、行先要素番号と、その要素で実行する項目（例えば、種別が指令であった場合、部品の各端子に入力する値）と、その要素が範囲指定されている場合に、範囲指定番号と、範囲内の位置（入口または中または出口）とから構成されている。範囲番号は、さらに、イベント、つまり事象の変化の監視か、タイマ監視の何れであるかを示す監視種別と、タイマ監視の場合の時間と、イベント監視の場合の信号名とからなる範囲指定情報からなる。
【００１６】
上記のようにしてネットファイル１６が作成されたなら、そのネットファイル１６を元に、図４に示すような処理順序ファイル４０を作成する。以下、図２の処理順序ファイル作成処理ＳＴ２０１の処理内容を、図３のフローチャートを参照して説明する。
【００１７】
最初に、ポインタＰに「１」を設定し、ネットファイル１６から要素種別が開始の要素データの要素番号ｎ１を得て、その要素番号ｎ１とデータ数（この場合、要素種別が開始であるのでデータ数「１」を処理順序ファイルの先頭にセットする（図３、ＳＴ３０１）。これにより、図４の処理順序ファイル４０のアドレス１にデータとして開始要素の要素番号ｎ１が、データ数として「１」が記憶される。
【００１８】
次に、その処理順序ファイル４０のポインタＰの指すアドレスのデータＤ１とデータ数ｋ１を取得する（ＳＴ３０２）。データＤ１として複数のデータｄが存在する場合には、次のステップＳＴ３０３で、データＤ１の中のデータｄ１が要素番号のみか、それとも要素番号と行先要素番号とからなるかを判別する。
【００１９】
ステップＳＴ３０３で要素番号であると判別された場合には、ステップＳＴ３０４に進み要素番号−行先要素番号セット処理を実行し、要素番号と行先要素番号とからなると判別された場合には、ステップＳＴ３０５に進み要素番号セット処理を実行する。
【００２０】
次に、図３のステップＳＴ３０５の要素番号セット処理を、図５を参照して説明する。
先ず、処理順序ファイル４０のポインタＰ１＋１の指すアドレスに要素ｄ１の行先要素番号が格納されているか否かを判別する（図５、ＳＴ５０１）。最初の状態では、ポインタＰ１＋１の指すアドレスにはデータは何も格納されていないので、ステップＳＴ４０２に進み、ポインタＰ１＋１の指すアドレスに要素ｄ１の行先要素番号を次の要素の要素番号として格納する。そして、データ数ｋ１回分上記の処理を繰り返したか否かを判別する（ＳＴ５０３）。
【００２１】
図６（Ａ）〜（Ｄ）は、上述した要素番号セット処理により作成される処理順序ファイルの一例を示す図である。処理順序ファイル４０は、要素番号からなる要素番号セルと、要素番号と行先要素番号とからなる要素番号＋行先要素番号セルとから構成されている。
【００２２】
図６（Ａ）は、ポインタＰ１が要素番号ｎ１と行先要素番号ｎ２とが記憶されているアドレス「５」を指しているときに、処理順序ファイル４０ａの次のアドレス「６」にその行先要素番号ｎ２が格納されることを示している。そして、その要素ｎ２の行先要素がネットファイル１６から探されて、要素ｎ２の要素番号ｎ２とその行先要素の要素番号が次のアドレス「７」に格納される。すなわち、処理順序ファイル４０ａには、要素番号と、要素番号＋行先要素番号とが交互に格納されることになる。そして、要素番号と行先要素番号が格納された要素番号＋行先要素番号セル内の要素番号はそのセルの１つ前に配置される要素番号セル内に存在し、要素番号＋行先要素番号セルの行先要素番号はそのセルの次の要素番号セル内に存在することになる。
【００２３】
同様に、図６（Ｂ）は、ポインタＰ１の指すセルの要素番号がｎ１で、その接続先の行先要素番号がｎ２、ｎ３、ｎ４の場合に、ポインタＰ１の指すアドレスの次のアドレスに１つ前のセルの行先要素番号が要素番号ｎ２、ｎ３、ｎ４として格納されることを示している。
【００２４】
図６（Ｃ）は、ポインタＰ１の指すセルの要素ｎ１，ｎ２，ｎ３の行先要素の要素番号がｎ４の場合を示しており、次のアドレスＰ１＋１にその行先要素番号ｎ４が、要素番号ｎ４として格納される。
【００２５】
図６（Ｄ）は、ポインタＰ１の指すセルの要素ｎ１、ｎ２、ｎ３の行先要素の要素番号がそれぞれｎ４、ｎ５、ｎ６の場合を示しており、ポインタＰ１の次のアドレスのセルの要素番号として行先要素番号ｎ４、ｎ５、ｎ６が格納される。
【００２６】
図３に戻り、ステップＳＴ３０４の要素番号−行先要素番号セット処理が終了し、ステップＳＴ３０６の判別でデータｄ１がＥＮＤ、ＲＥＴＵＲＮまたはＲＥＰＥＡＴでなかったとき、あるいはステップＳＴ３０５の要素番号セット処理が終了したときには、ステップＳＴ３０７に進みポインタＰ１に「１」を加算して、上述したステップＳＴ３０２以降の処理を繰り返す。そして、要素としてＥＮＤ、ＲＥＴＵＲＮまたはＲＥＰＥＡＴが検出されたなら、処理順序ファイル作成処理を終了する。
【００２７】
以上のようにして動作フローから処理順序ファイルを作成したなら、次にその処理順序ファイルに基づいてフロー要素処理の生成を行う。
図７は、図２のフロー要素処理生成処理ＳＴ２０２の処理内容を示すフローチャートである。
【００２８】
先ず、ポインタＰ１を初期化する（図７、ＳＴ７０１）。次に、処理順序ファイル４０のポインタＰ１で指定されるアドレスからデータＤ１とデータ数ｋ１を読み出す（ＳＴ７０２）。そして、処理順序ファイル４０の該当するアドレスにデータが記憶されているか否かを判別する（ＳＴ７０３）。
【００２９】
ステップＳＴ７０３で、処理順序ファイル４０にデータが記憶されていると判別されたときには、そのデータ型が要素番号か、それとも要素番号−行先要素番号の何れであるかを判別する（ＳＴ７０４）。データ型が要素番号であれば、ステップＳＴ７０５のステップ処理生成処理を実行し、データ型が要素番号−行先要素番号であれば、ステップＳＴ７０６のトランジション処理生成処理を実行する。ステップ処理またはトランジション処理の生成が終了したならポインタＰ１をインクリメントしてＳＴ７０２に戻り、上記の処理を繰り返す。
【００３０】
ここで、図７のステップ処理生成処理ＳＴ７０５の処理内容を、図８を参照して説明する。
最初に、処理順序ファイルのポインタＰ１で指定されるアドレスのデータＤ１の中のデータｄ１を読み出し、そのデータｄ１に対応するステップスケルトンを生成する（図８、ＳＴ８０１）。
【００３１】
この実施の形態では、動作フローの要素毎にその要素が実行可能な状態か否かを示す活性フラグ（活性情報）と、その要素が実行済みであるか否かを示す実行済フラグ（実行済情報）と、その要素を保留状態にする保留フラグ（保留情報）とを設け、要素に対応する処理の実行順序を管理している。そして、要素に対応する処理を、要素自体の実行処理であるステップ処理と次の要素にトークンを移動させるトランジション処理とに分け、動作フローから各要素のステップ処理とトランジション処理を自動生成するようにしている。
【００３２】
具体的には、ステップ処理で要素の活性フラグがオン、かつ実行済フラグがオフのとき、その要素自体の処理を実行し、処理が終了したならその要素の実行済フラグをオンにする。そして、トランジション処理で上流要素の活性フラグがオン、かつ実行済フラグがオン、かつ保留フラグがオフのとき、その要素の活性フラグと実行済フラグをオフにして次の要素の活性フラグをオンにし、トークン（実行権）を次の要素に移し次の要素を実行できるようにしている。
【００３３】
上記のステップスケルトン生成処理ＳＴ８０１とは、図９（Ａ）に示すような基本的な構成のステップ処理を生成する処理である。基本ステップ処理は、要素ｎの活性フラグがオン、かつ実行済フラグがオフか否かを判別するステップＳＴ９０１と、活性フラグがオン、かつ実行済フラグがオフのとき、実行済フラグをオンにするステップＳＴ９０２とからなる。
【００３４】
また、基本となるトランジション処理は、図９（Ｂ）に示すように、上流要素ｎの活性フラグがオン、かつ実行済フラグがオン、かつ保留フラグがオフであるか否かを判別するステップＳＴ９０３と、上流要素ｎの活性フラグがオン、かつ実行済フラグがオン、かつ保留フラグがオフのとき、上流要素ｎの活性フラグをオフし、実行済フラグをオフし、トークンを下流の要素ｎ１に移すために次の要素ｎ１の活性フラグをオンにするステップＳＴ９０４とからなる。
【００３５】
これらの基本ステップ処理及び基本トランジション処理に、その要素自体の処理（例えば、指令、分岐など）、条件判定処理等を付加して各要素のステップ処理及びトランジション処理が生成される。
【００３６】
図８に戻り、ステップスケルトンを生成したなら、次に要素ｄ１の要素種別をネットファイル１６から読み出し、要素種別が指令、待ちか、ＲＥＴＵＲＮか、その他かを判別する（図８、ＳＴ８０２）。
【００３７】
要素種別が指令または待ちであれば、ステップＳＴ８０３に進み、部品のパラメータを設定する部品端子入力処理を生成する。また、部品が動作フローの要素の実行時のみコールする関数型部品の場合には、部品データベース１７の部品ファンクションブロックをコールする部品処理を生成する。部品がフローの進行と独立して動作する常時型部品の場合、あるいは常時型で、起動タスクが生成されプログラムと別タスクの場合には、部品処理生成処理（図２、ＳＴ２０３）により部品処理が生成される。
【００３８】
ここで、ステップＳＴ８０３における部品端子入力処理を図１７を参照して説明する。
フロー作画処理部１５（図１参照）で作成されたステップ要素で使用している部品名をｎｅｔファイル１６（図１参照）から取得する（図１７、ＳＴ１７０１）。
【００３９】
次に、この部品名を元に部品データベース１７（図１参照）を検索し、全ての入力端子情報を取得する（図１７、ＳＴ１７０２）。
そして、ｎｅｔファイル１６から、この部品に対する指令を取得し、検索された１つの入力端子についてこの指令のみを有効とし、他の指令を無効とする処理を生成する（図１７、ＳＴ１７０３）。
【００４０】
さらに、ｎｅｔファイル１６の情報に基づき、残りの入力端子についても同様の処理を生成する（図１７、ＳＴ１７０４）。
これにより、部品に対する指令が設定されたときに、指令に対する排他処理が自動生成されるので、従来のようにユーザが部品処理の一部としてチェックプログラムを作成する必要がなくなり、チェックプログラムの作成を忘れて、複数の指令が同時に記述されて動作上の不都合が生じるのを防止できる。
【００４１】
また、部品内にチェック処理が不要のため、エラー情報を部品からメインルーチンへ出力する必要がなくなる。これにより、メインルーチンで使用する部品のエラー情報を変数として定義し、その変数を記憶するための領域をメモリに確保する必要がなくなるので、メモリ容量を制約できるとともに、部品エラーに対する処理も不要となる。
【００４２】
ステップＳＴ８０２でデータｄ１の要素種別がＲＥＴＵＲＮであると判別された場合には、ステップＳＴ８０４のＲＥＴＵＲＮ生成処理を実行する。また、データｄ１の要素種別が指令、待ち、ＲＥＴＵＲＮ以外であったときには、何も処理を実行せずにステップＳＴ８０５に進む。ステップＳＴ８０５では、データ数ｋ１回分ステップ処理生成処理を実行したか否かを判別し、ｋ１回実行したなら元の処理に戻る。
【００４３】
図１０は、上述したシーケンスプログラム作成装置により動作フローから生成されるシーケンスプログラムの概略を示す図である。
この動作フローは、コンベア１を１ｍ移動させる指令を与えた後、モータ１に停止指令を与えるものである。この動作フロー全体がタスク１として周期的に実行され、モータ１処理がタスク２として５ｍｓ毎に実行される。
【００４４】
上述した処理順序ファイル作成処理により、動作フローに対応する処理順序ファイル４０が作成され、さらにその処理順序ファイル４０に基づいてステップ処理及びトラジション処理が生成され、図１０に示すように動作フローの１番目の要素「開始」と２番目の要素から、ステップ処理のstep１処理と、トランジション処理のtran１−２処理と、ステップ処理のstep２処理が生成され、以下同様に各要素のとステップ処理とトランジション処理が生成される。
【００４５】
上述したシーケンスプログラムの自動生成方法により、動作フローの各要素毎にステップ処理と、要素間の接続と条件判断を行うトランジション処理が生成され、コンベア１を移動させる処理を起動させる処理が部品処理として生成され、５ｍｓ毎にモータ１処理等を起動する処理と範囲指定処理が生成される。
【００４６】
次に、以上のようなシーケンスプログラムの自動生成の際に、部品に対する排他処理をメインルーチンの一部として自動生成する処理について説明する。
ユーザは、メインルーチンから呼び出す部品を作成する際に、部品の入出力端子名と、その属性、例えばデータ型を設定する。
【００４７】
図１１は、端子の設定画面を示しており、「指令」、「状態」、「入力」等の端子種別から「指令」を選択して端子名として「停止」、「搬入」、「搬出」を記述し、それぞれのデータ型として「ＢＯＯＬ」を選択する。ここで、「ＢＯＯＬ」とは、１ビットのオン、オフで表されるデータである。この他の入出力端子、状態等の端子名、属性も同様に設定できる。
【００４８】
図１２は、指令端子の設定画面で設定された部品の部品データベース１７におけるデータ構造を示す図である。部品名、端子名（指令、状態は端子の種別を示す）、データ型が対のデータとして保存される。
【００４９】
図１３は、部品対する制御指示を指令として定義した定義方法に基づく部品の入出力端子を示す図である。本実施の形態では、指令のチェック処理を部品内部で行っていないので、指令チェック処理によりエラーが検出された場合のエラーを出力するエラー出力端子が不要となっている。
【００５０】
図１４は、部品の内部処理を示す図である。部品名「ロボット１、ロボット２」の指令として「停止」、「搬入」、「搬出」が設定された場合、ロボットの動作を停止させる停止処理、ロボットに部品等を搬入出させる搬入処理、搬出処理、それらの処理に基づいて出力端子から停止出力、搬出出力、搬出出力を出力するための制御出力処理、指令された動作が完了したことを示す停止完、搬入完、搬出完の情報を出力する状態出力処理がユーザにより作成されるが、図２３に示されているｎＣ１チェック処理とエラー出力処理は不要となる。
【００５１】
次に、図１５は、上述したようにして入出力端子の設定が終了した後に、部品に対する指令を入力する入力画面を示す図である。同図の入力画面は、図１６の「ロボット１を停止させる」動作フローに基づいて指令を入力する場合を示している。
【００５２】
指令の入力画面では、ユーザが画面の指令の欄の矢印のボタンをクリックすると、図１１の部品の入出力端子の設定画面で設定された指令、「停止」、「搬入」、「搬出」がメニュー形式で表示されるので、ユーザは表示された指令の中から動作フローで定義した指令を選択する。さらに、パラメータとして装置番号を設定する。パラメータは、指令を修飾する情報であり、指令と同時に詳細設定を部品に与えたい場合に使用する。この例で使用しているロボット１は、複数の組立機械に部品を搬入、搬出しているので、指令を与える時、組立機械を指定するための装置番号が必要であり、このために装置番号がパラメータとして指定される。
【００５３】
次に、本発明に係るプログラムの自動生成方法により生成されたプログラムの一例を、図１８〜図２１に示す。このプログラムは、図１６に示す動作フローから作成されたものである。
【００５４】
先ず、図１８の初期設定処理で、１ビットの値「１」をロードし（”ＬＤ  ＢＯＯＬ＃１”）、その値を変数”ＩＮＩＦＬＧ”、動作フローの開始要素である要素１の活性フラグ”ＳＴＳ１［１］”及び要素４の活性フラグ”ＳＴＳ１［４］”にストアする。
【００５５】
次に、各工程の開始番号を設定し、最大工程番号”ＫＴＮＯ＿ＭＡＸ”として「２５６」、有効範囲指定番号”ＨＮＯ＿ＭＡＸ”として「０」、有効要素番号”ＹＮＯ＿ＭＡＸ”として「５」、有効端子番号”ＴＲＮＯ＿ＭＡＸ”として「３」を設定する。
【００５６】
さらに、本プログラムで用いる変数名、例えば活性フラグ”ＳＴＳ１［１］”、”ＳＴＳ２［１］”・・・をモニタ時に用いる変数名”ＳＴＳ＿１”、”ＳＴＳ２＿１”・・・へ変換する。
【００５７】
同様に、図１９のフローの一時停止の変数名、トランジション処理の変数名の変換を行う。
次に、プログラムを一時停止させるための変数”ＰＧ＿ＰＳＥ［１］”の値をアキュムレータにロードし、その値が「０」か否かを判別する（図１９の”ＪＭＰＣＮ  ＦＬＷＣＮＴ１”）。変数”ＰＧ＿ＰＳＥ［１］”が「１」であれば、フローの最後の”ＦＬＷＣＮＴ１”の部品処理にジャンプし、「０」であれば次のステップに進む。
【００５８】
次のステップでは、要素１のステップ処理”ＡＣＴ１”を実行する。このステップ処理では、要素１の活性フラグ”ＳＴＳ１［１］”の値をアキュムレータにロードし（”ＬＤ  ＳＴＳ１［１］”）、アキュムレータの内容と要素１の実行済フラグ”ＳＴＳ２［１］”の値を反転したものとの論理積を取る（”ＡＮＤＮＳＴＳ２［１］”）。そして、演算結果が「０」か否かを判断し、演算結果が「０」であれば、つまり要素１が非活性、又は実行済であれば、”ＡＣＴ１Ｅ”にジャンプし、演算結果が「１」であれば、つまり要素１が活性、かつ未実行であれば次のステップに進む（”ＪＭＰＣＮ  ＡＣＴ１Ｅ”）。
【００５９】
要素１が活性、かつ未実行の場合には、要素１の処理を実行する必要があるが、この場合要素１が「開始要素」であるので、要素１の処理は何も実行せずに、要素１の実行済フラグ”ＳＴＳ２［１］”をセットし（”Ｓ  ＳＴＳ２［１］”）、要素１を実行済の状態にする。その後、整数型の数値「１」をアキュムレータにロードし（”ＬＤ  ＩＮＴ＃１”）、そのアキュムレータの内容を要素１の活性トークン数として変数”ＰＧ＿ＳＴＲ１［１］”にストアする。
【００６０】
次に、要素１が活性、かつ実行済の場合には、実行権を要素１から要素３へ渡すトランジション処理”（＊トランジション１−３＊）を実行する。このトランジション処理では、要素１の活性フラグ”ＳＴＳ１［１］”の値をアキュムレータにロードし、アキュムレータの内容と実行済フラグ”ＳＴＳ２［１］”の値との論理積を取り（”ＡＮＤ  ＳＴＳ２［１］”）、その結果と要素１の保留フラグ”ＳＴＳ３［１］”の値を反転したものとの論理積を取る（”ＡＮＤＮ  ＳＴＳ３［１］”）。そして、その結果が「０」か否かを判断し、結果が「０」であれば、つまり要素１が非活性、又は未実行、又は保留であれば、”ＴＲＮ１ｏｕｔ１”にジャンプし、結果が「１」であれば、つまり要素１が活性、実行済、かつ非保留であれば次のステップに進む。なお、演算結果は”ＴＲＮ１［１］”にストアしておく。
【００６１】
要素１が活性、かつ実行済かつ、非保留の場合には、要素１の活性フラグ”ＳＴＳ１［１］”をリセットし（”Ｒ  ＳＴＳ１［１］”）、要素１の実行済フラグ”ＳＴＳ２［１］”をリセットし、要素３の活性フラグ”ＳＴＳ１［３］”をセットする（”Ｓ  ＳＴＳ１［３］”）。
【００６２】
これにより要素１が非活性、未実行となり、要素３が活性となり、実行権が要素１から要素３へ移動する。なお、図１９の命令”Ｒ”はリセット命令を意味し、”Ｓ”はセット命令を意味している。なお、要素３は、図１６の動作フローのロボットを停止させる要素に該当し、要素１が開始要素、後述する要素２が終了要素に該当する。
【００６３】
次に、要素３のステップ処理ＡＣＴ３を実行する。先ず、要素３の活性フラグ”ＳＴＳ１［３］”の値をアキュムレータにロードし、そのアキュムレータの内容と要素３の実行済フラグ”ＳＴＳ２［３］”の値を反転したものとの論理積を取る。そして、演算結果が「０」か否かを判断し、演算結果が「０」であれば、、つまり要素３が非活性、又は実行済であれば、トランジション処理”（＊トランジション３−２＊）にジャンプし、演算結果が「１」で、要素３が活性、かつ未実行であれば次のステップに進む。
【００６４】
要素３が活性、かつ未実行の場合には、図２０で、要素３の実行済フラグ”ＳＴＳ２［３］”をセットして実行済にした後（”Ｓ  ＳＴＳ２［３］”）、指令端子の初期化を行う。
【００６５】
先ず、部品として定義されているロボット１の指令端子を初期化するために変数をクリアする処理を実行する。１ビットの値「０」をアキュムレータにロードし（”ＬＤ  ＢＯＯＬ＃０”）、そのアキュムレータの内容を変数”ＦＬＷＦＮ００００１＿停止”にストアする（”ＳＴ  ＦＬＷＦＮ００００１＿停止”）。搬入、搬出の指令についても同様に初期化を行う。さらに、数値「０」を変数”ＦＬＷＦＮ００００１＿装置”にストアし、部品のパラメータの装置番号を”０”に初期化する。
【００６６】
次に、ロボット１を停止させる指令を与えるために、１ビットの値「１」をアキュムレータにロードし（ＬＤ  ＢＯＯＬ＃１”）、そのアキュムレータの内容を変数”ＦＬＷＦＮ００００１＿停止”にストアする（”ＳＴ  ＦＬＷＦＮ００００１＿装置”）。これにより、ロボット１に指令を与えるための変数”ＦＬＷＦＮ００００１＿停止”に「１」が設定される。
【００６７】
さらに、数値「０」をアキュムレータにロードし（ＬＤ  ＩＮＴ＃０”）、そのアキュムレータの内容を変数”ＦＬＷＦＮ００００１＿装置”にロードする。これにより、対象装置の装置番号を指定する変数”ＦＬＷＦＮ００００１＿装置”に装置番号として「０」が設定される。この場合には、初期値と実際の装置番号が同一になっている。さらに、入力データ制御フラグ”ＦＣＮＴ［１］”に「１」をストアする。
【００６８】
上述したように部品に対する指令の入力画面で入力された指令のみを有効とし、他の指令を無効とする処理がメインルーチンの要素３の処理として自動生成される。これにより、部品に対する指令の排他管理を行うチェック処理を、部品処理の一部としてユーザが作成する必要がなくなるので、ユーザがチェック処理の作成を忘れて制御対象機器の動作に不都合が生じることが無くなる。
【００６９】
要素３のステップ処理が終了したなら、要素３−２のトランジション処理を実行する。このトランジション処理では、要素３の活性フラグ”ＳＴＳ１［３］”の値をアキュムレータにロードし、アキュムレータの内容と実行済フラグ”ＳＴＳ２［３］”との論理積を取り、さらにその結果と保留フラグ”ＳＴＳ３［３］”の値を反転したものとの論理積を取り、その結果を変数”ＴＲＮ１［２］”にストアする。そして、演算結果が「０」か否かを判断し、演算結果が「０」であれば、つまり要素３が非活性、又は未実行、又は保留であれば、”ＴＲＮ２ｏｕｔ１Ｅ”のステップにジャンプし、要素３が活性、かつ実行済、かつ非保留であれば、次のステップに進む（”ＪＭＰＣＮ  ＴＲＮ２ｏｕｔ１Ｅ”）。
【００７０】
要素３が活性、かつ実行済、かつ非保留の場合には、要素３の活性フラグ”ＳＴＳ１［３］”をリセットして非活性にし、実行済フラグ”ＳＴＳ２［３］”をリセットして未実行にし、要素２の活性フラグ”ＳＴＳ１［２］”をセットして実行権を要素２に移動する。
【００７１】
次に、要素２のステップ処理を実行する。このステップ処理では、要素２の活性フラグ”ＳＴＳ１［２］”の値をアキュムレータにロードし、そのアキュムレータの内容と要素２の実行済フラグ”ＳＴＳ２［２］”の値を反転したものとの論理積を取る。そして、その演算結果が「０」か否かを判断し、演算結果が「０」であれば、つまり要素２が非活性、又は実行済であれば、”ＡＣＴ２Ｅ”のステップにジャンプし、要素２が活性、かつ未実行であれば、次のステップに進む。
【００７２】
次のステップでは、要素２が終了要素であるので何も処理を実行せず、要素２の実行済フラグ”ＳＴＳ２［２］”をセットして実行済にする。さらに、整数型の数値「０」を変数”ＰＧ＿ＳＴＲ１［１］”にストアして、活性トークン数を「０」にする。
【００７３】
次に、終了要素２のトランジション処理ＡＣＴ２Ｅでは、要素２の活性フラグ”ＳＴＳ１［２］”の値をアキュムレータにロードし、そのアキュムレータの内容と実行済フラグ”ＳＴＳ２［２］”の値との論理積を取り、その結果と保留フラグ”ＳＴＳ３［２］”の値を反転したものとの論理積を取る。そして、演算結果が「０」か否かを判断し、演算結果が「０」であれば、つまり要素２が非活性、又は未実行、又は保留であれば、”ＴＲＮ２ＥＮＤＥ”のステップにジャンプし、演算結果が「１」であれば、次のステップに進む。
【００７４】
演算結果が「１」で、要素２が活性、かつ実行済、かつ非保留の場合には、要素２の活性フラグ”ＳＴＳ１［２］”をリセットして要素２を非活性にし、要素２の実行済フラグ”ＳＴＳ２［２］”をリセットして未実行にする。
【００７５】
次に、部品をコールして指令を与える処理について説明する。先ず、入力データ制御フラグ”ＦＣＮＴ［１］”の値をアキュムレータにロードし（”ＬＤ  ＦＣＮＴ［１］”）、アキュムレータの内容が「０」か否かを判別することで、入力データ制御フラグがセットされているか否かを判断する。アキュムレータが「０」のとき、つまり入力データ制御フラグがセットされていないときには、”ＦＮＣＣＮＴ１”のステップにジャンプし、アキュムレータが「１」で入力データ制御フラグがセットされているときには次のステップに進む。
【００７６】
次のステップでは、変数”ＦＬＷＦＮ００００１＿停止”の値をアキュムレータにロードし、そのアキュムレータの内容をロボット１の部品に対する指令としてストアする（図２１の”ＳＴ  ロボット１．＿停止”）。同様に、搬入、搬出の変数の値をロボット１の指令として設定する。また、変数”ＦＬＷＦＮ０００１”に記憶されている装置番号「０」を、ロボット１のパラメータの装置番号として設定する。
【００７７】
上述した処理により、例えば、図１５の部品に対する指令の入力画面でユーザが選択した指令のみが「１」となり、他の指令は「０」となるので、ロボット１に対する指令の内で”停止”のみが有効となり、他の搬入、搬出等の指令は無効となる。
【００７８】
最後にロボット１の部品処理をコール（”ＣＡＬ  ロボット１”）する。そして、入力データ制御フラグ”ＦＣＮＴ［１］”に１ビットの値「０」をセットして制御フラグをリセットする。さらに、ロボット１が停止完状態にあるか否かを示す部品の出力端子の”停止完”の情報をロードし、その情報を変数”ＦＬＷＦＮ００００１＿停止完”にストアする。同様にロボット１が搬入完了の状態にあるか否かを示す出力端子である”搬入完”の情報をロードし、その情報を変数”ＦＬＷＦＮ００００１＿搬入完”にストアする。また、ロボット１が搬出完了の状態にあるか否かを示す出力端子である”搬出完”の情報をロードし、その情報を変数”ＦＬＷＦＮ００００１＿搬出完”にストアする。これらの処理によりロボット１の状態が上述した変数にストアされ、メインルーチンでその変数を読み取ることにより、ロボット１の状態を認識できる。
【００７９】
上述した実施の形態によれば、部品に対する指令がユーザにより設定されたとき、設定された指令のみを有効とし、他の指令を無効とする処理が自動生成されるので、従来のようにユーザが部品処理の内部にチェック処理を作成する必要がなくなる。これにより、ユーザがチェック処理の作成を忘れて、異なる指令が１つの部品に同時に与えられるような問題の発生を防止できる。また、チェック処理を部品処理の内部処理として作成する必要が無いため、個々の部品がチェック結果をメインルーチンに通知するためのエラー情報を出力する必要が無くなる。これにより、多数の部品が存在する場合でも、それらの部品のエラー情報を記憶するための変数を定義し、その変数を記憶する領域をメモリに確保する必要が無くなるので、メモリ容量をその分節約することができる。また、変数で定義されているエラー情報を処理するための処理をメインルーチンに設ける必要が無くなるので、その分プログラムも簡素になる。
【００８０】
さらに、本発明に係るシーケンスプログラムの自動生成プログラムを、図２２に示すフロッピーディスク２２０１、ＣＤＲＯＭ２２０２等の記憶媒体に格納しておいて、その記憶媒体を情報処理装置（パーソナルコンピュータ等）２２０３の媒体駆動装置（フロッピーディスクドライバー、ＣＤＲＯＭドライバー等）２２０４により読み取りシーケンスプログラムを自動生成するようにしてもよい。あるいは自動生成プログラムをプログラム提供者のコンピュータのハードディスク等の記憶装置に記憶しておいて、通信によりユーザのコンピュータに転送してハードディスク等に記憶し、その自動生成プログラムを用いてシーケンスプログラムを生成するようにしてもよい。
【００８１】
上述した実施の形態によれば、動作フローの要素毎に活性フラグ、実行済フラグ、保留フラグを設け、それらのフラグが一定の条件を満足するとき、実行権を次の要素に渡すようにしたので、動作フローの要素に対応する処理とその要素の処理が終了したとき実行権を次の要素に渡すようなプログラムを自動生成することが可能となる。
【００８２】
また、本実施の形態では、動作フローの各要素に対応するステップ処理とトランジション処理とが自動生成されるので、従来のようにプログラミング担当者がプログラムを作成する場合に発生するステップやトランジションの抜けが無くなる。また、ステップ処理とステップ処理との間には必ずトランジション処理が生成されるので、シーケンシャルファンクションチャートのようにステップとトランジションの記述順序をユーザが注意する必要が無くなる。さらに、仕様を変更する際は、動作フローのみを変更すれば、その動作フローに対応するシーケンスプログラムが作成されるので、従来のようにシーケンスプログラムのみが変更され、動作フローが実際のプログラムと異なるという問題も生じない。
【００８３】
また、従来、使用する部品の動作に必要なタスク毎にフローを記述し、タスク間でデータ交換を行うためのソフトウエア設計が必要であったが、１つの動作フローで別タスクで動作すべき部品が記述できるので、これらの作業が不要となる。その結果、ユーザはモータ等の使用部品が別のタスクで動作するか否かを考慮する必要がなく、機械動作そのものを記述するだけでシーケンスプログラムを生成することができる。
【００８４】
なお、上述した実施の形態では、シーケンスプログラムを自動生成する際に、指令を排他管理するプログラムを自動生成する場合について説明したが、それ以外のプログラムを自動生成する場合にも本発明は適用できる。
【００８５】
【発明の効果】
本発明によれば、共通処理ルーチンに対する指令の排他管理を行うプログラムを自動生成することができるので、ユーザが指令のチェックプログラムを作成するのを忘れて処理上の不都合が生じるのを防止できる。また、共通処理ルーチンに対する指令の排他管理を行うプログラムを、共通処理ルーチンの内部ではなく、メインルーチン側に作成することにより、共通処理ルーチンからメインルーチンにエラー情報を通知する必要がなくなる。これにより、共通処理ルーチンが複数存在する場合でも、それぞれのエラー情報を記憶するメモリ領域を確保する必要が無くなるので、メモリ容量を節約できる。
【図面の簡単な説明】
【図１】実施の形態のシーケンスプログラム作成装置のブロック図である。
【図２】コンパイラ１８の処理内容を示す図である。
【図３】処理順序ファイル作成処理を示す図である。
【図４】処理順序ファイル４０の構成の一例を示す図である。
【図５】要素番号セット処理を示す図である。
【図６】同図（Ａ）〜（Ｄ）は、処理順序ファイルの一例を示す図である。
【図７】フロー要素処理生成処理を示す図である。
【図８】ステップ処理生成処理を示す図である。
【図９】ステップ処理及びトランジション処理の基本構成を示す図である。
【図１０】動作フローから生成されるシーケンスプログラムの一例を示す図である。
【図１１】部品の端子の設定画面を示す図である。
【図１２】部品データのデータ構造を示す図である。
【図１３】部品データベース１７に登録される部品の入出力端子を示す図である。
【図１４】部品の内部処理を示す図である。
【図１５】指令の入力画面を示す図である。
【図１６】動作フローの作成画面を示す図である。
【図１７】部品端子入力処理を生成するフローチャート
【図１８】シーケンスプログラムの一例を示す図（その１）である。
【図１９】シーケンスプログラムの一例を示す図（その２）である。
【図２０】シーケンスプログラムの一例を示す図（その３）である。
【図２１】シーケンスプログラムの一例を示す図（その４）である。
【図２２】記憶媒体を用いる場合の説明図である。
【図２３】部品に対して複数の指令を定義した場合の部品の入出力端子を示す図である。
【図２４】部品に対して複数の指令を定義した場合の部品の内部処理を示す図である。
【符号の説明】
１６    ネットファイル
１７    部品データベース
１８    コンパイラ
４０    処理順序ファイル
【図１】
0003890746.tif 000002
【図２】
0003890746.tif 000003
【図３】
0003890746.tif 000004
【図４】
0003890746.tif 000005
【図５】
0003890746.tif 000006
【図６】
0003890746.tif 000007
【図７】
0003890746.tif 000008
【図８】
0003890746.tif 000009
【図９】
0003890746.tif 000010
【図１０】
0003890746.tif 000011
【図１１】
0003890746.tif 000012
【図１２】
0003890746.tif 000013
【図１３】
0003890746.tif 000014
【図１４】
0003890746.tif 000015
【図１５】
0003890746.tif 000016
【図１６】
0003890746.tif 000017
【図１７】
0003890746.tif 000018
【図１８】
0003890746.tif 000019
【図１９】
0003890746.tif 000020
【図２０】
0003890746.tif 000021
【図２１】
0003890746.tif 000022
【図２２】
0003890746.tif 000023
【図２３】
0003890746.tif 000024
【図２４】
0003890746.tif 000025