(57)【要約】【課題】制御プログラムで定義されている制御アルゴリズムと、制御システムに含まれる入出力機器との関係を、理解しやすい形式で可視化できるようにする。【解決手段】デバイスグループ抽出部１２３及び連携デバイス抽出部１２４が、制御プログラムに記述されている各信号入出力用変数が、いずれの入出力機器と信号を入出力するための変数であるかを特定する。このため、グラフ生成部１１２が、ノードが変数を表し、有向エッジが変数間の依存関係を表し、制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表すとともに、各信号入出力用変数のノードを入出力機器と関連付けて表す表示情報を生成することができる。この結果、制御プログラムで定義されている制御アルゴリズムと、制御システムに含まれる入出力機器との関係を、理解しやすい形式で可視化することができる。【選択図】図１
2013225251.tif 000002
【特許請求の範囲】
【請求項１】
制御システムに含まれるシーケンサＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）により実行される制御プログラムであって、前記シーケンサＣＰＵが前記制御システムに含まれる中継装置を介して前記制御システムに含まれる入出力機器と信号を入出力するための１つ以上の信号入出力用変数を含む、複数の変数の記述と、変数間の依存関係の記述とにより制御アルゴリズムが定義されている制御プログラムを入力する制御プログラム入力部と、
前記制御システムに含まれる入出力機器ごとに、入出力機器で用いられる変数の範囲が入出力機器変数範囲として定義されている入出力機器変数範囲情報と、前記制御システムに含まれる中継装置ごとに、中継装置で用いられる変数の範囲が中継装置変数範囲として定義されている中継装置変数範囲情報とを入力する情報入力部と、
各入出力機器変数範囲情報の入出力機器変数範囲と、各中継装置変数範囲情報の中継装置変数範囲と、前記制御プログラムに記述されている各信号入出力用変数とを用いた解析を行い、前記制御プログラムに記述されている各信号入出力用変数が、いずれの入出力機器と信号を入出力するための変数であるかを特定する解析処理部と、
前記制御プログラムの複数の変数の記述と変数間の依存関係の記述とに基づき、ノードが変数を表し、有向エッジが変数間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表し、各信号入出力用変数のノードを前記解析処理部により特定された入出力機器と関連付けて表す表示情報を生成する表示情報生成部とを有することを特徴とする情報処理装置。
【請求項２】
前記制御プログラム入力部は、
各々が定義している制御アルゴリズムが相互に異なっており、各々における複数の変数の記述と変数間の依存関係の記述が相互に異なっており、各々における信号入出力用変数が相互に異なっている複数の制御プログラムを入力し、
前記解析処理部は、
制御プログラムごとに、各入出力機器変数範囲情報の入出力機器変数範囲と、各中継装置変数範囲情報の中継装置変数範囲と、制御プログラムに記述されている各信号入出力用変数とを用いた解析を行い、制御プログラムごとに、各信号入出力用変数が、いずれの入出力機器と信号を入出力するための変数であるかを特定し、
前記表示情報生成部は、
各制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表し、各制御プログラムに記述されている各信号入出力用変数のノードを前記解析処理部により特定された入出力機器と関連付けて表す表示情報を生成することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記解析処理部は、
制御プログラムごとに、各入出力機器変数範囲情報の入出力機器変数範囲と、各中継装置変数範囲情報の中継装置変数範囲と、制御プログラムに記述されている各変数とを用いた解析を行い、いずれか２つ以上の制御プログラムに重複して記述されている同一の変数を抽出し、
前記表示情報生成部は、
前記解析処理部により抽出された変数のノードを対応する制御プログラムごとに表すとともに、当該変数の２つ以上のノードを相互に関連付けて表し、２つ以上の制御プログラムに当該変数が重複して記述されていることを表す表示情報を生成することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記情報入力部は、
２つ以上の制御プログラムに記述されている相互に異なる２つ以上の変数が対応付けられている変数対応付け情報を入力し、
前記解析処理部は、
それぞれに前記変数対応付け情報のいずれかの変数が記述されている２つ以上の制御プログラムを特定し、
前記表示情報生成部は、
前記変数対応付け情報で対応付けられている２つ以上の変数のノードを相互に関連付けて表し、前記解析処理部により特定された２つ以上の制御プログラムが連携関係にあることを表す表示情報を生成することを特徴とする請求項２又は３に記載の情報処理装置。
【請求項５】
前記表示情報生成部は、
相互に関連付けられる２つ以上のノードを１つのノードとして集約し、
集約前の各ノードの有向エッジを、集約された１つのノードの有向エッジとする表示情報を生成することを特徴とする請求項３又は４に記載の情報処理装置。
【請求項６】
前記制御プログラム入力部は、
２つ以上のシーケンサＣＰＵにより実行される複数の制御プログラムを入力することを特徴とする請求項２〜５のいずれかに記載の情報処理装置。
【請求項７】
前記制御プログラム入力部は、
信号入出力用変数に番号が含まれている制御プログラムを入力し、
前記情報入力部は、
番号により中継装置変数範囲が定義されている中継装置変数範囲情報を、中継装置ごとに入力し、
入出力機器変数範囲が、中継装置変数範囲の番号をベースとするオフセットで定義されている入出力機器変数範囲情報を、入出力機器ごとに入力し、
前記解析処理部は、
各入出力機器変数範囲情報の入出力機器変数範囲に対して、各中継装置変数範囲情報の中継装置変数範囲とのオフセット加算を行い、
オフセット加算後の各入出力機器変数範囲の番号の範囲と、前記制御プログラムに記述されている各信号入出力用変数の番号とを照合し、
入出力機器変数範囲の番号の範囲に信号入出力用変数の番号が含まれる場合に、当該信号入力用変数が、当該入出力機器変数範囲に対応する入出力機器と信号を入出力するために用いられる変数であると判断することを特徴とする請求項１〜６のいずれかに記載の情報処理装置。
【請求項８】
前記情報入力部は、
前記中継装置変数範囲情報として、
前記シーケンサＣＰＵとバスにより接続されている中継装置ごとに、中継装置で用いられる変数の範囲が定義されているバス割付設定情報を入力することを特徴とする請求項１〜７のいずれかに記載の情報処理装置。
【請求項９】
前記情報入力部は、
前記制御システムに中継装置としてネットワークマスタが含まれている場合に、
前記中継装置変数範囲情報として、
前記ネットワークマスタと、前記ネットワークマスタが管理する局との間で用いられる変数の範囲が定義されているネットワーク割付設定情報を入力することを特徴とする請求項１〜８のいずれかに記載の情報処理装置。
【請求項１０】
前記情報入力部は、
前記制御システムに中継装置としてネットワークマスタが含まれている場合に、
前記中継装置変数範囲情報として、
前記ネットワークマスタで用いられる変数の範囲と、前記シーケンサＣＰＵで用いられる変数との対応関係が定義されるリフレッシュ設定情報を入力することを特徴とする請求項１〜９のいずれかに記載の情報処理装置。
【請求項１１】
前記表示情報生成部は、
共通の入出力機器と関連付けられている１つ以上の信号入出力用変数のノードを、当該入出力機器を表すノードに集約し、
前記１つ以上の信号入出力用変数のノードの有向エッジのうち重複している有向エッジを除去し、
重複を除去した後の有向エッジを、前記入出力機器を表すノードの有向エッジとする表示情報を生成することを特徴とする請求項１〜１０のいずれかに記載の情報処理装置。
【請求項１２】
前記表示情報生成部は、
信号入出力用変数以外の変数のノードを、前記制御プログラムを表すノードに集約し、
信号入出力用変数以外の各変数のノードと、各信号入出力用変数のノードとの間の有向エッジに則して、前記制御プログラムを表すノードと前記入出力機器を表すノードとの間に新たな有向エッジを設け、
前記制御プログラムと各入出力機器との関係を表す表示情報を生成することを特徴とする請求項１１に記載の情報処理装置。
【請求項１３】
コンピュータが、
制御システムに含まれるシーケンサＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）により実行される制御プログラムであって、前記シーケンサＣＰＵが前記制御システムに含まれる中継装置を介して前記制御システムに含まれる入出力機器と信号を入出力するための１つ以上の信号入出力用変数を含む、複数の変数の記述と、変数間の依存関係の記述とにより制御アルゴリズムが定義されている制御プログラムを入力する制御プログラム入力ステップと、
前記コンピュータが、
前記制御システムに含まれる入出力機器ごとに、入出力機器で用いられる変数の範囲が入出力機器変数範囲として定義されている入出力機器変数範囲情報と、前記制御システムに含まれる中継装置ごとに、中継装置で用いられる変数の範囲が中継装置変数範囲として定義されている中継装置変数範囲情報とを入力する情報入力ステップと、
前記コンピュータが、
各入出力機器変数範囲情報の入出力機器変数範囲と、各中継装置変数範囲情報の中継装置変数範囲と、前記制御プログラムに記述されている各信号入出力用変数とを用いた解析を行い、前記制御プログラムに記述されている各信号入出力用変数が、いずれの入出力機器と信号を入出力するための変数であるかを特定する解析処理ステップと、
前記コンピュータが、
前記制御プログラムの複数の変数の記述と変数間の依存関係の記述とに基づき、ノードが変数を表し、有向エッジが変数間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表し、各信号入出力用変数のノードを前記解析処理ステップにより特定された入出力機器と関連付けて表す表示情報を生成する表示情報生成ステップとを有することを特徴とする情報処理方法。
【請求項１４】
制御システムに含まれるシーケンサＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）により実行される制御プログラムであって、前記シーケンサＣＰＵが前記制御システムに含まれる中継装置を介して前記制御システムに含まれる入出力機器と信号を入出力するための１つ以上の信号入出力用変数を含む、複数の変数の記述と、変数間の依存関係の記述とにより制御アルゴリズムが定義されている制御プログラムを入力する制御プログラム入力ステップと、
前記制御システムに含まれる入出力機器ごとに、入出力機器で用いられる変数の範囲が入出力機器変数範囲として定義されている入出力機器変数範囲情報と、前記制御システムに含まれる中継装置ごとに、中継装置で用いられる変数の範囲が中継装置変数範囲として定義されている中継装置変数範囲情報とを入力する情報入力ステップと、
各入出力機器変数範囲情報の入出力機器変数範囲と、各中継装置変数範囲情報の中継装置変数範囲と、前記制御プログラムに記述されている各信号入出力用変数とを用いた解析を行い、前記制御プログラムに記述されている各信号入出力用変数が、いずれの入出力機器と信号を入出力するための変数であるかを特定する解析処理ステップと、
前記制御プログラムの複数の変数の記述と変数間の依存関係の記述とに基づき、ノードが変数を表し、有向エッジが変数間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表し、各信号入出力用変数のノードを前記解析処理ステップにより特定された入出力機器と関連付けて表す表示情報を生成する表示情報生成ステップとをコンピュータに実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、制御プログラムのデバッグ作業を容易化させる技術に関する。
【背景技術】
【０００２】
≪対象とする領域について≫
今日、ＦＡ（ファクトリーオートメーション）システムやＰＡ（プロセスオートメーション）システムにはシーケンス制御を行う機器としてプログラミング可能なＣＰＵ機器――プログラマブルコントローラ（ＰＬＣ、シーケンサ機器）が用いられている。
ＦＡシステムの制御プログラマ（システムインテグレータや、ＦＡシステムを構成するコンポーネントの装置メーカなど）は、パソコンで動作するＦＡ専用のエンジニアリング環境ソフトウェア上にてシーケンサ機器用の制御プログラムを作成（クロス開発）するのが一般的である。
エンジニアリング環境ソフトウェアは、プログラマが作成した制御プログラムを、シーケンサ機器内で解釈可能な中間言語プログラムにコンパイルし、シーケンサ機器へダウンロードする。
中間言語プログラムがダウンロードされたシーケンサ機器は、その制御プログラムに従って、様々な入出力ユニットやネットワークを介してセンサやモータを制御して、ＦＡ・ＰＡシステムを動作させる。
ＦＡ・ＰＡシステム用の制御プログラムが通常の組込みシステムと異なる点は、プログラミングを行うのがシーケンサ機器のメーカではなく一般エンドユーザであることと、制御プログラムの制御対象（変数，デバイス）がユーザのＦＡシステム内の比較的マクロな要素であること、つまり制御対象にはシステム全体の中で意味のある単位となりうること、が挙げられる。
この意味のあるデバイスの単位は、ラベルやシステムラベルと呼ばれることもある。
【０００３】
≪制御プログラムの運用について≫
プログラマが作成する制御プログラムは、国際規格ＩＥＣ６１１３１−３で定義された５言語、インストラクションリスト（ＩＬ），ラダー（ＬＤ），ストラクチャードテキスト（ＳＴ），ファンクションブロックダイアグラム（ＦＢＤ），シーケンシャルファンクションチャート（ＳＦＣ）などで記述されることが多い。
またＣやＣ＋＋などの汎用プログラミング言語で記述されることもある。
ＦＡ・ＰＡシステムは組み込みシステムであり、通常、制御対象は物理的な機械である。
このため机上で制御プログラムをデバッグするだけでなく、プログラム作成の最終段階、あるいは工場等においてラインを立ち上げる段階において、制御プログラムと制御対象である実機システムとを組み合わせて、動作タイミング等の確認や微調整を行う必要がある。
また、ＦＡ・ＰＡシステムはその性質上、数十年にわたって稼動するものも珍しくない。
しかしその長期間にわたって制御プログラムが変更されないわけではない。
例えば工場の製造ラインなどの場合は、製造する製品の仕様などの変化に伴って、制御プログラムに少しずつ修正が加えられることがある。
これらの修正過程では、ラインの運用中にシーケンサ機器へエンジニアリング端末を接続して、その場で変更などを行うことも多い。
この調整や変更は、ラダー（ＬＤ）やインストラクションリスト（ＩＬ）という、中間言語とほぼ一対一に対応した、機械語レベルの低級言語により行われることがある。
なぜならば、この作業を行うのは制御プログラマ（装置メーカ）ではなく、機械や製造ラインの専門家（エンドユーザ）であることが多く一般的に高級言語に不慣れなことや、微調整や少しの修正のために上流の設計（高級言語）を変更するのは時間がかかることを理由に、この手順が省略されるためである。
このため、計画的なバックアップ作業を行っていない限り、稼働中の実機システムを動作させている制御プログラムと整合性の取れている「マスタプログラム」が事務所などに保管されていないことがある。
そもそも、稼働中の実機システムのシーケンサ機器内に格納されている中間言語プログラムを「マスタプログラム」と考えているユーザも少なくない。
したがって、ＦＡ・ＰＡシステムにおいて、特に保守時に対象とする制御プログラムは、ＩＬやＬＤなどの機械語レベルの言語で記述されたものを前提として考える必要がある。
【０００４】
≪デバッグ・保守作業の困難性について≫
ＦＡ・ＰＡシステムでは「制御プログラム設計段階における構造化支援」と「制御プログラム試験段階におけるデバッグ効率の向上」と「実機システム運用段階における障害発生時の早急な復旧」が大きな課題となっている。
ＩＥＣ６１１３１−３でも定義されているファンクションブロック（ＦＢ）などを用い、制御プログラムの標準化と構造化を支援しているエンジニアリング環境も数多くあるが、ＦＢを有効に使用できているユーザ（特にエンドユーザ）は多くはないのが実情である。
ＦＢなどを用いた構造化プログラミングを阻害しているのは、制御プログラムのどの部分を切り出して構造化し、再利用可能なプログラム部品として定義すべきかを、プログラミング前にあらかじめ設計しにくいことが原因の一つと考えられる。
実機システムの運用中に発生する、工場の製造ラインを停止してしまうような障害については、復旧に費やされる時間がそのままラインの停止時間になり、エンドユーザの損失に直結するために、早急な復旧が必要である。
障害の原因究明に費やされる時間を短縮するため、可読性の高い制御プログラムが必要である。
しかしＦＡ・ＰＡシステムの制御プログラムをＬＤやＩＬにて作成する場合、何千何万行となる「巻物」プログラムを記述することになる。
ＬＤやＩＬで記述されたプログラムは構造を持っておらず、これらは言語仕様上コメント等が入れにくいことなどもあり、他人が見たときに分かりづらいプログラムとなりがちである。
ＬＤやＩＬで記述されたプログラムを短時間で正しく解釈するためには、ＬＤやＩＬ言語、制御プログラムに熟練している必要がある。
例えば実機システムの保守時に障害が顕在化したデバイスに注目し、制御プログラムに対して、このデバイスがコイル（出力）となっているラング（ＬＤ言語の回路ブロック）を検索し、そのラングで条件として使用されている接点（入力条件）のデバイス（通常は複数）を特定し、それがコイルとなっているラングを検索し．．．と順を追って検索を行うことで、障害が顕在化したデバイスに影響を与えているデバイスおよび処理を網羅してチェックすることが可能となる。
しかしながら、この方法では、コイル→接点と遡るたびに、探索木の分岐が行われるため、ユーザが途中の状態を記憶しておく必要がある。
また接点とコイルが循環していないか（探索木に繰返しが存在しないか）を随時チェックする必要がある。
なお、制御プログラマは通常、コイルに登場するデバイスを基準に処理を記述する。
つまり、２重コイル（プログラム中の複数個所で同一コイル出力が登場すること）は好まれないことが多い。
しかし、ラダー言語の接点−コイルの関係には、接点デバイスの条件によってコイルに書かれたデバイスのＯＮ／ＯＦＦが同時に定義されており、Ｃ言語などの汎用プログラミング言語に慣れているユーザにとっては分かりづらいところがある。
このため、ＳＥＴ命令やＲＥＳＥＴ命令によって明示的にデバイスのＯＮ／ＯＦＦを記すプログラマも増えてきている。
つまり、この場合は、コイル→接点デバイス検索における毎回の分岐の幅が増えることになり、ユーザに対して更なる負担を強いることになる。
【０００５】
≪先行技術について≫
特許文献１では、複数プログラム間の信号について、同一性を判断して制御プログラム間の関連を図示する技術について開示している。
特許文献１によれば、デバイス（機器）のそれぞれから取得された入力メモリおよび出力メモリの内容に基づいて、異なる機器間で同一の信号に相当する一対の入力信号と出力信号とをそれぞれの信号に付されたデバイス情報に基づいて抽出し、それら一対の入力信号と出力信号との間に紐付け処理を行ない、各デバイスのそれぞれから取得された入力メモリ、出力メモリ、プログラムメモリの内容、及び紐付け結果に基づいて、所定の表示装置の画面上のロジックシンボル図中に、同一の信号に相当する一対の入力信号と出力信号については、例えば一本の線で結んだ状態で一連に表示するとしている。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００９−０４２９１３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
規模の大きな制御システムにおいては、１つの制御プログラムが制御システム全体を制御しているとは限らず、複数の制御プログラムが連携して制御システムを構成していることもある。
たとえば入力ボタンＡが、あるＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）内の制御プログラムαの入力デバイスとして定義されており、そのボタンＡを押下することで、ボタンＡの信号がネットワークを介して別のＣＰＵ内の制御プログラムβに伝送され、そこのＣＰＵ内の制御プログラムβの出力デバイスとして、ランプＢが点灯する場合などである。
このような場合に、ボタンＡデバイスとランプＢデバイスの関連が図示されることが望ましい。
このような図示により、制御プログラムの構造化やデバッグ・保守作業の対象が一つの制御プログラムのスコープ内に限定されてしまうことを回避できると考えられる。
【０００８】
この点に関連して、特許文献１では、複数プログラム間の信号について、同一性を判断して制御プログラム間の関連を図示する技術について開示している。
すなわち、制御プログラムαの出力メモリ情報に含まれる全デバイス情報と、制御プログラムβの入力メモリ情報に含まれるデバイス情報の対応付けをチェックし、また逆方向の、制御プログラムαの入力メモリ情報に含まれる全デバイス情報と、制御プログラムβの出力メモリ情報に含まれるデバイス情報の対応付けをチェックすることで、制御プログラムαと制御プログラムβ間で対になる信号の紐付けを行っている。
【０００９】
特許文献１では、入力／出力メモリ情報内にデバイス情報を持つ、制御プログラムの信号同士の紐付けを行うことについて開示されているが、例えば１つの制御プログラムと、ネットワークで接続された入出力機器間の信号について、同一性を判断して紐付けし、それを図示する方法については開示されていない。
【００１０】
また特許文献１の方式では、制御プログラムの入／出力メモリ情報に含まれる全てのデバイス情報についてチェックを行う必要があるが、実際に複数プログラム間でやりとりされる信号はその一部であるため、この紐付け処理には余計な時間がかかるという課題がある。
【００１１】
本発明は、これらの課題を解決することを主な目的としており、制御プログラムで定義されている制御アルゴリズムと、制御システムに含まれる入出力機器との関係を、理解しやすい形式で可視化できるようにすることを主な目的とする。
【課題を解決するための手段】
【００１２】
本発明に係る情報処理装置は、
制御システムに含まれるシーケンサＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）により実行される制御プログラムであって、前記シーケンサＣＰＵが前記制御システムに含まれる中継装置を介して前記制御システムに含まれる入出力機器と信号を入出力するための１つ以上の信号入出力用変数を含む、複数の変数の記述と、変数間の依存関係の記述とにより制御アルゴリズムが定義されている制御プログラムを入力する制御プログラム入力部と、
前記制御システムに含まれる入出力機器ごとに、入出力機器で用いられる変数の範囲が入出力機器変数範囲として定義されている入出力機器変数範囲情報と、前記制御システムに含まれる中継装置ごとに、中継装置で用いられる変数の範囲が中継装置変数範囲として定義されている中継装置変数範囲情報とを入力する情報入力部と、
各入出力機器変数範囲情報の入出力機器変数範囲と、各中継装置変数範囲情報の中継装置変数範囲と、前記制御プログラムに記述されている各信号入出力用変数とを用いた解析を行い、前記制御プログラムに記述されている各信号入出力用変数が、いずれの入出力機器と信号を入出力するための変数であるかを特定する解析処理部と、
前記制御プログラムの複数の変数の記述と変数間の依存関係の記述とに基づき、ノードが変数を表し、有向エッジが変数間の依存関係を表し、前記制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表し、各信号入出力用変数のノードを前記解析処理部により特定された入出力機器と関連付けて表す表示情報を生成する表示情報生成部とを有することを特徴とする。
【発明の効果】
【００１３】
本発明では、ノードが変数を表し、有向エッジが変数間の依存関係を表し、制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表すとともに、各信号入出力用変数のノードを入出力機器と関連付けて表す表示情報を生成する。
このため、制御プログラムで定義されている制御アルゴリズムと、制御システムに含まれる入出力機器との関係を、理解しやすい形式で可視化することができる。
【図面の簡単な説明】
【００１４】
【図１】実施の形態１に係る情報処理装置の構成例を示す図。
【図２】実施の形態１に係るデバイスグループ抽出処理のフローチャート図。
【図３】実施の形態１に係る連携デバイス抽出処理のフローチャート図（システムデバイス設定情報）。
【図４】実施の形態１に係る連携デバイス抽出処理のフローチャート図（リフレッシュ設定情報）。
【図５】実施の形態１に係るバス割付設定情報の例を示す図。
【図６】実施の形態１に係るネットワーク割付設定情報の例を示す図。
【図７】実施の形態１に係るリフレッシュ設定情報の例を示す図。
【図８】実施の形態１に係るシステムデバイス設定情報の例を示す図。
【図９】実施の形態１に係るデバイスプロファイル情報の例を示す図。
【図１０】実施の形態１に係る制御システムの構成例を示す図。
【図１１】実施の形態１に係る制御プログラム例（１０１１のラダー回路）を示す図。
【図１２】実施の形態１に係る制御プログラム例（１０１２のラダー回路）を示す図。
【図１３】実施の形態１に係る制御プログラム例（１０４１のラダー回路）を示す図。
【図１４】制御プログラム表示例（１０１１のグラフ表示）を示す図。
【図１５】実施の形態１に係る制御プログラム表示例（１０１２のグラフ表示）を示す図。
【図１６】実施の形態１に係る制御プログラム表示例（１０４１のグラフ表示）を示す図。
【図１７】実施の形態１に係るデバイス割付情報を適用したグラフの構造例を示す図。
【図１８】実施の形態１に係るデバイス連携情報を適用したグラフの構造例を示す図。
【図１９】実施の形態１に係る連携デバイスを縮約表示したグラフの構造例を示す図。
【図２０】実施の形態１に係るグルーピングデバイスを縮約表示したグラフの構造例を示す図。
【図２１】実施の形態１に係る画面表示例を示す図。
【図２２】実施の形態１に係るデバイス割付情報を適用したデバイスグループ情報の例を示す図。
【図２３】実施の形態１に係るデバイス連携情報を適用したデバイスグループ情報の例を示す図。
【図２４】実施の形態１に係るノードの関連付け処理のフローチャート図。
【図２５】実施の形態１に係るノードの関連付け処理を説明する図。
【図２６】実施の形態２〜４に係る情報処理装置の構成例を示す図。
【図２７】実施の形態１に係る構成例と実施の形態２〜４に係る構成例の合成例を示す図。
【図２８】実施の形態２に係る情報処理装置のグラフ表示動作のフローチャート図。
【図２９】実施の形態２に係る情報処理装置の対応制御部分プログラム表示動作のフローチャート図。
【図３０】実施の形態２に係る情報処理装置の特定デバイス仕様出力動作のフローチャート図。
【図３１】実施の形態２に係る情報処理装置の影響範囲図示動作のフローチャート図。
【図３２】実施の形態２に係る情報処理装置の未使用箇所検出動作のフローチャート図。
【図３３】実施の形態２に係る情報処理装置の循環定義検出動作のフローチャート図。
【図３４】実施の形態２に係る情報処理装置のデバイス値モニタ動作のフローチャート図。
【図３５】実施の形態２に係る情報処理装置の障害可能性要因図示動作のフローチャート図。
【図３６】実施の形態３に係るＬＤ言語による制御プログラムの例を示す図。
【図３７】実施の形態３に係る制御プログラムのグラフ表示例１（模式図）を示す図。
【図３８】実施の形態３に係るノード構造体の例を示す図。
【図３９】実施の形態３に係るエッジ構造体の例を示す図。
【図４０】実施の形態３に係る接続情報の例を示す図。
【図４１】実施の形態４に係る制御プログラムのグラフ表示例２（模式図）を示す図。
【図４２】実施の形態４に係る影響範囲図示のグラフ表示例（模式図）を示す図。
【図４３】実施の形態４に係る循環定義検出のグラフ表示例（模式図）を示す図。
【図４４】実施の形態３に係る制御プログラム例のＩＬ言語表現を示す図。
【図４５】実施の形態２〜４に係る情報処理装置のハードウェア構成例を示す図。
【発明を実施するための形態】
【００１５】
実施の形態１．
≪概要≫
まず、本実施の形態に係る情報処理装置の動作の概要を説明し、その後、構成例及び動作手順の詳細を説明する。
【００１６】
本実施の形態では、ネットワークやバスなどで接続された、複数の制御プログラムや入出力信号を持つ機器間の連携動作を容易に確認するため、対象とする制御システム全体の制御ロジックを１つの画面に表示する情報処理装置を説明する。
本実施の形態に係る情報処理装置は、複数の制御プログラムや入出力信号を持つ機器間の同一信号を抽出するために、これら複数の制御プログラムや機器の信号をネットワークやバスを介して通信するためのパラメータ設定情報（デバイス連携情報）を用いる。
さらに、本実施の形態に係る情報処理装置は、表示された制御ロジックの可読性向上のために、制御システムの設定情報（デバイス割付情報）から、デバイスを制御ロジック上意味のある単位でグルーピングして表示、またはユーザの指定する任意の単位でグルーピングして表示、またこれらのグルーピングを単一アイコンで表示する。
これにより、複数の制御プログラムと機器から成る制御システム全体について、段階に応じて複数のデバイスをグルーピングし縮約してアイコン表示することができるため、制御システム全体を表示しながら、制御システム設計時や障害発生時に、ユーザは制御システム全体を画面内で俯瞰して見ながら、必要な部分は制御プログラムや機器のデバイス（信号）レベルまで詳細表示することが可能となる。
【００１７】
複数の制御プログラムと機器から成る制御システム全体を正常に連携動作させるためには、制御プログラムと機器の他に、これらをネットワークやバスを介して連携動作させるために「デバイス連携情報」と「デバイス割付情報」を必要とする。
これらの情報は、現在すでに制御システムを設計する際に、制御システム全体を管理する統合管理ツールや、シーケンサＣＰＵ等の制御プログラムの開発環境であるエンジニアリングツールが管理している情報である。
これらの情報はユーザが直接設定することもできるし、ユーザにより作成される、制御システムの機器・ネットワーク構成を表すシステム構成図と、各ＣＰＵに対応する単一あるいは複数の制御プログラムから自動的に作成することもできる。
「デバイス連携情報」とは、複数の制御プログラムや機器間で共通に使用されるデバイスに関する設定パラメータのことである。
これは例えば、システム内で１つの信号を複数の制御プログラムや機器で用いるために設定される「システムデバイス設定情報」や、制御システム内の１つのネットワーク・バスの各局・ユニット機器間で送受信されるデバイスを定義した「リフレッシュ設定情報」や、ネットワーク間のゲートウェイにおいて隣接するネットワークへ転送するデバイスを定義する「ゲートウェイ転送設定情報」などを含んでいる。
また、「デバイス割付情報」とは、複数あるいは単一の制御プログラムや機器で使用されているデバイスの分類や意味づけに関する設定パラメータのことである。
例えば、バス単位で、バスマスタであるシーケンサＣＰＵが管理するユニットのデバイスの割当てを設定する「バス割付設定情報」や、ネットワーク単位で、ネットワークマスタ機器と子局で使用するデバイスの割当てを設定する「ネットワーク割付設定情報」や、特定の機器やユニット機器の入出力信号やメモリ構造を記述した「デバイスプロファイル情報」などを含んでいる。
【００１８】
本実施の形態では、複数の制御プログラムや機器間を連携動作させるために使用されているデバイスを特定するために、デバイス連携情報を用いる。
デバイス連携情報には、複数の制御プログラムや機器を結ぶネットワークやバスで送受信されるデバイスが定義されているため、これらのデバイスが複数の制御プログラムや機器を連携動作させるための信号を媒介していると判断できるためである。
また、本実施の形態では、複数あるいは単一の制御プログラムと機器を一括表示した際に、表示されるデバイスのグルーピングを行い、必要に応じてグルーピングしたデバイス群を単一のアイコンで表示するために、デバイス割付情報を用いる。
デバイス割付情報には、制御システムで用いられている全デバイスを意味のある領域で分割する情報が定義されているため、デバイスのグルーピングや縮約対象デバイス群として利用できると考える。
よって、本実施の形態で開示する方法によれば、制御システム全体を構成する、複数の制御プログラムと機器と、それらをつなぐネットワークやバスを連携動作させるために用意されているデバイス連携情報とデバイス割付情報を利用することで、複数の制御プログラムと機器から成る制御システム全体を、各制御プログラムや機器間の連携を担うデバイスをデバイス連携情報を元に関連付けることにより、一つの有閉路有向グラフとして表示し、かつ、機器単位やユニット機器単位で複数のデバイスをグルーピングして展開して表示、あるいは縮約して一つのアイコンとして表示することを可能とする。
【００１９】
≪構成の説明≫
以降に、図１を用いて、本実施の形態に係る情報処理装置１００の構成例を説明する。
【００２０】
制御プログラム中間コード記憶部１０１は、ＦＡ・ＰＡシステムの制御プログラムが格納されているメモリである。
制御プログラム中間コード記憶部１０１で記憶されている制御プログラムのソースコードはどのような言語で記述されていても良い。
なお、制御プログラム中間コード記憶部１０１で記憶されている制御プログラムの中間コードは、制御プログラム中間コードという。
この制御プログラム中間コードは、ＦＡ・ＰＡシステムのエンジニアリング開発環境により、ユーザのプログラミングによって作成されたソースコードをコンパイルした結果である。
通常この制御プログラム中間コードはエンジニアリング環境のコンパイル生成物であり、シーケンサ機器にダウンロードされる対象でもある。
制御プログラム中間コードは、通常シーケンサＣＰＵ内に単一あるいは複数定義することができる。
つまり制御システム全体では、複数の制御プログラム中間コードが存在する。
制御プログラム中間コードには、複数の変数（以下、「デバイス」ともいう）が記述されるとともに変数間の依存関係が記述され、複数の変数の記述と変数間の依存関係の記述により制御システムにおける制御アルゴリズムが定義される。
また、制御プログラム中間コードに記述されている変数には、信号入出力用変数が含まれている。
信号入出力用変数は、シーケンサＣＰＵが制御システムに含まれる中継装置を介して制御システムに含まれる入出力機器と信号を入出力するための変数である。
なお、中継装置とは、具体的には、ネットワークマスタ、ネットワークユニット、入力ユニット、出力ユニット等である。
【００２１】
デバイス割付情報記憶部１２１は、デバイス割付情報を記憶するメモリである。
デバイス割付情報は、複数あるいは単一の制御プログラム１０１や機器で使用されているデバイス（変数）の分類や意味づけに関する設定パラメータである。
これは例えば、ネットワークやバス単位で、各マスタ機器とスレーブ機器で使用するデバイスの割当てを設定する「割付設定情報」や、機器やユニット機器の入出力信号やメモリ構造を記述した「デバイスプロファイル情報」などを含んでいる。割付設定情報の場合は、ネットワーク・バスのマスタ機器ごとに存在する。
またデバイスプロファイル情報は、機器ごとに存在する。
【００２２】
デバイス連携情報記憶部１２２は、デバイス連携情報を記憶するメモリである。
デバイス連携情報は、複数の制御プログラム中間コードや機器間で共通に使用されるデバイス（変数）に関する設定パラメータである。
これは例えば、システム内で１つの信号を複数の制御プログラムや機器で用いるために設定される「システムデバイス設定情報」や、制御システム内の１つのネットワーク・バスの各局・ユニット機器間で送受信されるデバイスを定義した「リフレッシュ設定情報」や、ネットワーク間のゲートウェイにおいて隣接するネットワークへ転送するデバイスを定義する「ゲートウェイ転送設定情報」などを含んでいる。
システムデバイス設定情報は、制御システム内で１つのシステムデバイスあたり１つのみ、当該システムデバイスの実メモリ存在するシーケンサＣＰＵ内に格納されている。
しかし、システムデバイス設定が制御システム全体を管理する統合管理ツール、もしくは制御プログラムの開発環境であるエンジニアリングツールで保持されている場合もある。
リフレッシュ設定情報は、少なくともネットワーク・バスのマスタ機器ごとに存在する。
ゲートウェイ転送設定情報は、ゲートウェイ対象となる複数のネットワークマスタユニットを抱えるＣＰＵの設定パラメータとして存在する。
【００２３】
ノード構造体記憶部１０４は、制御プログラム中間コード記憶部１０１から、デバイス抽出処理１５１によって抽出されたデバイスの情報を記憶しておく領域である。
ノード構造体記憶部１０４で記憶される情報は、ノード構造体という。
ノード構造体では、デバイスに対して、デバイス名あるいは、ユーザによって命名されたラベル名が格納される。
【００２４】
エッジ構造体記憶部１０５は、制御プログラム中間コード記憶部１０１から、依存関係抽出処理１５２によって抽出されたデバイス間の依存関係を記憶しておく領域である。
依存関係抽出処理１５２では２つのデバイス間の依存関係の種別と、対象となる２つのデバイスの組合せを抽出する。
依存関係の種別はエッジ構造体として格納する。
対象デバイスの組合せは、エッジ構造体もしくは、後述する接続情報として保存する。
【００２５】
接続情報記憶部１０６は、デバイスを記憶しているノード構造体と、デバイス間の依存関係を記憶しているエッジ構造体の間の接続関係を保持しておく記憶領域である。
接続情報記憶部１０６で記憶されている情報を接続情報という。
【００２６】
デバイスグループ抽出部１２３は、デバイス割付情報を用いて、接続情報に格納されたノードとエッジに対応するデバイスをグルーピングし、グルーピングしたものをさらにノードとしてノード構造体記憶部１０４へ格納する。
グルーピングする際には、対象となるノード群を接続するエッジを縮約するようにノード群をまとめて１つのノードを定義する。
この時、接続情報の構造は、複数の表示レイヤを持つようにして、グラフ生成部１１２により、グルーピングしたノード群をそのまま展開された状態で表示することもできれば、まとめた１つのノードのみを表示することもできるように、構成される。
【００２７】
連携デバイス抽出部１２４は、デバイス連携情報を用いて、複数の制御プログラム中間コードや機器から抽出した接続情報に格納されたノードとエッジに対応するデバイスの中から、複数の制御プログラムや機器間で連携しているデバイスを抽出し、連携デバイス間には新たなエッジを定義して、エッジ構造体記憶部１０５へ格納する。
あるいは２つ以上の連携デバイスをグルーピングして、デバイスグループ抽出部１２３の処理と同様に、新たなノードとしてノード構造体記憶部１０４へ格納する。
【００２８】
デバイスグループ抽出部１２３と連携デバイス抽出部１２４は、ともに、制御プログラム入力部、情報入力部、解析処理部の例に相当する。
【００２９】
グラフ生成部１１２は、デバイスグループ抽出部１２３でグルーピングしたノード群を、そのまま表示する場合と、まとめた１つのノードとして表示する場合を制御する部分である。
具体的には、ユーザのマウスやキーボードからの入力を受け取り、ノードを展開表示したり、閉じたりすることができる。
この部分のロジックは一般的なグラフ表示ツールの機能と同様なしくみで実現することができる。
なお、グラフ生成部１１２は、表示情報生成部の例に相当する。
【００３０】
デバイスグループ指定部１２５は、ユーザによって指定された複数のデバイスを１つのノードとしてグルーピングして、１つのアイコンとして表示するため、ユーザが複数のデバイスを指定し、そのアイコンを定義する部分である。
グルーピング後の処理は、デバイスグループ抽出部１２３と同じである。
【００３１】
結果出力部１０９は、制御システム全体を、デバイスグループ抽出部１２３によってグルーピングされたグラフ、あるいは連携デバイス抽出部１２４によって連結されたグラフとして画面に表示する部分である。
【００３２】
≪動作の説明≫
本実施の形態に係る情報処理装置１００の動作を簡単に説明すると、以下のようになる。
デバイスグループ抽出部１２３及び連携デバイス抽出部１２４が、デバイス割付情報、デバイス連携情報、制御プログラム中間コードを解析し、制御プログラムに記述されている各信号入出力用変数が、いずれの入出力機器と信号を入出力するための変数であるかを特定する。
そして、グラフ生成部１１２が、ノードが変数を表し、有向エッジが変数間の依存関係を表し、制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表すとともに、各信号入出力用変数のノードを入出力機器と関連付けて表す表示情報を生成する。
この結果、制御プログラムで定義されている制御アルゴリズムと、制御システムに含まれる入出力機器との関係を、理解しやすい形式で可視化することができる。
【００３３】
≪割付デバイスのグルーピングと表示≫
デバイスグループ抽出部１２３がデバイス割付情報を用いてデバイスをグルーピングし、グラフ生成部１１２によって、グルーピングされたノードが展開された状態、あるいはグルーピングされたノード群が１つのノードに縮約された状態のグラフが生成され、結果出力部１０９によってグラフが表示されるまでの手順について、以下に説明する。
【００３４】
デバイスグループ抽出部１２３とデバイスグループ指定部１２５により、図２２に示されるようなデバイスグループ情報が生成されるまでの手順について、図２をもとに説明する。
【００３５】
まず、処理２０１にて、シーケンサＣＰＵの数だけ繰返しを行う。
デバイスグループ抽出は制御システム全体を対象としているため、その中の個々の制御プログラム毎にデバイスグループの抽出を行う必要がある。
ここでは、まず制御プログラムが格納されるシーケンサＣＰＵ毎に処理を行う。
デバイスグループ抽出部１２３が用いるデバイス割付情報は「バス割付設定情報」と「ネットワーク割付設定情報」と「デバイスプロファイル情報」などから成る。
割付設定情報の場合は、対象とする制御システム内のネットワークやバスのマスタ機器ごとに存在する。
また、デバイスプロファイル情報は、対象とする制御システム内の機器ごとに存在する。
前者のバスマスタはつまりシーケンサＣＰＵに該当するため、シーケンサＣＰＵ１台ごとにバス割付設定情報が存在する。
【００３６】
次に、処理２０２にて、デバイスグループ抽出部１２３が、バス割付設定情報からシーケンサＣＰＵが管理するユニットの数を取得する。
バス割付設定情報には、図５に示されるような情報が含まれている。
シーケンサＣＰＵが管理するユニットの数は、バス割付設定情報のレコード数（行数）に相当する。
バス割付設定情報は、バスマスタであるシーケンサＣＰＵ毎に存在し、当該ＣＰＵが管理するユニットのＩ／Ｏデバイスのグルーピングがなされている。
バス割付設定情報により当該ＣＰＵが管理するユニットの数を知ることができる。
【００３７】
次に、処理２０３にて、デバイスグループ抽出部１２３が、処理２０１で注目しているシーケンサＣＰＵが管理するユニットの数だけループを行う。
【００３８】
次に、処理２０４にて、デバイスグループ抽出部１２３が、バス割付設定情報の各レコードの解析を行う。
つまりバス割付設定情報には、バス上に接続された各ユニットの先頭ＸＹ番号とＸＹ点数が含まれている。
これらの情報は、バスマスタであるシーケンサＣＰＵで動作する制御プログラムで使用される入力デバイスＸと、出力デバイスＹのグルーピング指定をしていることに他ならない。
このため、処理２０３で注目しているユニット毎のグルーピング処理を行うため、先頭ＸＹ番号からＸＹ点数分だけ、入出力デバイスのグルーピングを行い、この内容を注目しているユニットの割当てデバイスとして記録する。
【００３９】
次に、処理２０６にて、処理２０１で注目しているシーケンサＣＰＵが管理する機器の数だけループを行う。
つまり、シーケンサＣＰＵが管理しデバイスプロファイルが存在する機器の数と等しい。
処理２０３で繰返しを行った、シーケンサＣＰＵが管理するユニット毎にデバイスプロファイルが存在する場合は、処理２０３の繰り返し数と同じとなる。
【００４０】
次に、処理２０７にて、デバイスグループ抽出部１２３が、デバイスプロファイル情報からのデバイスグルーピングを行う。
デバイスプロファイル情報は、管理するシーケンサＣＰＵにぶら下がる形で定義されており、その割付設定情報が、上述したバス割付設定情報と同様に定義されている。
図９に示すようなデバイスプロファイル情報には、機器単位でのグルーピング情報が記述されている。
また、ユニットや機器単位よりもさらに詳細なＸＹデバイスのグルーピング情報が記述されている場合もあり、デバイスプロファイル情報を用いることで、デバイスプロファイルで定義された個々の機器内でのユニークな単位で詳細なグルーピングが可能になる。
なお、デバイスプロファイルで記述される機器の入出力信号の構造自体はデバイスプロファイルの定義から固定的なものではないため、デバイスプロファイルのパーサ（ＸＭＬパーサ等）を使用して解析処理が行われる。
この解析結果から、処理２０４と同じく、デバイスグループ抽出部１２３は、入出力デバイスのグルーピングを行い、この内容に注目している機器（とその内部構造）の割当てデバイスとして記録する。
【００４１】
なお、処理２０３から処理２０５と、処理２０６から処理２０８の処理順序について、図２に示したものは一例であり、他の順序で実施してもよい。
例えばデバイスプロファイル情報が、ユニット毎に存在せず、複数のユニットを跨いだデバイスプロファイルが定義されている可能性もある。
この場合グルーピングの定義に一部矛盾が生じる可能性がある。
この場合は、デバイスプロファイルから抽出してデバイスグループを優先的に採用してもよいし、バス割付設定情報から抽出したデバイスグループを優先的に採用してもよい。
また後述するように、ユーザが指定したグルーピングとの優先順位の関係にも同じことがいえる。
【００４２】
次に、処理２０９にて、デバイスグループ抽出部１２３が、処理２０２にて解析した「バス割付設定情報」から、ネットワークマスタとなるユニットの特定を行う。
図に示したバス割付設定情報の例の場合は、ネットワークマスタユニットはその型名もしくは種別から判別可能である。
バス割付設定情報にユニットのＩＤ情報がある場合は、それを用いて判断してもよい。
【００４３】
次に、処理２１０にて、デバイスグループ抽出部１２３が、ネットワークマスタ毎に存在する「ネットワーク割付設定情報」を元にデバイスグループの抽出を行うため、当該ネットワークマスタが管理する総局数を取得する。
つまりこれは、図６に例として示されるようなネットワーク割付設定情報のレコード数に等しい。
なお、バス割付設定情報内に複数のネットワークマスタが存在する場合は、処理２１０の前にネットワークマスタ数分の繰返しを行う必要がある。
【００４４】
次に、処理２１１にて、当該ネットワークマスタが管理する総局数だけ繰返しを行う。
【００４５】
次に、処理２１２にて、デバイスグループ抽出部１２３が、ネットワーク割付設定情報からのデバイスグルーピングを行う。
ネットワーク割付設定情報は、ビットデバイスとワードデバイスで、割付情報が分かれている場合があるため、それぞれについてネットワークデバイスのグルーピングを行い、この内容を注目している局の割当てデバイスとして記録する。
【００４６】
次に、処理２１３にて、デバイスグループ抽出部１２３が、デバイスプロファイル情報からのデバイスグルーピングを行う。
デバイスプロファイル情報は、管理するネットワークマスタにぶら下がる形で定義されており、通常はデバイスプロファイルが定義される機器の数は、総局数と等しい。
図９に示すようなデバイスプロファイル情報には、機器単位でのグルーピング情報が記述されている。
また、ユニットや機器単位よりもさらに詳細なＸＹデバイスのグルーピング情報が記述されている場合もあり、デバイスプロファイル情報を用いることで、デバイスプロファイルで定義された個々の機器内でのユニークな単位で詳細なグルーピングが可能になる。
なおデバイスプロファイルで記述される機器の入出力信号の構造自体はデバイスプロファイルの定義から固定的なものではないため、デバイスプロファイルのパーサ（ＸＭＬパーサ等）を使用して解析処理が行われる。
この解析結果から、処理２０８と同じく、入出力デバイスのグルーピングを行い、この内容に注目している機器（とその内部構造）の割当てデバイスとして記録する。
【００４７】
以上によって、シーケンサＣＰＵ内の制御プログラムが制御するデバイスのグルーピング処理が完了する。
これらのグルーピングが完了すると、デバイスグループ抽出部１２３には、処理２０４にてバス割付設定情報からユニット単位でのデバイスグループ、処理２０７にてデバイスプロファイルから機器単位もしくは機器内のより詳細単位でのデバイスグループ、処理２１２にてネットワーク割付設定情報からネットワークの局単位でのデバイスグループ、処理２１３にてデバイスプロファイルからネットワーク上の機器単位もしくは機器内のより詳細単位でのデバイスグループ、以上のデバイスグループ情報が記録されていることになる。
このデバイスグループ情報の例を図２２に示す。
【００４８】
さらに、図２の処理とは非同期に、デバイスグループ指定部１２５によりユーザがＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）画面を通じて、複数の任意のノード（個々のノードは、単一デバイスである場合と、複数デバイスを縮約して１つのノードとして表現されている可能性がある）を指定した場合、これらのノードで表されたデバイス群がグループとして、上記と同様にデバイスグループ情報として記録される。
以上がデバイスグループ抽出部１２３およびデバイスグループ指定部１２５の処理となる。
【００４９】
続いて、デバイスグループ情報と接続情報から、グラフ生成部１１２によってノード群を縮約／展開して、結果出力部１０９により画面上に表示する。
この際ユーザは、デバイスグループの縮約表示と展開表示について、画面上の当該ノードもしくはデバイスグループを選択してコマンドを指定することで、切り替えが可能となる。
【００５０】
≪連携デバイスのグルーピングと表示≫
連携デバイス抽出部１２４がデバイス連携情報を用いて連携デバイスを抽出し、グラフ生成部１１２によって、グルーピングされたノードが展開された状態、あるいはグルーピングされたノード群が１つのノードに縮約された状態のグラフが生成され、結果出力部１０９によってグラフが表示されるまでの手順について、以下に図３と図４を用いて説明する。
【００５１】
デバイス連携情報は、複数の制御プログラムや機器にて、それぞれさまざまに表記されているデバイスについて、同一利用目的のデバイスとして用いるために設定される情報であり、具体的にはシステムデバイス設定情報とリフレッシュ設定情報などから成る。
最初にシステムデバイス設定情報を利用した複数の制御プログラムや機器間の連携情報構築手順について図３を元にして説明する。
【００５２】
まず、処理３０１にて、連携デバイス抽出部１２４が、対象とする制御システム全体のシステムデバイス設定情報を取得する。
システムデバイス情報は、対象としている制御システムに一つだけ存在する場合の他、システムデバイスの実体が定義されているシーケンサＣＰＵのパラメータとして定義されている場合もある。
また、この時にシステムデバイス設定情報に定義されているシステムデバイスの数を取得する。
【００５３】
次に、処理３０２にて、取得したシステムデバイスの数だけ繰返しを行う。
【００５４】
次に、処理３０３にて、連携デバイス抽出部１２４が、システムデバイス情報から、システムデバイス名称とシステムデバイスの実体が定義されているシーケンサＣＰＵでのデバイス情報を取得する。
【００５５】
次に、処理３０４にて、当該システムデバイスを使用している制御プログラムを抽出する。
【００５６】
さらに、処理３０５にて、連携デバイス抽出部１２４が、各制御プログラムで使用しているシステムデバイスに対応するノード情報を取得し、グルーピングする。
グルーピングした結果は、図２２に例として示されるようなデバイスグループ情報として保存される。
【００５７】
次に、処理３０６にて、連携デバイス抽出部１２４が、グルーピングされたノード群について、当該システムデバイスの実体を定義しているシーケンサＣＰＵの対応する制御プログラムを中心として、ハブ接続の形式で、エッジを新規に定義する。
当該システムデバイスに関して、グルーピングされたノードは上記のようにエッジによりハブ型で表示することもできれば、グルーピングされたノード群を１つのノードに縮約し、これを別のシステムデバイスアイコンを用いて表示することもできる。
この仕組みはデバイスグループの表示と同じ方法にて実現できる。
【００５８】
以上のように処理３０３〜処理３０６がシステムデバイスの数だけ繰り返されることにより、同一のシステムデバイスを使用している複数の制御プログラムや機器間での連携情報が新規エッジによって構築される。
【００５９】
次に、リフレッシュ設定情報を利用した複数の制御プログラムや機器間の連携情報構築手順について説明する。
リフレッシュ設定情報は、制御システム内のネットワークマスタ毎に存在する。
リフレッシュ設定情報は、ネットワーク内で使用されてネットワークマスタ内のメモリとして定義されているデバイスを、制御プログラムで直接利用できるようにするために、シーケンサＣＰＵ内のメモリにマッピングしている情報である。
なお、バスの場合は通常バスマスタであるシーケンサＣＰＵが持つバス割付設定情報が、このリフレッシュ設定情報を兼ねている。
【００６０】
まず、処理４０１にて、対象とする制御システム内のシーケンサＣＰＵの数だけ繰返しを行う。
【００６１】
次に、処理４０２にて、ネットワークマスタの数だけ繰返しを行う。これはつまりリフレッシュ設定の数だけ繰返しを行うことと等しい。
【００６２】
次に、処理４０３にて、連携デバイス抽出部１２４が、リフレッシュ設定情報内の解析を行う。
リフレッシュ設定情報は例として図７に示すような構造になっており、基本的にネットワークマスタ側のメモリアドレス（デバイス）と、シーケンサＣＰＵ側のデバイスの対応関係が示されている。
またリフレッシュ設定情報は、デバイス種別ごとに分割されている場合がある。
【００６３】
次に、処理４０４にて、連携デバイス抽出部１２４が、リフレッシュ設定情報をもとに、ネットワークマスタ側のデバイスとシーケンサＣＰＵ側のデバイスで対となるデバイスについてグルーピングを行い、既に処理２１２にて作成しているデバイスグループ情報を修正する。
図２の処理２１２では、ネットワーク割付設定情報からグループを抽出しているが、これはネットワークの各局に割り当てられた、ネットワークマスタが保持するデバイス、つまり図１０でのデバイスメモリ１０２１の割り当てに従ってグルーピングを行っている。
しかし、制御プログラムで直接使用するのは通常シーケンサＣＰＵ内のデバイス、つまり図１０でのデバイスメモリ１０１６になるため、リフレッシュ設定情報により、シーケンサＣＰＵとネットワークマスタ間でデバイスのリフレッシュが行われることが多い。
したがって、処理２１２時点でグルーピングした、ネットワークマスタが保持するネットワークデバイスを、処理４０４にてシーケンサＣＰＵ内のデバイスに置き換えることを行う。
ただし、ネットワークマスタのデバイスと、シーケンサＣＰＵ内のデバイスを明確に区別する必要がある場合は、処理４０４によって置き換えるのではなく、新たにデバイスグループ情報を追記することもできる。
これにより、処理２１２で実施したネットワークデバイスの割付によるグルーピングと、処理４０４で実施するリフレッシュ設定情報によるグルーピングを独立させて表現することができる。
【００６４】
次に、処理４０５にて、グラフ生成部１１２が、実際に制御プログラムで使用されているデバイスのうち、処理４０４で設定したデバイスグループ情報に合致するものについて、接続情報あるいはエッジ構造体に追加を行う。
【００６５】
以上のように、処理４０３〜処理４０５がネットワークマスタの数、つまりリフレッシュ設定情報の数だけ繰り返されることにより、制御システム全体の中の複数の制御プログラムと機器と、それらを接続するネットワークのマスタ機器間のデバイスの連携を新規エッジとして構築できる。
【００６６】
≪具体例≫
ここでは、有閉路有向グラフとして表現された複数の制御プログラムと、機器と、それらを接続するために設定された、デバイス割付情報とデバイス連携情報の一例を示し、図１〜図４で開示した方法によりどのように処理されて、最終的にそれがどのように画面へ表示されるのかについて、具体例をもって説明する。
【００６７】
図１０は、制御システムの構成例である。
この例では、２つのシーケンサシステムと１つの機器がネットワーク１０７２によって接続されている。
１つ目のシーケンサシステムは、シーケンサＣＰＵ１０１０とネットワークマスタ１０２０によって構成され、この間はバス１０７１によって接続されている。
２つ目のシーケンサシステムは、バス１０７４によってシーケンサＣＰＵ１０４０とネットワークユニット１０５０が接続され、シーケンサＣＰＵ１０４０のＩ／Ｏ接続１０７３として入力（Ｘ）ユニット１０８０と出力（Ｙ）ユニット１０９０を介して機器１０３０が接続されている。
ネットワーク１０７２には以上のシーケンサシステムの他に、ネットワークの子局として機器１０６０が接続されている。
【００６８】
なお、以下では、シーケンサＣＰＵ１０１０とネットワークマスタ１０２０から構成されるシーケンサシステムを、「子局１」ともいう。
また、シーケンサＣＰＵ１０４０とネットワークユニット１０５０と入力（Ｘ）ユニット１０８０と出力（Ｙ）ユニット１０９０と機器１０３０から構成されるシーケンサシステムを、「子局２」ともいう。
また、機器１０６０を「子局３」ともいう。
【００６９】
また、図１０の制御システムにおいて、機器１０３０、機器１０６０が入出力機器の例に相当する。
また、ネットワークマスタ１０２０、ネットワークユニット１０５０、入力（Ｘ）ユニット１０８０、出力（Ｙ）ユニット１０９０は、シーケンサＣＰＵ１０１０、１０４０と、機器１０３０、１０６０との間で入出力される信号を中継するユニットであり、それぞれ中継装置の例に相当する。
【００７０】
図１０のシーケンサＣＰＵ１０１０内には制御プログラム１０１１と制御プログラム１０１２とデバイスメモリ１０１６があり、パラメータ情報として、バス割付設定情報１０１３、ネットワーク割付設定情報１０１４、リフレッシュ設定情報１０１５が設定されている。
ネットワーク割付設定情報１０１４とリフレッシュ設定情報１０１５は、ネットワークマスタ１０２０のために用意される情報である。
ネットワークマスタ１０２０には、デバイスメモリ１０２１がある。
【００７１】
図１０のシーケンサＣＰＵ１０４０内には制御プログラム１０４１とデバイスメモリ１０４５があり、パラメータ情報として、バス割付設定情報１０４２、システムデバイス設定情報１０４３、リフレッシュ設定情報１０４４が設定されている。
ネットワークユニット１０５０内にはデバイスメモリ１０５１がある。
なおネットワークマスタは存在ないため、この例ではシーケンサＣＰＵ１０４０内にネットワーク割付設定情報の記述はしていない。
しかしネットワークによっては、マスタ以外の子局にもこれらのパラメータ情報を格納される場合がある。
【００７２】
シーケンサＣＰＵ１０４０にはＩ／Ｏ接続（近接）で接続された機器１０３０がある。
機器１０３０にはデバイスメモリ１０３２と、この機器１０３０のメモリ構成等について記述されたデバイスプロファイル情報１０３１が格納されている。
この例ではデバイスプロファイル情報が機器内に格納されている例を示しているが、これら機器内（制御システム内）ではなく、制御システムへ接続するエンジニアリングツールがインストールされたパソコン内やインターネットやクラウド上に情報として保持しておく構成でもよい。
【００７３】
図１０の機器１０６０内にはデバイスメモリ１０６２と、この機器１０６０のメモリ構成等について記述されたデバイスプロファイル情報１０６１が格納されている。
この例ではデバイスプロファイル情報が機器内に格納されている例を示しているが、これら機器内（制御システム内）ではなく、制御システムへ接続するエンジニアリングツールがインストールされたパソコン内やインターネットやクラウド上に情報として保持しておく構成でもよい。
【００７４】
図１１〜図１３は、図１０のシーケンサＣＰＵ１０１０内の制御プログラム１０１１、同シーケンサＣＰＵ内の制御プログラム１０１２、シーケンサＣＰＵ１０４０内の制御プログラム１０４１、のラダープログラムの例を表している。
各制御プログラムには、図１０の制御システムでシーケンサＣＰＵ１０１０、１０４０が機器１０３０、１０６０を制御するための制御アルゴリズムが定義されている。
また、図１４〜図１６はそれぞれ図１１〜図１３のラダープログラムを有閉路有向グラフで表現した模式図である。
これらの有閉路有向グラフは、後述する実施の形態２以降の方法により作成される。
有閉路有向グラフの生成方法の詳細は実施の形態２以降で説明するため、図１４〜図１６の構成方法は、ここでは触れない。
【００７５】
シーケンサＣＰＵ１０１０内のバス割付設定情報１０１３は、例えば、図５のバス割付設定情報５１０に示す内容をもち、シーケンサＣＰＵ１０４０内のバス割付設定情報１０４２は、例えば、図５のバス割付設定情報５２０に示す内容をもつ。
バス割付設定情報には、シーケンサＣＰＵとバスにより接続されている中継装置ごとに、中継装置で用いられる変数の範囲が定義されている。
具体的には、バス割付設定情報５１０（１０１３）では、シーケンサＣＰＵ１０１０とバス１０７１により接続されている中継装置であるネットワークマスタ１０２０で用いられる変数の範囲（「先頭ＸＹ」に示されるアドレスから、「点数」で特定されるアドレスまでの範囲）が定義されている。
同様に、バス割付設定情報５２０（１０４２）では、シーケンサＣＰＵ１０４０とバス１０７４により接続されている中継装置であるネットワークユニット１０５０で用いられる変数の範囲が定義されている。
更に、シーケンサＣＰＵ１０４０とバス１０７３ａにより接続されている中継装置である入力（Ｘ）ユニット１０８０で用いられる変数の範囲が定義されている。
更に、シーケンサＣＰＵ１０４０とバス１０７３ｂにより接続されている中継装置である出力（Ｙ）ユニット１０９０で用いられる変数の範囲が定義されている。
バス割付設定情報は、中継装置変数範囲情報の例に相当する。
【００７６】
シーケンサＣＰＵ１０１０内のネットワーク割付設定情報１０１４は、例えば、図６のネットワーク割付設定情報６１０の内容をもつ。
ネットワーク割付設定情報６１０（１０１４）では、ネットワークマスタ１０２０と、ネットワークマスタ１０２０が管理する局（局１〜３）との間で用いられる変数の範囲が定義されている。
ネットワーク割付設定情報も、中継装置変数範囲情報の例に相当する。
【００７７】
シーケンサＣＰＵ１０１０内のリフレッシュ設定情報１０１５は、例えば、図７のリフレッシュ設定情報７１０に示す内容をもち、シーケンサＣＰＵ１０４０内のリフレッシュ設定情報１０４４は、例えば、図７のリフレッシュ設定情報７２０に示す内容をもつ。
リフレッシュ設定情報では、ネットワークマスタ１０２０で用いられる変数の範囲と、シーケンサＣＰＵ１０１０、１０４０で用いられる変数との対応関係が定義される。
具体的には、リフレッシュ設定情報７１０（１０１５）では、ネットワークマスタ１０２０で用いられる変数の範囲（例えば、６４点、０ｘ００００）と、シーケンサＣＰＵ１０１０で用いられる変数（例えば、Ｘ、０ｘ０１００）との対応関係が定義される。
同様に、リフレッシュ設定情報７２０（１０４４）では、ネットワークマスタ１０２０で用いられる変数の範囲（例えば、６４点、０ｘ００００）と、シーケンサＣＰＵ１０４０で用いられる変数（例えば、Ｘ、０ｘ０１００）との対応関係が定義される。
リフレッシュ設定情報も、中継装置変数範囲情報の例に相当する。
【００７８】
シーケンサＣＰＵ１０４０内のシステムデバイス設定情報１０４３は、例えば、図８のシステムデバイス設定情報８１０に示す内容をもつ。
システムデバイス設定情報８１０（１０４３）では、２つ以上の制御プログラムに記述されている相互に異なる２つ以上の変数が対応付けられている。
つまり、システムデバイス設定情報８１０（１０４３）では、制御プログラム１０１２（図１２）に記述されている変数“起動許可信号”と、制御プログラム１０４１（図１３）に記述されている変数「Ｘ１０００」とが対応付けられている。
システムデバイス設定情報は、変数対応付け情報の例に相当する。
【００７９】
機器１０６０内のデバイスプロファイル情報１０６１は、例えば、図９のデバイスプロファイル情報９１０に示す内容をもち、機器１０３０内のデバイスプロファイル情報１０３１は、例えば、図９のデバイスプロファイル情報９２０に示す内容をもつ。
デバイスプロファイル情報は、機器で用いられる変数の範囲が定義されている。
デバイスプロファイル情報では、変数範囲は、デバイスの種別（例えば、Ｘ）とアドレス（ｎ＋０ｘ００）で定義されている。
アドレスに示される「ｎ」はベースアドレスを表しており、「＋０ｘ００」は、ベースアドレスに対するオフセットである。
デバイスプロファイル情報は、入出力機器変数範囲情報の例に相当する。
【００８０】
図１１に示したのは、シーケンサＣＰＵ１０１０内で動作する制御プログラム１０１１のラダー図である。
この制御プログラムでは、ネットワーク１０７２に接続された機器１０６０からの２つの入力信号Ｘ１３０（１１０１）とＸ１３８（１１０３）の状態から、１１０４によって内部デバイスをＯＮし、この内部デバイスの自己保持（１１０２）によって、１１０５により０．５秒間の内部タイマを作動させている。
１１０６にて内部タイマがＯＮになると、ネットワークデバイス（Ｙ２００）をＯＮさせている。
【００８１】
図１２に示したのは、シーケンサＣＰＵ１０１０内で動作する制御プログラム１０１２のラダー図である。
この制御プログラムでは、ネットワークデバイスＹ２００がＯＮになり（１２０１）、機器１０６０の停止信号（Ｂ接ＣＮＴ）がＯＦＦであれば（１２０２）、１２０３にて内部カウンタをカウントアップする。
この内部カウンタは、同じく機器１０６０の起動までの信号回数で設定された数だけカウントすると、接点がＯＮとなる。
１２０４にて内部カウンタの接点がＯＮとなると、システムデバイスである“起動許可信号”をＯＮにする（１２０５）。
【００８２】
なお、図１１および図１２で示した制御プログラムは同一のシーケンサＣＰＵ上で動作するプログラムであるため、本来はネットワークデバイスＹ２００を介さずに情報をやり取りさせることも可能である。
ここでは具体例の説明のためにこのようなプログラムを例に挙げている。
【００８３】
図１３に示したのは、シーケンサＣＰＵ１０４０内で動作する制御プログラム１０４１のラダー図である。
この制御プログラムでは、機器１０３０の信号で入力ユニット１から入るＸ２０（１３０１）と、システムデバイス“起動許可信号”の実アドレスであるＸ１０００（１３０２）を見て、両方がＯＮであり、かつ入力ユニット１から入る信号Ｘ２ＦがＯＦＦである場合（１３０４）に、１３０５により内部デバイスがＯＮする。以降は１３０３により内部デバイスが自己保持する。
また内部デバイスの状態は１３０６と１３０７によって、出力ユニット１を介して機器１０３０の信号へ出力される。
【００８４】
図１１〜図１３に示される制御プログラムが、図１に示した制御プログラム中間コード記憶部１０１に格納され、デバイスグループ抽出部１２３及び連携デバイス抽出部１２４により読み出され、図２〜図４の処理の対象となる。
なお、図１１〜図１３に示すデバイスのうち、「Ｘ１３０」のように先頭に「Ｘ」のあるデバイスが、シーケンサＣＰＵが機器から信号を入力するために用いられる変数である。
また、「Ｙ２００」のように、先頭に「Ｙ」のあるデバイスが、シーケンサＣＰＵが機器へ信号を出力するために用いられる変数である。
これら先頭に「Ｘ」及び「Ｙ」があるデバイスが、信号入出力用変数の例に相当する。
【００８５】
図１４は、図１１に示されたラダープログラムを、有閉路有向グラフとして表現し、表示した例の模式図である。
図１５は、図１２に示されたラダープログラムを、有閉路有向グラフとして表現し、表示した例の模式図である。
図１６は、図１３に示されたラダープログラムを、有閉路有向グラフとして表現し、表示した例の模式図である。
図１４〜図１６の有閉路有向グラフは、グラフ生成部１１２で生成し、結果出力部１０９で表示することができる。
【００８６】
なお、これら図１１〜図１３を見ただけでは、図１０に示した制御システム全体で、どのような制御が行われているのか俯瞰することは困難である。
また、実施の形態２以降で開示する方法により、これら３つの制御プログラムを図１４〜図１６にあるように有閉路有向グラフ（模式図）として表したとしても、ここから制御システム全体の連携動作を理解することは困難である。
なぜならば、３つの制御プログラムと２つの機器のどの信号がどのように連携して制御システム全体を構成しているのか不明な部分が多いためである。
上記で図１１〜図１３として説明した文章は、図５〜図９に記したデバイス連携情報例およびデバイス割付情報例を加味して、図１１〜図１３に使用されているデバイスの意味を加えて説明したものである。
図１１〜図１３の制御プログラムにコメント類をつけるか、デバイスにコメントやラベルなどの変数名をつけることなしに、これらの制御プログラムを理解することは困難であり、またたとえそれがあったとしても、複数の制御プログラムと機器の連携動作を一度に俯瞰して確認することは難しい。
以下に、本実施の形態で開示する方法によって、図１４〜図１６にある有閉路有向グラフがどのようにデバイスをグルーピングし、制御プログラムが連携表示されるのかについて具体的に説明する。
なお、図１０および図１１〜図１３、図５〜図９に記した情報はすべて、制御システム全体を対象にする統合管理ツール、または個々のシーケンサＣＰＵを対象にするエンジニアリングツールによって、保持・管理されている内容であり、制御システム全体を正常に動作させるために必要な情報である。
これらはユーザにより設定されるか、ユーザが設定した情報により自動作成される情報である。
これらの情報の準備・作成方式については、さまざまなものが考えられるが、どの方式がとられてもかまわない。
【００８７】
≪デバイスのグルーピング≫
まず、デバイス割付情報を元にしたデバイスのグルーピングについて、図１０および図１４〜図１６の例を元に、図２に記したフローに沿ってデバイスグループ情報の構築手順を以下に記す。
【００８８】
図１０の構成によれば、シーケンサＣＰＵの数は２であるため、処理２０１〜処理２０５の手順を２回繰り返す。
【００８９】
処理２０２では、図５に示された、各シーケンサＣＰＵのバス割付設定情報５１０、５２０から、ユニットの数がそれぞれシーケンサＣＰＵ１０１０の場合は１、シーケンサＣＰＵ１０４０の場合は３であることが分かるため、処理２０４を、それらの数だけ繰り返す。
【００９０】
処理２０４では、バス割付設定情報５１０の最初のユニットのレコード「ネットワークマスタ１」５１２の情報から、先頭ＸＹが「０ｘ００００」であり、点数が「３２点」であることが分かるため、これに従って、デバイスグループ抽出部１２３により、図２２に示されるデバイスグループ情報２２００の２２０１に示されたレコードＧ１が作成される。
同様に、図５の例えばシーケンサＣＰＵ１０４０の２番目のユニットである「入力（ｘ）ユニット１」の場合は、レコード５２３を参照し、デバイスグループ抽出部１２３により、デバイスグループ情報２２００の２２０３に示されたレコードＧ３が作成されることになる。
このように、処理２０４により、バス割付設定情報に記されたユニット単位でのグルーピング情報が構築される。
図２２の例では、デバイスグループ抽出部１２３により、２２０１〜２２０４（Ｇ１〜Ｇ４）の４レコードが、処理２０４によって作成される。
【００９１】
次に、処理２０６にて、各シーケンサＣＰＵに接続された機器の数、つまりシーケンサＣＰＵ１０１０の場合は０（接続なし）、シーケンサＣＰＵ１０４０の場合は１（機器１０３０）だけ、処理２０７を行う。
各シーケンサＣＰＵに接続された機器の数は、制御システム全体を管理する統合管理ツール等によって保持されていてもよいし、機器プロファイル情報とともにユーザが指定してもよい。
【００９２】
処理２０７において、デバイスグループ抽出部１２３は、機器１０３０についてのデバイスプロファイル情報９２０からグループ抽出を行う。
グルーピングの結果は、デバイスグループ情報２２００の２２０５に示されたレコードＧ５として表現される。
なお、ここではデバイスプロファイル情報単位でグルーピングを行うとしているが、多くの機能を持つ機器や、アナログ入出力機器など同一機能を複数チャンネル持つ機器など、デバイスプロファイル内に機能の階層を持つ機器については、デバイスプロファイル内でさらにグルーピングの階層を持たせてもよい。
このようにグルーピングが階層を持つ場合は、グルーピングの番号やＩＤを対象デバイスとして用いることで表現できる。
ただし、このような多階層のグルーピング構造をどのように表現するのかについては、任意である。
ＣｙｔｏｓｃａｐｅやＧｅｐｈｉなどの一般的な大規模グラフ表示ツール等で実現されている方法をとってもよい。
【００９３】
次に、処理２０９により、デバイスグループ抽出部１２３は、バス割付設定情報から、ネットワークマスタの特定を行う。
バス割付設定情報５１０から、シーケンサＣＰＵ１０１０にはネットワークマスタが１台接続されていることが分かる。
【００９４】
次に、処理２１０にて、デバイスグループ抽出部１２３は、このネットワークマスタに関連するネットワーク割付設定情報６１０を確認して、当該ネットワークの総局数を取得する。
この例では、ネットワーク割付設定情報６１０のレコード数が総局数となるため、３が取得できる。
このため、次の処理２１１〜処理２１４が３回繰り返される。
【００９５】
処理２１２にて、デバイスグループ抽出部１２３は、ネットワーク割付設定情報６１０からグループを抽出する。
この例では、ネットワーク割付設定情報６１０の各レコード６１１、６１２、６１３単位でグルーピングを行う。
この結果は、デバイスグループ情報２２００のそれぞれ２２０６、２２０７、２２０８に示されたレコードＧ６、Ｇ７、Ｇ８として作成される。
この例では、グルーピングの単位を局単位としているが、ネットワーク割付設定情報６１０の例でも示したようにデバイスのタイプによって情報が分かれている場合があるため、より詳細なグルーピングを行ってもよい。
例えば、ビット入力（ＬＸ）とビット出力（ＬＹ）とワードの３つに分割して、デバイスグループ情報へ設定してもよい。
【００９６】
次に、処理２１３にて、デバイスグループ抽出部１２３は、ネットワーク１０７２に接続された機器１０６０について、デバイスプロファイル情報９１０からグルーピングを行う。
この結果、機器１０６０についてのデバイスグループ情報が図２２の２２０９で示されたレコードＧ９として作成される。
デバイスプロファイル情報内の構造については、処理２０７と同じく、対象となるデバイスプロファイルの定義に従って、さらに階層的にグルーピングを行っても構わない。
【００９７】
≪デバイスの連携≫
次に、デバイス連携情報を元にした、制御システム内の複数の制御プログラムと機器間の連携を一画面で俯瞰表示する方法について、図１０および図１４〜図１６の例を元に、図３および図４に記したフローに沿って以下に記す。
【００９８】
まず、システムデバイス設定情報に対する処理について図３を用いて説明する。
【００９９】
処理３０１では、連携デバイス抽出部１２４は、システムデバイス設定情報からシステムデバイスの数を取得する。
図１０の例ではシステムデバイス設定情報１０４３は、図８のシステムデバイス設定情報８１０に示したものになっており、その数は１となる。
したがって、処理３０２以降を、システムデバイス設定情報１０４３（８１０）の数１だけ繰り返す。
なお、この例ではシステムデバイス設定情報１０４３（８１０）は、定義されるシステムデバイスの実体メモリが存在するシーケンサＣＰＵ１０４０にあるものと想定しているが、システムデバイス設定情報１０４３（８１０）は、制御システムの統合管理ツールが管理できる場所であれば、どこに存在しても構わない。
【０１００】
処理３０３では、連携デバイス抽出部１２４は、システムデバイス設定情報１０４３（８１０）から名称と実デバイスを取得する。
システムデバイス設定情報８１０のレコード８１１に示された情報から、システムデバイス名称が“起動許可信号”であることと、定義ＣＰＵとアドレスの情報から、実デバイスが「シーケンサＣＰＵ１０４０のアドレスＸ１０００」であることを得る。
また、当該システムデバイスを使用しているシーケンサＣＰＵが、ＣＰＵ１０１０であることが分かる。
定義ＣＰＵと使用ＣＰＵに関してはＩＤで定義されていてもよいし、あるいは制御プログラム単位で指定されていてもよい。
次に、処理３０４にて、当該システムデバイスが使用される制御プログラムを特定する。
図８の使用ＣＰＵの欄から、当該システムデバイスを使用しているシーケンサＣＰＵが１０１０、つまり制御プログラム１０１１と１０１２であることが判明する。
なお、図８では「ＣＰＵ１０１０」と記したが実際には各シーケンサＣＰＵを特定するＩＤとして情報保持していてもよいし、当該システムデバイスが使用されている制御プログラムを直接指定していてもよい。
【０１０１】
次に、処理３０５にて、連携デバイス抽出部１２４は、システムデバイスのグルーピングを行う。
システムデバイス設定情報８１１により、定義ＣＰＵ１０４０内の制御プログラム１０４１のデバイス「Ｘ１０００」と、使用ＣＰＵ１０１０内の制御プログラム１０１２のデバイス“起動許可信号”がグルーピングされ、図２３に示されたデバイスグループ情報例のレコード２３１３（Ｇ１０）として追加される。
【０１０２】
次に、処理３０６にて、連携デバイス抽出部１２４は、定義デバイスと使用デバイスの間に新しいエッジを定義する。
この例では制御プログラム１０４１のデバイス「Ｘ１０００」と、制御プログラム１０１２のデバイス“起動許可信号”の間にエッジが追加される。
これは複数プログラムや機器間の連携を表現するために追加される。
また、使用デバイスが２箇所以上記述されている場合は、定義デバイスから使用デバイスへ、定義デバイスをハブとしたスター型トポロジにてエッジが追加される。
【０１０３】
次に、リフレッシュ設定情報に対する処理について図４を用いて説明する。
【０１０４】
処理４０１では、連携デバイス抽出部１２４は、シーケンサＣＰＵの数だけ繰返しを行う。
図１０の例では２回繰り返す。
【０１０５】
次に、処理４０２にて、連携デバイス抽出部１２４は、図２の処理２０２，処理２０３の処理と同様の処理を行って、ネットワークマスタの数を取得する。
ここではシーケンサＣＰＵ１０１０に注目し、ネットワークマスタ１０２０の数、１を取得する。
つまり１回だけ繰返す。
【０１０６】
次に、処理４０３にて、連携デバイス抽出部１２４は、ネットワークマスタ１０２０用に用意された、リフレッシュ設定情報７１０の解析を行う。
具体的にはリフレッシュ設定情報７１０に設定されたレコード毎にデバイスの分類を行う。
レコード７１１から、ネットワークマスタ側のビット入力デバイス（ＬＸ）の０ｘ００００〜０ｘ００３Ｆの６４点分が、シーケンサＣＰＵ側のデバイスＸの０ｘ０１００〜０ｘ０１３Ｆまでにリフレッシュされることが分かる。
また、レコード７１２から、ネットワークマスタ側のビット出力デバイス（ＬＹ）の０ｘ００００〜０ｘ００３Ｆの６４点分が、シーケンサＣＰＵ側のデバイスＹの０ｘ０２００〜０ｘ２３Ｆまでにリフレッシュされることが分かる。
また、レコード７１３から、ネットワークマスタ側のワードデバイス（ＬＷ）の０ｘ００００〜０ｘ００３Ｆの６４点分が、シーケンサＣＰＵ側のデバイスＤの０ｘ０１００〜０ｘ１３Ｆまでにリフレッシュされることが分かる。
【０１０７】
次に、先に説明したネットワーク割付設定情報６１０によって設定されたデバイスグループ情報を修正する。
前述したように、図２の処理２１２では、ネットワーク割付設定情報６１０からグループを抽出しているが、これはネットワークの各局に割り当てられた、ネットワークマスタが保持するデバイス、つまり図１０でのデバイスメモリ１０２１の割り当てに従ってグルーピングを行っている。
しかし、制御プログラムで直接使用するのは通常シーケンサＣＰＵ内のデバイス、つまり図１０でのデバイスメモリ１０１６になるため、リフレッシュ設定情報により、シーケンサＣＰＵとネットワークマスタ間でデバイスのリフレッシュが行われることが多い。
したがって、処理２１２時点でグルーピングした、ネットワークマスタが保持するネットワークデバイスを、処理４０４にてシーケンサＣＰＵ内のデバイスに置き換えることを行う。
ただし、ネットワークマスタのデバイスと、シーケンサＣＰＵ内のデバイスを明確に区別する必要がある場合は、処理４０４によって置き換えるのではなく、新たにデバイスグループ情報を追記することもできる。
これにより、処理２１２で実施したネットワークデバイスの割付によるグルーピングと、処理４０４で実施するリフレッシュ設定情報によるグルーピングを独立させて表現することができる。
【０１０８】
具体的に、デバイスグループ情報２２００のレコード２２０６（Ｇ６）に記されたデバイスグループについて説明する。
デバイスグループ情報２２０６（Ｇ６）では子局１（つまりネットワークマスタ）のデバイスであるＬＸ００００〜００１Ｆ、ＬＹ００００〜００１Ｆ、ＬＷ００００〜０００Ｆをグルーピングしている。
これに注目して説明する。
リフレッシュ設定情報７１０のＬＸデバイスに対するレコード７１１では、ＬＸ００００〜００３ＦをＣＰＵのＸ０１００〜０１３Ｆへリフレッシュすることが記されている。
つまり、デバイスグループ情報２２０６（Ｇ６）をネットワークマスタのデバイスからシーケンサＣＰＵのデバイスへ置き換えるため、ＬＸ００００〜００１Ｆまでを、シーケンサＣＰＵのデバイスＸ０１００〜０１１Ｆへ置き換える。
同様に、リフレッシュ設定情報７１０のＬＹデバイスに対するレコード７１２では、ＬＹ００００〜００３ＦをＣＰＵのＹ０２００〜０２３Ｆへリフレッシュすることが記されている。
つまり、デバイスグループ情報２２０６（Ｇ６）をネットワークマスタのデバイスからシーケンサＣＰＵのデバイスへ置き換えるため、ＬＹ００００〜００１Ｆまでを、シーケンサＣＰＵのデバイスＹ０２００〜０２１Ｆへ置き換える。
同様に、リフレッシュ設定情報７１０のＬＷデバイスに対するレコード７１３では、ＬＷ００００〜００３ＦをＣＰＵのＤ０１００〜Ｄ０１３Ｆへリフレッシュすることが記されている。
つまり、デバイスグループ情報２２０６（Ｇ６）をネットワークマスタのデバイスからシーケンサＣＰＵのデバイスへ置き換えるため、ＬＷ００００〜００１Ｆまでを、シーケンサＣＰＵのデバイスＤ０１００〜Ｄ０１１Ｆへ置き換える。
以上がデバイスグループ情報２２０６（Ｇ６）の置換え手順であり、この結果、子局１について、図２３のレコード２３０６（Ｇ６−１）のデバイスグループ情報が作成される。
このことは子局２、３についても行われ、同様に２３０７、２３０８のレコード（Ｇ７−１、Ｇ８−１）が作成される。
また、さらに、図１０におけるネットワークユニット１０５０とシーケンサＣＰＵ１０４０の間に設定されたリフレッシュ設定情報７２０についても同様の処理が行われ、これにより図２３のレコード２３０９〜２３１１のデバイスグループ情報（Ｇ６−２、Ｇ７−２、Ｇ８−２）が作成される。
【０１０９】
次に、処理４０５にて、グルーピングされたデバイス群について、デバイス番号が同じものについては、そのデバイス間でエッジが追加される。
【０１１０】
以上のようにデバイス連携情報、つまりシステムデバイス情報とリフレッシュ設定情報を元にしてグルーピングおよびエッジの追加が行われることで、図１４〜図１６にデバイス割付情報を適用して図１７に示した構造ができ、更に、図１７から図１８に示した構造ができあがる。
【０１１１】
図１７では、デバイスＸ１３０、Ｘ１３８、Ｘ１３９、Ｄ１３０が囲み線１７１０によりグルーピングされ、また、これらデバイスが機器１０６０のデバイス名である「スイッチ１」（図９）と関連付けられている。
また、デバイスＸ２０とＹ３２が囲み線１７２０によりグルーピングされ、また、これらデバイスが機器１０３０のデバイス名である「モータ１」（図９）と関連付けられている。
【０１１２】
囲み線１７１０によるデバイスＸ１３０、Ｓ１３８、Ｘ１３９、Ｄ１３０のグルーピングは、図４の処理４０５による。
図４の処理４０５は、図２４に示す手順で実現される。
図２４は，プログラムで使用されている各デバイスが，デバイスグループの対象デバイスに含まれるかどうかの判定を行っている。
図２４の処理２４０１では、対象となっている制御プログラム内のすべてのデバイスを対象としてループする。次の処理２４０２では図２３に示されるようなデバイスグループ情報の各グループについてループする。
処理２４０３ではデバイスグループ情報の対象デバイス欄にベースアドレスとして未決定（変数が使用されている）かどうか確認する。ベースアドレスが未計算の場合は、処理２４０４にて、計算を行う。ベースアドレス計算にはデバイス割付設定情報とリフレッシュ設定情報（図５〜８）を用いる。
次に処理２４０５にて、制御プログラム内のデバイスについて、各グループに該当するか否かのチェックを行う。グループに該当する場合は、そのグループのデバイスグループ情報として注目している制御プログラム内のデバイスが追加される。これらがデバイスグループ情報および制御プログラム内の全デバイスについて繰り返される（処理２４０３７、２４０８）。
以下に、図２４の処理フローを囲み線１７１０の例をとって説明する。
囲み線１７１０によるグルーピングでは、図２５に示すように図２３のレコードＧ８−３とレコードＧ９が用いられる。
連携デバイス抽出部１２４は、図２３のレコードのうち対象機器がＣＰＵ１０１０となっているレコード（Ｇ１、Ｇ６−１、Ｇ７−１、Ｇ８−１）の対象デバイスの欄に記述されている変数範囲の各変数をベースアドレスとし、総当たりで、図２３のＧ９のレコードに記述されている「Ｘ＋００００、Ｘ＋０００８−０００９、Ｄ＋００００」とのオフセット加算を行う。
そして、図２３のレコードＧ８−１に記述されている「Ｘ０１３０」と「Ｄ０１３０」をベースアドレスとしたオフセット加算の加算結果の中に、Ｘ１３０、Ｘ１３８、Ｘ１３９、Ｄ１３０が含まれるため、図２３のレコードＧ９のグループ名「スイッチ１」から、連携デバイス抽出部１２４は、Ｘ１３０、Ｘ１３８、Ｘ１３９、Ｄ１３０はシーケンサＣＰＵ１０１０が「スイッチ１」と信号を入出力するための変数であると判断することができる。
この結果、図１７に示すように、バイスＸ１３０、Ｘ１３８、Ｘ１３９、Ｄ１３０が囲み線１７１０によりグルーピングされ、また、これらデバイスが「スイッチ１」と関連付けられる。
【０１１３】
また、囲み線１７２０によるデバイスＸ２０とＹ３２のグルーピングも、図４の処理４０５による。
囲み線１７２０によるグルーピングでは、図２５に示すように図２３のレコードＧ３、レコードＧ４とレコードＧ５が用いられる。
連携デバイス抽出部１２４は、図２３のレコードのうち対象機器がＣＰＵ１０４０となっているレコード（Ｇ２、Ｇ３、Ｇ４、Ｇ６−２、Ｇ７−２、Ｇ８−２）の対象デバイスの欄に記述されている変数範囲の各変数をベースアドレスとし、総当たりで、図２３のＧ５のレコードに記述されている「Ｘ＋００００−０００１、Ｙ＋０００２−０００３」とのオフセット加算を行う。
そして、図２３のレコードＧ３に記述されている「Ｘ００２０」とレコードＧ４に記述されている「Ｙ００３０」をベースアドレスとしたオフセット加算の加算結果の中に、Ｘ２０とＹ３２が含まれるため、図２３のレコードＧ５のグループ名「モータ１」から、連携デバイス抽出部１２４は、Ｘ２０とＹ３２はシーケンサＣＰＵ１０４０が「モータ１」と信号を入出力するための変数であると判断することができる。
この結果、図１７に示すように、Ｘ２０とＹ３２が囲み線１７２０によりグルーピングされ、また、これらデバイスが「モータ１」と関連付けられる。
【０１１４】
図１８において、囲み線１８１０と１８２０は、図１７の囲み線１７１０と１７２０と同じである。
囲み線１８３０は、制御プログラム１０１１（図１１、図１４）と制御プログラム１０１２（図１２、図１５）で共通に記述されている「Ｙ２００」をグルーピングしたものであり、ネットワーク割付情報６１０とリフレッシュ設定情報７１０に基づく。
また、囲み線１８４０は、制御プログラム１０１２（図１２、図１５）の“起動許可信号”と制御プログラム１０４１（図１３、図１６）の「Ｘ１０００」をグルーピングしたものであり、システムデバイス設定情報８１０に基づく。
囲み線１８４０により、制御プログラム１０１２と制御プログラム１０４１が連携関係にあることが表される。
【０１１５】
また、囲み線１８３０によるグルーピングは、図２５に示すように図２３のレコードＧ６−１が用いられる。
レコードＧ６−１の解釈は、「対象機器であるシーケンサＣＰＵ１０１０について、Ｘ０１００〜０１１Ｆと、Ｙ０２００〜０２１Ｆと、Ｄ０１００〜０１０Ｆをグルーピングする」となる。
図１７の１８３１のＹ２００は、制御プログラム１０１１で使用されているＹ２００（図１１の１１０７）である。
また、図１８の１８３２のＹ２００は、制御プログラム１０１２で使用されているＹ２００（図１２の１２０１）である。
これら２つの制御プログラム１０１１、１０１２は、両方ともＣＰＵ１０１０内で動作している。
このため、Ｇ６−１のグルーピング情報にてグルーピングが行われる。
【０１１６】
このように、図１４〜図１６にて別々に示された３つの制御プログラムと２つの機器が、図１８にて１つに接続され、連携動作の様子を表現することができている。
なお、図１７、図１８は、図１４〜図１６までに示された個々の制御プログラムのグラフ表現と、図２３に示されるデバイスグループ情報をまとめたもので、情報処理装置１００内で図１７、図１８に相当する情報を保持すればよく、結果出力部１０９により表示されなくてもよい。
結果出力部１０９は、例えば、後述する図１９〜図２１の内容を表示する。
また、これとは異なり、図１７又は図１８の内容を結果出力部１０９で表示してもよい。
図１７又は図１８の内容を結果出力部１０９で表示する場合は、グラフ生成部１１２が図１７又は図１８の内容を表す表示情報を生成する。
【０１１７】
≪グルーピングされたデバイスの表示≫
最後に、グラフ生成部１１２が、図１８に例として示した制御プログラムのグラフ表現をどのように加工し、結果出力部１０９が、実際にどのような形式で画面上に表示するかについて記す。
【０１１８】
図１８のうち、デバイス連携情報によりグルーピングされた箇所、つまり囲み線１８３０と１８４０でグルーピングしたデバイス群を１つのノードとして表現すると、図１９に示したようになる。
つまり、囲み線１８３０により相互に関連付けられた２つのノード（１８３１と１８３２）を１つのノード（１９３０）に集約し、また、２つのノード（１８３１と１８３２）有向エッジを、集約された１つのノード（１９３０）の有向エッジとする。
同様に、囲み線１８４０により相互に関連付けられた２つのノード（１８４１と１８４２）を１つのノード（１９４０）に集約し、また、２つのノード（１８４１と１８４２）有向エッジを、集約された１つのノード（１９４０）の有向エッジとする。
【０１１９】
さらに、図１９のうち、デバイス割付情報によりグルーピングされた箇所、つまり囲み線１９１０と１９２０でグルーピングしたデバイス群を１つのノードとして表現すると、図２０に示したようになる。
このようにグルーピングしたデバイスを１つのノードとして表現することによって、表示すべきノードの数が削減され、有閉路有向グラフ表現された制御プログラムの可読性が高まる。
さらに、縮約されたノード、２０１０、２０２０、２０３０、２０４０はユーザ操作によって、いつでも独立に展開することが容易に可能である。
【０１２０】
さらに、デバイスグループ情報はユーザ操作によって追加することができるため、例えば図２０において、制御プログラムの処理に対応する、内部デバイス２０５１と内部タイマ２０５２を「制御プログラムＡ」というノードにグルーピングし、同様に内部カウンタ２０５３を「制御プログラムＢ」、内部デバイス２０５５を「制御プログラムＣ」にグルーピングすることで、例えば図２１に示すような表示をさせることが可能である。
「制御プログラムＡ」は、図１０の制御プログラム１０１１に相当し、「制御プログラムＢ」は、制御プログラム１０１２に相当し、「制御プログラムＣ」は、制御プログラム１０４１に相当する。
【０１２１】
さらに、この図２１のノードについて、図２３に示すデバイスグループ情報の最右列に示したようなアイコン情報（Ｍｏｔｏｒ０１．ｊｐｇ、Ｓｗｉｔｃｈ０１．ｊｐｇ）から、特定の図などを表示させることで、ユーザにとってより分かりやすい制御システムの全体像として表示することができる。
【０１２２】
≪実施の形態における効果≫
本実施の形態が開示する方法によれば、ネットワークやバスなどで接続された、複数の制御プログラムや入出力信号を持つ機器間の連携動作を容易に確認するため、対象とする制御システム全体の制御ロジックを１つの画面に表示する。
この際に、複数の制御プログラムや入出力信号を持つ機器間の同一信号を抽出するために、これら複数の制御プログラムや機器の信号をネットワークやバスを介して通信するためのパラメータ設定情報（デバイス連携情報）を用いる。
さらに表示された制御ロジックの可読性向上のために、制御システムの設定情報（デバイス割付情報）から、デバイスを制御ロジック上意味のある単位でグルーピングして表示、またはユーザの指定する任意の単位でグルーピングして表示、またこれらのグルーピングを単一アイコンで表示する。
この方法により、複数の制御プログラムと機器から成る制御システム全体について、段階に応じて複数のデバイスをグルーピングし縮約してアイコン表示することができるため、制御システム全体を表示しながら、制御システム設計時や障害発生時に、ユーザは制御システム全体を画面内で俯瞰して見ながら、必要な部分は制御プログラムや機器のデバイス（信号）レベルまで詳細表示することが可能となる。
【０１２３】
このため、制御プログラムの構造化やデバッグ・保守作業の対象が一つの制御プログラムのスコープ内に限定されてしまうことがなく、また複数の制御プログラムと機器から構成される制御システム全体を俯瞰して表示する場合においても、注目したい機器や制御プログラム部分のみを詳細に表示し、他の構成要素は縮約して簡単なアイコン等で表示することができるため、多数のデバイスが用いられる制御システムにおいても、可読性を損なわずに、制御システムのロジック確認が可能となる。
【０１２４】
以上、本実施の形態では、
制御プログラムで制御される変数（デバイス）を抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、制御プログラムを有閉路有向グラフとしてＧＵＩにて表示する技術において、複数の制御プログラムや入出力機器で共通に使用されるデバイスを１つのノードとして表示、あるいはこれらのデバイスをエッジで接続して関連を表示することで、制御システム全体を１つの有閉路有向グラフとしてＧＵＩにて表示するシステムを説明した。
【０１２５】
また、複数の制御プログラムや入出力機器で共通に使用されるデバイスを特定するために、複数の制御プログラムや入出力機器を接続するネットワークやバスのパラメータとして設定されている「デバイス連携情報」を利用する、共通デバイス特定方法を説明した。
【０１２６】
また、制御プログラムで制御される変数（デバイス）を抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、単一あるいは複数の制御プログラムを有閉路有向グラフとしてＧＵＩにて表示する技術において、デバイスを任意の単位（デバイス種別単位、デバイス番号ごとの利用単位、デバイスの制御プログラムでの役割単位、ユーザの指定した単位）ごとに、画面上の近い座標位置に配置し、分類ごとにグルーピングして表示するシステムを説明した。
【０１２７】
また、デバイスのグルーピングの単位を決定するために、制御プログラムのパラメータとして設定されている「デバイス割付情報」を利用することを特徴とする、デバイスのグルーピング方法を説明した。
【０１２８】
また、グルーピングされたデバイスを縮約して１つの抽象ノードとして定義して、抽象的なアイコンによって表示する表示方法を説明した。
【０１２９】
また、自動的あるいはユーザによる明示的な指定により、グルーピング表示とアイコン表示を切り替えて表示する表示方法を説明した。
【０１３０】
また、以下の構成を説明した。
１）デバイス割付情報からデバイスグループ情報を抽出し、制御プログラムで用いられているデバイスについてまとめてノードとして登録する「デバイスグループ抽出部」、
２）デバイス連携情報からデバイスグループ情報を抽出し、制御プログラムで用いられているデバイスについてまとめてノードとして登録する「連携デバイス抽出部」、
３）複数のデバイスを選択し、デバイスグループとして登録する「デバイスグループ指定部」、
４）デバイスグループ情報と、ノード構造体、接続情報、エッジ構造体から、デバイスグループを縮約して１つのノードとして表示する形式と、デバイスグループを展開して複数のノードとして表示する形式を切り替える「グラフ生成部」、
５）接続情報に格納された有閉路有向グラフの情報を画面に出力する「結果出力部」。
【０１３１】
実施の形態２．
実施の形態２〜４では、図１４〜図２０で示したグラフ表示を生成する方法を説明する。
【０１３２】
≪概要≫
まず、本実施の形態に係る情報処理装置の動作の概要を説明し、その後、構成例及び動作手順の詳細を説明する。
【０１３３】
本実施の形態に係る情報処理装置は、制御プログラムで制御される変数（デバイス）を抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、制御プログラムを有閉路有向グラフとしてみて、その構造を保持することで、制御プログラム設計時あるいは保守時に、ユーザ作業の効率化、作業の時間短縮を支援する。
また、本実施の形態に係る情報処理装置は、例えば、制御プログラム設計時に制御プログラム内で使用されているデバイス間の関係を、ＧＵＩにて可視的に表示することや、制御プログラム保守時にＧＵＩにて可視的に表示された依存関係グラフ上にて、デバイス値をモニタする、などの機能を持つ。
【０１３４】
ここでは、本実施の形態に係る情報処理装置が対象とする言語の１つとして、ラダー（ＬＤ）言語を説明するとともに、ＬＤ言語で記述された制御プログラムから有閉路有向グラフを生成する例を説明する。
【０１３５】
ラダー（ＬＤ）言語は電気回路をモデル化した言語である。
ＬＤ言語では、左右の母線間をラング（回路ブロック）の単位で通常一つの意味のある処理が記述される。
回路ブロックにはその処理に必要な変数（デバイス）が接点やコイルの形で登場する。
したがって、ＬＤ言語はデバイス間の処理を列挙した「処理志向型言語」と考えることができる。
なお、インストラクションリスト（ＩＬ）言語についても、構成する命令は基本的にＬＤ言語の要素と一対一に対応可能である。
しかしながら、制御プログラムの目的は、物理的な機械の駆動や電子デバイスへの電圧付加など、実際の物理的なデバイスへの指示が基本である。
例えば、ある生産ラインにおいて以下の仕様にて制御を行う必要があるとする。
１）センサＡがＯＮで、押しボタンＢ１押下時に、ベルトコンベアＣのモータが正転する。
２）センサＡがＯＮで、押しボタンＢ２押下時に、ベルトコンベアＣのモータが逆転する。
この制御プログラムを考えた場合、上記の１）の文と２）の文をそれぞれ記述するのがラダー言語（処理指向型言語）である。
ＬＤ言語において１）及び２）の文（処理）が、それぞれラングで表現され、それぞれのラングには、以下のように、Ａ、Ｂ１、Ｃ（正転）およびＡ、Ｂ２、Ｃ（逆転）の３つのデバイス間の関係が記述されることになる。
・センサＡ：ベルトコンベアＣの正転・逆転に影響を与える
・押しボタンＢ１：ベルトコンベアＣの正転に影響を与える
・押しボタンＢ２：ベルトコンベアＣの逆転に影響を与える
・ベルトコンベアＣ（正転）：センサＡ、押しボタンＢ１に影響を受ける
・ベルトコンベアＣ（逆転）：センサＡ、押しボタンＢ２に影響を受ける
【０１３６】
上記のように、制御対象であるデバイス間の関係を表現するのが本実施の形態に係る表示形式の考え方であり、本実施の形態では、それを有閉路有向グラフ構造として保持する方法をとる。
前述のとおり、ＦＡ・ＰＡシステムの制御プログラムはその目的が、具体的な「デバイス」を制御することである。
ＬＤ言語やＩＬ言語で記述される制御プログラムのほとんどは「接点→コイル」の組合せで記述され、その単位処理自体は単純なものである。
またＦＡ・ＰＡシステムの制御プログラムは、デバイスに対する操作として間接アドレシング（ポインタ）などを使用することは少ない特徴もある。
基本的に、物理的に実在する機器に対応するものとして各デバイスが定義されるため、デバイスをポインタやインデクスとして使用する例は多くない。
【０１３７】
本実施の形態の手法と類似した、一般的なプログラムの解析技術として「フローグラフ」がある。
これは、プログラムスライシング技術等で使用されるプログラム内の処理（制御）間の依存関係を有向グラフにて表したものである。
プログラムスライシング技術は、例えば、文献「プログラムスライシング技術と応用」（ＩＳＢＮ４−３２０−０２７４３−４、下村隆夫、共立出版、１９９５）に説明されている。
フローグラフは一般的なプログラム全てに適用可能であり、本実施の形態に係る情報処理装置が対象とするＦＡ・ＰＡシステムの制御プログラムに対しても定義可能である。
しかし、フローグラフはプログラムの構造を抽象的に表現したものであって、個々のグラフ要素（ノード、エッジ）が具体的な何かに対応するものではない。
またフローグラフのノードは、それ自体が何らかの処理を内包しており、その処理自体の依存関係がエッジとして表現される。
しかしＦＡ・ＰＡシステムの制御プログラムは、通常プログラムの制御の構造が浅い。
つまりＩＦ文やループ文などの構造を持つことがほとんど無い。
これはサイクリック演算によって繰返し実行されることにも起因している。
本実施の形態では、処理間の依存関係を表現する理由が少なく、むしろ変数（デバイス）と処理を明確に分離した方が可視化の際にユーザに理解されやすいと考える。
このように、フローグラフのようなノードとエッジの定義による可視化は、少なくともＦＡ・ＰＡシステムの制御プログラムを対象とする場合には適していない。
そもそも一般的なプログラムの場合は、使用される変数自体が抽象的なものであり、ポインタや配列などを頻繁に使用するため、その変数の実体（メモリ領域）が固定していないことが多い。
このため、本実施の形態で開示するようなグラフ構造を構築するのは困難である。
しかし、対象をＦＡ・ＰＡシステムの制御プログラムに限定した場合は、より詳細なデバイス単位でのグラフ構築が可能になる。
つまり、デバイスをノードとして表現することでそのイメージが固定され、表示される有閉路有向グラフは、実機システムを構成する要素群のイメージに近いものとなる。
本実施の形態は、ＦＡ・ＰＡシステムの制御プログラムのこの特徴を拠りどころとしている。
グラフ表示による可視化は、ユーザに対して制御プログラムの直感的な理解の手助けになると考える。
【０１３８】
本実施の形態は、制御プログラム内のデバイス間の関係を一度すべて解析し、有向グラフという形式で、直感的に分かりやすい形で可視化することを特徴としている。
例えばＬＤやＩＬ言語で使われる接点とコイルの関係「Ａ⇒Ｂ」（条件Ａならば結果Ｂ）は、接点とコイルをノードとしたときに、有向エッジによって表す方法が最も簡単であり、これ以上簡略また有効な可視化方法はない。
本実施の形態で開示する有閉路有向グラフは、ＦＡ・ＰＡシステムの制御プログラムの設計フェーズおよび保守フェーズにて有用である。
前者については、対象となる制御プログラムの解析を行うことより、プログラムの構造化・再利用化の支援となる。また後者については、グラフ上でモニタを行うことで、視覚的にデバッグ作業を実施することが可能となるほか、制御プログラム全体に対して問題箇所（バグ）を最小の手順で見つけ出すことを容易にするため、障害発生時の早急な原因究明の支援となる。
【０１３９】
≪構成の説明≫
以降に、図２６を用いて、本実施の形態に係る情報処理装置１００の構成例を説明する。
なお、図２６は、グラフ表示の生成手順を説明するために必要な構成を示したものであり、図１に示したデバイス割付情報記憶部１２１、デバイス連携情報記憶部１２２、デバイスグループ抽出部１２３、連携デバイス抽出部１２４、デバイスグループ指定部１２５は図示していない。
図１と図２６で同じ符号の要素は、同じ要素である。
図１に示す構成と、図２６に示す構成を合成すると、図２７に示す構成となる。
実施の形態１の動作を実現するためには、厳密には、図２７に示す構成が必要となる。
実施の形態１では、説明の簡明化のため、図２６にのみ示されている要素の説明を省略していた。
なお、図２７では、図が複雑になるのを回避するために、デバイスグループ抽出部１２３と接続情報記憶部１０６との間の矢印線、連携デバイス抽出部１２４と接続情報記憶部１０６及びノード構造体記憶部１０４との間の矢印線の図示を省略している。
【０１４０】
図２６において、制御プログラム中間コード記憶部１０１は、ＦＡ・ＰＡシステムの制御プログラムが格納されているメモリである。
制御プログラム中間コード記憶部１０１で記憶されている制御プログラムのソースコードはどのような言語で記述されていても良い。
なお、制御プログラム中間コード記憶部１０１で記憶されている制御プログラムの中間コードは、制御プログラム中間コード５０１０と表記する。
この制御プログラム中間コード５０１０は、ＦＡ・ＰＡシステムのエンジニアリング開発環境により、ユーザのプログラミングによって作成されたソースコードをコンパイルした結果である。
後述するように、この制御プログラムは作成中である場合と全て完成されている場合がある。
通常この制御プログラム中間コード５０１０はエンジニアリング環境のコンパイル生成物であり、シーケンサ機器にダウンロードされる対象でもある。
前述したように、制御プログラム中間コード５０１０には、複数のデバイスが記述されるとともにデバイス間の依存関係が記述され、複数のデバイスの記述とデバイス間の依存関係の記述により複数のデバイスに対する制御アルゴリズムが定義される。
【０１４１】
デバイス抽出部１０２は、制御プログラムの中で使用されているデバイスの記述を抽出する。
抽出されるデバイスは、制御プログラムがＬＤ言語の場合は接点デバイスやコイルデバイスであり、ＩＬ言語である場合はオペランドとして指定するソースデバイスやデスティネーションデバイスである。
デバイス抽出部１０２で抽出されたデバイスは、ノード情報としてノード構造体記憶部１０４に格納される。
デバイスの抽出は、例えば制御プログラムの設計段階においては、ユーザが制御プログラムを作成し、意味のある単位（ＬＤ言語では例えばラング）を作成するたびに抽出処理をおこなってもよいし、例えば実機システムの保守段階においては、障害が発生した段階で、稼働中の制御プログラム全体に対して一括して行ってもよい。
【０１４２】
依存関係抽出部１０３は、制御プログラムの中のデバイス間の依存関係の記述を抽出する。
抽出される依存関係は、制御プログラムがＬＤ言語の場合は、例えば接点で指定されたデバイスＡとコイルで指定されたデバイスＢの間の依存関係や、比較条件Ｃと演算対象Ｄの間の依存関係である。
依存関係抽出部１０３で抽出された依存関係は、エッジ情報としてエッジ構造体記憶部１０５に格納される。
依存関係の抽出は、例えば制御プログラムの設計段階においては、ユーザが制御プログラムを作成し、意味のある単位（ＬＤ言語では例えばラング）を作成するたびに抽出処理をおこなってもよいし、例えば実機システムの保守段階においては、障害が発生した段階で、稼働中の制御プログラム全体に対して一括して行ってもよい。
【０１４３】
ノード構造体記憶部１０４は、デバイス抽出部１０２によって抽出されたデバイスの情報を記憶しておく領域である。
ノード構造体記憶部１０４で記憶される情報は、ノード構造体５０４０と表記する。
ノード構造体５０４０では、デバイスに対して、デバイス名あるいは、ユーザによって命名されたラベル名が格納される。
また、ノード構造体５０４０にはモニタを行うためのデバイスの現在値の格納エリアも設けてある。
【０１４４】
エッジ構造体記憶部１０５は、依存関係抽出部１０３によって抽出されたデバイス間の依存関係を記憶しておく領域である。
デバイス間の依存関係はいくつか種別がある。
ＬＤ言語を例に取ると例えば、Ａ接点−コイルの関係（Ｄ１⇒Ｄ２）、Ｂ接点−コイルの関係（Ｄ１⇒Ｄ２）、演算式の関係（Ｄ２＝Ｄ１＋１）、条件式の関係（ＩＦ  Ｄ１＞０ＴＨＥＮ  Ｄ２＝１）などである。
これらの例では全てデバイスＤ２はデバイスＤ１に依存している。
依存関係抽出部１０３では、これらの依存関係の種別と、対象となる２つ以上のデバイスの組合せを抽出する。
依存関係の種別はエッジ構造体５０５０として格納する。
対象デバイスの組合せは、エッジ構造体５０５０もしくは、後述する接続情報５０６０として保存する。
【０１４５】
接続情報記憶部１０６は、デバイスを記憶しているノード構造体５０４０と、デバイス間の依存関係を記憶しているエッジ構造体５０５０の間の接続関係を保持しておく記憶領域である。
接続情報記憶部１０６で記憶されている情報を接続情報５０６０と表記する。
接続情報５０６０は、ノード構造体５０４０とエッジ構造体５０５０、つまり、デバイス抽出部１０２で抽出されたデバイスと依存関係抽出部１０３で抽出された依存関係を対応付ける情報である。
【０１４６】
グラフ生成部１１２は、デバイス抽出部１０２により抽出されたデバイスの記述と依存関係抽出部１０３により抽出されたデバイス間の依存関係の記述とに基づき、有閉路有向グラフを生成する。
より具体的には、グラフ生成部１１２は、ノード構造体５０４０とエッジ構造体５０５０と接続情報５０６０を用い、接続情報５０６０に示されている対応付けに従って、ノード構造体５０４０のデバイスとエッジ構造体５０５０の依存関係を組み合わせて、有閉路有向グラフを生成する。
有閉路有向グラフは、ノードがデバイスを表し、有向エッジがデバイス間の依存関係を表し、制御プログラムで定義されている制御アルゴリズムをノードと有向エッジとの接続で表すグラフである。
有閉路有向グラフの例は、後述する。
【０１４７】
条件入力部１０７は、グラフ生成部１１２で生成された有閉路有向グラフに対して、グラフ内の要素を検索するための条件やフィルタリングするための条件をユーザがＧＵＩを通して入力する手段である。
例えばＧＵＩによって表示されたグラフに対して、その任意のノードを指定することでノードが特定される。
またはグラフに対して、任意の領域を選択することで、そのデバイス群が選択される。
【０１４８】
グラフ解析部１０８は、用途に応じて有閉路有向グラフをグラフ解析するエンジン部分である。
例えば、条件入力部１０７で選択されたデバイス群「が」影響を与え得る範囲（当該デバイス群から有向エッジを介して到達可能なノード全て）を抽出することや、逆に条件入力部１０７で指定されたデバイス「に」影響を与え得る範囲（当該デバイスから有向エッジを逆向きに介して到達可能なノード）を段階的に抽出するなどを行う。
また、グラフ全体のクラスタ性について計測を行い、制御プログラムのデバイス間の結合度合いを算出する、などを行う。
グラフ解析部１０８は、一般的なグラフ解析ロジックを用いることもできる。
【０１４９】
結果出力部１０９は、グラフ全体や、グラフ解析部１０８によってフィルタリングされた部分グラフをＧＵＩを通してユーザに表示する手段である。
ＦＡ・ＰＡシステムの制御プログラムで用いられるデバイスの数や処理の数は膨大なものになりうるため、本実施の形態で開示している有閉路有向グラフも大規模なものになる可能性がある。
このため、この結果出力部１０９にはグラフの拡大縮小表示機能や、選択デバイス／依存関係のみを表示する機能、あるいは選択されたデバイス群を縮約して、単一な仮想デバイスとして表示する機能などを持つことができる。
結果出力部１０９の一部機能は、一般的な複雑グラフ表示技術やツールを用いることもできる。
【０１５０】
リンク管理部１１０は、制御プログラムのコードと、それを変換した有閉路有向グラフの要素（ノード：デバイス、エッジ：ラング（ＬＤの場合））を対応付ける手段である。
リンク管理部１１０は、ＧＵＩを通してユーザに表示されるグラフと、元の制御プログラムコードを対応付けるために用いられる。
例えばグラフのノードを選択すると、それに対応するデバイスが、元の制御プログラムコードの中から検索され、当該デバイスが使用されている全てのラング（ＬＤの場合）が一覧表示される。またエッジを選択すると、それに対応するラング（ＬＤの場合）が表示される。
リンク管理部１１０は、これらの機能を実現するために使用される。
【０１５１】
オンラインモニタ部１１１は、実際のシーケンサ機器と通信を行って、デバイスの現在値を取得する手段である。
ここで取得されたデバイス値は、グラフ表示を用いて現在値モニタを行う際に結果出力部１０９を介してＧＵＩ表示される。
一般的なＦＡ・ＰＡシステムのエンジニアリング開発環境は、既存のプログラミング言語エディタ上にてデバイスのオンラインモニタ機能を実現しているものが多い。
したがって、オンラインモニタ部１１１は、このオンラインモニタ機能で使用しているデバイス値取得機能部分を流用してもよい。
【０１５２】
≪動作の説明≫
≪１．グラフの表示≫
制御プログラム内で使用されているデバイス間の関係をＧＵＩにて可視的に表示する手順について図２８をもとに以下に述べる。
【０１５３】
まず、処理３２０２にて、ユーザが制御プログラムを入力する。
続いて、処理３２０３にて、コンパイルを実行する。
しかし、コンパイル可能な単位の入力が完了していない場合は、再び処理３２０２に戻って、制御プログラムの入力を待つ。
コンパイル可能な単位での入力が完了したら、コンパイル操作によって制御プログラム中間コード５０１０を作成する。
ここまでの処理は一般的なＦＡ・ＰＡシステムのエンジニアリング環境が持つ機能を流用することもできる。
【０１５４】
続いて、処理３２０４にて、デバイス抽出部１０２が制御プログラム中間コード５０１０からデバイスの抽出を行う。
これにより対象とする制御プログラムの全体あるいは部分で使用されるデバイスの一覧が取得できる。
これらのデバイス情報はノード構造体５０４０としてノード構造体記憶部１０４に格納される。
この際、デバイスに関する種々の情報（例えばデバイス種別やラベル名など）も格納する。
同様に、処理３２０５にて、依存関係抽出部１０３が制御プログラム中間コード５０１０から依存関係の抽出を行う。
これにより対象とする制御プログラムの全体あるいは部分で処理されているデバイス間の依存関係が抽出される。
これらの情報はエッジ構造体５０５０としてエッジ構造体記憶部１０５に格納される。
エッジ構造体５０５０には後述するように、グラフ解析に利用するための、正論理／負論理の情報なども格納する。
ここでもエッジに関する種々の情報（例えばエッジのタイプなど）も格納する。
同様に、処理３２０６にて、依存関係抽出部１０３が制御プログラム中間コード５０１０とエッジ構造体５０５０から、接続情報５０６０を構築する。
次に、処理３２０７にて、ノード構造体５０４０とエッジ構造体５０５０の間の接続関係を表す接続情報５０６０およびそれにリンクしたノード構造体５０４０とエッジ構造体５０５０から、グラフ生成部１１２が有閉路有向グラフを生成し、結果出力部１０９が表示する。
これらの処理を処理３２０１と処理３２０８間で繰り返す。
このループは制御プログラムの作成が完了するまで繰り返される。
【０１５５】
上記の流れ以外にも、制御プログラムのコンパイルが完了したことをトリガとして、デバイスの抽出処理３２０４を開始する方法を取ることもできる。
また制御プログラムを保存したタイミング、シーケンサ機器へダウンロードしたタイミングをトリガとする方法もとることができる。
また、処理３２０３のコンパイル時に、前回のコンパイル結果との照合を行い、修正のあった箇所についてのみ処理３２０４以降の処理を行うことで、差分描画処理を行うこともできる。
【０１５６】
≪２．対応制御部分プログラム表示≫
ＧＵＩにて可視化されたグラフの要素（ノード／エッジ）を選択することで、対応する元の制御プログラムの要素の検索結果を表示する手順について、図２９をもとに以下に述べる。
【０１５７】
まず、処理３３０１にて、グラフを構築する（接続情報５０６０構築）段階で、デバイス抽出部１０２及び依存関係抽出部１０３が、元の制御プログラムの各要素とグラフの要素（ノード／エッジ）とのリンクを作成する。
グラフのノードと元の制御プログラムのデバイス間のリンク情報はノード構造体５０４０に、構造体の要素として格納される。
また、グラフのエッジと元の制御プログラムの処理（ＬＤ言語であればラング）間のリンク情報はエッジ構造体５０５０に、構造体の要素として格納される。
これにより、表示されるグラフの各要素が元の制御プログラムの要素と関連づいた状態となる。
処理３３０２により、ユーザがＧＵＩに表示されたグラフの要素を選択する。
すると処理３３０３において、グラフ解析部１０８により、そのグラフ要素がノードであるかエッジであるかが判別される。
ノードである場合は処理３３０４にて、リンク管理部１１０により、ノード構造体５０４０とそこからリンクを辿った先の制御プログラム中間コード５０１０から、該当ノードが表すデバイスを使用した全ての処理（ＬＤ言語であればラング）が検索される。
エッジである場合は処理３３０５にて、リンク管理部１１０により、エッジ構造体５０５０とそこからリンクを辿った先の制御プログラム中間コード５０１０から、該当エッジが表す処理（ＬＤ言語であればラング）が抽出される。
最後に、処理３３０６にて、結果出力部１０９により、処理３３０４もしくは処理３３０５で抽出した制御プログラム中間コード５０１０が表示される。
この表示は、例えば、グラフと制御プログラム中間コード５０１０とを並べて表示することが考えられる。
【０１５８】
処理３３０４および処理３３０５によりグラフ上の対応要素が特定され、制御プログラム中間コード５０１０内の対応要素が特定された後は、一般的なエンジニアリング環境で実現されている検索結果表示機能を用いて、対応する制御プログラム検索結果表示処理３３０６を行うこともできる。
【０１５９】
≪３．特定デバイス仕様出力≫
ＧＵＩにて可視化されたグラフの特定ノードを選択することで、当該ノードの仕様を日本語（自然言語の一例）にて表示する手順について、図３０をもとに以下に述べる。
【０１６０】
まず、処理３４０１にて、ユーザによってＧＵＩに表示されたグラフから、対象となるノードが選択される。
次に、処理３４０２にて、グラフ解析部１０８によるグラフ解析により、指定されたノードに至る全てのパスを構成するノード、エッジを含む部分グラフを抽出する。
つまり、グラフ解析部１０８は、指定されたノードに影響を与える可能性のあるノードとエッジを全て抽出する。
この処理は対象ノードから全ての有向エッジを逆向きに辿り、見つかったノードとエッジを部分グラフに追加していき、新しいノードが見つからなくなるまで続けることで実行可能である。
これは一般的なグラフ解析ロジックを用いてもよい。
処理３４０３にて、グラフ解析部１０８は、作成した部分グラフ内で入出力デバイスを表現しているノードのみを抽出する。
これは特定デバイスの仕様を出力する際に、実機システムとのインタフェースとしてユーザに分かりやすいデバイスを表示する意味がある。
しかし、入出力デバイスに限定する必要はなく、内部デバイスに対しても実行してもよい。
また、この処理を行うため、ノード構造体５０４０にはあらかじめ対応するデバイスの種別情報を格納しておく必要がある。
入出力デバイスそれぞれについて処理を行うため、処理３４０４から処理３４０７でループ処理を行う。
この内部では、処理３４０５にて、グラフ解析部１０８は、対象となる入出力デバイスから出ている有向エッジについて日本語へ変換する。
例えば、特定デバイスが「モータＣ（正転）」であり、対象となった入力デバイスのラベル名が「センサＡ」であり、そこから出る有向エッジのタイプが「Ａ接点−コイル」だとすると、「モータＣ（正転）はセンサＡに依存する」という説明文が作成される。
また、もう一つの入力デバイスのラベルが「非常停止ボタンＢ」であり、エッジのタイプが「Ｂ接点−コイル」だとすると、「モータＣ（正転）は非常停止ボタンＢに依存する」という説明文が作成される。
処理３４０６にてこれらの説明文が、結果出力部１０９により、一文ずつユーザに提示される。
処理３４０５にて、入出力デバイスに隣接するエッジのみを考慮に入れているが、これは出力される仕様の文章を単純化するためである。
より厳密に、入出力デバイスから特定デバイスに至るパスを有向エッジに沿った形で連ね、全て日本語化することも可能である。
また、逆に、３４０５の処理は割愛し、入出力デバイスのみを持って、簡単な仕様として表示する方法もある。
この場合は入出力デバイスに隣接するエッジの情報は使用されず、一様に「［入出力デバイス］に依存する」という記述になる。
【０１６１】
≪４．影響範囲図示≫
ＧＵＩにて可視化されたグラフの特定領域を選択することで、それらの範囲に変更を行った場合の、制御プログラムに与える影響範囲を図示する手順について、図３１をもとに以下に述べる。
【０１６２】
まず、処理３５０１にて、ユーザによってＧＵＩに表示されたグラフから、対象となる領域（部分グラフ）が選択される。
次に、処理３５０２にて、グラフ解析部１０８が、グラフ解析により、指定された領域に至る全てのパスを構成するノード、エッジを含む部分グラフを抽出する。
この処理は対象領域内にある全てのノードについて、そのノードに隣接する有向エッジを逆向きに辿って、見つかったノードとエッジを部分グラフに追加していき、新しいノードが見つからなくなるまで続けることで実行可能である。
この処理により、グラフ解析部１０８は、ユーザによって指定された対象領域内の要素（指定要素）に変更があった場合に当該変更の影響を受ける影響範囲を抽出することができる。
なお、この影響範囲の抽出処理は、一般的なグラフ解析ロジックを用いてもよい。
処理３５０３にて、結果出力部１０９が、既に表示されている全体グラフの中で、作成した部分グラフについて強調表示等を行って、影響範囲が分かるようにする。
【０１６３】
なお、ここでは、結果をグラフ上に図示する例のみを載せているが、制御プログラム中間コード内の処理（ＬＤ言語ではラング）を表示する方法も取ることができる。
【０１６４】
≪５．未使用箇所検出≫
ＧＵＩにて可視化されたグラフ上で、制御プログラム内のどの出力デバイスにも影響を与えないデバイス群（未使用デバイス群）を図示する手順について、図３２をもとに以下に述べる。
【０１６５】
まず処理３６０１から処理３６０３にて、全ての出力デバイスについて繰り返す。
処理３６０２にて、グラフ解析部１０８が、グラフ解析により、出力デバイスへ至る全てのパスを構成するノード、エッジを含む部分グラフを抽出する。
この処理は出力デバイスを表すノードについて、そのノードに隣接する有向エッジを逆向きに辿って、見つかったノードとエッジを部分グラフに追加していき、新しいノードが見つからなくなるまで続けることで実行可能である。
これは一般的なグラフ解析ロジックを用いてもよい。
また、この部分は前述した影響範囲図示と同じアルゴリズムを流用することもできる。
また出力デバイス以外にも外部システムとのインタフェースとなるデバイスが存在する可能性がある。
これらについて、ユーザが任意にデバイス群を指定する、あるいはデバイス種別を選択することができても良い。
処理３６０４にて、グラフ解析部１０８は、既に表示されている全体グラフの中から、処理３６０３にて抽出した部分グラフに含まれない、全てのノード（未使用デバイス）とエッジを抜き出す。
また未使用デバイスのみを一覧表示するため、ここで抜き出す要素をノードのみに限っても良い。
そして、処理３６０５にて、結果出力部１０９が、これらの部分グラフ群を強調表示する。
【０１６６】
なお、ここでは、結果をグラフ上に図示する例のみを載せているが、制御プログラム中間コード内の処理（ＬＤ言語ではラング）を表示する方法も取ることができる。
【０１６７】
≪６．循環定義検出≫
ＧＵＩにて可視化されたグラフ上で、制御プログラム内でソフトウェアによるチャタリング（特定のデバイスがサイクリック時間（の定数倍）ごとにＯＮとＯＦＦを繰り返す現象）を起こす危険性のあるデバイスの組合せを検出する手順について、図３３をもとに以下に述べる。
この現象は通常、本実施の形態で開示している有向グラフ表現において、循環（エッジの向きを考慮した閉路）があり、その循環のパス上で奇数回の負論理回路が存在するときに発生する可能性がある。
ただし、タイマデバイスやカウンタデバイスなど、条件が満たされてからコイルがＯＮとなるまでに遅延があるものは対象外とする。
【０１６８】
まず、処理３７０１にて、グラフ解析部１０８は、任意のビットデバイスを開始地点として対象ノードとする。
上記したように、対象ノードにはタイマやカウンタなど、状態を持つことで条件ＯＮからコイルＯＮまでに時間的遅延が発生するものは対象としない。
次にグラフ内のノードを探索するため、処理３７０２および処理３７０３から処理３７０８にて、グラフ解析部１０８はグラフ内の探索を行う。
ここでの目的は、タイマやカウンタを含まず、負論理が奇数回登場する循環定義を検出するため、処理３７０４にて負論理に相当するエッジ（処理）の数をカウントする。
この時に必要となるそのエッジが負論理であるかどうかの情報は、先に述べた「依存関係の抽出」処理３２０５にて、エッジ構造体５０５０内に格納しておく。
次に、グラフ解析部１０８は、探索中に経由するノードについて、処理３７０５にて、カウンタやタイマにたどり着いたかどうかチェックを行う。
カウンタやタイマを経由する場合は、循環定義として抽出しない（サイクリック時間とは異なったユーザ定義値を基準にしてデバイスのＯＮ／ＯＦＦが切り替わるため、正常な動作と考えられるため）。
しかし、実装する機能としては、ユーザへ循環定義抽出結果にカウンタやタイマを含むことを知らせた上で、条件分岐処理３７０５を除くこともできる。
次に処理３７０６にて、グラフ解析部１０８は、循環を形成するかどうかチェックを行う。
現時点までの探索経路内に訪れたノードに至った場合は循環（閉路）が存在することになるため、処理３７０７にてその循環パスを記録する。
最後に、グラフ解析部１０８は、処理３７０９にて、記録した循環パスの負論理の数が奇数のものについて、循環定義によってソフトウェアによるチャタリングが発生する危険性がある循環定義として抽出する。
そして、処理３７１０において、結果出力部１０９が、該当するパスを図示する。
【０１６９】
図３３は対象とする制御プログラムおよびそれを表現しているグラフが連結していることを前提としている。
制御プログラムがいくつかの独立した部分グラフから構成される場合は、それぞれ独立した部分グラフ内で、処理３７０１によって一つの開始ノードを選択する必要がある。
なお、処理３７０２から処理３７０８までに記述したグラフ内の探索手順は一例であり、その他のグラフ解析アルゴリズムを用いてもよい。
【０１７０】
≪７．デバイス値モニタ≫
ＧＵＩにて可視化されたグラフ上で、ユーザが現在値モニタを行いたいデバイス群を指定し、シーケンサ機器、あるいは制御プログラムシミュレータと接続時に、それらのデバイスの現在値をモニタする手順について、図３４をもとに以下に述べる。
【０１７１】
まず、処理３８０１にて、ＧＵＩにて可視化されたグラフ上で、ユーザがモニタを行いたい任意のデバイス群を選択する。
ただし、制御プログラム内の全てのデバイス、あるいは画面表示された全てのデバイスを対象とする場合は、ユーザからの指定は不要である。
次に、選択されたデバイスについて、処理３８０２から処理３８０５までを繰り返す。
処理３８０３では、オンラインモニタ部１１１が、対象デバイスそれぞれについて、シーケンサ機器または制御プログラムシミュレータから、対応するデバイスの現在値を取得してノード構造体５０４０へ格納する。
続いて処理３８０４にて、結果出力部１０９が、グラフのノード上にテキストとして、あるいはノードの形状変更、あるいはノードの色変更等によって、ノードが表現するデバイスの現在値を表示する。
【０１７２】
なお、モニタを定期的に行う場合は、例えば１秒毎に処理３８０２から処理３８０５までの処理を繰り返すことで実現が可能である。
また、シーケンサ機器や制御プログラムシミュレータから、デバイスの現在値だけでなく、制御プログラム内のどの処理が実行されたのかが取得可能であれば、オンラインモニタ部１１１が、エッジ構造体５０５０に処理実行中フラグを設定／解除することによりグラフ上に表示することもできる。
【０１７３】
≪８．障害要因の図示≫
実機システムあるいは制御プログラムシミュレータ上にて、障害が発生した場合、その要因となる制御プログラム上のバグを特定するため、ＧＵＩにて可視化されたグラフ上で、ユーザにより障害が顕在化しているデバイス、また完全に正常に動作しているデバイスを特定することで、障害の要因となるデバイスあるいは処理を図示する手順について、図３５をもとに以下に述べる。
【０１７４】
まず、処理３９０１にて、グラフ解析部１０８が、初期処理として要因領域を空に設定する。
要因領域は、障害の要因の候補としてグラフ上に示す要素を格納する領域である。
以降処理３９０２から処理３９０９までは、ユーザが障害要因を特定するまで繰返し実行する。
処理３９０３にて、ユーザは障害が発生した時に、その現象が直接現れたデバイス、あるいは確実に異常な振舞いをしているデバイスを指定し、それが「異常」デバイスであることを入力する。
グラフ解析部１０８は、処理３９０４にて、全体グラフから、ユーザが指定したデバイスのノード（異常発生デバイスノード）に至るパス全てをマージした部分グラフを抽出する。
つまり、グラフ解析部１０８は、異常発生デバイスノードと接続している有向エッジを有閉路有向グラフから抽出するとともに、抽出した有向エッジと接続しているノード（デバイス）を抽出する。
この処理は前述した３５０２の処理と同じである。
次に、処理３９０５にて、グラフ解析部１０８は、抽出したデバイスの正常／異常をチェックする。
デバイスごとの正常／異常は、ユーザが指定する。
ユーザから「正常」と指定されたデバイスについては、処理３９０６にて、現時点の要因領域から、抽出した部分グラフを削除する（「正常」と指定されたデバイスのノードと当該ノードに接続しているエッジを要因領域に含めない）。
これは障害要因が含まれる可能性がある要因領域のうち、全ての条件において完全に正常であると判断されたデバイスに影響を与える領域については、要因領域から除くことができるためである。
反対に、ユーザから「異常」と指定されたデバイスについては、処理３９０７にて、現時点の要因領域に抽出した部分グラフを追加する（「異常」と指定されたデバイスのノードと当該ノードに接続しているエッジを要因領域に含める）。
これは障害要因が含まれる可能性がある要因領域が拡大するためである。
ここでは障害要因が１つであるとは限らないため、３９０７の処理において抽出した部分グラフとその時点の要因領域のＡＮＤを取ることはしていない。
次に、処理３９０８にて、結果出力部１０９が、その時点での要因領域をグラフ上に強調表示する。
これにより障害の要因と考えられるデバイスおよび処理を絞り込むことが可能となる。
【０１７５】
また、処理３９０７にて部分グラフとその時点の要因領域のＡＮＤ領域に相当する部分について、色変更や形状変更などにより要因領域全体と区別して表示することも可能である。
これにより、より要因が存在する可能性が高い領域を絞り込むことが可能である。
【０１７６】
実施の形態３．
≪グラフ表示の例≫
ここでは、ＬＤ言語で記述されたＦＡシステム用の制御プログラムがどのように有閉路有向グラフへ変換され、それが表示されるのかについて、具体例をもって説明する。
【０１７７】
図３６は、ＦＡシステム用の制御プログラムの例であり、ＬＤ言語により記述されている。
この制御プログラムは次のような仕様で動作する。
なお、図４４は、図３６の制御プログラムをＩＬ言語で記述したものである。
ａ）入力（開始ボタン）を押下すると出力（ランプ）が点灯する。
ｂ）出力（ランプ）は３秒間点灯する。
ｃ）３回実行すると、入力（開始ボタン）には反応しなくなる。
ｄ）入力（リセットボタン）を押下するとデバイス値をリセットして最初の状態へ戻る。
ｅ）入力（開始ボタン）は押し続ける必要はなく、内部デバイスは自己保持する。
【０１７８】
以下にＬＤプログラムを示した図３６について説明する。
１０００は上記した１）から５）の仕様を満たす制御プログラムの例である。
【０１７９】
まず、最初のラング（回路ブロック）にて内部デバイスのコイル５００４の定義を行っている。
内部デバイス５００４は、出力（ランプ）を直接定義するための中間的なデバイスである。
上記仕様のａ）にあるように、内部デバイス５００４は、入力（開始ボタン）の押下によってＯＮするため、入力（開始ボタン）のＡ接点５００１が条件となる。
次に、仕様ｃ）にあるように、ボタン押下を３回行って３回実行が完了したとき、またｄ）にあるように入力（リセットボタン）押下されたときは、内部デバイスのコイル５００４がＯＦＦとなることを実現するため、カウンタ５００２のＢ接点５００２と、入力（リセットボタン）のＢ接点５００３をそれぞれＡＮＤ条件とする。
ｅ）にあるように、内部デバイスは自己保持するため、入力（開始ボタン）とＯＲ条件で内部デバイスのＡ接点５００５を付け、ただしこの自己保持はｂ）の仕様から３秒間のみ継続するため、タイマのＢ接点５００６をＡＮＤ条件として付ける。
次に、タイマのコイル５００８と出力（ランプ）コイル５００９の定義を行っている。
これらのコイルは何れも内部デバイスから直接定義されるため、内部デバイスのＡ接点５００７のみを条件とする。
タイマのコイル５００８は、内部デバイス５００７がＯＮになった状態で３秒間経過するとＯＮする。つまり３秒経過した時点でタイマのＢ接点５００６がＯＦＦとなる。
次にカウンタのコイル５０１２の定義を行う。
仕様ｃ）より、カウンタは入力（開始ボタン）を３回押下し、処理が完了したときにカウントアップする必要がある。このため、タイマのタイムアップタイミング（つまりタイマのＡ接点５０１１）をカウンタの条件としている。カウンタ５０１２は、タイマのＡ接点５０１１が３回ＯＦＦからＯＮになったタイミングでＯＮする。
最後のラングでは入力（リセットボタン）５０１３を実現している。
仕様ｄ）を実現するため、入力（リセットボタン）のＡ接点５０１３がＯＮしたタイミングで、カウントアップしているカウンタを０にリセットするため、ＲＥＳＥＴ命令５０１４を使用している。
【０１８０】
以上のような制御プログラム５０００がシステム内の制御プログラム中間コード５０１０として格納されている場合の、グラフ表示が行われる流れについて、グラフ表示のフロー３２００の中の処理３２０４から具体的に説明する。
【０１８１】
まず、デバイス抽出部１０２が、デバイスの抽出処理３２０４を行う。
これは制御プログラムをスキャンして、使用しているデバイスを抽出することで実現する。
制御プログラム５０００の例では、ノード構造体５０４０として、デバイス一覧５２００（図３８）が抽出される。
ノード構造体例５２００のデバイス（ラベル）名欄には制御プログラムで通常そのデバイスを特定する名称が登録されるが、ここにはデバイスＩＤやラベルＩＤや変数名など、デバイスを一意に特定できるものであればなにを登録しても良い。
また、デバイス種別欄には対象とするシーケンサ機器や制御プログラムで使用できるデバイス種別が格納される。
【０１８２】
次に、依存関係抽出部１０３が、依存関係の抽出処理３２０５を行う。
これは制御プログラムをスキャンして、各ラングの「条件⇒コイル」の関係を抽出することで実現する。
制御プログラム５０００の例では、エッジ構造体５０５０として、依存関係一覧５３００（図３９）が抽出される。
エッジ構造体例５３００のエッジタイプには、そのエッジが表している制御プログラムの処理のタイプが登録される。
例えば制御プログラム５０００の最後のラングに注目する。
このラングでは入力（リセットボタン）のＡ接点５０１３と、カウンタのＲＥＳＥＴ５０１４との間に依存関係が存在している。
この部分をＩＬ言語で表現すると以下のようになる。
なお制御プログラム５０００をＩＬ言語で表現した例を図４４に載せる。
前述のとおり、一般的にＬＤ言語のプログラム要素とＩＬ言語のプログラム要素は一対一に対応させることができる。
ＬＯＡＤ    入力（リセットボタン）  ―――  ５０１３
ＲＥＳＥＴ  カウンタ  ――――――――――  ５０１４
エッジ構造体５３００の例では、このＩＬ言語の命令を組み合わせてエッジタイプとしている。
上記の例はエッジ構造体５３００の番号９に表されている「ＬＯＡＤ−ＲＥＳＥＴ」がエッジタイプとなる。
このエッジタイプにより、２デバイス間の依存関係の概略を表現することが可能となる。
次に論理の欄は、エッジによって接続される２デバイス間の論理（正論理／負論理）を登録する。
ここでいう論理とは、有向エッジによって表現される処理が、デバイスのＯＮ／ＯＦＦを逆転させるかどうかを表している。このためデバイス種別がビットでない場合（ワードである場合）は無効となる。
【０１８３】
次に、依存関係抽出部１０３が、接続情報の構築処理３２０６を行う。
これは処理３２０４と処理３２０５で作成したノード構造体５２００とエッジ構造体５３００の間をリンク付けする処理である。
制御プログラム５０００の例では、接続情報５４００（図４０）が構築される。
接続情報５４００のエッジ欄は接続関係を表現しているエッジ構造体５３００内のエッジの番号を示している。
同様に元ノード欄と先ノード欄は、ノード構造体５２００内のノードの番号を示している。
接続情報で表現されているエッジは必ず有向グラフであるため、元ノード欄と先ノード欄に分けて設定される。
なお、通常エッジ構造体５３００の番号欄と接続情報５４００のエッジ欄は一対一に対応するため、エッジ構造体５３００と接続情報５４００は同一の表として実現してもよい。
【０１８４】
最後に、グラフ生成部１１２が有閉路有向グラフの生成・描画処理３２０７を行う。
上述した処理３２０５までの処理によってグラフ描画のための情報であるノード構造体５２００、エッジ構造体５３００、接続情報５４００は全て作成されている。
このため、グラフ生成部１１２は、接続情報５４００に示されている対応付けに従って、ノード構造体５２００のデバイスとエッジ構造体５３００の依存関係を組み合わせて、有閉路有向グラフの生成・描画を行う。
【０１８５】
図３７は、制御プログラム５０００を、本実施の形態に係るグラフ表示方法によって表示した例を模式的に表したものである。
入力デバイスと出力デバイスは矩形、内部のデバイスは円で示している。
また、正論理の処理は実線、負論理の処理は破線で示している。
また、図３７のノード内の（１）〜（６）は、ノード構造体５２００（図３８）に示されている番号を表し、エッジ近傍の（１）〜（９）は、エッジ構造体５３００（図３９）に示されている番号を表している。
【０１８６】
ここでは、グラフを構成する要素であるノードとエッジを描画する手順について説明する。
例えばノード（デバイス）の種別毎に画面上で分類をして表示を行いたければ、ノード構造体５２００内のデバイス種別の同じものを集めて画面上へノードを表示する。
ノード構造体５２００のデバイス種別から、入力のデバイスを取得すると、「ビット入力」であるものは入力（開始ボタン）５１０１と入力（リセットボタン）５１０２となる。
同様にノード構造体５２００のデバイス種別から、内部のデバイスを取得すると、「タイマ」「カウンタ」「ビット内部」であるものは、内部デバイス５１０３とタイマ５１０４とカウンタ５１０５となる。
次に、ノード構造体５２００のデバイス種別から、出力のデバイスを取得すると、「ビット出力」であるものは、出力（ランプ）５１０６となる。
次に、接続情報５４００の表の元ノード欄と先ノード欄をチェックして、エッジ番号およびエッジ構造体５３００のエッジタイプや論理を取得する。
これにより、グラフとして表示されるノード間がどのようなエッジで接続されているのかを知り、そのエッジタイプや論理によってエッジの線種などを変更する。
前述のように図３７の例では、エッジ構造体５３００の論理欄から、その処理（エッジ）が正論理の場合は実線、負論理の場合は破線で示している。
接続情報５４００の一行目を見ると、元ノード番号が１、先ノード番号が２でエッジ番号が１であるため、入力（開始ボタン）５１０１と内部デバイス５１０３の間にエッジが存在し、そのエッジはエッジタイプが「ＬＯＡＤ−ＯＵＴ」であり、正論理であることが分かる。
したがって、画面にはグラフとして入力（開始ボタン）５１０１と内部デバイス５１０３の間に、有向エッジとして実線のエッジ５１１０を描画する。
さらに、例えば接続情報５４００の２行目にあるように、自分自身のノードへのエッジの場合は、ループの形でエッジ５１１３を表示する。
このように、エッジ構造体５３００および接続情報５４００内の、エッジ番号１は実線エッジ５１１０、番号２は実線ループエッジ５１１３、番号３は破線エッジ５１１６、番号４は破線エッジ５１１８、番号５は破線エッジ５１１１、番号６は実線エッジ５１１５、番号７は実線エッジ５１１４、番号８は実線エッジ５１１７、番号９は破線エッジ５１１２、にそれぞれ対応する。
このようにして、制御プログラム５０００は、図３７に示すようなグラフ表示が可能となる。
【０１８７】
制御プログラム５０００から自動的に図３７のグラフ表示を行うため、図３７のグラフのノードの配置アルゴリズムについては、さまざまな方法をとることができる。
上述したように、ノードの同一な種別を同一領域にまとめて配置する方法や、ノードとして表されたデバイスの番号順や名称順に並べる方法、さらにノードの次数（ノードから出入りするエッジの数）の多い順などが考えられる。
また、エッジによって接続された２つのノードをより近くに表示させる方法などもある。
これらのノードおよびエッジの配置方法については一般的な複雑グラフ表示アルゴリズムを用いることもできる。
また、グラフは２次元平面上だけでなく、３次元空間上に表示させることもできる。
さらに一度表示されたノードおよびエッジはその位置をユーザが自由に変更させることができる。
この場合、一般的なグラフ描画ツールに搭載される機能と同じように、ノードやエッジをマウスによるドラッグ＆ドロップなどの方法で、ユーザの好みの配置へ変更することができる。
【０１８８】
実施の形態４．
≪影響範囲図示の例≫
図４１は、ある制御プログラムをグラフ表示した例である。
この制御プログラムは入力ビットデバイスが５５０１、５５０２の２つ、内部ビットデバイスが５５０３、５５０４、５５０５の３つ、出力ビットデバイスが５５０６、５５０７、５５０８の３つから成っている。
実線のエッジは、エッジが表す処理が正論理であることを示し、破線のエッジはエッジが表す処理が負論理であることを示している。
【０１８９】
このグラフを使用して、影響範囲図示の例について以下に説明する。
【０１９０】
影響範囲図示のフローを示した図３１を参照すると、まずユーザによって対象領域の選択処理３５０１が行われる。
ここでの例では、ユーザによって出力１のノード５５０６が選択されたとする。
次の３５０２の処理にて、グラフ解析部１０８が、対象領域に至る全てのノードを列挙する。
図４１の例の場合、まず対象領域であるノード５５０６に至る隣り合った有向エッジは、エッジ５５１５のみであるため、まずパスとしてこれを加える。
次に、エッジ５５１５の元ノード５５０３に注目する。
このノードへ至る隣り合った有向エッジは、エッジ５５１４とエッジ５５１０であるため、パスとしてこれを加える。
このときエッジ５５１４はノード５５０３へ戻るループであるため、こちらのパスはここで探索を終える。
もう片方のエッジ５５１０の元ノード５５０１に注目する。
このノード５５０１については、このノードへ至る隣り合った有向エッジが存在しないため、ここで探索を終える。
この結果、３５０３の処理において強調表示される部分は、図４２に示す領域となる。
つまり出力１のノード５６０６を対象とした場合、このノードに影響を与える範囲としては、図４２内の黒塗り及び太線で示した部分、つまり処理５６１５と、内部１デバイス５６０３と、処理５６１４と、処理５６１０と、入力デバイス５６０１となる。
【０１９１】
このように、影響範囲図示のフローの３５０２の処理は、グラフについて、有向エッジを逆向きに辿る探索を行うことで全てのパスを抽出することができる。
この際の探索方法は、一般的なグラフ探索アルゴリズムを用いることができる。
探索方法は深さ優先探索でも幅優先探索でもかまわない。
ただし、グラフが有閉路グラフであるため、既に訪れたノードを記憶しておくこと、また有向グラフであるため、エッジの向きを逆向きに探索するという制約がある。
【０１９２】
≪循環定義検出の例≫
同様に図４１のグラフを使用して、循環定義検出の例について以下に説明する。
【０１９３】
循環定義検出のフローを示した図３３を参照すると、まず処理３７０１にて、任意のビットデバイスを対象ノードとする。
ここでは例として、入力１のノード５５０１を選択する。
次に、処理３７０２にて、グラフ解析部１０８が、対象ノードから出ているエッジを選択する。
図４１の例では、エッジ５５１０とエッジ５５１１が対象となる。
ここから処理３７０３にてグラフ内探索を開始する。
ループ内では処理３７０４によりエッジの論理をチェックする。
エッジ５５１０とエッジ５５１１は両方とも正論理であるため、カウントアップは行わない。
そして、処理３７０５により、グラフ解析部１０８は、次に至るノードがカウンタやタイマであるかどうかを判断する。
エッジ５５１０によって至るノードである内部１ノード５５０３と、エッジ５５１１によって至るノードである内部２ノード５５０４は、両方ともカウンタやタイマではないため、そのまま処理３７０６の処理に移る。
次の処理３７０６において、この時点で「既に経由したノード」として記憶されているのは、最初に選択した入力１ノードのみであるため、ここで至った内部１ノード５５０３と内部２ノード５５０４と異なり、条件７０６には合致しない。
このため、処理３７０４へ戻る。
次に、内部１ノード５５０３に注目し、このノードから出ているエッジ５５１４とエッジ５５１５について判断する。
エッジ５５１４は正論理であるため、処理３７０５にてカウントアップは行わないが、エッジ５５１４はループエッジであるため、条件７０６に合致する。
そして、処理３７０７にて、循環定義としてそのパスと負論理のカウント値の組「内部１ノード５５０３、エッジ５５１４、カウント０」が保存される。
内部１ノード５５０３から出ているエッジ５５１５の方は、そのまま出力１ノード５５０６へ至り、ノード５５０６から出ているエッジは存在しないため、ここでこの枝の探索は終了する。
次に、内部２ノード５５０４を対象として、同様にグラフ探索を続ける。
すると「内部２ノード５５０４、エッジ５５１７、内部３ノード５５０５、エッジ５５１８、出力３ノード５５０８、エッジ５５１９、カウント１」と、閉路が存在することが分かる。
なおかつこの閉路を構成する３つのエッジのうち、エッジ５５１９のみが負論理の処理を表している。
この結果、処理３７０９において、この閉路は循環定義パスのうち負論理が奇数のものに該当する。
なお、先に抽出した「内部１ノード５５０３、エッジ５５１４、カウント０」はカウントが偶数であるため、対象からは外れる。
したがって、処理３７１０にて、図４３に示すように循環定義「内部２ノード５７０４、エッジ５７１７、内部３ノード５７０５、エッジ５７１８、出力３ノード５７０８、エッジ５７１９、カウント１」が抽出できる。
よって、この図４１または図４３で表される制御プログラムにおいて、３つのデバイス、内部１、内部２および出力３は、ソフトウェアによるチャタリングを起こす危険性があるということが分かる。
【０１９４】
≪実施の形態における効果≫
実施の形態２〜４で開示する方法によれば、制御プログラムで制御される変数（デバイス）を抽出してノードとし、デバイス間の相互作用を依存関係として抽出してエッジとすることで、制御プログラムを有閉路有向グラフとして制御プログラム内で使用されているデバイス間の関係を、ＧＵＩにて可視的に表示することが可能となる。
グラフ表示内の特定のノード、つまりデバイスに注目した場合には、制御プログラムによって、そのデバイスによって引き起こされる全ての操作が、そのノードから出ているエッジとして表現されており、またそのデバイスへ影響を与える全ての操作が、そのノードへ入っているエッジとして表現されることになる。
このため、制御プログラムのグラフ表示を確認させることで、ＬＤ言語やＩＬ言語の熟練者でない作業者に対しても、デバイスを中心とした制御プログラムの理解支援が可能となる。
また、制御プログラムを有閉路有向グラフとして表示し、可視化された表示の一部分を指定することで、指定するデバイス群に対して変更を行った場合の影響範囲について図示することが可能となる。
この結果、例えば制御プログラムが動作するＦＡ・ＰＡシステムにおける障害発生時に、ＬＤ言語やＩＬ言語のみを用いて障害の原因究明を行うよりも短時間で、その要因発見を支援することができる。
また、制御プログラムを有閉路有向グラフとしてデータ構造に保持することにより、ソフトウェアによるチャタリングなどのプログラム上の潜在バグについて確認することが可能となるため、制御プログラムの設計時に、シミュレータや実際のＦＡ・ＰＡシステムと接続して判明するような潜在バグや不安定な動作の危険性を、プログラムの静的チェックで知ることが可能となる。
この結果、制御プログラムの設計フェーズにおける手戻り工数の削減を助けることが可能となる。
【０１９５】
≪ハードウェア構成例≫
最後に、実施の形態１〜４に示した情報処理装置１００のハードウェア構成例について説明する。
図４５は、実施の形態１〜４に示す情報処理装置１００のハードウェア資源の一例を示す図である。
なお、図４５の構成は、あくまでも情報処理装置１００のハードウェア構成の一例を示すものであり、情報処理装置１００のハードウェア構成は図４５に記載の構成に限らず、他の構成であってもよい。
【０１９６】
図４５において、情報処理装置１００は、プログラムを実行するＣＰＵ４９１１（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ、中央処理装置、処理装置、演算装置、マイクロプロセッサ、マイクロコンピュータ、プロセッサともいう）を備えている。
ＣＰＵ４９１１は、バス４９１２を介して、例えば、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）４９１３、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）４９１４、通信ボード４９１５、表示装置４９０１、キーボード４９０２、マウス４９０３、磁気ディスク装置４９２０と接続され、これらのハードウェアデバイスを制御する。
更に、ＣＰＵ４９１１は、ＦＤＤ４９０４（Ｆｌｅｘｉｂｌｅ  Ｄｉｓｋ  Ｄｒｉｖｅ）、コンパクトディスク装置４９０５（ＣＤＤ）、プリンタ装置４９０６、スキャナ装置４９０７と接続していてもよい。また、磁気ディスク装置４９２０の代わりに、ＳＳＤ（Ｓｏｌｉｄ  Ｓｔａｔｅ  Ｄｒｉｖｅ）、光ディスク装置、メモリカード（登録商標）読み書き装置などの記憶装置でもよい。
ＲＡＭ４９１４は、揮発性メモリの一例である。ＲＯＭ４９１３、ＦＤＤ４９０４、ＣＤＤ４９０５、磁気ディスク装置４９２０の記憶媒体は、不揮発性メモリの一例である。これらは、記憶装置の一例である。
実施の形態１〜４で説明した「〜記憶部」は、ＲＡＭ４９１４、磁気ディスク装置４９２０等により実現される。
通信ボード４９１５、キーボード４９０２、マウス４９０３、スキャナ装置４９０７などは、入力装置の一例である。
また、通信ボード４９１５、表示装置４９０１、プリンタ装置４９０６などは、出力装置の一例である。
【０１９７】
通信ボード４９１５は、ネットワークに接続されている。
例えば、通信ボード４９１５は、ＬＡＮ（ローカルエリアネットワーク）、インターネット、ＷＡＮ（ワイドエリアネットワーク）、ＳＡＮ（ストレージエリアネットワーク）などに接続される。
【０１９８】
磁気ディスク装置４９２０には、オペレーティングシステム４９２１（ＯＳ）、ウィンドウシステム４９２２、プログラム群４９２３、ファイル群４９２４が記憶されている。
プログラム群４９２３のプログラムは、ＣＰＵ４９１１がオペレーティングシステム４９２１、ウィンドウシステム４９２２を利用しながら実行する。
【０１９９】
また、ＲＡＭ４９１４には、ＣＰＵ４９１１に実行させるオペレーティングシステム４９２１のプログラムやアプリケーションプログラムの少なくとも一部が一時的に格納される。
また、ＲＡＭ４９１４には、ＣＰＵ４９１１による処理に必要な各種データが格納される。
【０２００】
また、ＲＯＭ４９１３には、ＢＩＯＳ（Ｂａｓｉｃ  Ｉｎｐｕｔ  Ｏｕｔｐｕｔ  Ｓｙｓｔｅｍ）プログラムが格納され、磁気ディスク装置４９２０にはブートプログラムが格納されている。
情報処理装置１００の起動時には、ＲＯＭ４９１３のＢＩＯＳプログラム及び磁気ディスク装置４９２０のブートプログラムが実行され、ＢＩＯＳプログラム及びブートプログラムによりオペレーティングシステム４９２１が起動される。
【０２０１】
上記プログラム群４９２３には、実施の形態１〜４の説明において「〜部」（「〜記憶部」以外、以下同様）として説明している機能を実行するプログラムが記憶されている。プログラムは、ＣＰＵ４９１１により読み出され実行される。
【０２０２】
ファイル群４９２４には、実施の形態１〜４の説明において、「〜の抽出」、「〜の生成」、「〜の構築」、「〜の選択」、「〜の変換」、「〜の設定」、「〜の登録」、「〜の取得」、「〜の入力」、「〜の出力」等として説明している処理の結果を示す情報やデータや信号値や変数値やパラメータが、「〜ファイル」や「〜データベース」の各項目として記憶されている。
「〜ファイル」や「〜データベース」は、ディスクやメモリなどの記録媒体に記憶される。
ディスクやメモリなどの記憶媒体に記憶された情報やデータや信号値や変数値やパラメータは、読み書き回路を介してＣＰＵ４９１１によりメインメモリやキャッシュメモリに読み出される。
そして、読み出された情報やデータや信号値や変数値やパラメータは、抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示などのＣＰＵの動作に用いられる。
抽出・検索・参照・比較・演算・計算・処理・編集・出力・印刷・表示のＣＰＵの動作の間、情報やデータや信号値や変数値やパラメータは、メインメモリ、レジスタ、キャッシュメモリ、バッファメモリ等に一時的に記憶される。
また、実施の形態１〜４で説明しているフローチャートの矢印の部分は主としてデータや信号の入出力を示す。
データや信号値は、ＲＡＭ４９１４のメモリ、ＦＤＤ４９０４のフレキシブルディスク、ＣＤＤ４９０５のコンパクトディスク、磁気ディスク装置４９２０の磁気ディスク、その他光ディスク、ミニディスク、ＤＶＤ等の記録媒体に記録される。
また、データや信号は、バス４９１２や信号線やケーブルその他の伝送媒体によりオンライン伝送される。
【０２０３】
また、実施の形態１〜４の説明において「〜部」として説明しているものは、「〜回路」、「〜装置」、「〜機器」であってもよく、また、「〜ステップ」、「〜手順」、「〜処理」であってもよい。
すなわち、実施の形態１〜４で説明したフローチャートに示すステップ、手順、処理により、本発明に係る「情報処理方法」を実現することができる。
また、「〜部」として説明しているものは、ＲＯＭ４９１３に記憶されたファームウェアで実現されていても構わない。
或いは、ソフトウェアのみ、或いは、素子・デバイス・基板・配線などのハードウェアのみ、或いは、ソフトウェアとハードウェアとの組み合わせ、さらには、ファームウェアとの組み合わせで実施されても構わない。
ファームウェアとソフトウェアは、プログラムとして、磁気ディスク、フレキシブルディスク、光ディスク、コンパクトディスク、ブルーレイ（登録商標）ディスク、ＤＶＤ等の記録媒体に記憶される。
プログラムはＣＰＵ４９１１により読み出され、ＣＰＵ４９１１により実行される。
すなわち、プログラムは、実施の形態１〜４の「〜部」としてコンピュータを機能させるものである。あるいは、実施の形態１〜４の「〜部」の手順や方法をコンピュータに実行させるものである。
【０２０４】
このように、実施の形態１〜４に示す情報処理装置１００は、処理装置たるＣＰＵ、記憶装置たるメモリ、磁気ディスク等、入力装置たるキーボード、マウス、通信ボード等、出力装置たる表示装置、通信ボード等を備えるコンピュータである。
そして、上記したように「〜部」として示された機能をこれら処理装置、記憶装置、入力装置、出力装置を用いて実現するものである。
【符号の説明】
【０２０５】
１００  情報処理装置、１０１  制御プログラム中間コード記憶部、１０２  デバイス抽出部、１０３  依存関係抽出部、１０４  ノード構造体記憶部、１０５  エッジ構造体記憶部、１０６  接続情報記憶部、１０７  条件入力部、１０８  グラフ解析部、１０９  結果出力部、１１０  リンク管理部、１１１  オンラインモニタ部、１１２  グラフ生成部、１２１  デバイス割付情報記憶部、１２２  デバイス連携情報記憶部、１２３  デバイスグループ抽出部、１２４  連携デバイス抽出部、１２５  デバイスグループ指定部。
【図１】
2013225251.tif 000003
【図２】
2013225251.tif 000004
【図３】
2013225251.tif 000005
【図４】
2013225251.tif 000006
【図５】
2013225251.tif 000007
【図６】
2013225251.tif 000008
【図７】
2013225251.tif 000009
【図８】
2013225251.tif 000010
【図９】
2013225251.tif 000011
【図１０】
2013225251.tif 000012
【図１１】
2013225251.tif 000013
【図１２】
2013225251.tif 000014
【図１３】
2013225251.tif 000015
【図１４】
2013225251.tif 000016
【図１５】
2013225251.tif 000017
【図１６】
2013225251.tif 000018
【図１７】
2013225251.tif 000019
【図１８】
2013225251.tif 000020
【図１９】
2013225251.tif 000021
【図２０】
2013225251.tif 000022
【図２１】
2013225251.tif 000023
【図２２】
2013225251.tif 000024
【図２３】
2013225251.tif 000025
【図２４】
2013225251.tif 000026
【図２５】
2013225251.tif 000027
【図２６】
2013225251.tif 000028
【図２７】
2013225251.tif 000029
【図２８】
2013225251.tif 000030
【図２９】
2013225251.tif 000031
【図３０】
2013225251.tif 000032
【図３１】
2013225251.tif 000033
【図３２】
2013225251.tif 000034
【図３３】
2013225251.tif 000035
【図３４】
2013225251.tif 000036
【図３５】
2013225251.tif 000037
【図３６】
2013225251.tif 000038
【図３７】
2013225251.tif 000039
【図３８】
2013225251.tif 000040
【図３９】
2013225251.tif 000041
【図４０】
2013225251.tif 000042
【図４１】
2013225251.tif 000043
【図４２】
2013225251.tif 000044
【図４３】
2013225251.tif 000045
【図４４】
2013225251.tif 000046
【図４５】
2013225251.tif 000047