(57)【要約】  【課題】ユーザーは、スレッドの実行許可を意識しなくても、簡単にフローチャートからプログラムを作成することができる。  【解決手段】プログラム生成部４３は、フローチャートに基づいてプログラムを生成する。スレッド抽出部４４は、共通バッファに記憶されたデータを処理するスレッドをフローチャートから抽出する。プログラム挿入部４５は、プログラム生成部４３がプログラムを生成する際、スレッド抽出部４４によって抽出されたスレッドのプログラムに、共通バッファのデータをコピーし、他のスレッドの実行を許可するプログラムを挿入させる。【選択図】図４
2015222517.tif 000002
【特許請求の範囲】
【請求項１】
フローチャートに基づいてプログラムを生成するプログラム生成部と、
共通バッファに記憶されたデータを処理するスレッドを前記フローチャートから抽出するスレッド抽出部と、
前記プログラム生成部がプログラムを生成する際、前記スレッド抽出部によって抽出された前記スレッドのプログラムに、前記共通バッファのデータをコピーし、他の前記スレッドの実行を許可するプログラムを挿入させるプログラム挿入部と、
を有することを特徴とする情報処理装置。
【請求項２】
請求項１に記載の情報処理装置であって、
前記プログラム挿入部は、前記共通バッファのデータをコピーした後に、他の前記スレッドの実行を許可するプログラムを挿入させる、
ことを特徴とする情報処理装置。
【請求項３】
請求項１に記載の情報処理装置であって、
前記プログラム挿入部は、前記スレッドがデータ処理を実行する前に、前記共通バッファのデータをコピーするプログラムを挿入させる、
ことを特徴とする情報処理装置。
【請求項４】
請求項１に記載の情報処理装置であって、
前記プログラム挿入部は、前記スレッドがデータ処理を終了した後に、他の前記スレッドの実行を許可するプログラムを挿入させる、
ことを特徴とする情報処理装置。
【請求項５】
請求項１に記載の情報処理装置であって、
前記プログラム挿入部は、複数の前記スレッドのそれぞれにおいて、前記共通バッファに記憶されたデータをコピーする記憶領域を確保するプログラムを挿入させる、
ことを特徴とする情報処理装置。
【請求項６】
請求項１に記載の情報処理装置であって、
前記プログラム挿入部は、前記フローチャートの前記スレッドの記述位置によって、次に実行される次スレッドを判定し、前記次スレッドが次に実行許可されるようにプログラムを挿入させる、
ことを特徴とする情報処理装置。
【請求項７】
請求項６に記載の情報処理装置であって、
前記プログラム挿入部は、前記次スレッドの前に実行される前スレッドのプログラムに、前記前スレッドの処理が終了したとき終了フラグを立てるプログラムを挿入させ、前記次スレッドのプログラムに、前記終了フラグが立っている場合、前記次スレッドの処理を実行するようにするプログラムを挿入させる、
ことを特徴とする情報処理装置。
【請求項８】
情報処理装置のプログラム生成方法であって、
共通バッファに記憶されたデータを処理するスレッドをフローチャートから抽出する抽出ステップと、
前記抽出ステップによって抽出された前記スレッドのプログラムに、前記共通バッファのデータをコピーし、他の前記スレッドの実行を許可するプログラムを挿入したプログラムを生成する生成ステップと、
を有することを特徴とするプログラム生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置およびプログラム生成方法に関する。
【背景技術】
【０００２】
特許文献１には、スレッドの優先度や状態をスレッド情報退避部に格納した後、スレッド情報変更部によりスレッド指定部により指定されたスレッドを優先実行し、後に前記スレッド情報退避部に格納されていた優先度や状態を復帰させ実行を継続する実行順序決定方法が開示されている。
【０００３】
特許文献２には、効率のよい画像処理のロジック（処理フロー）の構築を実現する情報処理装置が開示されている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開平７−７３０５１号公報
【特許文献２】特開２０１０−２４４５０７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
ところで、マルチスレッド処理では、例えば、あるスレッドから他のスレッドへの実行許可を、あるスレッド内において明示しなければならない場合がある。
【０００６】
そのため、フローチャートからプログラムを生成する情報処理装置において、例えば、ユーザーが、あるスレッドの処理を記述したフローチャートで、他のスレッドの実行許可を記述しなかったり、適切な位置に記述しなかったりすると、生成されたプログラムが正しく動かない場合があるという問題がある。
【０００７】
そこで本発明は、ユーザーがスレッドの実行許可を意識しなくても、簡単にフローチャートからプログラムを作成することを目的とする。
【課題を解決するための手段】
【０００８】
上記の課題を解決するための本発明の第一の態様は、フローチャートに基づいてプログラムを生成するプログラム生成部と、共通バッファに記憶されたデータを処理するスレッドを前記フローチャートから抽出するスレッド抽出部と、前記プログラム生成部がプログラムを生成する際、前記スレッド抽出部によって抽出された前記スレッドのプログラムに、前記共通バッファのデータをコピーし、他の前記スレッドの実行を許可するプログラムを挿入させるプログラム挿入部と、を有することを特徴とする情報処理装置である。第一の態様によれば、情報処理装置は、共通バッファに記憶されたデータを処理するスレッドのプログラムに、共通バッファのデータをコピーして、他のスレッドの実行を許可するプログラムを挿入するので、ユーザーは、他のスレッドの実行許可を意識せずに、フローチャートを簡単に作成することができる。
【０００９】
前記プログラム挿入部は、前記共通バッファのデータをコピーした後に、他の前記スレッドの実行を許可するプログラムを挿入させる、ことを特徴としてもよい。これにより、他のスレッドは、共通バッファから自分が処理すべき適切なデータを取得することができる。
【００１０】
前記プログラム挿入部は、前記スレッドがデータ処理を実行する前に、前記共通バッファのデータをコピーするプログラムを挿入させる、ことを特徴としてもよい。これにより、スレッドは、共通バッファに記憶されたデータをコピーしてから、適切にデータ処理を行うことができる。
【００１１】
前記プログラム挿入部は、前記スレッドがデータ処理を終了した後に、他の前記スレッドの実行を許可するプログラムを挿入させる、ことを特徴としてもよい。これにより、スレッドのデータ処理が終了してから、他のスレッドは、データ処理を開始することができる。
【００１２】
前記プログラム挿入部は、複数の前記スレッドのそれぞれにおいて、前記共通バッファに記憶されたデータをコピーする記憶領域を確保するプログラムを挿入させる、ことを特徴としてもよい。これにより、スレッドは、共通バッファに記憶されたデータを記憶領域にコピーして、データ処理を適切に行うことができる。
【００１３】
前記プログラム挿入部は、前記フローチャートの前記スレッドの記述位置によって、次に実行される次スレッドを判定し、前記次スレッドが次に実行許可されるようにプログラムを挿入させる、ことを特徴としてもよい。これにより、ユーザーは、スレッドのフローチャートの記述位置によって、スレッドの優先度を簡単に決めることができる。
【００１４】
前記プログラム挿入部は、前記次スレッドの前に実行される前スレッドのプログラムに、前記前スレッドの処理が終了したとき終了フラグを立てるプログラムを挿入させ、前記次スレッドのプログラムに、前記終了フラグが立っている場合、前記次スレッドの処理を実行するようにするプログラムを挿入させる、ことを特徴としてもよい。これにより、ユーザーは、前スレッドのデータ処理が終了してから、次スレッドのデータ処理を開始するようにするプログラムを簡単に生成することができる。
【００１５】
上記の課題を解決するための本発明の第二の態様は、情報処理装置のプログラム生成方法であって、共通バッファに記憶されたデータを処理するスレッドをフローチャートから抽出する抽出ステップと、前記抽出ステップによって抽出された前記スレッドのプログラムに、前記共通バッファのデータをコピーし、他の前記スレッドの実行を許可するプログラムを挿入したプログラムを生成する生成ステップと、を有することを特徴とするプログラム生成方法である。第二の態様によれば、情報処理装置は、共通バッファに記憶されたデータを処理するスレッドのプログラムに、共通バッファのデータをコピーして、他のバッファの実行を許可するプログラムを挿入するので、ユーザーは、他のスレッドの実行許可を意識せずに、フローチャートを簡単に作成することができる。
【図面の簡単な説明】
【００１６】
【図１】第１の実施の形態に係る情報処理装置の適用例を示した図である。
【図２】フローチャートによるプログラムの生成を説明する図である。
【図３】カメラの撮像例を説明する図である。
【図４】情報処理装置の機能ブロックの例を示した図である。
【図５】スレッドの抽出を説明する図である。
【図６】プログラムの挿入を説明する図である。
【図７】情報処理装置の動作例を説明する処理フローである。
【図８】情報処理装置のハードウェア構成例を示した図である。
【図９】第２の実施の形態に係る情報処理装置の動作を説明する図である。
【発明を実施するための形態】
【００１７】
［第１の実施の形態］
図１は、第１の実施の形態に係る情報処理装置の適用例を示した図である。図１には、情報処理装置１１と、カメラ１２と、ステージ１３と、検査対象物１４とが示してある。情報処理装置１１は、例えば、ラップトップＰＣ（Personal Computer）またはデスクトップＰＣなどである。
【００１８】
情報処理装置１１には、例えば、検査対象物１４を検査するプログラムが実装されている。情報処理装置１１は、実装されたプログラムに基づいて、ステージ１３上に配置された検査対象物１４をカメラ１２で撮像し、検査する。例えば、情報処理装置１１は、検査対象物１４が適切に組み立てられたか、または異物が付着していないかなどを、カメラ１２によって撮像された画像データに基づいて検査する。
【００１９】
情報処理装置１１は、以下で説明するように、ユーザーが作成したフローチャートに基づいて、検査対象物１４を検査するプログラムを生成する。情報処理装置１１は、フローチャートからプログラムを生成するので、ユーザーは、例えば、Ｃ言語等のプログラム言語を知らなくても、フローチャートを作成することによって、検査対象物１４を検査するプログラムを生成することができる。
【００２０】
以下では、説明を簡単にするため、カメラが撮像した画像データに対し、所定の画像処理を行うプログラムの生成について説明する。
【００２１】
図２は、フローチャートによるプログラムの生成を説明する図である。図２には、情報処理装置１１の表示装置に表示される画面例が示してある。図２に示す画面例は、例えば、情報処理装置１１にインストールされている、フローチャートに基づいてプログラムを生成するプログラム生成ソフトを起動すると、表示装置に表示される。ユーザーは、情報処理装置１１の画面上で、フローチャートを作成（編集）することにより、所望の処理を実行するプログラムを作成することができる。
【００２２】
図２に示す表示領域２１には、プログラムの処理単位となる処理モジュールが表示されている。例えば、表示領域２１の「撮像」は、カメラが撮像した画像データを取得する処理モジュールを示している。「処理１」および「処理２」は、カメラが撮像した画像データに対し、所定の画像処理を行う処理モジュールを示している。「分岐」は、条件によって、処理を分岐する処理モジュールを示している。
【００２３】
図２に示す表示領域２２には、所望の処理を実行するプログラムを実現するためのフローチャートが表示されている。ユーザーは、例えば、表示領域２１に表示されている処理モジュールを、表示領域２２にドラッグアンドドロップし、ドラッグアンドドロップした処理モジュールを「フロー線」（図２中の矢印線）で結ぶことにより、所定の処理を実行するプログラムを作成することができる。なお、フロー線は、処理モジュールの処理の順番を規定する。例えば、フロー線で結ばれた処理モジュールは、フロー線の矢印の方向に向かって、順に処理を実行する。
【００２４】
表示領域２２にドラッグアンドドロップされた処理モジュールは、ユーザーの所定の操作に応じて、処理パラメータが設定される。処理パラメータは、処理モジュールの動作を詳細に規定するパラメータである。
【００２５】
例えば、ユーザーが、画面上のマウスポインタを、表示領域２２の処理モジュールの上に重ねて右クリックすると、その処理モジュールの処理パラメータを設定するためのプロパティシートが表示装置に表示される。例えば、図２のプロパティシート２３は、処理モジュール「撮像」の処理パラメータを設定するプロパティシートを示している。ユーザーは、例えば、プロパティシート２３によって、処理モジュール「撮像」の処理パラメータを設定し、処理モジュール「撮像」の動作を詳細に規定することができる。
【００２６】
処理モジュールの処理パラメータには、例えば、その処理モジュールの処理をマルチスレッドにするか否かの設定がある。図２のプロパティシート２３の例では、「マルチスレッド」のチェックボックスが選択され、処理モジュール「撮像」をマルチスレッドに設定する例が示してある。処理モジュールの処理パラメータには、マルチスレッドの設定の他に、処理モジュールが入力するデータの最大値および最小値を規定する設定や、処理モジュールのデータ処理を行う周期の設定など、様々な設定がある。また、処理モジュール「分岐」の場合には、処理パラメータによって、分岐条件を設定することができる。
【００２７】
処理モジュールを「マルチスレッド」に設定すると、その処理モジュールからは、複数のフロー線を伸ばすことができる。例えば、図２の例の場合、マルチスレッドが設定された処理モジュール「撮像」からは、２本のフロー線が、２つの処理モジュール「分岐」に伸びている。
【００２８】
これにより、図２に示すフローチャートによるプログラムは、３つのスレッドによって動作することになる。具体的には、一点鎖線枠２４ａに囲まれた処理モジュール「撮像」のスレッドｔｈ０と、一点鎖線枠２４ｂに囲まれた処理モジュール「分岐」、処理モジュール「処理１」、および処理モジュール「処理２」のスレッドｔｈ１と、一点鎖線枠２４ｃに囲まれた処理モジュール「分岐」、処理モジュール「処理１」、および処理モジュール「処理２」のスレッドｔｈ２との、３つのスレッドによって動作することになる。すなわち、「マルチスレッド」が設定された処理モジュールから分岐して伸びる、フロー線で繋がった処理モジュールのグループは、１つのスレッドとして処理を実行することになる。
【００２９】
なお、処理モジュール「分岐」から伸びている２本のフロー線は、条件分岐によるフロー線であって、マルチスレッドによる処理の流れを示すフロー線ではない。従って、例えば、スレッドｔｈ１の処理モジュール「処理１」と処理モジュール「処理２」は、別々のスレッドではなく、１つのスレッドｔｈ１に属する。
【００３０】
また、一点鎖線枠２４ａ〜２４ｃは、情報処理装置１１の表示装置には表示されなくてもよい。
【００３１】
ボタン２５は、表示領域２２に表示されているフローチャートのプログラムを、生成するためのボタンである。例えば、情報処理装置１１は、ボタン２５がユーザーによって押下されると、表示領域２２に表示されているフローチャートの処理手順に基づいたプログラムを生成する。
【００３２】
ボタン２６は、ボタン２５の押下に基づいて生成されたプログラムを実行するためのボタンである。例えば、情報処理装置１１は、ボタン２６がユーザーによって押下されると、ボタン２５の押下に基づいて生成されたプログラムを実行する。これにより、例えば、情報処理装置１１は、図１で説明した、検査対象物１４の検査を行うことができる。
【００３３】
画像処理では、一般的にマルチスレッドによってデータ処理を行うことが多い。カメラで撮像した画像データを、マルチスレッド処理する例は色々あるが、例えば、カメラの視野範囲が狭く、被撮像対象物の全体を１度に撮像できない場合などがある。
【００３４】
図３は、カメラの撮像例を説明する図である。図３には、カメラによって撮像される被撮像対象物３１と、カメラの撮像範囲３２ａ，３２ｂ，…，３２ｅとが示してある。
【００３５】
カメラは、被撮像対象物３１に対して視野範囲が狭い場合、被撮像対象物３１を複数に分けて撮像する。例えば、カメラは、撮像範囲３２ａ，３２ｂ，…，３２ｅに示すように、被撮像対象物３１に対して、撮像範囲を複数に分けて撮像する。
【００３６】
このように、カメラが撮像範囲を複数に分けて被撮像対象物３１を撮像する場合、例えば、図２で説明したスレッドｔｈ０は、カメラで撮像された被撮像対象物３１の画像データを、次々にリングバッファへ記憶する処理を行う。そして、スレッドｔｈ１は、リングバッファから、例えば、奇数枚目の画像データ（例えば、撮像範囲３２ａ，３２ｃ，…で撮像された画像データ）を取得して所定の画像処理を行い、スレッドｔｈ２は、リングバッファから、例えば、偶数枚目の画像データ（撮像範囲３２ｂ，３２ｄ，…で撮像された画像データ）を取得して所定の画像処理を行う。
【００３７】
ここで、リングバッファに記憶された画像データを画像処理するスレッドｔｈ１，ｔｈ２には、他のスレッドｔｈ１，ｔｈ２がデータ処理を開始するための「実行許可」をフローチャート上で記述（指示）する必要がある。例えば、スレッドｔｈ１では、他のスレッドｔｈ２が処理を開始するための「実行許可」をフローチャート上で記述する必要がある。同様にスレッドｔｈ２においても、他のスレッドｔｈ１が処理を開始するための「実行許可」をフローチャート上で記述する必要がある。
【００３８】
「実行許可」をフローチャート上で記述しなかったり、適切な位置に記述しなかったりすると、プログラムはロックしたり、または適切でないタイミングで他のスレッドが処理を開始して、適切でない結果を出力したりする。
【００３９】
例えば、ＯＳ（Operating System）には、スレッドの実行タイミングを管理しないものがある。このようなＯＳでは、「実行許可」をフローチャート上で記述しなかったり、適切な位置で記述しなかったりすると、例えば、上記したスレッドｔｈ１が、１枚目の画像データを取得している最中に、スレッドｔｈ２が、処理を開始したりする場合がある。この場合、スレッドｔｈ２は、例えば、本来２枚目の画像データを取得して画像処理を行わなければならないのに、１枚目の画像データを取得して画像処理を行い、不適切な結果を出力する。
【００４０】
より具体的には、スレッドｔｈ２は、スレッドｔｈ１がリングバッファから１枚目の画像データを全て読み出し、リングバッファのリードポインタが２枚目の画像データを指し示してから、リングバッファから画像データを読み出さなければならない。しかし、フローチャート上で「実行許可」が記述されていなかったり、適切な位置に記述されなかったりすると、スレッドｔｈ２は、例えば、リードポインタがまだ１枚目の画像データを指し示しているときに（スレッドｔｈ１がまだ画像データの読み出し処理を実行しているときに）、リングバッファから画像データを読み出してしまう。すなわち、スレッドｔｈ２は、本来２枚目の画像データを読み出して画像処理を行わなければならないのに、１枚目の画像データを読み出して画像処理を行い、不適切な結果を出力する。
【００４１】
また、例えば、スレッドｔｈ２は、スレッドｔｈ１の後に処理が実行されなければならないとする。この場合、ＯＳは、スレッドｔｈ１より先にスレッドｔｈ２を実行してしまう場合もある。この場合、処理すべきデータは、不適切になる。
【００４２】
そこで、情報処理装置１１は、ユーザーが「実行許可」をフローチャート上で記述しなくても、生成するプログラムの適切な位置に、他のスレッドの実行を許可するプログラムを挿入し、スレッドが適切なデータ処理を行うようにする。
【００４３】
図４は、情報処理装置の機能ブロックの例を示した図である。図４に示すように、情報処理装置１１は、入力部４１と、フローチャート作成部４２と、プログラム生成部４３と、スレッド抽出部４４と、プログラム挿入部４５と、プログラム実行部４６と、表示部４７と、記憶部４８とを有している。
【００４４】
入力部４１は、ユーザーから、フローチャートの作成操作、プログラムの生成操作、およびプログラムの実行操作等を受付ける。
【００４５】
フローチャート作成部４２は、ユーザーのフローチャートの作成操作に応じて、フローチャートを作成する。例えば、フローチャート作成部４２は、図２に示した表示領域２１の処理モジュールの、表示領域２２へのドラッグアンドドロップ操作等に応じて、フローチャートを作成する。
【００４６】
プログラム生成部４３は、ユーザーのプログラムの生成操作に応じて、ユーザーが作成したフローチャートに基づくプログラムを生成する。例えば、プログラム生成部４３は、図２に示したボタン２５がユーザーによって押下されると、表示領域２２に表示されているフローチャートの処理モジュールのプログラムを、フロー線の矢印の順に従って処理されるよう展開し、フローチャートが示す処理手順に基づくプログラムを生成する。また、プログラム生成部４３は、処理モジュールに処理パラメータが設定されている場合、その処理パラメータに基づいた処理を実行するプログラムを生成する。
【００４７】
スレッド抽出部４４は、データをリングバッファに記憶するスレッドと、リングバッファに記憶されたデータを処理するスレッドとを、ユーザーが作成したフローチャートから抽出する。すなわち、スレッド抽出部４４は、複数のスレッドによって処理されるデータを、共通の記憶領域（リングバッファ）に記憶するスレッドと、その共通の記憶領域に記憶されたデータを処理するスレッドとを抽出する。以下では、データをリングバッファに記憶するスレッドを、「記憶スレッド」と呼ぶことがある。また、リングバッファに記憶されたデータを処理するスレッドを「処理スレッド」と呼ぶことがある。なお、リングバッファは、例えば、本発明の共通バッファに対応する。処理スレッドは、例えば、本発明のスレッドに対応する。
【００４８】
図５は、スレッドの抽出を説明する図である。図５には、ユーザーによって作成されたフローチャートの例が示してある。なお、図５のフローチャートは、図２とは異なる処理のフローチャートの例が示してある。例えば、図５では、図２、図３で説明したように、どのスレッドが何枚目の画像データを処理しなければならないという制約はなく、スレッドは、単にリングバッファに記憶されている画像データに対し、所定の処理を行うものとする。
【００４９】
図５に示す処理モジュール「撮像」は、カメラが撮像した画像データをカメラから取得し、リングバッファに記憶する処理を行う処理モジュールである。処理モジュール「二値化」は、画像データを二値化処理する処理モジュールである。処理モジュール「ノイズ除去」は、画像データのノイズを除去する処理モジュールである。処理モジュール「エッジ強調」は、画像データをエッジ強調処理する処理モジュールである。処理モジュール「特徴量抽出」は、画像データから物体の線などの特徴を抽出する処理モジュールである。
【００５０】
図５に示す処理モジュール「撮像」は、プロパティシートによって、マルチスレッドが設定されているとする。この場合、ユーザーは、処理モジュール「撮像」から、複数のフロー線を伸ばすことができる。図５の例の場合、処理モジュール「撮像」からは、３本のフロー線が伸びている。
【００５１】
スレッド抽出部４４は、リングバッファにデータを記憶する処理モジュールが、マルチスレッドに設定された場合、その処理モジュールを、記憶スレッドとして抽出する。例えば、図５の例の場合、処理モジュール「撮像」は、カメラが撮像した画像データをリングバッファに記憶する処理を行い、また、プロパティシートによって、マルチスレッドが設定されているので、スレッド抽出部４４は、処理モジュール「撮像」を、記憶スレッド（図５ではスレッドｔｈ０）として抽出する。
【００５２】
また、スレッド抽出部４４は、記憶スレッドの処理モジュールから分岐して伸びる、フロー線の矢先の処理モジュールのグループを、処理スレッドとして抽出する。例えば、図５の例の場合、記憶スレッドであるスレッドｔｈ０から伸びるフロー線は、図中左側の処理モジュール「二値化」、処理モジュール「ノイズ除去」、・・・のグループと、図中中央の処理モジュール「エッジ強調」、処理モジュール「二値化」、・・・のグループと、図中右側の処理モジュール「二値化」、処理モジュール「特徴量抽出」、・・・のグループと、に伸びている。この場合、スレッド抽出部４４は、上記したそれぞれのグループを、処理スレッド（図５ではスレッドｔｈ１〜ｔｈ３）として抽出する。
【００５３】
なお、フロー線の矢先の処理モジュールのグループは、処理モジュールが１つであってもよい。例えば、スレッドｔｈ１は、１つの処理モジュールによって構成されていてもよい。
【００５４】
図４の説明に戻る。プログラム挿入部４５は、プログラム生成部４３が、フローチャートに基づくプログラムを生成する際、スレッド抽出部４４によって抽出された処理スレッドのプログラムに、リングバッファのデータをコピーするプログラムを挿入させ、また、他の処理スレッドの実行を許可するプログラムを挿入させる。
【００５５】
以下では、スレッド抽出部４４によって抽出された処理スレッドのプログラムを抽出プログラムと呼ぶことがある。抽出プログラムに挿入される、リングバッファのデータをコピーするプログラムをコピープログラムと呼ぶことがある。他の処理スレッドの実行を許可するプログラムを実行許可プログラムと呼ぶことがある。抽出プログラム、コピープログラム、および実行許可プログラムは、プログラム生成部４３が生成する実行プログラム全体の要素のプログラムといえる。
【００５６】
図６は、プログラムの挿入を説明する図である。図６は、図５と比較して、点線で示す処理モジュールの部分が異なっている。
【００５７】
プログラム挿入部４５は、プログラム生成部４３がフローチャートに基づいてプログラムを生成する際、プログラム生成部４３に、図６の点線で示す処理モジュールのプログラムを挿入させる。すなわち、ユーザーは、点線で示す処理モジュールを、フローチャートに記述しなくてよい。つまり、プログラム生成部４３は、自動的に点線で示す処理モジュールの処理を実行するプログラムを挿入する。
【００５８】
プログラム挿入部４５は、プログラム生成部４３が、フローチャートに基づくプログラムを生成する際、スレッド抽出部４４によって抽出された処理スレッドの抽出プログラムに、リングバッファに記憶されたデータをコピーするコピープログラムを挿入させる。例えば、図６の例の場合、処理スレッドは、スレッドｔｈ１〜ｔｈ３であるので、プログラム挿入部４５は、スレッドｔｈ１〜ｔｈ３のそれぞれの抽出プログラムに、リングバッファに記憶された画像データをコピーするコピープログラムを挿入させる。
【００５９】
より具体的には、プログラム挿入部４５は、スレッドｔｈ１が実行するデータ処理より前において（図６に示すスレッドｔｈ１の二値化処理、ノイズ除去処理、…のデータ処理より前において）、スレッドｔｈ１の固有の記憶領域（バッファｂｕｆ１）を、プログラム生成部４３に確保させる。そして、プログラム挿入部４５は、スレッドｔｈ１の固有のバッファｂｕｆ１に、リングバッファに記憶された画像データをコピーするコピープログラムを挿入させる。このスレッドｔｈ１のコピープログラムは、図６のスレッドｔｈ１の「ｂｕｆ１に画像データをコピー」に対応する。
【００６０】
同様にして、プログラム挿入部４５は、スレッドｔｈ２においても、固有のバッファｂｕｆ２を確保させ、確保させた固有のバッファｂｕｆ２に、リングバッファに記憶された画像データをコピーするコピープログラムを、プログラム生成部４３に挿入させる。このスレッドｔｈ２のコピープログラムは、図６のスレッドｔｈ２の「ｂｕｆ２に画像データをコピー」に対応する。また、スレッドｔｈ３においても同様に、プログラム挿入部４５は、リングバッファのデータを固有のバッファｂｕｆ３にコピーするコピープログラムを、プログラム生成部４３に挿入させる。このスレッドｔｈ３のコピープログラムは、図６のスレッドｔｈ３の「ｂｕｆ３に画像データをコピー」に対応する。
【００６１】
また、プログラム挿入部４５は、プログラム生成部４３が、フローチャートに基づくプログラムを生成する際、他の処理スレッドの実行を許可する実行許可プログラムを、プログラム生成部４３に挿入させる。例えば、プログラム挿入部４５は、スレッドがリングバッファのデータをコピーする処理よりも後に、他の処理スレッドの実行を許可するように、実行許可プログラムを挿入させる。
【００６２】
より具体的には、プログラム挿入部４５は、スレッドｔｈ１に挿入したコピープログラム「ｂｕｆ１に画像データをコピー」の処理よりも後に、他の処理スレッドであるスレッドｔｈ２，ｔｈ３の実行を許可する実行許可プログラムを挿入させる。このスレッドｔｈ１の実行許可プログラムは、図６のスレッドｔｈ１の「実行許可」に対応する。
【００６３】
同様にして、プログラム挿入部４５は、スレッドｔｈ２においても、スレッドｔｈ２に挿入したコピープログラム「ｂｕｆ２に画像データをコピー」の処理よりも後に、他の処理スレッドであるスレッドｔｈ１，ｔｈ３の実行を許可する実行許可プログラムを挿入させる。このスレッドｔｈ２の実行許可プログラムは、図６のスレッドｔｈ２の「実行許可」に対応する。また、スレッドｔｈ３においても同様に、プログラム挿入部４５は、他のスレッドｔｈ１、ｔｈ２の実行を許可する実行許可プログラムを挿入させる。このスレッドｔｈ３の実行許可プログラムは、図６のスレッドｔｈ３の「実行許可」に対応する。
【００６４】
このように、プログラム挿入部４５は、処理スレッド（スレッドｔｈ１〜ｔｈ３）のそれぞれにおいて、リングバッファのデータを処理スレッド固有のバッファに記憶し、その後、他の処理スレッドの実行を許可するプログラムを挿入させる。これにより、他の処理スレッドは、現在処理を行っている処理スレッドが、少なくともリングバッファの画像データをコピーし終えた後に実行が許可され、データ処理を開始することになる。つまり、ある処理スレッドが画像データをコピーしている最中に、他の処理スレッドが処理を開始することが防止され、他の処理スレッドが、ある処理スレッドと同じ画像データをコピーして画像処理することが防止される。
【００６５】
なお、図６に示す実線の処理モジュールは、スレッドｔｈ１〜ｔｈ３の固有のバッファｂｕｆ１〜ｂｕｆ３にコピーされた画像データを画像処理する。例えば、スレッドｔｈ１の処理モジュール「二値化」、処理モジュール「ノイズ除去」、…は、スレッドｔｈ１の固有のバッファｂｕｆ１にコピーされた画像データを画像処理する。
【００６６】
図４の説明に戻る。プログラム実行部４６は、ユーザーのプログラムの実行操作に応じて、プログラム生成部４３によって生成された（プログラム挿入部４５によってプログラムが挿入された）プログラムを実行する。例えば、プログラム実行部４６は、図２に示したボタン２６がユーザーによって押下されると、プログラム生成部４３によって生成されたプログラムを実行する。
【００６７】
表示部４７は、フローチャート作成部４２によって作成されるフローチャートを、表示装置に表示する。例えば、表示部４７は、図２の表示領域２２に示すようなフローチャートを表示する。
【００６８】
記憶部４８には、処理モジュールの処理を実行するためのプログラムが記憶されている。プログラム生成部４３は、例えば、フローチャートに記述されている処理モジュールに基づいて記憶部４８を参照し、フローチャートに記述されている処理モジュールに対応するプログラムを取得してプログラムを生成する。
【００６９】
図７は、情報処理装置の動作例を説明する処理フローである。図７に示す処理フローは、例えば、図２で説明したプログラム生成ソフトを起動すると実行される。
【００７０】
まず、入力部４１は、ユーザーから、フローチャートの作成操作を受付ける（ステップＳ１）。
【００７１】
次に、フローチャート作成部４２は、入力部４１が受け付けたフローチャートの作成操作に応じて、フローチャートを作成する（ステップＳ２）。なお、フローチャート作成部４２によって作成されるフローチャートは、表示部４７によって、情報処理装置１１の表示装置に表示される。
【００７２】
次に、入力部４１は、ユーザーから、フローチャートの作成終了の操作を受付けたか否か判定する（ステップＳ３）。入力部４１は、ユーザーから、フローチャートの作成終了の操作を受付けていない場合（ステップＳ３にて「Ｎｏ」の場合）、ステップＳ１の処理へ移行する。入力部４１は、ユーザーから、フローチャートの作成終了の操作を受付けた場合（ステップＳ３にて「Ｙｅｓ」の場合）、ステップＳ４の処理へ移行する。
【００７３】
入力部４１は、ステップＳ３にて、フローチャートの作成終了の操作を受付けた場合（ステップＳ３にて「Ｙｅｓ」の場合）、ユーザーがプログラムの生成操作を行ったか否か判定する（ステップＳ４）。例えば、入力部４１は、図２に示したボタン２５をユーザーが押下したか否か判定する。入力部４１は、ユーザーがプログラムの生成操作を行ったと判定した場合（ステップＳ４にて「Ｙｅｓ」の場合）、ステップＳ５の処理へ移行する。入力部４１は、ユーザーがプログラムの生成操作を行っていないと判定した場合、当該処理フローの処理を終了する。
【００７４】
次に、スレッド抽出部４４は、ステップＳ４にて、入力部４１がプログラムの生成操作を受付けた場合（ステップＳ４にて「Ｙｅｓ」の場合）、ユーザーによって作成されたフローチャートから、処理スレッドを抽出する（ステップＳ５）。例えば、スレッド抽出部４４は、図５に示すスレッドｔｈ１〜ｔｈ３を抽出する。
【００７５】
次に、プログラム生成部４３は、ユーザーによって生成されたフローチャートに基づいて、プログラムを生成する（ステップＳ６）。例えば、プログラム生成部４３は、記憶部４８を参照して、フローチャートに記述されている処理モジュールに対応するプログラムを取得し、ユーザーによって生成されたフローチャートに基づいた処理のプログラムを生成する。
【００７６】
次に、プログラム挿入部４５は、プログラム生成部４３がフローチャートに基づくプログラムを生成する際、スレッド抽出部４４によって抽出された処理スレッドの抽出プログラムに、リングバッファに記憶されたデータをコピーするコピープログラムを挿入させ、また、他のスレッドの実行を許可する実行許可プログラムを挿入させる（ステップＳ７）。例えば、プログラム挿入部４５は、図６の点線枠に示す処理を実行するプログラムを、処理スレッドのプログラムに挿入させる。
【００７７】
図８は、情報処理装置のハードウェア構成例を示した図である。情報処理装置１１は、例えば、図８に示すような、ＣＰＵ（Central Processing Unit）等の演算装置５１と、ＲＡＭ（Random Access Memory）などの主記憶装置５２と、ＨＤＤ（Hard Disk Drive）等の補助記憶装置５３と、有線又は無線により通信ネットワークと接続するための通信インターフェイス（Ｉ／Ｆ）５４と、マウス、キーボード、タッチセンサーやタッチパネルなどの入力装置５５と、液晶ディスプレイなどの表示装置５６と、ＤＶＤ（Digital Versatile Disk）などの持ち運び可能な記憶媒体に対する情報の読み書きを行う読み書き装置５７と、を備える。
【００７８】
フローチャート作成部４２、プログラム生成部４３、スレッド抽出部４４、プログラム挿入部４５、およびプログラム実行部４６の機能は、例えば、補助記憶装置５３などから主記憶装置５２にロードされた所定のプログラム（プログラム作成ソフトのプログラム）を演算装置５１が実行することで実現される。入力部４１は、例えば、演算装置５１が入力装置５５を利用することで実現される。表示部４７は、例えば、演算装置５１が表示装置５６を利用することで実現される。記憶部４８は、例えば、演算装置５１が主記憶装置５２または補助記憶装置５３を利用することで実現される。情報処理装置１１と、その他の機器との通信は、例えば、演算装置５１が通信Ｉ／Ｆ５４を利用することで実現される。
【００７９】
なお、プログラム作成ソフトのプログラムは、例えば、読み書き装置５７により読み取られた記憶媒体からインストールされてもよいし、通信Ｉ／Ｆ５４を介してネットワークからインストールされてもよい。
【００８０】
このように、情報処理装置１１のプログラム生成部４３は、ユーザーが作成したフローチャートに基づいてプログラムを生成し、スレッド抽出部４４は、データをリングバッファに記憶する記憶スレッドと、リングバッファに記憶されたデータを処理する処理スレッドとをフローチャートから抽出する。そして、プログラム挿入部４５は、プログラム生成部４３がプログラムを生成する際、スレッド抽出部４４によって抽出された処理スレッドのプログラムに、リングバッファに記憶されたデータをコピーするプログラムを挿入させ、他の処理スレッドの実行を許可するプログラムを挿入させる。これにより、情報処理装置１１は、リングバッファに記憶されたデータを処理する処理スレッドに、自動でリングバッファのデータをコピーするコピープログラムを挿入し、他の処理スレッドの実行を許可する実行許可プログラムを挿入するので、ユーザーは、他の処理スレッドの実行許可を意識せずに、フローチャートを簡単に作成することができる。
【００８１】
また、プログラム挿入部４５は、リングバッファのデータをコピーした後に、他の処理スレッドの実行を許可するようにプログラムを挿入させる。これにより、他の処理スレッドは、リングバッファから自分が処理すべき適切なデータを取得して、データ処理を行うことができる。
【００８２】
また、プログラム挿入部４５は、処理スレッドがデータ処理を実行する前に、リングバッファのデータをコピーするようにプログラムを挿入させる。これにより、処理スレッドは、リングバッファに記憶されたデータをコピーしてから、適切にデータを処理することができる。
【００８３】
また、プログラム挿入部４５は、複数の処理スレッドのそれぞれにおいて、リングバッファに記憶されたデータをコピーする記憶領域を確保するプログラムを挿入させる。これにより、処理スレッドは、リングバッファに記憶されたデータを記憶領域にコピーし、データ処理を適切に行うことができる。
【００８４】
なお、上記では、情報処理装置１１が、フローチャートからプログラムを生成し、生成したプログラムを実行するとしたが、生成したプログラムは、別の装置が実行してもよい。例えば、情報処理装置１１で生成したプログラムを、別の情報処理装置にインストールして、別の情報処理装置でプログラムを実行するようにしてもよい。
【００８５】
また、プログラム挿入部４５は、処理スレッドがデータ処理を終了した後に、他の処理スレッドの実行を許可するようにプログラムを挿入させてもよい。例えば、プログラム挿入部４５は、図６において、スレッドｔｈ１〜ｔｈ３の「実行許可」の実行許可プログラムを、スレッド処理の終了を示す「エンド」の直前に挿入させてもよい。この場合、前に実行されていた処理スレッドのデータ処理が終了してから、他の処理スレッドは、データ処理を開始することができる。
【００８６】
また、上記では、情報処理装置１１は、ボタン２５が押下されるとプログラム（オブジェクトコード）を生成するとしたが、例えば、Ｃ言語等の所定の言語によるソースコードやアセンブリコードも生成するようにしてもよい。その際、情報処理装置１１は、ソースコードやアセンブリコードの、プログラム挿入部４５によって挿入されたプログラムに対応する部分を、例えば、他のコードの部分と異なる色を付して生成するようにしてもよい。
【００８７】
また、プログラム挿入部４５は、プログラム生成部４３がプログラムを生成する際、ユーザーが作成したフローチャートに、コピープログラムおよび実行許可プログラムに対応する処理モジュールを、プログラム生成部４３に挿入させてもよい。例えば、ユーザーは、図５に示したフローチャートを作成したとする。この場合、プログラム挿入部４５は、図６の点線で示す処理モジュールを、プログラム生成部４３に挿入させる。プログラム生成部４３は、フローチャートの処理モジュールの挿入に合わせてプログラムを生成する。これにより、ユーザーは、プログラム生成部４３によって、どのような処理を行うプログラムが生成されたかを、処理モジュールが挿入（追加）されたフローチャートから、容易に把握することができる。
【００８８】
また、プログラム挿入部４５は、処理スレッドが他の処理スレッドからの実行許可を受けて、データ処理を開始するようにするプログラムを挿入させてもよい。例えば、プログラム挿入部４５は、処理スレッドがデータ処理を開始する前に、他の処理スレッドからの実行許可があるかないかを判定し、実行許可があった場合に、データ処理を実行するようにするプログラムを挿入させてもよい。または、ＯＳが、処理スレッドの実行許可を受けて、他の処理スレッドを実行する（呼び出す）ようにしてもよい。
【００８９】
［第２の実施の形態］
次に、第２の実施の形態について説明する。ユーザーは、プログラムによっては、リングバッファに記憶されたデータを処理するスレッドの実行順を規定したい場合もある。第２の実施の形態では、リングバッファに記憶されたデータを処理するスレッドの実行順（優先度）を規定するプログラムの生成について説明する。
【００９０】
第２の実施の形態に係る情報処理装置の機能ブロックは、図４で示した機能ブロック例と同様であるが、プログラム挿入部４５の機能が異なる。以下では、第２の実施の形態においても、図４の機能ブロック例を用いて説明し、機能の異なる部分について説明する。
【００９１】
図９は、第２の実施の形態に係る情報処理装置の動作を説明する図である。図９には、図６と同様のフローチャートが示してあるが、２点鎖線で示す処理モジュールの部分が異なっている。
【００９２】
プログラム挿入部４５は、プログラム生成部４３がフローチャートに基づいてプログラムを生成する際、プログラム生成部４３に、図９の点線および二点鎖線で示す処理モジュールのプログラムを挿入させる。すなわち、ユーザーは、点線および二点鎖線で示す処理モジュールを、フローチャートに記述しなくてよい。つまり、プログラム生成部４３は、自動的に点線および２点鎖線で示す処理モジュールの処理を実行するプログラムを挿入する。
【００９３】
プログラム挿入部４５は、処理スレッドのフローチャートの記述位置によって、次に実行される処理スレッドを判定し、判定した次の処理スレッドが、次に実行許可されるようにプログラムを挿入させる。例えば、図９に示すスレッドｔｈ１〜ｔｈ３は、処理スレッドであり、プログラム挿入部４５は、処理スレッドであるスレッドｔｈ１〜ｔｈ３の水平方向における記述の順番によって、他の処理スレッドｔｈ１〜ｔｈ３の実行を許可するプログラムを挿入させる。
【００９４】
より具体的には、プログラム挿入部４５は、左側の処理スレッドが、その右隣の処理スレッドの実行許可を行うように、実行許可のプログラムを挿入させる。そして、プログラム挿入部４５は、右端のスレッドが左端のスレッドの実行許可を行うように、実行許可のプログラムを挿入させる。図９の例では、プログラム挿入部４５は、スレッドｔｈ１においては、右隣に記述されたスレッドｔｈ２の実行を許可するプログラムを挿入させ、スレッドｔｈ２においては、右隣に記述されたスレッドｔｈ３の実行を許可するプログラムを挿入させる。そして、プログラム挿入部４５は、右端のスレッドｔｈ３においては、左端のスレッドｔｈ１の実行を許可するプログラムを挿入させる。なお、この「実行許可」のプログラムは、図９に示す「スレッドｔｈ２実行許可」、「スレッドｔｈ３実行許可」、および「スレッドｔｈ１実行許可」に対応する。
【００９５】
このように、プログラム挿入部４５は、フローチャートの処理スレッドの記述位置によって、次に実行される処理スレッドを判定し、判定した処理スレッドが次に実行許可されるようにプログラムを挿入させる。これにより、ユーザーは、処理スレッドのフローチャートの記述位置によって、処理スレッドの優先度を簡単に決めることができる。
【００９６】
なお、プログラム挿入部４５は、次に実行される処理スレッドの前に実行される処理スレッドのプログラムに、前の処理スレッドの処理が終了したとき終了フラグを立てるプログラムを挿入させ、次に実行される処理スレッドのプログラムに、前の処理スレッドの終了フラグが立っている場合、次の処理スレッドの処理を実行するようにするプログラムを挿入させてもよい。
【００９７】
例えば、プログラム挿入部４５は、スレッドｔｈ１のプログラムに、スレッドｔｈ１の処理が終了したとき終了フラグを立てるプログラムを挿入させる。より具体的には、プログラム挿入部４５は、図９に示すスレッドｔｈ１の「エンド」の前において、終了フラグを立てるプログラムを挿入させる。そして、プログラム挿入部４５は、次に実行されるスレッドｔｈ２のプログラムに、前のスレッドｔｈ１の終了フラグが立っている場合、スレッドｔｈ２の処理を実行するようにするプログラムを挿入させる。
【００９８】
このように、プログラム挿入部４５が終了フラグを挿入させることによって、ユーザーは、前の処理スレッドの処理が終了してから、次の処理スレッドの処理を開始するようにするプログラムを簡単に生成することができる。
【００９９】
上述した情報処理装置１１の機能構成は、情報処理装置１１の構成を理解容易にするために、主な処理内容に応じて分類したものである。構成要素の分類の仕方や名称によって、本願発明が制限されることはない。例えば、プログラム生成部４３が、プログラム挿入部４５の機能を有していてもよい。例えば、プログラム生成部４２は、フローチャートに基づいてプログラムを生成する際、スレッド抽出部４４によって抽出されたスレッドのプログラムに、共通バッファのデータをコピーし、他のスレッドの実行を許可するプログラムを挿入するようにしてもよい。また、プログラム挿入部４５が、プログラム生成部４３によってプログラムが生成される際、スレッド抽出部４４によって抽出されたスレッドのプログラムに、共通バッファのデータをコピーし、他のスレッドの実行を許可するプログラムを挿入してもよい。また、情報処理装置１１の構成は、処理内容に応じて、さらに多くの構成要素に分類することもできる。また、１つの構成要素がさらに多くの処理を実行するように分類することもできる。また、各構成要素の処理は、１つのハードウェアで実行されてもよいし、複数のハードウェアで実行されてもよい。
【０１００】
また、上述したフロー図の各処理単位は、情報処理装置１１の処理を理解容易にするために、主な処理内容に応じて分割したものである。処理単位の分割の仕方や名称によって、本願発明が制限されることはない。情報処理装置１１の処理は、処理内容に応じて、さらに多くの処理単位に分割することもできる。また、１つの処理単位がさらに多くの処理を含むように分割することもできる。
【０１０１】
以上、本発明について実施形態を用いて説明したが、本発明の技術的範囲は上記実施形態に記載の範囲には限定されない。上記実施形態に多様な変更または改良を加えることが可能であることが当業者には明らかである。また、そのような変更または改良を加えた形態も本発明の技術的範囲に含まれ得ることが、特許請求の範囲の記載から明らかである。また、本発明は、フローチャートに基づいてプログラムを生成するプログラム生成方法、フローチャートに基づいてプログラムを生成するプログラム、当該プログラムを記憶した記憶媒体として提供することもできる。
【符号の説明】
【０１０２】
１１：情報処理装置
１２：カメラ
１３：ステージ
１４：検査対象物
２１，２２：表示領域
２３：プロパティシート
２４ａ〜２４ｃ：一点鎖線枠
２５，２６：ボタン
３１：撮像対象物
３２ａ〜３２ｃ：撮像範囲
４１：入力部
４２：フローチャート作成部
４３：プログラム生成部
４４：スレッド抽出部
４５：プログラム挿入部
４６：プログラム実行部
４７：表示部
４８：記憶部
５１：演算装置
５２：主記憶装置
５３：補助記憶装置
５４：通信インターフェイス
５５：入力装置
５６：表示装置
５７：読み書き装置
【図１】
2015222517.tif 000003
【図２】
2015222517.tif 000004
【図３】
2015222517.tif 000005
【図４】
2015222517.tif 000006
【図５】
2015222517.tif 000007
【図６】
2015222517.tif 000008
【図７】
2015222517.tif 000009
【図８】
2015222517.tif 000010
【図９】
2015222517.tif 000011