複数のデバイスが記述されるとともにデバイス間の依存関係が記述され、前記複数のデバイスの記述とデバイス間の依存関係の記述により前記複数のデバイスに対する制御アルゴリズムが定義される制御プログラムから、各デバイスの記述を抽出するデバイス抽出部と、前記制御プログラムから、デバイス間の依存関係の記述を抽出する依存関係抽出部と、前記デバイス抽出部により抽出されたデバイスの記述と前記依存関係抽出部により抽出されたデバイス間の依存関係の記述とに基づき、ノードがデバイスを表し、有向エッジがデバイス間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表す有閉路有向グラフを生成するグラフ生成部とを有することを特徴とする情報処理装置。前記依存関係抽出部は、前記デバイス抽出部により抽出されたデバイスの記述と、抽出した依存関係の記述とを対応付ける接続情報を生成し、前記グラフ生成部は、前記デバイス抽出部により抽出されたデバイスの記述と、前記依存関係抽出部により抽出されたデバイス間の依存関係の記述と、前記依存関係抽出部により生成された接続情報とを用いて、前記有閉路有向グラフを生成することを特徴とする請求項1に記載の情報処理装置。前記デバイス抽出部は、IECInternationalElectrotechnicalCommission61131-3規格で定義されている言語で作成された制御プログラムから、各デバイスの記述を抽出し、前記依存関係抽出部は、IEC61131-3規格で定義されている言語で作成された前記制御プログラムから、デバイス間の依存関係の記述を抽出することを特徴とする請求項1又は2に記載の情報処理装置。前記情報処理装置は、更に、前記グラフ生成部により生成された有閉路有向グラフをGUIGraphicalUserInterface方式にて表示する表示部を有することを特徴とする請求項1~3のいずれかに記載の情報処理装置。前記依存関係抽出部は、デバイス間の依存関係として、1つの動作手順において起点となる起点デバイスと起点デバイスの動作に動作状態が依存する依存デバイスとが記述されている制御プログラムから、デバイス間の依存関係の記述を抽出し、前記グラフ生成部は、前記制御プログラムで定義されている制御アルゴリズムを、起点デバイスから依存デバイスに向かう有向エッジを用いて表す有閉路有向グラフを生成することを特徴とする請求項1~4のいずれかに記載の情報処理装置。前記依存関係抽出部は、デバイス間の依存関係として、正論理の依存関係及び負論理の依存関係のいずれであるかが記述されている制御プログラムから、デバイス間の依存関係の記述を抽出し、前記グラフ生成部は、正論理の依存関係を表す有向エッジと、負論理の依存関係を表す有向エッジとが区別される有閉路有向グラフを生成することを特徴とする請求項1~5のいずれかに記載の情報処理装置。前記情報処理装置は、更に、前記制御プログラムに記述されている特定のデバイス及び特定の依存関係の少なくともいずれかを指定要素として指定する指定要素情報を入力する情報入力部と、前記有閉路有向グラフを解析し、前記指定要素情報で指定されている指定要素に変更があった場合に当該変更の影響を受ける影響範囲を前記有閉路有向グラフから抽出するグラフ解析部と、前記グラフ解析部により抽出された影響範囲を前記有閉路有向グラフにおいて表示する表示部とを有することを特徴とする請求項1~6のいずれかに記載の情報処理装置。前記情報処理装置は、更に、前記制御プログラムに記述されている特定のデバイス及び特定の依存関係の少なくともいずれかを指定要素として指定する指定要素情報を入力する情報入力部と、前記指定要素情報で指定されている指定要素が記述されているプログラムコードを前記制御プログラムから抽出するプログラムコード抽出部と、前記グラフ生成部により生成された有閉路有向グラフと、前記プログラムコード抽出部により抽出されたプログラムコードとを表示する表示部とを有することを特徴とする請求項1~7のいずれかに記載の情報処理装置。前記情報処理装置は、更に、前記有閉路有向グラフを解析し、チャタリングを発生させる可能性のある循環を前記有閉路有向グラフから抽出するグラフ解析部と、前記グラフ解析部により抽出された循環を前記有閉路有向グラフにおいて表示する表示部とを有することを特徴とする請求項1~8のいずれかに記載の情報処理装置。前記情報処理装置は、更に、前記制御プログラムに記述されている特定のデバイスを指定要素として指定する指定要素情報を入力する情報入力部と、前記有閉路有向グラフを解析し、前記指定要素情報で指定要素として指定されているデバイスを表すノードと接続している有向エッジを前記有閉路有向グラフから抽出するとともに、抽出した有向エッジと接続しているノードを前記有閉路有向グラフから抽出し、抽出した有向エッジとノードとに基づき、前記指定要素情報で指定要素として指定されているデバイスと抽出したノードが表しているデバイスとの間の依存関係を自然言語にて説明する説明文を生成するグラフ解析部と、前記グラフ生成部により生成された有閉路有向グラフと、前記グラフ解析部により生成された説明文とを表示する表示部とを有することを特徴とする請求項1~9のいずれかに記載の情報処理装置。前記情報処理装置は、更に、前記有閉路有向グラフを解析し、いずれのデバイスとも依存関係にないデバイスを表すノードを未使用デバイスノードとして前記有閉路有向グラフから抽出するグラフ解析部と、前記グラフ解析部により抽出された未使用デバイスノードを、他のノードと区別して前記有閉路有向グラフにおいて表示する表示部とを有することを特徴とする請求項1~10のいずれかに記載の情報処理装置。前記情報処理装置は、更に、前記複数のデバイスに対して前記制御プログラムを用いた制御が行われている場合に、所定のデバイスで計測された計測値を入力する計測値入力部と、前記有閉路有向グラフ内の該当するデバイスのノードに対して前記計測値入力部により入力された計測値を表示する表示部とを有することを特徴とする請求項1~11のいずれかに記載の情報処理装置。前記情報処理装置は、更に、いずれかのデバイスで障害が発生した場合に、前記有閉路有向グラフを解析し、障害が発生したデバイスを表す障害発生デバイスノードと接続している有向エッジを前記有閉路有向グラフから抽出するとともに、抽出した有向エッジと接続しているノードを抽出し、抽出したノードが表しているデバイスに異常が発生していると判定された場合に、抽出したノードと接続している有向エッジの抽出及び抽出した有向エッジと接続しているノードの抽出を行い、抽出したノードが表しているデバイスに異常が発生していると判定された場合に、更に、抽出したノードと接続している有向エッジの抽出及び抽出した有向エッジと接続しているノードの抽出を繰り返すグラフ解析部と、前記障害発生デバイスノードと、異常が発生していると判定されたデバイスを表すノードとを、他のノードから区別して前記有閉路有向グラフにおいて表示する表示部とを有することを特徴とする請求項1~12のいずれかに記載の情報処理装置。コンピュータが、複数のデバイスが記述されるとともにデバイス間の依存関係が記述され、前記複数のデバイスの記述とデバイス間の依存関係の記述により前記複数のデバイスに対する制御アルゴリズムが定義される制御プログラムから、各デバイスの記述を抽出するデバイス抽出ステップと、前記コンピュータが、前記制御プログラムから、デバイス間の依存関係の記述を抽出する依存関係抽出ステップと、前記コンピュータが、前記デバイス抽出ステップにより抽出されたデバイスの記述と前記依存関係抽出ステップにより抽出されたデバイス間の依存関係の記述とに基づき、ノードがデバイスを表し、有向エッジがデバイス間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表す有閉路有向グラフを生成するグラフ生成ステップとを有することを特徴とする情報処理方法。複数のデバイスが記述されるとともにデバイス間の依存関係が記述され、前記複数のデバイスの記述とデバイス間の依存関係の記述により前記複数のデバイスに対する制御アルゴリズムが定義される制御プログラムから、各デバイスの記述を抽出するデバイス抽出ステップと、前記制御プログラムから、デバイス間の依存関係の記述を抽出する依存関係抽出ステップと、前記デバイス抽出ステップにより抽出されたデバイスの記述と前記依存関係抽出ステップにより抽出されたデバイス間の依存関係の記述とに基づき、ノードがデバイスを表し、有向エッジがデバイス間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表す有閉路有向グラフを生成するグラフ生成ステップとをコンピュータに実行させることを特徴とするプログラム。上述したように、制御プログラムはその性質上、実機システム内で稼働中の機械語レベルのコードをマスタプログラムと考えることが多い。またそれらの機械語レベルの中間コードと整合性のとれた、より可読性の高い上級言語プログラムや内部仕様書がユーザの元に存在するとは限らない。このことからFAPAシステムを対象とする場合、その制御プログラムはLDやIL言語で記述されていることを前提とする必要がある。しかし一方で、LDやILなどの機械語レベルのコードをプログラミングすることや、これらのコードのみを使用してデバッグや障害発生時の原因究明を短時間で行うには、熟練した技術が必要である。つまり、FAPAシステムの課題としてLDやIL言語などの機械語レベルの言語をターゲットとしながら、それを熟練者でないユーザでも短時間でデバッグや障害要因の究明を行えるようにするという課題がある。本発明は、このような課題を解決することを主な目的としており、制御プログラムで定義されている制御アルゴリズムを理解しやすい形式で可視化するグラフを生成することを主な目的とする。本発明に係る情報処理装置は、複数のデバイスが記述されるとともにデバイス間の依存関係が記述され、前記複数のデバイスの記述とデバイス間の依存関係の記述により前記複数のデバイスに対する制御アルゴリズムが定義される制御プログラムから、各デバイスの記述を抽出するデバイス抽出部と、前記制御プログラムから、デバイス間の依存関係の記述を抽出する依存関係抽出部と、前記デバイス抽出部により抽出されたデバイスの記述と前記依存関係抽出部により抽出されたデバイス間の依存関係の記述とに基づき、ノードがデバイスを表し、有向エッジがデバイス間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表す有閉路有向グラフを生成するグラフ生成部とを有することを特徴とする。本発明によれば、制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表す有閉路有向グラフを生成する。このため、制御プログラムで定義されている制御アルゴリズムを理解しやすい形式で可視化することができ、制御プログラムのデバッグ作業等を容易にすることができる。実施の形態1.≪概要≫まず、本実施の形態に係る情報処理装置の動作の概要を説明し、その後、構成例及び動作手順の詳細を説明する。本実施の形態に係る情報処理装置は、制御プログラムで制御される変数デバイスを抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、制御プログラムを有閉路有向グラフとしてみて、その構造を保持することで、制御プログラム設計時あるいは保守時に、ユーザ作業の効率化、作業の時間短縮を支援する。また、本実施の形態に係る情報処理装置は、例えば、制御プログラム設計時に制御プログラム内で使用されているデバイス間の関係を、GUIにて可視的に表示することや、制御プログラム保守時にGUIにて可視的に表示された依存関係グラフ上にて、デバイス値をモニタする、などの機能を持つ。ここでは、本実施の形態に係る情報処理装置が対象とする言語の1つとして、ラダーLD言語を説明するとともに、LD言語で記述された制御プログラムから有閉路有向グラフを生成する例を説明する。ラダーLD言語は電気回路をモデル化した言語である。LD言語では、左右の母線間をラング回路ブロックの単位で通常一つの意味のある処理が記述される。回路ブロックにはその処理に必要な変数デバイスが接点やコイルの形で登場する。したがって、LD言語はデバイス間の処理を列挙した処理志向型言語と考えることができる。なお、インストラクションリストIL言語についても、構成する命令は基本的にLD言語の要素と一対一に対応可能である。しかしながら、制御プログラムの目的は、物理的な機械の駆動や電子デバイスへの電圧付加など、実際の物理的なデバイスへの指示が基本である。例えば、ある生産ラインにおいて以下の仕様にて制御を行う必要があるとする。1センサAがONで、押しボタンB1押下時に、ベルトコンベアCのモータが正転する2センサAがONで、押しボタンB2押下時に、ベルトコンベアCのモータが逆転するこの制御プログラムを考えた場合、上記の1の文と2の文をそれぞれ記述するのがラダー言語処理指向型言語である。LD言語において1及び2の文処理が、それぞれラングで表現され、それぞれのラングには、以下のように、A、B1、C正転およびA、B2、C逆転の3つのデバイス間の関係が記述されることになる。センサA:ベルトコンベアCの正転逆転に影響を与える押しボタンB1:ベルトコンベアCの正転に影響を与える押しボタンB2:ベルトコンベアCの逆転に影響を与えるベルトコンベアC正転:センサA、押しボタンB1に影響を受けるベルトコンベアC逆転:センサA、押しボタンB2に影響を受ける上記のように、制御対象であるデバイス間の関係を表現するのが本実施の形態に係る表示形式の考え方であり、本実施の形態では、それを有閉路有向グラフ構造として保持する方法をとる。前述のとおり、FAPAシステムの制御プログラムはその目的が、具体的なデバイスを制御することである。LD言語やIL言語で記述される制御プログラムのほとんどは接点→コイルの組合せで記述され、その単位処理自体は単純なものである。またFAPAシステムの制御プログラムは、デバイスに対する操作として間接アドレシングポインタなどを使用することは少ない特徴もある。基本的に、物理的に実在する機器に対応するものとして各デバイスが定義されるため、デバイスをポインタやインデクスとして使用する例は多くない。本実施の形態の手法と類似した、一般的なプログラムの解析技術としてフローグラフがある。これは、前述したように、プログラムスライシング技術非特許文献1等で使用されるプログラム内の処理制御間の依存関係を有向グラフにて表したものである。フローグラフは一般的なプログラム全てに適用可能であり、本実施の形態に係る情報処理装置が対象とするFAPAシステムの制御プログラムに対しても定義可能である。しかし、フローグラフはプログラムの構造を抽象的に表現したものであって、個々のグラフ要素ノード、エッジが具体的な何かに対応するものではない。またフローグラフのノードは、それ自体が何らかの処理を内包しており、その処理自体の依存関係がエッジとして表現される。しかしFAPAシステムの制御プログラムは、通常プログラムの制御の構造が浅い。つまりIF文やループ文などの構造を持つことがほとんど無い。これはサイクリック演算によって繰返し実行されることにも起因している。本実施の形態では、処理間の依存関係を表現する理由が少なく、むしろ変数デバイスと処理を明確に分離した方が可視化の際にユーザに理解されやすいと考える。このように、フローグラフのようなノードとエッジの定義による可視化は、少なくともFAPAシステムの制御プログラムを対象とする場合には適していない。そもそも一般的なプログラムの場合は、使用される変数自体が抽象的なものであり、ポインタや配列などを頻繁に使用するため、その変数の実体メモリ領域が固定していないことが多い。このため、本実施の形態で開示するようなグラフ構造を構築するのは困難である。しかし、対象をFAPAシステムの制御プログラムに限定した場合は、より詳細なデバイス単位でのグラフ構築が可能になる。つまり、デバイスをノードとして表現することでそのイメージが固定され、表示される有閉路有向グラフは、実機システムを構成する要素群のイメージに近いものとなる。本実施の形態は、FAPAシステムの制御プログラムのこの特徴を拠りどころとしている。グラフ表示による可視化は、ユーザに対して制御プログラムの直感的な理解の手助けになると考える。本実施の形態は、制御プログラム内のデバイス間の関係を一度すべて解析し、有向グラフという形式で、直感的に分かりやすい形で可視化することを特徴としている。例えばLDやIL言語で使われる接点とコイルの関係A⇒B条件Aならば結果Bは、接点とコイルをノードとしたときに、有向エッジによって表す方法が最も簡単であり、これ以上簡略また有効な可視化方法はない。本実施の形態で開示する有閉路有向グラフは、FAPAシステムの制御プログラムの設計フェーズおよび保守フェーズにて有用である。前者については、対象となる制御プログラムの解析を行うことより、プログラムの構造化再利用化の支援となる。また後者については、グラフ上でモニタを行うことで、視覚的にデバッグ作業を実施することが可能となるほか、制御プログラム全体に対して問題箇所バグを最小の手順で見つけ出すことを容易にするため、障害発生時の早急な原因究明の支援となる。≪構成の説明≫以降に、図1を用いて、本実施の形態に係る情報処理装置100の構成例を説明する。図1において、制御プログラム中間コード記憶部101は、FAPAシステムの制御プログラムが格納されているメモリである。制御プログラム中間コード記憶部101で記憶されている制御プログラムのソースコードはどのような言語で記述されていても良い。なお、制御プログラム中間コード記憶部101で記憶されている制御プログラムの中間コードは、制御プログラム中間コード1010と表記する。この制御プログラム中間コード1010は、FAPAシステムのエンジニアリング開発環境により、ユーザのプログラミングによって作成されたソースコードをコンパイルした結果である。後述するように、この制御プログラムは作成中である場合と全て完成されている場合がある。通常この制御プログラム中間コード1010はエンジニアリング環境のコンパイル生成物であり、シーケンサ機器にダウンロードされる対象でもある。前述したように、制御プログラム中間コード1010には、複数のデバイスが記述されるとともにデバイス間の依存関係が記述され、複数のデバイスの記述とデバイス間の依存関係の記述により複数のデバイスに対する制御アルゴリズムが定義される。デバイス抽出部102は、制御プログラムの中で使用されているデバイスの記述を抽出する。抽出されるデバイスは、制御プログラムがLD言語の場合は接点デバイスやコイルデバイスであり、IL言語である場合はオペランドとして指定するソースデバイスやデスティネーションデバイスである。デバイス抽出部102で抽出されたデバイスは、ノード情報としてノード構造体記憶部104に格納される。デバイスの抽出は、例えば制御プログラムの設計段階においては、ユーザが制御プログラムを作成し、意味のある単位LD言語では例えばラングを作成するたびに抽出処理をおこなってもよいし、例えば実機システムの保守段階においては、障害が発生した段階で、稼働中の制御プログラム全体に対して一括して行ってもよい。依存関係抽出部103は、制御プログラムの中のデバイス間の依存関係の記述を抽出する。抽出される依存関係は、制御プログラムがLD言語の場合は、例えば接点で指定されたデバイスAとコイルで指定されたデバイスBの間の依存関係や、比較条件Cと演算対象Dの間の依存関係である。依存関係抽出部103で抽出された依存関係は、エッジ情報としてエッジ構造体記憶部105に格納される。依存関係の抽出は、例えば制御プログラムの設計段階においては、ユーザが制御プログラムを作成し、意味のある単位LD言語では例えばラングを作成するたびに抽出処理をおこなってもよいし、例えば実機システムの保守段階においては、障害が発生した段階で、稼働中の制御プログラム全体に対して一括して行ってもよい。ノード構造体記憶部104は、デバイス抽出部102によって抽出されたデバイスの情報を記憶しておく領域である。ノード構造体記憶部104で記憶される情報は、ノード構造体1040と表記する。ノード構造体1040では、デバイスに対して、デバイス名あるいは、ユーザによって命名されたラベル名が格納される。また、ノード構造体1040にはモニタを行うためのデバイスの現在値の格納エリアも設けてある。エッジ構造体記憶部105は、依存関係抽出部103によって抽出されたデバイス間の依存関係を記憶しておく領域である。デバイス間の依存関係はいくつか種別がある。LD言語を例に取ると例えば、A接点-コイルの関係D1⇒D2、B接点-コイルの関係D1⇒D2、演算式の関係D2=D11、条件式の関係IFD1>0THEND2=1などである。これらの例では全てデバイスD2はデバイスD1に依存している。依存関係抽出部103では、これらの依存関係の種別と、対象となる2つ以上のデバイスの組合せを抽出する。依存関係の種別はエッジ構造体1050として格納する。対象デバイスの組合せは、エッジ構造体1050もしくは、後述する接続情報1060として保存する。接続情報記憶部106は、デバイスを記憶しているノード構造体1040と、デバイス間の依存関係を記憶しているエッジ構造体1050の間の接続関係を保持しておく記憶領域である。接続情報記憶部106で記憶されている情報を接続情報1060と表記する。接続情報1060は、ノード構造体1040とエッジ構造体1050、つまり、デバイス抽出部102で抽出されたデバイスと依存関係抽出部103で抽出された依存関係を対応付ける情報である。グラフ生成部112は、デバイス抽出部102により抽出されたデバイスの記述と依存関係抽出部103により抽出されたデバイス間の依存関係の記述とに基づき、有閉路有向グラフを生成する。より具体的には、グラフ生成部112は、ノード構造体1040とエッジ構造体1050と接続情報1060を用い、接続情報1060に示されている対応付けに従って、ノード構造体1040のデバイスとエッジ構造体1050の依存関係を組み合わせて、有閉路有向グラフを生成する。有閉路有向グラフは、ノードがデバイスを表し、有向エッジがデバイス間の依存関係を表し、制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表すグラフである。有閉路有向グラフの例は、後述する。条件入力部107は、グラフ生成部112で生成された有閉路有向グラフに対して、グラフ内の要素を検索するための条件やフィルタリングするための条件をユーザがGUIを通して入力する手段である。例えばGUIによって表示されたグラフに対して、その任意のノードを指定することでノードが特定される。またはグラフに対して、任意の領域を選択することで、そのデバイス群が選択される。グラフ解析部108は、用途に応じて有閉路有向グラフをグラフ解析するエンジン部分である。例えば、条件入力部107で選択されたデバイス群が影響を与え得る範囲当該デバイス群から有向エッジを介して到達可能なノード全てを抽出することや、逆に条件入力部107で指定されたデバイスに影響を与え得る範囲当該デバイスから有向エッジを逆向きに介して到達可能なノードを段階的に抽出するなどを行う。また、グラフ全体のクラスタ性について計測を行い、制御プログラムのデバイス間の結合度合いを算出する、などを行う。グラフ解析部108は、一般的なグラフ解析ロジックを用いることもできる。結果出力部109は、グラフ全体や、グラフ解析部108によってフィルタリングされた部分グラフをGUIを通してユーザに表示する手段である。FAPAシステムの制御プログラムで用いられるデバイスの数や処理の数は膨大なものになりうるため、本実施の形態で開示している有閉路有向グラフも大規模なものになる可能性がある。このため、この結果出力部109にはグラフの拡大縮小表示機能や、選択デバイス/依存関係のみを表示する機能、あるいは選択されたデバイス群を縮約して、単一な仮想デバイスとして表示する機能などを持つことができる。結果出力部109の一部機能は、一般的な複雑グラフ表示技術やツールを用いることもできる。結果出力部109は表示部の例である。リンク管理部110は、制御プログラムのコードと、それを変換した有閉路有向グラフの要素ノード:デバイス、エッジ:ラングLDの場合を対応付ける手段である。リンク管理部110は、GUIを通してユーザに表示されるグラフと、元の制御プログラムコードを対応付けるために用いられる。例えばグラフのノードを選択すると、それに対応するデバイスが、元の制御プログラムコードの中から検索され、当該デバイスが使用されている全てのラングLDの場合が一覧表示される。またエッジを選択すると、それに対応するラングLDの場合が表示される。リンク管理部110は、これらの機能を実現するために使用される。リンク管理部110はプログラムコード抽出部の例である。オンラインモニタ部111は、実際のシーケンサ機器と通信を行って、デバイスの現在値を取得する手段である。ここで取得されたデバイス値は、グラフ表示を用いて現在値モニタを行う際に結果出力部109を介してGUI表示される。一般的なFAPAシステムのエンジニアリング開発環境は、既存のプログラミング言語エディタ上にてデバイスのオンラインモニタ機能を実現しているものが多い。したがって、オンラインモニタ部111は、このオンラインモニタ機能で使用しているデバイス値取得機能部分を流用してもよい。オンラインモニタ部111は計測値入力部の例である。≪動作の説明≫≪1.グラフの表示≫制御プログラム内で使用されているデバイス間の関係をGUIにて可視的に表示する手順について図2をもとに以下に述べる。まず、処理202にて、ユーザが制御プログラムを入力する。続いて、処理203にて、コンパイルを実行する。しかし、コンパイル可能な単位の入力が完了していない場合は、再び処理202に戻って、制御プログラムの入力を待つ。コンパイル可能な単位での入力が完了したら、コンパイル操作によって制御プログラム中間コード1010を作成する。ここまでの処理は一般的なFAPAシステムのエンジニアリング環境が持つ機能を流用することもできる。続いて、処理204にて、デバイス抽出部102が制御プログラム中間コード1010からデバイスの抽出を行う。これにより対象とする制御プログラムの全体あるいは部分で使用されるデバイスの一覧が取得できる。これらのデバイス情報はノード構造体1040としてノード構造体記憶部104に格納される。この際、デバイスに関する種々の情報例えばデバイス種別やラベル名なども格納する。同様に、処理205にて、依存関係抽出部103が制御プログラム中間コード1010から依存関係の抽出を行う。これにより対象とする制御プログラムの全体あるいは部分で処理されているデバイス間の依存関係が抽出される。これらの情報はエッジ構造体1050としてエッジ構造体記憶部105に格納される。エッジ構造体1050には後述するように、グラフ解析に利用するための、正論理/負論理の情報なども格納する。ここでもエッジに関する種々の情報例えばエッジのタイプなども格納する。同様に、処理206にて、依存関係抽出部103が制御プログラム中間コード1010とエッジ構造体1050から、接続情報1060を構築する。次に、処理207にて、ノード構造体1040とエッジ構造体1050の間の接続関係を表す接続情報1060およびそれにリンクしたノード構造体1040とエッジ構造体1050から、グラフ生成部112が有閉路有向グラフを生成し、結果出力部109が表示する。これらの処理を処理201と処理208間で繰り返す。このループは制御プログラムの作成が完了するまで繰り返される。上記の流れ以外にも、制御プログラムのコンパイルが完了したことをトリガとして、デバイスの抽出処理204を開始する方法を取ることもできる。また制御プログラムを保存したタイミング、シーケンサ機器へダウンロードしたタイミングをトリガとする方法もとることができる。また、処理203のコンパイル時に、前回のコンパイル結果との照合を行い、修正のあった箇所についてのみ処理204以降の処理を行うことで、差分描画処理を行うこともできる。≪2.対応制御部分プログラム表示≫GUIにて可視化されたグラフの要素ノード/エッジを選択することで、対応する元の制御プログラムの要素の検索結果を表示する手順について、図3をもとに以下に述べる。まず、処理301にて、グラフを構築する接続情報1060構築段階で、デバイス抽出部102及び依存関係抽出部103が、元の制御プログラムの各要素とグラフの要素ノード/エッジとのリンクを作成する。グラフのノードと元の制御プログラムのデバイス間のリンク情報はノード構造体1040に、構造体の要素として格納される。また、グラフのエッジと元の制御プログラムの処理LD言語であればラング間のリンク情報はエッジ構造体1050に、構造体の要素として格納される。これにより、表示されるグラフの各要素が元の制御プログラムの要素と関連づいた状態となる。処理302により、ユーザがGUIに表示されたグラフの要素を選択する。すると処理303において、グラフ解析部108により、そのグラフ要素がノードであるかエッジであるかが判別される。ノードである場合は処理304にて、リンク管理部110により、ノード構造体1040とそこからリンクを辿った先の制御プログラム中間コード1010から、該当ノードが表すデバイスを使用した全ての処理LD言語であればラングが検索される。エッジである場合は処理305にて、リンク管理部110により、エッジ構造体1050とそこからリンクを辿った先の制御プログラム中間コード1010から、該当エッジが表す処理LD言語であればラングが抽出される。最後に、処理306にて、結果出力部109により、処理304もしくは処理305で抽出した制御プログラム中間コード1010が表示される。この表示は、例えば、グラフと制御プログラム中間コード1010とを並べて表示することが考えられる。処理304および処理305によりグラフ上の対応要素が特定され、制御プログラム中間コード1010内の対応要素が特定された後は、一般的なエンジニアリング環境で実現されている検索結果表示機能を用いて、対応する制御プログラム検索結果表示処理306を行うこともできる。≪3.特定デバイス仕様出力≫GUIにて可視化されたグラフの特定ノードを選択することで、当該ノードの仕様を日本語自然言語の一例にて表示する手順について、図4をもとに以下に述べる。まず、処理401にて、ユーザによってGUIに表示されたグラフから、対象となるノードが選択される。次に、処理402にて、グラフ解析部108によるグラフ解析により、指定されたノードに至る全てのパスを構成するノード、エッジを含む部分グラフを抽出する。つまり、グラフ解析部108は、指定されたノードに影響を与える可能性のあるノードとエッジを全て抽出する。この処理は対象ノードから全ての有向エッジを逆向きに辿り、見つかったノードとエッジを部分グラフに追加していき、新しいノードが見つからなくなるまで続けることで実行可能である。これは一般的なグラフ解析ロジックを用いてもよい。処理403にて、グラフ解析部108は、作成した部分グラフ内で入出力デバイスを表現しているノードのみを抽出する。これは特定デバイスの仕様を出力する際に、実機システムとのインタフェースとしてユーザに分かりやすいデバイスを表示する意味がある。しかし、入出力デバイスに限定する必要はなく、内部デバイスに対しても実行してもよい。また、この処理を行うため、ノード構造体1040にはあらかじめ対応するデバイスの種別情報を格納しておく必要がある。入出力デバイスそれぞれについて処理を行うため、処理404から処理407でループ処理を行う。この内部では、処理405にて、グラフ解析部108は、対象となる入出力デバイスから出ている有向エッジについて日本語へ変換する。例えば、特定デバイスがモータC正転であり、対象となった入力デバイスのラベル名がセンサAであり、そこから出る有向エッジのタイプがA接点-コイルだとすると、モータC正転はセンサAに依存するという説明文が作成される。また、もう一つの入力デバイスのラベルが非常停止ボタンBであり、エッジのタイプがB接点-コイルだとすると、モータC正転は非常停止ボタンBに依存するという説明文が作成される。処理406にてこれらの説明文が、結果出力部109により、一文ずつユーザに提示される。処理405にて、入出力デバイスに隣接するエッジのみを考慮に入れているが、これは出力される仕様の文章を単純化するためである。より厳密に、入出力デバイスから特定デバイスに至るパスを有向エッジに沿った形で連ね、全て日本語化することも可能である。また、逆に、405の処理は割愛し、入出力デバイスのみを持って、簡単な仕様として表示する方法もある。この場合は入出力デバイスに隣接するエッジの情報は使用されず、一様に[入出力デバイス]に依存するという記述になる。≪4.影響範囲図示≫GUIにて可視化されたグラフの特定領域を選択することで、それらの範囲に変更を行った場合の、制御プログラムに与える影響範囲を図示する手順について、図5をもとに以下に述べる。まず、処理501にて、ユーザによってGUIに表示されたグラフから、対象となる領域部分グラフが選択される。次に、処理502にて、グラフ解析部108が、グラフ解析により、指定された領域に至る全てのパスを構成するノード、エッジを含む部分グラフを抽出する。この処理は対象領域内にある全てのノードについて、そのノードに隣接する有向エッジを逆向きに辿って、見つかったノードとエッジを部分グラフに追加していき、新しいノードが見つからなくなるまで続けることで実行可能である。この処理により、グラフ解析部108は、ユーザによって指定された対象領域内の要素指定要素に変更があった場合に当該変更の影響を受ける影響範囲を抽出することができる。なお、この影響範囲の抽出処理は、一般的なグラフ解析ロジックを用いてもよい。処理503にて、結果出力部109が、既に表示されている全体グラフの中で、作成した部分グラフについて強調表示等を行って、影響範囲が分かるようにする。なお、ここでは、結果をグラフ上に図示する例のみを載せているが、制御プログラム中間コード内の処理LD言語ではラングを表示する方法も取ることができる。≪5.未使用箇所検出≫GUIにて可視化されたグラフ上で、制御プログラム内のどの出力デバイスにも影響を与えないデバイス群未使用デバイス群を図示する手順について、図6をもとに以下に述べる。まず処理601から処理603にて、全ての出力デバイスについて繰り返す。処理602にて、グラフ解析部108が、グラフ解析により、出力デバイスへ至る全てのパスを構成するノード、エッジを含む部分グラフを抽出する。この処理は出力デバイスを表すノードについて、そのノードに隣接する有向エッジを逆向きに辿って、見つかったノードとエッジを部分グラフに追加していき、新しいノードが見つからなくなるまで続けることで実行可能である。これは一般的なグラフ解析ロジックを用いてもよい。また、この部分は前述した影響範囲図示と同じアルゴリズムを流用することもできる。また出力デバイス以外にも外部システムとのインタフェースとなるデバイスが存在する可能性がある。これらについて、ユーザが任意にデバイス群を指定する、あるいはデバイス種別を選択することができても良い。処理604にて、グラフ解析部108は、既に表示されている全体グラフの中から、処理603にて抽出した部分グラフに含まれない、全てのノード未使用デバイスとエッジを抜き出す。また未使用デバイスのみを一覧表示するため、ここで抜き出す要素をノードのみに限っても良い。そして、処理605にて、結果出力部109が、これらの部分グラフ群を強調表示する。なお、ここでは、結果をグラフ上に図示する例のみを載せているが、制御プログラム中間コード内の処理LD言語ではラングを表示する方法も取ることができる。≪6.循環定義検出≫GUIにて可視化されたグラフ上で、制御プログラム内でソフトウェアによるチャタリング特定のデバイスがサイクリック時間の定数倍ごとにONとOFFを繰り返す現象を起こす危険性のあるデバイスの組合せを検出する手順について、図7をもとに以下に述べる。この現象は通常、本実施の形態で開示している有向グラフ表現において、循環エッジの向きを考慮した閉路があり、その循環のパス上で奇数回の負論理回路が存在するときに発生する可能性がある。ただし、タイマデバイスやカウンタデバイスなど、条件が満たされてからコイルがONとなるまでに遅延があるものは対象外とする。まず、処理701にて、グラフ解析部108は、任意のビットデバイスを開始地点として対象ノードとする。上記したように、対象ノードにはタイマやカウンタなど、状態を持つことで条件ONからコイルONまでに時間的遅延が発生するものは対象としない。次にグラフ内のノードを探索するため、処理702および処理703から処理708にて、グラフ解析部108はグラフ内の探索を行う。ここでの目的は、タイマやカウンタを含まず、負論理が奇数回登場する循環定義を検出するため、処理704にて負論理に相当するエッジ処理の数をカウントする。この時に必要となるそのエッジが負論理であるかどうかの情報は、先に述べた依存関係の抽出処理205にて、エッジ構造体1050内に格納しておく。次に、グラフ解析部108は、探索中に経由するノードについて、処理705にて、カウンタやタイマにたどり着いたかどうかチェックを行う。カウンタやタイマを経由する場合は、循環定義として抽出しないサイクリック時間とは異なったユーザ定義値を基準にしてデバイスのON/OFFが切り替わるため、正常な動作と考えられるため。しかし、実装する機能としては、ユーザへ循環定義抽出結果にカウンタやタイマを含むことを知らせた上で、条件分岐処理705を除くこともできる。次に処理706にて、グラフ解析部108は、循環を形成するかどうかチェックを行う。現時点までの探索経路内に訪れたノードに至った場合は循環閉路が存在することになるため、処理707にてその循環パスを記録する。最後に、グラフ解析部108は、処理709にて、記録した循環パスの負論理の数が奇数のものについて、循環定義によってソフトウェアによるチャタリングが発生する危険性がある循環定義として抽出する。そして、処理710において、結果出力部109が、該当するパスを図示する。図7は対象とする制御プログラムおよびそれを表現しているグラフが連結していることを前提としている。制御プログラムがいくつかの独立した部分グラフから構成される場合は、それぞれ独立した部分グラフ内で、処理701によって一つの開始ノードを選択する必要がある。なお、処理702から処理708までに記述したグラフ内の探索手順は一例であり、その他のグラフ解析アルゴリズムを用いてもよい。≪7.デバイス値モニタ≫GUIにて可視化されたグラフ上で、ユーザが現在値モニタを行いたいデバイス群を指定し、シーケンサ機器、あるいは制御プログラムシミュレータと接続時に、それらのデバイスの現在値をモニタする手順について、図8をもとに以下に述べる。まず、処理801にて、GUIにて可視化されたグラフ上で、ユーザがモニタを行いたい任意のデバイス群を選択する。ただし、制御プログラム内の全てのデバイス、あるいは画面表示された全てのデバイスを対象とする場合は、ユーザからの指定は不要である。次に、選択されたデバイスについて、処理802から処理805までを繰り返す。処理803では、オンラインモニタ部111が、対象デバイスそれぞれについて、シーケンサ機器または制御プログラムシミュレータから、対応するデバイスの現在値を取得してノード構造体1040へ格納する。続いて処理804にて、結果出力部109が、グラフのノード上にテキストとして、あるいはノードの形状変更、あるいはノードの色変更等によって、ノードが表現するデバイスの現在値を表示する。なお、モニタを定期的に行う場合は、例えば1秒毎に処理802から処理805までの処理を繰り返すことで実現が可能である。また、シーケンサ機器や制御プログラムシミュレータから、デバイスの現在値だけでなく、制御プログラム内のどの処理が実行されたのかが取得可能であれば、オンラインモニタ部111が、エッジ構造体1050に処理実行中フラグを設定/解除することによりグラフ上に表示することもできる。≪8.障害要因の図示≫実機システムあるいは制御プログラムシミュレータ上にて、障害が発生した場合、その要因となる制御プログラム上のバグを特定するため、GUIにて可視化されたグラフ上で、ユーザにより障害が顕在化しているデバイス、また完全に正常に動作しているデバイスを特定することで、障害の要因となるデバイスあるいは処理を図示する手順について、図9をもとに以下に述べる。まず、処理901にて、グラフ解析部108が、初期処理として要因領域を空に設定する。要因領域は、障害の要因の候補としてグラフ上に示す要素を格納する領域である。以降処理902から処理909までは、ユーザが障害要因を特定するまで繰返し実行する。処理903にて、ユーザは障害が発生した時に、その現象が直接現れたデバイス、あるいは確実に異常な振舞いをしているデバイスを指定し、それが異常デバイスであることを入力する。グラフ解析部108は、処理904にて、全体グラフから、ユーザが指定したデバイスのノード異常発生デバイスノードに至るパス全てをマージした部分グラフを抽出する。つまり、グラフ解析部108は、異常発生デバイスノードと接続している有向エッジを有閉路有向グラフから抽出するとともに、抽出した有向エッジと接続しているノードデバイスを抽出する。この処理は前述した502の処理と同じである。次に、処理905にて、グラフ解析部108は、抽出したデバイスの正常/異常をチェックする。デバイスごとの正常/異常は、ユーザが指定する。ユーザから正常と指定されたデバイスについては、処理906にて、現時点の要因領域から、抽出した部分グラフを削除する正常と指定されたデバイスのノードと当該ノードに接続しているエッジを要因領域に含めない。これは障害要因が含まれる可能性がある要因領域のうち、全ての条件において完全に正常であると判断されたデバイスに影響を与える領域については、要因領域から除くことができるためである。反対に、ユーザから異常と指定されたデバイスについては、処理907にて、現時点の要因領域に抽出した部分グラフを追加する異常と指定されたデバイスのノードと当該ノードに接続しているエッジを要因領域に含める。これは障害要因が含まれる可能性がある要因領域が拡大するためである。ここでは障害要因が1つであるとは限らないため、907の処理において抽出した部分グラフとその時点の要因領域のANDを取ることはしていない。次に、処理908にて、結果出力部109が、その時点での要因領域をグラフ上に強調表示する。これにより障害の要因と考えられるデバイスおよび処理を絞り込むことが可能となる。また、処理907にて部分グラフとその時点の要因領域のAND領域に相当する部分について、色変更や形状変更などにより要因領域全体と区別して表示することも可能である。これにより、より要因が存在する可能性が高い領域を絞り込むことが可能である。実施の形態2.≪グラフ表示の例≫ここでは、LD言語で記述されたFAシステム用の制御プログラムがどのように有閉路有向グラフへ変換され、それが表示されるのかについて、具体例をもって説明する。図10は、FAシステム用の制御プログラムの例であり、LD言語により記述されている。この制御プログラムは次のような仕様で動作する。なお、図18は、図10の制御プログラムをIL言語で記述したものである。a入力開始ボタンを押下すると出力ランプが点灯する。b出力ランプは3秒間点灯する。c3回実行すると、入力開始ボタンには反応しなくなる。d入力リセットボタンを押下するとデバイス値をリセットして最初の状態へ戻る。e入力開始ボタンは押し続ける必要はなく、内部デバイスは自己保持する。以下にLDプログラムを示した図10について説明する。1000は上記した1から5の仕様を満たす制御プログラムの例である。まず、最初のラング回路ブロックにて内部デバイスのコイル1004の定義を行っている。内部デバイス1004は、出力ランプを直接定義するための中間的なデバイスである。上記仕様のaにあるように、内部デバイス1004は、入力開始ボタンの押下によってONするため、入力開始ボタンのA接点1001が条件となる。次に、仕様cにあるように、ボタン押下を3回行って3回実行が完了したとき、またdにあるように入力リセットボタン押下されたときは、内部デバイスのコイル1004がOFFとなることを実現するため、カウンタ1002のB接点1002と、入力リセットボタンのB接点1003をそれぞれAND条件とする。eにあるように、内部デバイスは自己保持するため、入力開始ボタンとOR条件で内部デバイスのA接点1005を付け、ただしこの自己保持はbの仕様から3秒間のみ継続するため、タイマのB接点1006をAND条件として付ける。次に、タイマのコイル1008と出力ランプコイル1009の定義を行っている。これらのコイルは何れも内部デバイスから直接定義されるため、内部デバイスのA接点1007のみを条件とする。タイマのコイル1008は、内部デバイス1007がONになった状態で3秒間経過するとONする。つまり3秒経過した時点でタイマのB接点1006がOFFとなる。次にカウンタのコイル1012の定義を行う。仕様cより、カウンタは入力開始ボタンを3回押下し、処理が完了したときにカウントアップする必要がある。このため、タイマのタイムアップタイミングつまりタイマのA接点1011をカウンタの条件としている。カウンタ1012は、タイマのA接点1011が3回OFFからONになったタイミングでONする。最後のラングでは入力リセットボタン1013を実現している。仕様dを実現するため、入力リセットボタンのA接点1013がONしたタイミングで、カウントアップしているカウンタを0にリセットするため、RESET命令1014を使用している。以上のような制御プログラム1000がシステム内の制御プログラム中間コード1010として格納されている場合の、グラフ表示が行われる流れについて、グラフ表示のフロー200の中の処理204から具体的に説明する。まず、デバイス抽出部102が、デバイスの抽出処理204を行う。これは制御プログラムをスキャンして、使用しているデバイスを抽出することで実現する。制御プログラム1000の例では、ノード構造体1040として、デバイス一覧1200図12が抽出される。ノード構造体例1200のデバイスラベル名欄には制御プログラムで通常そのデバイスを特定する名称が登録されるが、ここにはデバイスIDやラベルIDや変数名など、デバイスを一意に特定できるものであればなにを登録しても良い。また、デバイス種別欄には対象とするシーケンサ機器や制御プログラムで使用できるデバイス種別が格納される。次に、依存関係抽出部103が、依存関係の抽出処理205を行う。これは制御プログラムをスキャンして、各ラングの条件⇒コイルの関係を抽出することで実現する。制御プログラム1000の例では、エッジ構造体1050として、依存関係一覧1300図13が抽出される。エッジ構造体例1300のエッジタイプには、そのエッジが表している制御プログラムの処理のタイプが登録される。例えば制御プログラム1000の最後のラングに注目する。このラングでは入力リセットボタンのA接点1013と、カウンタのRESET1014との間に依存関係が存在している。この部分をIL言語で表現すると以下のようになる。なお制御プログラム1000をIL言語で表現した例を図18に載せる。前述のとおり、一般的にLD言語のプログラム要素とIL言語のプログラム要素は一対一に対応させることができる。LOAD入力リセットボタン―――1013RESETカウンタ――――――――――1014エッジ構造体1300の例では、このIL言語の命令を組み合わせてエッジタイプとしている。上記の例はエッジ構造体1300の番号9に表されているLOAD-RESETがエッジタイプとなる。このエッジタイプにより、2デバイス間の依存関係の概略を表現することが可能となる。次に論理の欄は、エッジによって接続される2デバイス間の論理正論理/負論理を登録する。ここでいう論理とは、有向エッジによって表現される処理が、デバイスのON/OFFを逆転させるかどうかを表している。このためデバイス種別がビットでない場合ワードである場合は無効となる。次に、依存関係抽出部103が、接続情報の構築処理206を行う。これは処理204と処理205で作成したノード構造体1200とエッジ構造体1300の間をリンク付けする処理である。制御プログラム1000の例では、接続情報1400図14が構築される。接続情報1400のエッジ欄は接続関係を表現しているエッジ構造体1300内のエッジの番号を示している。同様に元ノード欄と先ノード欄は、ノード構造体1200内のノードの番号を示している。接続情報で表現されているエッジは必ず有向グラフであるため、元ノード欄と先ノード欄に分けて設定される。なお、通常エッジ構造体1300の番号欄と接続情報1400のエッジ欄は一対一に対応するため、エッジ構造体1300と接続情報1400は同一の表として実現してもよい。最後に、グラフ生成部112が有閉路有向グラフの生成描画処理207を行う。上述した処理205までの処理によってグラフ描画のための情報であるノード構造体1200、エッジ構造体1300、接続情報1400は全て作成されている。このため、グラフ生成部112は、接続情報1400に示されている対応付けに従って、ノード構造体1200のデバイスとエッジ構造体1300の依存関係を組み合わせて、有閉路有向グラフの生成描画を行う。図11は、制御プログラム1000を、本実施の形態に係るグラフ表示方法によって表示した例を模式的に表したものである。入力デバイスと出力デバイスは矩形、内部のデバイスは円で示している。また、正論理の処理は実線、負論理の処理は破線で示している。また、図11のノード内の1~6は、ノード構造体1200図12に示されている番号を表し、エッジ近傍の1~9は、エッジ構造体1300図13に示されている番号を表している。ここでは、グラフを構成する要素であるノードとエッジを描画する手順について説明する。例えばノードデバイスの種別毎に画面上で分類をして表示を行いたければ、ノード構造体1200内のデバイス種別の同じものを集めて画面上へノードを表示する。ノード構造体1200のデバイス種別から、入力のデバイスを取得すると、ビット入力であるものは入力開始ボタン1101と入力リセットボタン1102となる。同様にノード構造体1200のデバイス種別から、内部のデバイスを取得すると、タイマカウンタビット内部であるものは、内部デバイス1103とタイマ1104とカウンタ1105となる。次に、ノード構造体1200のデバイス種別から、出力のデバイスを取得すると、ビット出力であるものは、出力ランプ1106となる。次に、接続情報1400の表の元ノード欄と先ノード欄をチェックして、エッジ番号およびエッジ構造体1300のエッジタイプや論理を取得する。これにより、グラフとして表示されるノード間がどのようなエッジで接続されているのかを知り、そのエッジタイプや論理によってエッジの線種などを変更する。前述のように図11の例では、エッジ構造体1300の論理欄から、その処理エッジが正論理の場合は実線、負論理の場合は破線で示している。接続情報1400の一行目を見ると、元ノード番号が1、先ノード番号が2でエッジ番号が1であるため、入力開始ボタン1101と内部デバイス1103の間にエッジが存在し、そのエッジはエッジタイプがLOAD-OUTであり、正論理であることが分かる。したがって、画面にはグラフとして入力開始ボタン1101と内部デバイス1103の間に、有向エッジとして実線のエッジ1110を描画する。さらに、例えば接続情報1400の2行目にあるように、自分自身のノードへのエッジの場合は、ループの形でエッジ1113を表示する。このように、エッジ構造体1300および接続情報1400内の、エッジ番号1は実線エッジ1110、番号2は実線ループエッジ1113、番号3は破線エッジ1116、番号4は破線エッジ1118、番号5は破線エッジ1111、番号6は実線エッジ1115、番号7は実線エッジ1114、番号8は実線エッジ1117、番号9は破線エッジ1112、にそれぞれ対応する。このようにして、制御プログラム1000は、図11に示すようなグラフ表示が可能となる。制御プログラム1000から自動的に図11のグラフ表示を行うため、図11のグラフのノードの配置アルゴリズムについては、さまざまな方法をとることができる。上述したように、ノードの同一な種別を同一領域にまとめて配置する方法や、ノードとして表されたデバイスの番号順や名称順に並べる方法、さらにノードの次数ノードから出入りするエッジの数の多い順などが考えられる。また、エッジによって接続された2つのノードをより近くに表示させる方法などもある。これらのノードおよびエッジの配置方法については一般的な複雑グラフ表示アルゴリズムを用いることもできる。また、グラフは2次元平面上だけでなく、3次元空間上に表示させることもできる。さらに一度表示されたノードおよびエッジはその位置をユーザが自由に変更させることができる。この場合、一般的なグラフ描画ツールに搭載される機能と同じように、ノードやエッジをマウスによるドラッグドロップなどの方法で、ユーザの好みの配置へ変更することができる。実施の形態3.≪影響範囲図示の例≫図15は、ある制御プログラムをグラフ表示した例である。この制御プログラムは入力ビットデバイスが1501、1502の2つ、内部ビットデバイスが1503、1504、1505の3つ、出力ビットデバイスが1506、1507、1508の3つから成っている。実線のエッジは、エッジが表す処理が正論理であることを示し、破線のエッジはエッジが表す処理が負論理であることを示している。このグラフを使用して、影響範囲図示の例について以下に説明する。影響範囲図示のフローを示した図5を参照すると、まずユーザによって対象領域の選択処理501が行われる。ここでの例では、ユーザによって出力1のノード1506が選択されたとする。次の502の処理にて、グラフ解析部108が、対象領域に至る全てのノードを列挙する。図15の例の場合、まず対象領域であるノード1506に至る隣り合った有向エッジは、エッジ1515のみであるため、まずパスとしてこれを加える。次に、エッジ1515の元ノード1503に注目する。このノードへ至る隣り合った有向エッジは、エッジ1514とエッジ1510であるため、パスとしてこれを加える。このときエッジ1514はノード1503へ戻るループであるため、こちらのパスはここで探索を終える。もう片方のエッジ1510の元ノード1501に注目する。このノード1501については、このノードへ至る隣り合った有向エッジが存在しないため、ここで探索を終える。この結果、503の処理において強調表示される部分は、図16に示す領域となる。つまり出力1のノード1606を対象とした場合、このノードに影響を与える範囲としては、図16内の黒塗り及び太線で示した部分、つまり処理1615と、内部1デバイス1603と、処理1614と、処理1610と、入力デバイス1601となる。このように、影響範囲図示のフローの502の処理は、グラフについて、有向エッジを逆向きに辿る探索を行うことで全てのパスを抽出することができる。この際の探索方法は、一般的なグラフ探索アルゴリズムを用いることができる。探索方法は深さ優先探索でも幅優先探索でもかまわない。ただし、グラフが有閉路グラフであるため、既に訪れたノードを記憶しておくこと、また有向グラフであるため、エッジの向きを逆向きに探索するという制約がある。≪循環定義検出の例≫同様に図15のグラフを使用して、循環定義検出の例について以下に説明する。循環定義検出のフローを示した図7を参照すると、まず処理701にて、任意のビットデバイスを対象ノードとする。ここでは例として、入力1のノード1501を選択する。次に、処理702にて、グラフ解析部108が、対象ノードから出ているエッジを選択する。図15の例では、エッジ1510とエッジ1511が対象となる。ここから処理703にてグラフ内探索を開始する。ループ内では処理704によりエッジの論理をチェックする。エッジ1510とエッジ1511は両方とも正論理であるため、カウントアップは行わない。そして、処理705により、グラフ解析部108は、次に至るノードがカウンタやタイマであるかどうかを判断する。エッジ1510によって至るノードである内部1ノード1503と、エッジ1511によって至るノードである内部2ノード1504は、両方ともカウンタやタイマではないため、そのまま処理706の処理に移る。次の処理706において、この時点で既に経由したノードとして記憶されているのは、最初に選択した入力1ノードのみであるため、ここで至った内部1ノード1503と内部2ノード1504と異なり、条件706には合致しない。このため、処理704へ戻る。次に、内部1ノード1503に注目し、このノードから出ているエッジ1514とエッジ1515について判断する。エッジ1514は正論理であるため、処理705にてカウントアップは行わないが、エッジ1514はループエッジであるため、条件706に合致する。そして、処理707にて、循環定義としてそのパスと負論理のカウント値の組内部1ノード1503、エッジ1514、カウント0が保存される。内部1ノード1503から出ているエッジ1515の方は、そのまま出力1ノード1506へ至り、ノード1506から出ているエッジは存在しないため、ここでこの枝の探索は終了する。次に、内部2ノード1504を対象として、同様にグラフ探索を続ける。すると内部2ノード1504、エッジ1517、内部3ノード1505、エッジ1518、出力3ノード1508、エッジ1519、カウント1と、閉路が存在することが分かる。なおかつこの閉路を構成する3つのエッジのうち、エッジ1519のみが負論理の処理を表している。この結果、処理709において、この閉路は循環定義パスのうち負論理が奇数のものに該当する。なお、先に抽出した内部1ノード1503、エッジ1514、カウント0はカウントが偶数であるため、対象からは外れる。したがって、処理710にて、図17に示すように循環定義内部2ノード1704、エッジ1717、内部3ノード1705、エッジ1718、出力3ノード1708、エッジ1719、カウント1が抽出できる。よって、この図15または図17で表される制御プログラムにおいて、3つのデバイス、内部1、内部2および出力3は、ソフトウェアによるチャタリングを起こす危険性があるということが分かる。≪実施の形態における効果≫実施の形態1~3で開示する方法によれば、制御プログラムで制御される変数デバイスを抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、制御プログラムを有閉路有向グラフとして制御プログラム内で使用されているデバイス間の関係を、GUIにて可視的に表示することが可能となる。グラフ表示内の特定のノード、つまりデバイスに注目した場合には、制御プログラムによって、そのデバイスによって引き起こされる全ての操作が、そのノードから出ているエッジとして表現されており、またそのデバイスへ影響を与える全ての操作が、そのノードへ入っているエッジとして表現されることになる。このため、制御プログラムのグラフ表示を確認させることで、LD言語やIL言語の熟練者でない作業者に対しても、デバイスを中心とした制御プログラムの理解支援が可能となる。また、制御プログラムを有閉路有向グラフとして表示し、可視化された表示の一部分を指定することで、指定するデバイス群に対して変更を行った場合の影響範囲について図示することが可能となる。この結果、例えば制御プログラムが動作するFAPAシステムにおける障害発生時に、LD言語やIL言語のみを用いて障害の原因究明を行うよりも短時間で、その要因発見を支援することができる。また、制御プログラムを有閉路有向グラフとしてデータ構造に保持することにより、ソフトウェアによるチャタリングなどのプログラム上の潜在バグについて確認することが可能となるため、制御プログラムの設計時に、シミュレータや実際のFAPAシステムと接続して判明するような潜在バグや不安定な動作の危険性を、プログラムの静的チェックで知ることが可能となる。この結果、制御プログラムの設計フェーズにおける手戻り工数の削減を助けることが可能となる。以上の実施の形態1~3では、制御プログラムで制御される変数デバイスを抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、制御プログラムを有閉路有向グラフとしてデータ構造に保持することで、制御プログラム設計時に以下の支援を行うシステムを説明した。1制御プログラム内で使用されているデバイス間の関係を、GUIにて可視的に表示する2可視化された表示の部分を指定することで、対応する元の制御プログラムの部分を表示する3特定のデバイスについて、他デバイスとの関係を表す仕様を文章で表示する4指定するデバイス群に対して変更を行った場合の影響範囲について図示する5制御プログラム内に登場する、未使用デバイスについて指摘する6ソフトウェアによるチャタリングなどのプログラム上の潜在バグについて指摘する7複数箇所で登場する同一構造を可視化することで、ソフトウェア部品の再利用を支援する8デバイス群の疎結合部分を見つけ出すことで、制御プログラムの分割について支援する9有閉路有向グラフを解析し、制御プログラムのデバイス間の結合度合いの指標を示す。また、実施の形態1~3では、制御プログラムで制御される変数デバイスを抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、制御プログラムを有閉路有向グラフとしてデータ構造に保持することで、制御プログラム保守時に以下の支援を行うシステムを説明した。10GUIにて可視的に表示された依存関係上にて、デバイス値をモニタする11障害が現れたデバイス群を指定することで、その要因となりうる箇所を図示する。また、上記を実現するための以下の構成も説明した。1制御プログラムで使用されているデバイスをノードとして抽出するデバイス抽出部2記述されたデバイス間の依存関係処理をエッジとして抽出する依存関係抽出部3解析条件および障害状況を入力する条件入力部4有閉路有向グラフの構造を解析するグラフ解析部5解析結果を出力する結果出力部6制御プログラムと有閉路有向グラフの部分の対応関係を管理するリンク管理部7実機器との通信によって、デバイスの現在値を取得するオンラインモニタ部。更に、上記のグラフ構築部にて構築される有閉路有向グラフをシステム内のメモリに保持するための以下の特徴を持つデータ構造を説明した。1デバイスラベルをノード構造体として表現2処理を、元の制御プログラムの処理位置へのリンク情報を持つエッジ構造体として表現3ノード構造体とエッジ構造体を接続するトポロジ情報。また、ネットワーク上の制御機器上などに格納された、複数に分割された制御プログラムについて、その制御プログラム間の共通デバイス設定を参照することで、複数の制御プログラムをシームレスに一つの有閉路有向グラフとして扱うシステムと構成と手順についても説明した。≪ハードウェア構成例≫最後に、実施の形態1~3に示した情報処理装置100のハードウェア構成例について説明する。図19は、実施の形態1~3に示す情報処理装置100のハードウェア資源の一例を示す図である。なお、図19の構成は、あくまでも情報処理装置100のハードウェア構成の一例を示すものであり、情報処理装置100のハードウェア構成は図19に記載の構成に限らず、他の構成であってもよい。図19において、情報処理装置100は、プログラムを実行するCPU911CentralProcessingUnit、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいうを備えている。CPU911は、バス912を介して、例えば、ROMReadOnlyMemory913、RAMRandomAccessMemory914、通信ボード915、表示装置901、キーボード902、マウス903、磁気ディスク装置920と接続され、これらのハードウェアデバイスを制御する。更に、CPU911は、FDD904FlexibleDiskDrive、コンパクトディスク装置905CDD、プリンタ装置906、スキャナ装置907と接続していてもよい。また、磁気ディスク装置920の代わりに、SSDSolidStateDrive、光ディスク装置、メモリカード登録商標読み書き装置などの記憶装置でもよい。RAM914は、揮発性メモリの一例である。ROM913、FDD904、CDD905、磁気ディスク装置920の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。実施の形態1~3で説明した~記憶部は、RAM914、磁気ディスク装置920等により実現される。通信ボード915、キーボード902、マウス903、スキャナ装置907などは、入力装置の一例である。また、通信ボード915、表示装置901、プリンタ装置906などは、出力装置の一例である。通信ボード915は、ネットワークに接続されている。例えば、通信ボード915は、LANローカルエリアネットワーク、インターネット、WANワイドエリアネットワーク、SANストレージエリアネットワークなどに接続される。磁気ディスク装置920には、オペレーティングシステム921OS、ウィンドウシステム922、プログラム群923、ファイル群924が記憶されている。プログラム群923のプログラムは、CPU911がオペレーティングシステム921、ウィンドウシステム922を利用しながら実行する。また、RAM914には、CPU911に実行させるオペレーティングシステム921のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。また、RAM914には、CPU911による処理に必要な各種データが格納される。また、ROM913には、BIOSBasicInputOutputSystemプログラムが格納され、磁気ディスク装置920にはブートプログラムが格納されている。情報処理装置100の起動時には、ROM913のBIOSプログラム及び磁気ディスク装置920のブートプログラムが実行され、BIOSプログラム及びブートプログラムによりオペレーティングシステム921が起動される。上記プログラム群923には、実施の形態1~3の説明において~部~記憶部以外、以下同様として説明している機能を実行するプログラムが記憶されている。プログラムは、CPU911により読み出され実行される。ファイル群924には、実施の形態1~3の説明において、~の抽出、~の生成、~の構築、~の選択、~の変換、~の設定、~の登録、~の取得、~の入力、~の出力等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、~ファイルや~データベースの各項目として記憶されている。~ファイルや~データベースは、ディスクやメモリなどの記録媒体に記憶される。ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してCPU911によりメインメモリやキャッシュメモリに読み出される。そして、読み出された情報やデータや信号値や変数値やパラメータは、抽出検索参照比較演算計算処理編集出力印刷表示などのCPUの動作に用いられる。抽出検索参照比較演算計算処理編集出力印刷表示のCPUの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。また、実施の形態1~3で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示す。データや信号値は、RAM914のメモリ、FDD904のフレキシブルディスク、CDD905のコンパクトディスク、磁気ディスク装置920の磁気ディスク、その他光ディスク、ミニディスク、DVD等の記録媒体に記録される。また、データや信号は、バス912や信号線やケーブルその他の伝送媒体によりオンライン伝送される。また、実施の形態1~3の説明において~部として説明しているものは、~回路、~装置、~機器であってもよく、また、~ステップ、~手順、~処理であってもよい。すなわち、実施の形態1~3で説明したフローチャートに示すステップ、手順、処理により、本発明に係る情報処理方法を実現することができる。また、~部として説明しているものは、ROM913に記憶されたファームウェアで実現されていても構わない。或いは、ソフトウェアのみ、或いは、素子デバイス基板配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ミニディスク、DVD等の記録媒体に記憶される。プログラムはCPU911により読み出され、CPU911により実行される。すなわち、プログラムは、実施の形態1~3の~部としてコンピュータを機能させるものである。あるいは、実施の形態1~3の~部の手順や方法をコンピュータに実行させるものである。このように、実施の形態1~3に示す情報処理装置100は、処理装置たるCPU、記憶装置たるメモリ、磁気ディスク等、入力装置たるキーボード、マウス、通信ボード等、出力装置たる表示装置、通信ボード等を備えるコンピュータである。そして、上記したように~部として示された機能をこれら処理装置、記憶装置、入力装置、出力装置を用いて実現するものである。