以下、本発明の一側面に係る実施の形態(以下、「本実施形態」とも表記する)を、図面に基づいて説明する。ただし、以下で説明する本実施形態は、あらゆる点において本発明の例示に過ぎない。本発明の範囲を逸脱することなく種々の改良や変形を行うことができることは言うまでもない。つまり、本発明の実施にあたって、実施形態に応じた具体的構成が適宜採用されてもよい。なお、本実施形態において登場するデータを自然言語により説明しているが、より具体的には、コンピュータが認識可能な疑似言語、コマンド、パラメータ、マシン語等で指定される。
§1 適用例
まず、図1を用いて、本発明が適用される場面の一例について説明する。図1は、本実施形態に係る解析装置1の適用場面の一例を模式的に例示する。本実施形態に係る解析装置1は、「グラフ表示装置」の一例である。図1の例では、解析装置1とは別のコンピュータであるPLC(programmable logic controller)2が存在し、PLC2が、制御プログラム221に基づいて、生産ライン27を構成する複数のデバイス28の動作を制御する場面を想定している。
本実施形態に係る解析装置1は、生産ライン27に含まれる複数のデバイス28間の依存関係を制御プログラム221から導出するように構成されたコンピュータである。具体的に、解析装置1は、生産ライン27に含まれる複数のデバイス28の動作を制御するための複数の命令(一連の命令群)を含む制御プログラム221を取得する。制御プログラム221内で定義される複数の命令は、1つ以上の関数のインスタンス及び複数の変数を含む。
関数は、定義された情報処理を実行するための命令群により構成される。例えば、関数は、与えられた入力パラメータに基づいて、定められた演算処理を実行し、その演算結果を出力パラメータに出力する命令群により構成される。「関数」は、「関数ブロック」と称されてもよい。入力パラメータ(入力変数)は、関数に入力値(引数)を与えるためのパラメータである。出力パラメータ(出力変数)は、関数の演算結果(戻り値)を受け取るためのパラメータである。
関数は、1つ以上の入力パラメータ及び1つ以上の出力パラメータを含むように定義されてよい。また、入力パラメータ及び出力パラメータは共通のパラメータで与えられてもよい。この共通のパラメータは「入出力パラメータ」と称されてよい。関数は、1つ以上の入出力パラメータを含むように定義されてよい。入出力パラメータには、配列が用いられてもよい。なお、1つの入出力パラメータを含むことは、1つの入力パラメータ及び1つの出力パラメータを含むことと同じとして取り扱われてよい。
関数の種類として、ユーザ定義関数及び標準関数の2種類の関数が存在する。ユーザ定義関数は、制御プログラム内にユーザにより定義された関数である。ユーザ定義関数の内容は、制御プログラム内に記述される。一方、標準関数は、システムに標準で用意された関数である。標準関数の内容は、定義ファイル(ライブラリ)等により制御プログラムとは別に与えられる。制御プログラム221の1つ以上の関数のインスタンスは、1つ以上の標準関数41のインスタンスを含む。
また、複数の変数は、それぞれ各デバイス28に対応する複数のデバイス変数31を含む。デバイス変数31は、生産ライン27に含まれるデバイス28に対応し、対応するデバイス28に対する何らかの命令を定めるために制御プログラム221内で利用される。ただし、制御プログラム221内で利用される変数の種類は、デバイス変数31に限られなくてもよい。制御プログラム221には、デバイス変数31以外の他の変数が利用されていてもよい。他の変数は、例えば、生産ライン27に対する何らかの命令を定めるために利用される。制御プログラム221は、複数のサブプログラムに分割されてよい。この場合、変数の種別(属性)として、内部変数及び外部変数の2種類の種別を与えることができる。内部変数は、一つのサブプログラム内で利用される変数である。外部変数は、複数のサブプログラム間で共通に利用される変数である。デバイス変数31は、これらのうちの外部変数の一種である。
生産ライン27は、何らかの物を生産可能であればよく、その種類は、特に限定されなくてもよい。デバイス28の種類は、特に限定されなくてもよく、実施の形態に応じて適宜選択されてよい。デバイス28は、例えば、コンベア、ロボットアーム、サーボモータ、シリンダ、吸着パッド、カッター装置、シール装置等であってよい。また、デバイス28は、例えば、成形機、印刷機、実装機、リフロー炉、基板検査装置等の複合装置であってもよい。更に、デバイス28は、例えば、上記のような何らかの物理的な動作を伴う装置の他に、例えば、各種センサにより何らかの情報を検知する装置、各種センサからデータを取得する装置、取得したデータから何らかの情報を検知する装置、取得したデータを情報処理する装置等の内部処理を行う装置を含んでもよい。1つのデバイス28は、1又は複数の装置で構成されてもよいし、装置の一部で構成されてもよい。複数のデバイス28により1つの装置が構成されてもよい。また、同一の装置が複数の処理を実行する場合には、それぞれを別のデバイス28とみなしてもよい。例えば、同一の装置が第1の処理と第2の処理とを実行する場合に、第1の処理を実行する当該装置を第1のデバイスとみなし、第2の処理を実行する当該装置を第2のデバイスとみなしてもよい。
本実施形態に係る解析装置1は、取得された制御プログラム221に対して依存性解析を実行することで、関数のインスタンスの入力パラメータ又は出力パラメータに対する各デバイス変数31の依存関係のパターンを抽出する。抽出されるパターンには、標準関数41のインスタンスの入力パラメータ43又は出力パラメータ44に対する各デバイス変数31の依存関係のパターンが含まれる。ただし、標準関数41の内容(内部構造)は、制御プログラム221内には記述されないため、制御プログラム221に対する依存性解析では、標準関数41のインスタンスにおける入力パラメータ43と出力パラメータ44との間の依存関係を導出することができない。
そこで、本実施形態に係る解析装置1は、制御プログラム221に対する依存性解析では導出不能な標準関数41の入力パラメータ43と出力パラメータ44との間の依存関係の定義を外部情報により与える。すなわち、解析装置1は、標準関数における入力パラメータと出力パラメータとの間の依存関係を定義する関数構造情報121を取得する。続いて、解析装置1は、関数構造情報121を参照して、関数構造情報121では依存関係の定義されていない1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれているか否かを判定する。
未定義の標準関数のインスタンスが制御プログラム221に含まれていないと判定された場合には、解析装置1は、関数構造情報121に基づいて、制御プログラム221に含まれる標準関数41のインスタンスにおける入力パラメータ43と出力パラメータ44との間の依存関係を特定する。一方、1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれていると判定された場合には、解析装置1は、未定義の標準関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を定義する追加の関数構造情報123の入力を受け付ける。そして、解析装置1は、関数構造情報121及び追加の関数構造情報123に基づいて、制御プログラム221に含まれる標準関数41のインスタンスにおける入力パラメータ43と出力パラメータ44との間の依存関係を特定する。すなわち、1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれていると判定された場合には、解析装置1は、入力された追加の関数構造情報123に基づいて、当該1つ以上の未定義の標準関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定する。
抽出した依存関係のパターンにおいて、複数のデバイス変数31のうちの一のデバイス変数が、制御プログラム221に含まれる1つ以上の関数のうちのある関数のインスタンスの入力パラメータに依存関係を有すると想定する。また、他のデバイス変数が、当該入力パラメータとの間に依存関係を有する同一の関数の出力パラメータに依存関係を有すると想定する。この場合に、本実施形態に係る解析装置1は、当該一のデバイス変数が当該他のデバイス変数との間に依存関係を有すると認定する。
すなわち、複数のデバイス変数31のうちの第1のデバイス変数(一のデバイス変数)は、制御プログラム221に含まれる1つ以上の関数のうちのいずれかの関数の入力パラメータに対して依存関係を有し、第2のデバイス変数(他のデバイス変数)は、いずれかの関数の出力パラメータに対して依存関係を有すると想定する。この場合に、入力パラメータ及び出力パラメータが同一の関数のもの(換言すると、第1のデバイス変数及び第2のデバイス変数が共通の関数に対して依存関係を有する)であり、かつ入力パラメータと出力パラメータとの間に依存関係が存在する場合に、解析装置1は、第1のデバイス変数と第2のデバイス変数との間に依存関係が存在すると認定する。
制御プログラム221にユーザ定義関数のインスタンスが含まれる場合、ユーザ定義関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係は、制御プログラム221に対する依存性解析により特定される。一方、標準関数41のインスタンスにおける入力パラメータ43と出力パラメータ44との間の依存関係は、関数構造情報121又は追加の関数構造情報123により与えられる。そのため、上記認定処理により、解析装置1は、各デバイス変数31間の依存関係を特定することができる。解析装置1は、各デバイス変数31間の依存関係を特定した結果に関する情報を出力する。
図1の例では、デバイス変数「D1」は、標準関数41のインスタンスの入力パラメータ「I1」に対して依存関係を有している。デバイス変数「D2」は、標準関数41のインスタンスの入力パラメータ「I2」に対して依存関係を有している。デバイス変数「D3」は、標準関数41のインスタンスの出力パラメータ「O1」に対して依存関係を有している。デバイス変数「D4」は、標準関数41のインスタンスの出力パラメータ「O2」に対して依存関係を有している。これらの依存関係のパターンは、依存性解析により抽出される。また、関数構造情報121又は追加の関数構造情報123により、入力パラメータ「I1」と出力パラメータ「O1」との間に依存関係が存在し、入力パラメータ「I2」と出力パラメータ「O1」及び「O2」それぞれとの間に依存関係が存在するとの定義が与えられる。
そのため、図1の例では、解析装置1は、デバイス変数「D1」がデバイス変数「D3」との間に依存関係を有し、デバイス変数「D2」がデバイス変数「D3」及び「D4」それぞれとの間に依存関係を有するとのように、各デバイス変数31間の依存関係を特定することができる。なお、図1は、各デバイス変数31間の依存関係の一例を示すに過ぎない。デバイス変数31の数、その他の変数の数、関数のインスタンスの数、関数における各パラメータの数、及び依存関係の有無はそれぞれ適宜設定されてよい。
以上のとおり、本実施形態では、関数構造情報121及び追加の関数構造情報123により、標準関数41の入力パラメータ43と出力パラメータ44との間の依存関係が明らかになるため、標準関数41を介在する複数のデバイス変数31間の依存関係を特定することができるようになる。したがって、本実施形態によれば、図1に例示されるように、制御プログラム221が標準関数41を含む場合でも、その制御プログラム221から生産ライン27を構成する複数のデバイス28間の依存関係を適切に導出することができる。
§2 構成例
[ハードウェア構成]
<解析装置>
次に、図2を用いて、本実施形態に係る解析装置1のハードウェア構成の一例について説明する。図2は、本実施形態に係る解析装置1のハードウェア構成の一例を模式的に例示する。
図2に示されるとおり、本実施形態に係る解析装置1は、制御部11、記憶部12、通信インタフェース13、入力装置14、表示装置15、及びドライブ16が電気的に接続されたコンピュータである。なお、図2では、通信インタフェースを「通信I/F」と記載している。
制御部11は、ハードウェアプロセッサであるCPU(Central Processing Unit)、RAM(Random Access Memory)、ROM(Read Only Memory)等を含み、プログラム及び各種データに基づいて情報処理を実行するように構成される。記憶部12は、メモリの一例であり、例えば、ハードディスクドライブ、ソリッドステートドライブ等の補助記憶装置により構成される。本実施形態では、記憶部12は、解析プログラム81、関数構造情報121等の各種情報を記憶する。
解析プログラム81は、複数のデバイス28間の依存関係の導出に関する情報処理(後述する図5A~図6、図10A~図11B、図13A、及び図13B)を解析装置1に実行させるためのプログラムである。解析プログラム81は、この情報処理の一連の命令群を含む。関数構造情報121は、標準関数における入力パラメータと出力パラメータとの間の依存関係の定義を示す。詳細は後述する。
通信インタフェース13は、例えば、有線LAN(Local Area Network)モジュール、無線LANモジュール等であり、ネットワークを介した有線又は無線通信を行うためのインタフェースである。解析装置1は、この通信インタフェース13により、PLC2との間でネットワークを介したデータ通信を行い、制御プログラム221を取得することができる。なお、ネットワークの種類は、例えば、インターネット、無線通信網、移動通信網、電話網、専用網等から適宜選択されてよい。
入力装置14は、例えば、マウス、キーボード等の入力を行うための装置である。また、表示装置15は、出力装置の一例であり、例えば、ディスプレイである。オペレータは、入力装置14及び表示装置15を介して、解析装置1を操作することができる。なお、表示装置15は、タッチパネルディスプレイであってもよい。この場合、入力装置14は省略されてもよい。
ドライブ16は、例えば、CDドライブ、DVDドライブ等であり、記憶媒体91に記憶されたプログラムを読み込むためのドライブ装置である。ドライブ16の種類は、記憶媒体91の種類に応じて適宜選択されてよい。上記解析プログラム81、関数構造情報121及び制御プログラム221の少なくともいずれかは、この記憶媒体91に記憶されていてもよい。
記憶媒体91は、コンピュータその他装置、機械等が記録されたプログラム等の情報を読み取り可能なように、当該プログラム等の情報を、電気的、磁気的、光学的、機械的又は化学的作用によって蓄積する媒体である。解析装置1は、この記憶媒体91から、上記解析プログラム81、関数構造情報121及び制御プログラム221の少なくともいずれかを取得してもよい。
ここで、図2では、記憶媒体91の一例として、CD、DVD等のディスク型の記憶媒体を例示している。しかしながら、記憶媒体91の種類は、ディスク型に限定される訳ではなく、ディスク型以外であってもよい。ディスク型以外の記憶媒体として、例えば、フラッシュメモリ等の半導体メモリを挙げることができる。
なお、解析装置1の具体的なハードウェア構成に関して、実施形態に応じて、適宜、構成要素の省略、置換及び追加が可能である。例えば、制御部11は、複数のハードウェアプロセッサを含んでもよい。ハードウェアプロセッサは、マイクロプロセッサ、FPGA(field-programmable gate array)、DSP(digital signal processor)等で構成されてよい。記憶部12は、制御部11に含まれるRAM及びROMにより構成されてもよい。通信インタフェース13、入力装置14、表示装置15及びドライブ16の少なくともいずれかは省略されてもよい。解析装置1は、例えば、スピーカ等の表示装置15以外の出力装置を更に備えてもよい。解析装置1は、複数台のコンピュータで構成されてもよい。この場合、各コンピュータのハードウェア構成は、一致していてもよいし、一致していなくてもよい。また、解析装置1は、提供されるサービス専用に設計された情報処理装置の他、デスクトップPC(Personal Computer)、タブレットPC等の汎用の情報処理装置、汎用のサーバ装置等であってもよい。
<PLC>
次に、図3を用いて、生産ライン27の動作を制御するPLC2のハードウェア構成の一例を説明する。図3は、本実施形態に係るPLC2のハードウェア構成の一例を模式的に例示する。
図3に示されるとおり、PLC2は、制御部21、記憶部22、入出力インタフェース23、及び通信インタフェース24が電気的に接続されたコンピュータである。これにより、PLC2は、生産ライン27の各デバイス28の動作を制御するように構成される。なお、図3では、入出力インタフェース及び通信インタフェースをそれぞれ「入出力I/F」及び「通信I/F」と記載している。
制御部21は、CPU、RAM、ROM等を含み、プログラム及び各種データに基づいて情報処理を実行するように構成される。記憶部22は、例えば、RAM、ROM等で構成され、制御プログラム221等の各種情報を記憶する。制御プログラム221は、生産ライン27の動作を制御するためのプログラムである。制御プログラム221は、生産ライン27に含まれる複数のデバイス28の動作を制御するための複数の命令(一連の命令群)を含む。
入出力インタフェース23は、外部装置と接続するためのインタフェースであり、接続する外部装置に応じて適宜構成される。本実施形態では、PLC2は、入出力インタフェース23を介して、生産ライン27に接続される。入出力インタフェース23の数は、特に限定されなくてもよく、実施の形態に応じて適宜設定されてよい。
通信インタフェース24は、例えば、有線LANモジュール、無線LANモジュール等であり、有線又は無線通信を行うためのインタフェースである。PLC2は、通信インタフェース24により、解析装置1との間でデータ通信を行うことができる。
なお、PLC2の具体的なハードウェア構成に関して、実施の形態に応じて、適宜、構成要素の省略、置換、及び追加が可能である。例えば、制御部21は、複数のプロセッサを含んでもよい。記憶部22は、制御部21に含まれるRAM及びROMにより構成されてもよい。記憶部22は、ハードディスクドライブ、ソリッドステートドライブ等の補助記憶装置により構成されてもよい。また、PLC2は、提供されるサービス専用に設計された情報処理装置の他、制御する対象に応じて、デスクトップPC、タブレットPC等の汎用の情報処理装置に置き換えられてもよい。
[ソフトウェア構成]
次に、図4を用いて、本実施形態に係る解析装置1のソフトウェア構成の一例を説明する。図4は、本実施形態に係る解析装置1のソフトウェア構成の一例を模式的に例示する。
解析装置1の制御部11は、記憶部12に記憶された解析プログラム81をRAMに展開する。そして、制御部11は、RAMに展開された解析プログラム81をCPUにより解釈及び実行して、各構成要素を制御する。これによって、図4に示されるとおり、本実施形態に係る解析装置1は、プログラム取得部111、プログラム解析部112、定義判定部113、定義受付部114、定義付与部115、関係特定部116、グラフ生成部117、及び出力部118をソフトウェアモジュールとして備えるコンピュータとして動作する。すなわち、本実施形態では、解析装置1の各ソフトウェアモジュールは、制御部11(CPU)により実現される。
プログラム取得部111は、生産ライン27に含まれる複数のデバイス28の動作を制御するための複数の命令を含む制御プログラム221を取得する。複数の命令は、1つ以上の関数のインスタンス及び複数の変数を含む。1つ以上の関数は、標準で用意される1つ以上の標準関数41を含む。複数の変数は、各デバイス28にそれぞれ対応する複数のデバイス変数31を含む。
プログラム解析部112は、制御プログラム221に対して依存性解析を実行することで、関数のインスタンスの入力パラメータ又は出力パラメータに対する各デバイス変数31の依存関係のパターンを抽出する。定義判定部113は、標準関数における入力パラメータと出力パラメータとの間の依存関係を定義する関数構造情報121を参照し、関数構造情報121では依存関係の定義されていない1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれているか否かを判定する。1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれていると判定された場合に、定義受付部114は、当該未定義の標準関数における入力パラメータと出力パラメータとの間の依存関係を定義する追加の関数構造情報123の入力を受け付ける。
定義付与部115は、関数構造情報121に基づいて、1つ以上の関数に含まれる1つ以上の標準関数41のインスタンスにおける入力パラメータ43と出力パラメータ44との間の依存関係を特定する。また、定義付与部115は、1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれていると判定された場合に、定義付与部115は、入力された追加の関数構造情報123に基づいて、制御プログラム221に含まれる標準関数41のうちの1つ以上の未定義の標準関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定する。
関係特定部116は、抽出した依存関係のパターンにおいて、1つ以上の関数のうちの同一の関数の、入力パラメータに依存関係を有する一のデバイス変数が、当該入力パラメータとの間に依存関係を有する出力パラメータに依存関係を有する他のデバイス変数との間に依存関係を有すると認定することで、各デバイス変数31間の依存関係を特定する。グラフ生成部117は、依存関係を特定した結果に基づいて、特定された各デバイス変数31間の依存関係を示す有向グラフであって、各デバイス変数31をそれぞれ表現するノード、及び依存関係を有することを表現する1つ以上のエッジを含む有向グラフを生成する。出力部118は、各デバイス変数31間の依存関係を特定した結果に関する情報を出力する。本実施形態では、出力部118は、生成された有向グラフを当該結果に関する情報として出力する。
解析装置1の各ソフトウェアモジュールに関しては後述する動作例で詳細に説明する。なお、本実施形態では、解析装置1の各ソフトウェアモジュールがいずれも汎用のCPUにより実現される例について説明している。しかしながら、以上のソフトウェアモジュールの一部又は全部が、1又は複数の専用のハードウェアプロセッサにより実現されてもよい。また、解析装置1のソフトウェア構成に関して、実施形態に応じて、適宜、ソフトウェアモジュールの省略、置換及び追加が行われてもよい。
§3 動作例
次に、図5A及び図5Bを用いて、解析装置1の動作例について説明する。図5A及び図5Bは、本実施形態に係る解析装置1の処理手順の一例を例示する。以下で説明する解析装置1の処理手順は、本発明の「解析方法」の一例である。ただし、以下で説明する処理手順は一例に過ぎず、各処理は可能な限り変更されてもよい。また、以下で説明する処理手順について、実施の形態に応じて、適宜、ステップの省略、置換、及び追加が可能である。
[ステップS101]
ステップS101では、制御部11は、プログラム取得部111として動作し、制御プログラム221を取得する。
本実施形態では、制御部11は、通信インタフェース13を利用して、ネットワークを介してPLC2から制御プログラム221を取得する。ただし、制御プログラム221の所在及び取得方法は、このような例に限られなくてもよい。制御プログラム221が記憶部12又は記憶媒体91に存在する場合には、制御部11は、記憶部12又は記憶媒体91から取得してもよい。また、制御プログラム221が他の情報処理装置に存在する場合には、制御部11は、他の情報処理装置から制御プログラム221を取得してもよい。制御プログラム221を取得すると、制御部11は、次のステップS102に処理を進める。
なお、制御プログラム221は、PLC2で実行可能なように、例えば、ラダー・ダイアグラム言語、ファンクション・ブロック・ダイアグラム言語、ストラクチャード・テキスト言語、インストラクション・リスト言語、シーケンシャル・ファンクション・チャート言語、及びC言語の少なくともいずれかを利用して記述されていてもよい。これらの他、制御プログラム221は、例えば、Java(登録商標)、Python、C++、Ruby、Lua等のプログラム言語を利用して記述されてもよい。制御プログラム221の種類は、特に限定されなくてもよく、実施の形態に応じて適宜選択されてよい。
[ステップS102]
ステップS102では、制御部11は、プログラム解析部112として動作し、取得された制御プログラム221に対して依存性解析を実行することで、関数のインスタンスの入力パラメータ又は出力パラメータに対する各デバイス変数31の依存関係のパターンを抽出する。
<依存性解析>
ここで、図6を用いて、ステップS102の処理の一例を詳細に説明する。図6は、本実施形態に係る解析装置1による依存性解析の処理手順の一例を例示する。本実施形態に係るステップS102の処理は、以下のステップS201~ステップS205の処理を含む。ただし、以下で説明する処理手順は一例に過ぎず、各処理は可能な限り変更されてよい。また、以下で説明する処理手順について、実施の形態に応じて、適宜、ステップの省略、置換、及び追加が可能である。
(ステップS201)
ステップS201では、制御部11は、制御プログラム221に対する構文解析を実行することで、制御プログラム221から抽象構文木を生成する。抽象構文木の生成には、トップダウン構文解析又はボトムアップ構文解析による公知の構文解析方法が用いられてよい。また、抽象構文木の生成には、特定の形式文法に従った文字列を扱う構文解析器が用いられてよい。構文解析の方法は、特に限定されなくてもよく、実施の形態に応じて適宜選択されてよい。
図7及び図8を用いて、生成される抽象構文木の一例について説明する。図7は、取得される制御プログラム221の一例を示す。図8は、図7の制御プログラム221から生成される抽象構文木222の一例を示す。図7の例では、ストラクチャード・テキスト(ST)言語で記述された制御プログラム221が取得された場面を想定している。図7で例示される制御プログラム221は、4つのデバイス変数(D1、D2、D3、D4)、1つのユーザ定義関数(My_FB)のインスタンス(Inst_MyFB)、及び2つの標準関数(Std_FB1、Std_FB2)のインスタンス(Inst_StdFB1、Inst_StdFB2)を含んでいる。ユーザ定義関数(My_FB)は、3つの入力パラメータ(Enable、Arg1、Arg2)及び2つの出力パラメータ(Out1、Out2)を含んでいる。標準関数(Std_FB1)は、3つの入力パラメータ(Execute、Input1、Input2)及び1つの出力パラメータ(Out)を含んでいる。標準関数(Std_FB2)は、2つの入力パラメータ(Execute、Input)及び2つの出力パラメータ(Out1、Out2)を含んでいる(後述する図14も参照)。
図7で例示される制御プログラム221は、2つのサブプログラム(2211、2212)に分割されている。サブプログラム2211(Program0/Section0)は、最初に呼び出されて実行される。サブプログラム2212には、ユーザ定義関数(My_FB)の内容が記述されている。この制御プログラム221に対して構文解析を実行することで、図8に示される抽象構文木222を得ることができる。図8の例では、サブプログラム(2211、2212)毎に抽象構文木が得られている。抽象構文木222は、制御プログラム221内で利用される変数(パラメータを含む)、演算子、及びノード間の関係(演算と被演算との関係等)を示す。
なお、図8では、括弧を利用したネスト構造により抽象構文木を表現している。例えば、「a=b+1」に対して構文解析を実行することで、抽象構文木「(=a(+ b 1))」を得ることができる。このネスト構造で表現された抽象構文木では、「=」が、根ノードである。「a」が、根ノード「=」に連結される葉ノードであり、「+」が、根ノード「=」に連結される内部ノードである。「b」及び「1」が、内部ノード「+」に連結される葉ノードである。抽象構文木の生成が完了すると、制御部11は、次のステップS202に処理を進める。
(ステップS202)
図6に戻り、ステップS202では、制御部11は、生成された抽象構文木を利用して、フロー解析を実行する。フロー解析の方法は、特に限定されなくてもよく、実施の形態に応じて適宜選択されてよい。フロー解析には、公知の方法が採用されてよい。これにより、制御部11は、制御プログラム221に含まれる各命令の依存する経路を示す制御フローグラフを抽象構文木から生成する。
図9は、図8の抽象構文木222から得られる制御フローグラフ223の一例を示す。制御フローグラフ223は、制御プログラム221の処理の流れ(実線の矢印)、データの依存性(一点鎖線の矢印)、及び制御の依存性(点線の矢印)を示す。処理の流れは、制御プログラム221内の処理が実行される順序を示す。例えば、制御プログラム221では、「A1:=D1」の処理の後に「CAL Inst_MyFB」の処理が実行される。そのため、制御フローグラフ223において、「A1:=D1」及び「CAL Inst_MyFB」は、処理の流れを示す矢印で連結されている。
データの依存性は、影響を与える処理の関係を示す。例えば、制御プログラム221では、「A1:=D1」の処理の結果が、「Arg1:=A1」の処理に影響を与える。そのため、制御フローグラフ223において、「A1:=D1」及び「Arg1:=A1」は、データの依存性を示す矢印で連結されている。また、制御の依存性は、条件分岐等により実行の可否を決定する処理の関係を示す。例えば、制御プログラム221では、「CAL Inst_MyFB」の実行に応じて、「Enable:=D3」、「Arg1:=A1」及び「Arg2:=Var1」が実行される。そのため、「CAL Inst_MyFB」は、「Enable:=D3」、「Arg1:=A1」及び「Arg2:=Var1」と制御の依存性を示す矢印で連結されている。
生成される制御フローグラフによれば、制御プログラム221における変数の演算を含む処理同士の依存関係を特定することができる。制御フローグラフの生成が完了すると、制御部11は、次のステップS203に処理を進める。
(ステップS203及びステップS204)
図6に戻り、ステップS203では、制御部11は、制御プログラム221内で利用されている各デバイス変数31を抽象構文木又は制御フローグラフから抽出する。制御プログラム221内で利用されている各デバイス変数31を抽出する方法は、実施の形態に応じて適宜選択されてよい。
一例として、制御部11は、デバイス変数のリストを参照することで、利用されている各デバイス変数31を抽象構文木又は制御フローグラフから抽出してもよい。具体的には、制御部11は、抽象構文木又は制御フローグラフから制御プログラム221内で利用されている各変数を特定する。次に、制御部11は、特定された各変数をデバイス変数のリストと照合することで、特定された各変数がデバイス変数であるか否かを判定する。これにより、制御部11は、制御プログラム221内で利用されている各デバイス変数31を抽出することができる。なお、デバイス変数のリストの形式は、特に限定されなくてもよく、実施の形態に応じて適宜設定されてよい。また、デバイス変数のリストは、ユーザの指定により与えられてもよいし、システムに予め保持されていてもよい。このデバイス変数のリストは、記憶部12に格納されていてもよい。
次のステップS204では、制御部11は、制御プログラム221内で利用されている関数(ユーザ定義関数及び標準関数)のインスタンスを呼び出すための関数呼び出し式を抽象構文木又は制御フローグラフから抽出する。利用されている関数の呼び出し式を抽出する方法は、実施の形態に応じて適宜選択されてよい。
一例として、制御部11は、デバイス変数31の抽出方法と同様に、関数のリストを参照することで、利用されている関数の呼び出し式を抽象構文木又は制御フローグラフから抽出してもよい。なお、関数のリストの形式は、特に限定されなくてもよく、実施の形態に応じて適宜設定されてよい。また、関数のリストは、ユーザの指定により与えられてもよいし、システムに予め保持されていてもよい。この関数のリストは、記憶部12に格納されてもよい。関数のうち標準関数のリストは、関数構造情報121から得られてもよい。また、ユーザ定義関数のリストは、制御プログラム221内のサブプログラム等の名称から得られてもよい。関数の呼び出し式を抽出するその他の例として、制御部11は、制御プログラム221の言語仕様に基づいて、関数の呼び出し式に対応するパターンを抽出してもよい。
上記の一例では、ステップS203において、4つのデバイス変数(D1、D2、D3、D4)を、抽象構文木222(図8)又は制御フローグラフ223(図9)から抽出することができる。また、ステップS204において、1つのユーザ定義関数(My_FB)のインスタンス(Inst_MyFB)、及び2つの標準関数(Std_FB1、Std_FB2)のインスタンス(Inst_StdFB1、Inst_StdFB2)の呼び出し式を、抽象構文木222又は制御フローグラフ223から抽出することができる。なお、ステップS203及びステップS204の処理順序は入れ替えられてもよい。制御プログラム221内で利用されている各デバイス変数31及び関数の呼び出し式の抽出が完了すると、制御部11は、次のステップS205に処理を進める。
(ステップS205)
ステップS205では、制御部11は、制御フローグラフを参照し、各命令の依存する経路をたどることで、抽出された関数のインスタンスの入力パラメータ又は出力パラメータに対する抽出された各デバイス変数31の依存関係のパターンを抽出する。制御フローグラフに基づいて依存関係のパターンを抽出する方法は、特に限定されなくてもよく、実施の形態に応じて適宜設定されてよい。
互いに依存関係を有する2つのデバイス変数の間に標準関数のインスタンスが介在していないと想定する。この場合、2つのデバイス変数が直接的に依存関係を有しているときには、制御フローグラフにおいて、一方のデバイス変数から他方のデバイス変数までの経路をたどることができる。制御プログラム221に含まれる複数のデバイス変数31の中には、このように他のデバイス変数と直接的に依存関係を有するデバイス変数が存在してもよい。また、2つのデバイス変数の間に少なくとも1つのユーザ定義関数のインスタンスが介在していたとしても、ユーザ定義関数の内容は制御プログラム221内に記述されているため、制御フローグラフにおいて、一方のデバイス変数から他方のデバイス変数までの経路をたどることができる。なお、このときには、この経路をたどる過程で、ユーザ定義関数の内部構造が特定される。
これに対して、互いに依存関係を有する2つのデバイス変数の間に標準関数のインスタンスが介在していると想定する。この場合、標準関数の内容は制御プログラム221内に記述されていないため、制御フローグラフにおいて、一方のデバイス変数から他方のデバイス変数までの経路をたどることはできない。つまり、デバイス変数を起点に開始した経路の探索は、標準関数のパラメータに到達した時点で終了する。
そこで、本実施形態では、制御部11は、制御フローグラフにおいて、抽出された各デバイス変数31を起点に、終端のインスタンスの入力パラメータ若しくは出力パラメータ又は他のデバイス変数に到達するまで、データ又は制御の依存性の経路をたどる。上記の理由から、終端のインスタンスは、標準関数のインスタンスである。これにより、制御部11は、各デバイス変数31の依存関係のパターンを抽出する。
<抽出処理>
ここで、図10A及び図10Bを更に用いて、ステップS205の処理の一例を詳細に説明する。図10A及び図10Bは、本実施形態に係る解析装置1による依存関係のパターンを抽出するための処理手順の一例を例示する。本実施形態に係るステップS205の処理は、以下のステップS301~ステップS315の処理を含む。ただし、以下で説明する処理手順は一例に過ぎず、各処理は可能な限り変更されてよい。また、以下で説明する処理手順について、実施の形態に応じて、適宜、ステップの省略、置換、及び追加が可能である。
(ステップS301)
ステップS301では、制御部11は、ステップS203により抽出された各デバイス変数31をリストアップする。上記図8及び図9の例では、4つのデバイス変数(D1、D2、D3、D4)がリストアップされる。抽出された各デバイス変数31をリストアップすると、制御部11は、次のステップS302に処理を進める。
(ステップS302~ステップS304)
ステップS302では、制御部11は、抽出されたデバイス変数31のリストから注目するデバイス変数(以下、「注目デバイス変数」とも記載する)をピックアップする。ステップS303では、制御部11は、制御フローグラフにおいて、ピックアップした注目デバイス変数を起点に各命令の依存する経路(データ又は制御の依存性を示す経路)を一方向にたどる。なお、データ又は制御の依存性の経路は、矢印の方向に従う順方向及び矢印の方向に逆らう逆方向の2方向にたどることができる。そのため、ステップS303では、制御部11は、これら2つの方向のうちのいずれかの方向を上記一方向として選択し、選択した方向に経路をたどる。ステップS304では、制御部11は、経路をたどった結果、注目デバイス変数と依存関係を有する変数(関数のインスタンスのパラメータを含む)をリストアップする。依存関係を有する変数とは、経路上に登場する変数である。
上記図8及び図9の例において、ステップS302により、デバイス変数「D1」を注目デバイス変数としてピックアップした場面を想定する。この場合、ステップS303では、「A1:=D1」から「Arg1:=A1」へと依存性の経路をたどることができる。次のステップS304では、変数「A1」及び「Arg1」がリストアップされる。変数「A1」は、デバイス変数31以外の他の変数の一例であり、変数「Arg1」は、ユーザ定義関数(My_FB)のインスタンスの入力パラメータの一例である。依存関係を有する変数をリストアップすると、制御部11は、次のステップS305に処理を進める。
(ステップS305及びステップS306)
ステップS305では、制御部11は、依存関係を有する変数のリストから解析対象とする変数をピックアップする。この解析対象の変数は、関数(標準関数又はユーザ定義関数)のインスタンスのパラメータ(入力パラメータ又は出力パラメータ)、デバイス変数、及びデバイス変数以外の他の変数のいずれかである。
そこで、次のステップS306では、制御部11は、ピックアップした解析対象の変数が、関数のインスタンスのパラメータ又はデバイス変数であるか否かを判定する。解析対象の変数が関数のインスタンスのパラメータ又はデバイス変数であると判定された場合には、制御部11は、次のステップS308に処理を進める。一方、解析対象の変数が関数のインスタンスのパラメータ及びデバイス変数のいずれでもないと判定された場合、すなわち、解析対象の変数がデバイス変数以外の他の変数である場合には、制御部11は、次のステップS307に処理を進める。
例えば、上記の例において、ステップS305により、変数「Arg1」が解析対象の変数としてピックアップされた場合には、制御部11は、解析対象の変数は関数のインスタンスのパラメータであると判定して、次のステップS308に処理を進める。一方、上記の例において、ステップS305により、変数「A1」が解析対象の変数としてピックアップされた場合には、制御部11は、解析対象の変数は関数のインスタンスのパラメータ及びデバイス変数のいずれでもないと判定して、次のステップS307に処理を進める。
(ステップS307)
ステップS307は、ステップS305でピックアップされた解析対象の変数がデバイス変数以外の他の変数である場合に実行される。この場合、注目デバイス変数から解析対象の変数までの依存性の経路は、注目デバイス変数と他の変数との間の依存関係を示しているに過ぎない。そのため、ステップS307では、制御部11は、その解析対象の変数までの依存性の経路を破棄する。依存性の経路を破棄した後、制御部11は、次のステップS313に処理を進める。
(ステップS308)
ステップS308では、制御部11は、ピックアップした解析対象の変数が、ユーザ定義関数のインスタンスのパラメータであるか否かを判定する。解析対象の変数がユーザ定義関数のインスタンスのパラメータであると判定された場合、制御部11は、次のステップS310に処理を進める。一方、解析対象の変数がユーザ定義関数のインスタンスのパラメータではないと判定された場合、すなわち、解析対象の変数が、標準関数のインスタンスのパラメータ又はデバイス変数である場合、制御部11は、次のステップS309に処理を進める。
(ステップS309)
ステップS309は、ステップS305でピックアップされた解析対象の変数が標準関数のインスタンスのパラメータ又はデバイス変数である場合に実行される。各デバイス変数31間の依存関係を特定する観点から、デバイス変数(特に、注目デバイス変数以外の他のデバイス変数)は、注目デバイス変数を起点とした経路の探索の終端である。また、制御プログラム221内には標準関数の内容は記述されないため、標準関数のインスタンスのパラメータも、注目デバイス変数を起点とした経路の探索の終端である。つまり、この注目デバイス変数を起点とした経路の探索は、標準関数のインスタンスのパラメータ又はデバイス変数に到達した時点で終了となる。
そのため、ステップS309では、制御部11は、注目デバイス変数から解析対象の変数までに経由した依存性の経路に基づいて、注目デバイス変数についての依存関係のパターンを特定する。解析対象の変数がデバイス変数である場合には、デバイス変数と注目デバイス変数との間の依存関係のパターンが特定される。一方、解析対象の変数が標準関数のインスタンスのパラメータである場合には、制御部11は、標準関数のインスタンスのパラメータと注目デバイス変数との間の依存関係のパターンが特定される。制御部11は、特定した依存関係のパターンを解析結果として保存する。なお、注目デバイス変数から解析対象の変数までの依存性の経路にデバイス変数以外の他の変数が含まれている場合には、制御部11は、その経路に含まれる他の変数の情報も解析結果として保存する。解析結果を保存した後、制御部11は、次のステップS313に処理を進める。
(ステップS310~ステップS312)
ステップS310~ステップS312は、ステップS305でピックアップされた解析対象の変数がユーザ定義関数のインスタンスのパラメータである場合に実行される。解析対象の変数がユーザ定義関数のインスタンスのパラメータである場合、ユーザ定義関数の内容は制御プログラム221内に記述されているため、解析対象の変数を起点にして、そのユーザ定義関数の内部に向けて、依存性の経路を更にたどることができる。そこで、制御部11は、ユーザ定義関数のインスタンスまでの解析結果を保存した後、解析対象の変数を新たな起点に設定して、依存性の経路をたどる処理を継続する。
具体的には、ステップS310では、制御部11は、注目デバイス変数から解析対象の変数までに経由した依存性の経路に基づいて、注目デバイス変数についての依存関係のパターンを特定する。この場面では、ユーザ定義関数のインスタンスのパラメータと注目デバイス変数との間の依存関係のパターンが特定される。制御部11は、特定した依存関係のパターンを解析結果として保存する。ステップS309と同様に、注目デバイス変数から解析対象の変数までの依存性の経路にデバイス変数以外の他の変数が含まれている場合には、制御部11は、その経路に含まれる他の変数の情報も解析結果として保存する。
次のステップS311では、制御部11は、解析対象の変数を新たな注目変数として指定する。そして、次のステップS312では、制御部11は、制御フローグラフを参照し、注目変数を起点に各命令の依存する経路をたどることで、関数のパラメータ又はデバイス変数に対する注目変数の依存関係のパターンを抽出する。ステップS312のサブルーチンの詳細は後述する。ステップS312による依存関係のパターンの抽出が完了すると、制御部11は、次のステップS313に処理を進める。
(ステップS313)
ステップS313では、制御部11は、ステップS304でリストアップされた全ての変数についてステップS305以下の処理が終了したか否かを判定する。ステップS305以下の処理を実行していない変数がリストに残っている場合には、制御部11は、リストアップされた全ての変数についてはまだステップS305以下の処理は終了していないと判定する。この場合には、制御部11は、ステップS305に処理を戻し、リストに残っている別の変数を解析対象の変数としてピックアップして、ステップS306以下の処理を繰り返す。一方、そうではない場合には、制御部11は、リストアップされた全ての変数について処理が終了したと判定し、次のステップS314に処理を進める。
(ステップS314)
ステップS314では、制御部11は、順方向及び逆方向の両方向について、注目デバイス変数を起点とする経路の探索に関するステップS303~ステップS313の一連の処理が終了したか否かを判定する。ステップS303~ステップS313の一連の処理が一度しか実行されていない段階では、両方向についてはまだ経路探索に関する処理は終了していない。この段階では、制御部11は、両方向についてはまだ経路探索に関する処理は終了していないと判定して、ステップS303に処理を戻し、経路をたどる方向を別の方向に変更して、ステップS303以下の処理を繰り返す。例えば、一度目に順方向に依存性の経路をたどった場合には、制御部11は、次の経路探索に関する処理では逆方向に依存性の経路をたどる。一方、この処理の繰り返しにより、当該一連の処理が二度実行されると、両方向についての経路探索に関する処理が終了する。この段階では、制御部11は、両方向について経路探索に関する処理が終了したと判定し、次のステップS315に処理を進める。
(ステップS315)
ステップS315では、制御部11は、ステップS301でリストアップされた全てのデバイス変数についてステップS302以下の処理が終了したか否かを判定する。ステップS302以下の処理を実行していないデバイス変数がリストに残っている場合には、制御部11は、リストアップされた全てのデバイス変数についてはまだステップS302以下の処理は終了していないと判定する。この場合には、制御部11は、ステップS302に処理を戻し、リストに残っている別のデバイス変数を注目デバイス変数としてピックアップして、ステップS303以下の処理を繰り返す。一方、そうではない場合には、制御部11は、リストアップされた全てのデバイス変数について処理が終了したと判定し、依存関係のパターンを抽出するための処理を終了する。これにより、ステップS205の一連の処理が終了するため、ステップS102による依存性解析の処理が完了する。ステップS102による依存性解析の処理が完了すると、制御部11は、次のステップS103に処理を進める。
<抽出処理のサブルーチン>
次に、図11A及び図11Bを更に用いて、ステップS312の処理の一例を詳細に説明する。図11A及び図11Bは、本実施形態に係る解析装置1によるユーザ定義関数に関する依存パターンを抽出するための処理手順(サブルーチン)の一例を例示する。本実施形態に係るステップS312の処理は、以下のステップS401~ステップS411の処理を含む。ただし、以下で説明する処理手順は一例に過ぎず、各処理は可能な限り変更されてよい。また、以下で説明する処理手順について、実施の形態に応じて、適宜、ステップの省略、置換、及び追加が可能である。
ステップS401~ステップS411の一連の処理では、ユーザ定義関数のインスタンスのパラメータを起点に依存性の経路の探索を実行する。そのため、ステップS401~ステップS411の一連の処理は、ステップS302でピックアップされた注目デバイス変数をステップS311で指定された注目変数に置き換えたステップS303~ステップS313の一連の処理と同様である。
(ステップS401及びステップS402)
すなわち、ステップS401では、制御部11は、制御フローグラフにおいて、指定された注目変数を起点に各命令の依存する経路を一方向にたどる。ステップS401では、制御部11は、ステップS303で選択した方向に依存性の経路をたどる。ステップS402では、制御部11は、経路をたどった結果、注目変数と依存関係を有する変数(関数のインスタンスのパラメータを含む)をリストアップする。
(ステップS403及びステップS404)
ステップS403では、制御部11は、依存関係を有する変数のリストから解析対象とする変数をピックアップする。ステップS404では、制御部11は、ピックアップした解析対象の変数が、関数のインスタンスのパラメータ又はデバイス変数であるか否かを判定する。解析対象の変数が関数のインスタンスのパラメータ又はデバイス変数であると判定された場合には、制御部11は、次のステップS406に処理を進める。一方、解析対象の変数が関数のインスタンスのパラメータ及びデバイス変数のいずれでもないと判定された場合、すなわち、解析対象の変数がデバイス変数以外の他の変数である場合には、制御部11は、次のステップS405に処理を進める。
(ステップS405)
ステップS405では、制御部11は、その解析対象の変数までの依存性の経路を破棄する。依存性の経路を破棄した後、制御部11は、次のステップS411に処理を進める。
(ステップS406)
ステップS406では、制御部11は、ステップS403によりピックアップした解析対象の変数が、ユーザ定義関数のインスタンスのパラメータであるか否かを判定する。解析対象の変数がユーザ定義関数のインスタンスのパラメータであると判定された場合、制御部11は、次のステップS408に処理を進める。一方、解析対象の変数がユーザ定義関数のインスタンスのパラメータではないと判定された場合、すなわち、解析対象の変数が、標準関数のインスタンスのパラメータ又はデバイス変数である場合、制御部11は、次のステップS407に処理を進める。
(ステップS407)
ステップS407では、制御部11は、注目変数から解析対象の変数までに経由した依存性の経路に基づいて、注目変数についての依存関係のパターンを特定する。そして、制御部11は、特定した依存関係のパターンを解析結果として保存する。なお、注目変数から解析対象の変数までの依存性の経路にデバイス変数以外の他の変数が含まれている場合には、制御部11は、その経路に含まれる他の変数の情報も解析結果として保存する。解析結果を保存した後、制御部11は、次のステップS411に処理を進める。
(ステップS408~ステップS410)
ステップS408では、制御部11は、注目変数から解析対象の変数までに経由した依存性の経路に基づいて、注目変数についての依存関係のパターンを特定し、特定した依存関係のパターンを解析結果として保存する。ステップS407と同様に、注目変数から解析対象の変数までの依存性の経路にデバイス変数以外の他の変数が含まれている場合には、制御部11は、その経路に含まれる他の変数の情報も解析結果として保存する。
ステップS409では、制御部11は、解析対象の変数を新たな注目変数として指定する。そして、ステップS410では、制御部11は、制御フローグラフを参照し、注目変数を起点に各命令の依存する経路をたどることで、関数のパラメータ又はデバイス変数に対する注目変数の依存関係のパターンを抽出する。このステップS410の処理は、ステップS312と同様である。すなわち、制御部11は、新たに指定された注目変数に対してステップS401~ステップS411の処理を実行する。ステップS410による依存関係のパターンの抽出が完了すると、制御部11は、次のステップS411に処理を進める。
なお、新たな注目変数のユーザ定義関数のインスタンスが、元の注目変数のユーザ定義関数のインスタンスとは異なっていると想定する。この場合、ステップS410の処理では、制御部11は、新たな注目変数を起点にして、そのユーザ定義関数の内部に向けて、依存性の経路をたどることになる。一方、新たな注目変数のユーザ定義関数のインスタンスが、元の注目変数のユーザ定義関数のインスタンスと同じであると想定する。この場合には、元の注目変数から新たな注目変数まで依存性の経路をたどったことにより、そのユーザ定義関数の内部の探索が完了している。つまり、元の注目変数から新たな注目変数までの経路によりそのユーザ定義関数の内部構造が特定される。そのため、ステップS410の処理では、制御部11は、新たに指定された注目変数を起点にして、そのユーザ定義関数の外部に向けて、依存性の経路をたどることになる。
(ステップS411)
ステップS411では、制御部11は、ステップS402でリストアップされた全ての変数についてステップS403以下の処理が終了したか否かを判定する。ステップS403以下の処理を実行していない変数がリストに残っている場合には、制御部11は、リストアップされた全ての変数についてはまだステップS403以下の処理は終了していないと判定する。この場合には、制御部11は、ステップS403に処理を戻し、リストに残っている別の変数を解析対象の変数としてピックアップして、ステップS404以下の処理を繰り返す。一方、そうではない場合には、制御部11は、リストアップされた全ての変数について処理が終了したと判定し、本サブルーチンの処理を完了する。本サブルーチンの処理を完了すると、制御部11は、次のステップS313(ステップS410によりサブルーチンの処理を繰り返している場合には、前のサブルーチンのステップS411)に処理を進める。
なお、ステップS312及びステップS410は、これらよりも前に実行された同一の注目デバイス変数について依存性の経路をたどる処理を新たな注目変数を起点に継続する処理である。そのため、制御部11は、この継続後に得られた解析結果を継続前に得られた解析結果に関連付けて保存する。具体的には、制御部11は、ステップS407又はS408における解析結果を、ステップS310(ステップS410によりサブルーチンの処理を繰り返している場合には、前のサブルーチンのステップS408)における解析結果に従属させて保存する。
図12を用いて、上記抽出処理により依存関係のパターンを抽出した結果の一例について説明する。図12は、図9の制御フローグラフ223から依存関係のパターンを抽出した結果を示す抽出結果データ224の一例を示す。図12の例では、抽出結果データ224はテーブル構造を有しており、各レコード(行データ)は、「NO」、「PARENT」、「DEVICE」、「FOCUS」、「DIRECTION」、「VARIABLE」、「PROGRAM」、「INSTANCE」、「FUNCTION」、「PARAMETER」及び「IO」のフィールドを有している。1つのレコードが、1つの解析結果に対応している。ただし、抽出結果のデータ構成は、このような例に限定されなくてもよく、実施の形態に応じて適宜決定されてよい。
「NO」フィールドには、各レコードの番号が格納される。各レコードの番号は、解析結果を識別するために利用される。「PARENT」フィールドには、各解析結果の従属関係を示すため、対象のレコードにより示される解析結果が従属する解析結果を示すレコードの番号が格納される。例えば、上記ステップS309及びステップS310における解析結果は、その他のいずれの解析結果にも従属しない。そのため、この解析結果を示すレコードの「PARENT」フィールドは空欄である(例えば、図12の1、3、5、7、8番目のレコード)。一方、例えば、上記ステップS407又はS408における解析結果は、ステップS310(ステップS410によりサブルーチンの処理を繰り返している場合には、前のサブルーチンのステップS408)における解析結果に従属する。そのため、この解析結果を示すレコードの「PARENT」フィールドには、従属先の解析結果を示すレコードの番号が格納される(例えば、図12の2、4、6番目のレコード)。
「DEVICE」フィールドには、依存関係のパターンを抽出するために注目しているデバイス変数(注目デバイス変数)の名称が格納される。「FOCUS」フィールドには、依存性の経路をたどる際に起点にした変数の名称が格納される。例えば、上記ステップS309及びステップS310における解析結果を示すレコードの「FOCUS」フィールドには、注目デバイス変数の名称が格納される。一方、例えば、上記ステップS407又はS408における解析結果を示すレコードの「FOCUS」フィールドには、注目変数の名称が格納される。
「VARIABLE」フィールドには、「FOCUS」フィールドにより示される変数と依存関係を有する変数の名称が格納される。ステップS309、ステップS310、ステップS407、及びステップS408で抽出される依存性の経路に含まれる他の変数の情報は、この「VARIABLE」フィールドに格納される。「DIRECTION」フィールドには、「FOCUS」フィールドにより示される変数と「VARIABLE」フィールドにより示される変数との間の依存関係の方向を示す情報が格納される。依存関係の方向は、依存性の経路をたどる方向に応じて特定される。「PROGRAM」フィールドには、対象のレコードにより示される解析結果を与えるプログラム部分の制御プログラム221内の所在を示す情報が格納される。
「INSTANCE」フィールドには、「FOCUS」フィールドにより示される変数と依存関係を有する関数のインスタンスの名称が格納される。ステップS305及びステップS403によりピックアップされた解析対象の変数が標準関数又はユーザ定義関数のインスタンスのパラメータである場合に、その標準関数又はユーザ定義関数のインスタンスの名称が「INSTANCE」フィールドに格納される。「FUNCTION」フィールドには、「INSTANCE」フィールドにより示されるインスタンスの関数の名称が格納される。「PARAMETER」フィールドには、「FOCUS」フィールドにより示される変数と依存関係を有する関数のパラメータの名称が格納される。「IO」フィールドには、「PARAMETER」フィールドにより示されるパラメータの種別(入力パラメータであるか出力パラメータであるか)を示す情報が格納される。なお、解析対象の変数がデバイス変数である場合には、関数のインスタンスのパラメータに対する依存関係ではなく、このデバイス変数に対する依存関係のパターンが抽出される。そのため、得られるレコードの「INSTANCE」、「FUNCTION」、「PARAMETER」及び「IO」フィールドは空欄である。
上記図9の例において、デバイス変数「D1」を注目デバイス変数としてステップS303の処理を実行したと想定する。この場合に、図12で例示される1番目のレコード(「NO」が「1」のレコード)は、「A1:=D1」から「Arg1:=A1」へと依存性の経路をたどった結果により抽出された依存関係のパターンを示す。すなわち、この1番目のレコードは、変数「Arg1」を解析対象の変数としてピックアップした後に、ステップS310の処理を実行することで得られた解析結果を示す。
この変数「Arg1」は、ユーザ定義関数(My_FB)のインスタンスの入力パラメータの一例である。そのため、変数「Arg1」は新たな注目変数に指定され、ステップS312の処理が実行される。2番目のレコード(「NO」が「2」のレコード)は、1番目のレコードを得た後に、ステップS312の処理を実行することで得られた解析結果、すなわち、「Input1:=Arg1」を参照した結果、ステップS407により抽出された依存関係のパターンを示す。そのため、2番目のレコードの「PARENT」フィールドには、1番目のレコードの番号が格納されている。なお、詳細には、この2番目のレコードは、標準関数(Std_FB1)のインスタンスの入力パラメータ「Input1」に対して注目変数「Arg1」が依存関係を有していることを示している。
[ステップS103及びステップS104]
図5A及び図5Bに戻り、ステップS103では、制御部11は、定義判定部113として動作し、標準関数における入力パラメータと出力パラメータとの間の依存関係を定義する関数構造情報121を参照する。そして、制御部11は、関数構造情報121では依存関係の定義されていない1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれているか否かを判定する。なお、ステップS103を実行する前に、制御部11は、関数構造情報121を取得する。本実施形態では、関数構造情報121は記憶部12に保持されている。そのため、制御部11は、関数構造情報121を記憶部12から取得する。ただし、関数構造情報121の取得先は、このような例に限定されなくてもよく、実施の形態に応じて適宜選択されてよい。
未定義の標準関数のインスタンスが制御プログラム221に含まれているか否かを判定する方法は、実施の形態に応じて適宜決定されてよい。例えば、制御部11は、ステップS204により抽出された関数のうちの標準関数41が関数構造情報121で定義されているか否かを照合する。関数構造情報121には定義のない標準関数がステップS204で抽出された標準関数41に含まれている場合には、制御部11は、1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれていると判定する。一方、ステップS204で抽出された全ての標準関数41の定義が関数構造情報121に存在する場合には、制御部11は、未定義の標準関数のインスタンスが制御プログラム221に含まれていないと判定する。
ステップS104では、制御部11は、ステップS103の判定結果に基づいて、処理の分岐先を決定する。ステップS103において、1つ以上の未定義の標準関数のインスタンスが制御プログラム221に含まれていると判定した場合には、制御部11は、次のステップS105に処理を進める。一方、ステップS103において、未定義の標準関数のインスタンスが制御プログラム221に含まれていないと判定した場合には、制御部11は、ステップS105の処理を省略し、次のステップS106に処理を進める。
[ステップS105]
ステップS105では、制御部11は、定義受付部114として動作し、未定義の標準関数における入力パラメータと出力パラメータとの間の依存関係を定義する追加の関数構造情報123の入力を受け付ける。追加の関数構造情報123の入力を受け付ける方法は、実施の形態に応じて適宜決定されてよい。例えば、制御部11は、入力装置14を介して未定義の標準関数についての定義の入力を受け付けてもよい。また、例えば、制御部11は、未定義の標準関数についての定義を記述したデータを受信してもよい。これにより、追加の関数構造情報123が入力されると、制御部11は、次のステップS106に処理を進める。
[ステップS106及びステップS107]
ステップS106では、制御部11は、定義付与部115として動作し、関数構造情報121に基づいて、制御プログラム221に含まれる1つ以上の標準関数41のインスタンスにおける入力パラメータ43と出力パラメータ44との間の依存関係を特定する。上記ステップS105が実行されている場合には、制御部11は、関数構造情報121及び追加の関数構造情報123に基づいて、制御プログラム221に含まれる1つ以上の標準関数41のインスタンスにおける入力パラメータ43と出力パラメータ44との間の依存関係を特定する。すなわち、制御部11は、入力された追加の関数構造情報123に基づいて、1つ以上の標準関数41のうち1つ以上の未定義の標準関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定する。
ステップS107では、制御部11は、関係特定部116として動作し、抽出した依存関係のパターンにおいて、ある関数のインスタンスの入力パラメータに依存関係を有する一のデバイス変数が、当該入力パラメータとの間に依存関係を有する、同一の関数のインスタンスの出力パラメータに依存関係を有する他のデバイス変数との間に依存関係を有すると認定する。これにより、制御部11は、各デバイス変数31間の依存関係を特定する。
<特定処理>
ここで、図13A及び図13Bを用いて、ステップS106及びステップS107の処理の一例を詳細に説明する。図13A及び図13Bは、本実施形態に係る解析装置1による各デバイス変数31間の依存関係と特定するための処理手順の一例を例示する。本実施形態に係るステップS106及びS107の処理は、以下のステップS501~ステップS512の処理を含む。ただし、以下で説明する処理手順は一例に過ぎず、各処理は可能な限り変更されてよい。また、以下で説明する処理手順について、実施の形態に応じて、適宜、ステップの省略、置換、及び追加が可能である。
(ステップS501~ステップS503)
ステップS501では、制御部11は、制御プログラム221内で利用されているデバイス変数31をリストアップする。ステップS501は、上記ステップS301と同様に処理されてよい。ステップS502では、制御部11は、依存関係を解析する対象となるデバイス変数(以下、「解析対象のデバイス変数」とも記載する)をデバイス変数のリストからピックアップする。ステップS503では、制御部11は、抽出結果(抽出結果データ224)を参照し、解析対象のデバイス変数に関する始端のレコードをリストアップする。
始端のレコードは、依存性の経路をたどった結果、最初に抽出された依存関係のパターンを示す。つまり、始端のレコードは、他のレコードに従属せず、当該始端のレコードの「PARENT」フィールドは空欄である。制御部11は、「PARENT」及び「DEVICE」フィールドを参照することで、解析対象のデバイス変数に関する始端のレコードをリストアップすることができる。
上記図12の例において、例えば、デバイス変数「D1」を解析対象のデバイス変数としてピックアップした場合には、制御部11は、デバイス変数「D1」に関する始端のレコードとして1番目のレコードをピックアップする。一方、例えば、デバイス変数「D3」を解析対象のデバイス変数としてピックアップした場合には、制御部11は、デバイス変数「D3」に関する始端のレコードとして5番目及び7番目のレコードをピックアップする。
解析対象のデバイス変数に関する始端のレコードのリストアップが完了すると、制御部11は、次のステップS504に処理を進める。
(ステップS504及びステップS505)
ステップS504では、制御部11は、始端のレコードのリスト(リストアップされた始端のレコード)から解析処理の対象とする始端のレコードをピックアップする。ステップS505では、制御部11は、始端のレコードから抽出結果の各レコードを探索し、終端のレコードを抽出する。
終端のレコードは、依存性の経路とたどった結果、最終的に抽出された依存関係のパターンを示す。つまり、終端のレコードには、従属する他のレコードが存在しない。制御部11は、「PARENT」及び「DEVICE」フィールドを参照し、始端のレコードから抽出結果の各レコードをたどることで、終端のレコードを抽出することができる。1つの始端のレコードに対して複数の終端のレコードが存在する場合には、制御部11は、全ての終端のレコードを抽出する。
上記図12の例において、例えば、5番目のレコードを処理対象の始端のレコードとしてピックアップした場合には、制御部11は、5番目のレコードに対応する終端のレコードとして6番目のレコードを抽出する。また、例えば、7番目のレコードを処理対象の始端のレコードとしてピックアップした場合には、この7番目のレコードに従属するレコードは存在しないため、制御部11は、そのまま7番目のレコードを終端のレコードとして抽出する。
ピックアップした始端のレコードに対応する終端のレコードの抽出が完了すると、制御部11は、次のステップS506に処理を進める。
(ステップS506)
上記抽出処理では、解析対象の変数がユーザ定義関数のインスタンスのパラメータである場合には、依存性の経路をたどる処理は継続される。一方で、解析対象の変数が標準関数のインスタンスのパラメータ又は他のデバイス変数である場合には、依存性の経路をたどる処理は終了する。そのため、終端のレコードは、標準関数のインスタンスのパラメータ又は他のデバイス変数に対する依存関係を示す。
そこで、ステップS506では、制御部11は、抽出された終端のレコードが標準関数のインスタンスのパラメータに関するか他のデバイス変数に関するかを判定する。この判定方法は、実施の形態に応じて適宜決定されてよい。本実施形態では、抽出された終端のレコードが標準関数のインスタンスのパラメータに関する場合、当該終端のレコードの「PARAMETER」フィールドには、そのパラメータの名称が格納されている。一方、抽出された終端のレコードが他のデバイス変数に関する場合、当該終端のレコードの「PARAMETER」フィールドは空欄である。そのため、制御部11は、「PARAMETER」フィールドの値を参照することで、抽出された終端のレコードが標準関数のインスタンスのパラメータに関するか他のデバイス変数に関するかを判定してもよい。
抽出された終端のレコードが標準関数のインスタンスのパラメータに関すると判定した場合、制御部11は、ステップS508に処理を進める。一方、抽出された終端のレコードが他のデバイス変数に関すると判定した場合、制御部11は、次のステップS507に処理を進める。
(ステップS507)
ステップS507では、制御部11は、終端のレコードにより示される他のデバイス変数と解析対象のデバイス変数との間に依存関係があると認定し、認定結果及び参照レコードの情報(不図示)を保存する。制御部11は、終端のレコードの「VARIABLE」フィールドから他のデバイス変数の名称を取得することができる。認定結果及び参照レコードの情報のデータ形式は、実施の形態に応じて適宜決定されてよい。認定結果及び参照レコードの情報の保存が完了すると、制御部11は、次のステップS510に処理を進める。
(ステップS508及びステップS509)
ステップS508では、制御部11は、関数構造情報121を参照し、終端のレコードにより示される標準関数のパラメータについての依存関係の定義を抽出する。ステップS105により追加の関数構造情報123の入力を受け付けた場合には、制御部11は、関数構造情報121及び追加の関数構造情報123を参照し、終端のレコードにより示される標準関数のパラメータについての依存関係の定義を抽出する。ステップS509では、制御部11は、抽出した定義を参照することで、対象のパラメータに関する依存関係を特定し、依存関係を特定した結果及びレコードの探索結果の情報を保存する。
ここで、図14A及び図14Bを更に用いて、終端のレコードにより示される標準関数のパラメータに関する依存関係を特定する過程の一例について説明する。図14Aは、本実施形態に係る関数構造情報121(及び、追加の関数構造情報123)の一例を模式的に例示する。図14Bは、ステップS509の処理の結果により得られる中間データ226の一例を例示する。
図14Aの例では、関数構造情報121はテーブル構造を有しており、各レコード(行データ)は、「ID」、「FB」、「RAR_X」、及び「RAR_Y」のフィールドを有している。「ID」フィールドには、依存関係を識別するための識別子が格納される。「FB」フィールドには、依存関係が定義される標準関数の名称が格納される。「RAR_X」フィールドには、依存関係が定義される入力パラメータの名称が格納される。「RAR_Y」フィールドには、「RAR_X」フィールドにより示される入力パラメータとの間で依存関係を有する出力パラメータの名称が格納される。1つのレコードが、標準関数における入力パラメータと出力パラメータとの間の1つの依存関係に対応している。ただし、関数構造情報121のデータ構成は、このような例に限定されなくてもよく、実施の形態に応じて適宜決定されてよい。追加の関数構造情報123も、関数構造情報121と同様に構成される。
本実施形態では、ステップS508では、制御部11は、終端のレコードの「FUNCTION」フィールドの値を関数構造情報121の各レコードの「FB」フィールドの値と照合する。また、制御部11は、終端のレコードの「PARAMETER」フィールドの値を関数構造情報121の各レコードの「PAR_X」又は「PAR_Y」フィールドの値と照合する。終端のレコードの「IO」フィールドの値が入力パラメータであること示している場合には、制御部11は、終端のレコードの「PARAMETER」フィールドの値を関数構造情報121の各レコードの「PAR_X」と照合する。一方、終端のレコードの「IO」フィールドの値が出力パラメータであること示している場合には、制御部11は、終端のレコードの「PARAMETER」フィールドの値を関数構造情報121の各レコードの「PAR_Y」と照合する。これにより、制御部11は、関数構造情報121の各レコードを検索し、終端のレコードにより示される標準関数のパラメータについての依存関係を定義するレコードを抽出する。ステップS105により追加の関数構造情報123の入力を受け付けた場合には、制御部11は、追加の関数構造情報123の検索も更に実行する。なお、以下では、追加の関数構造情報123に対する処理については、関数構造情報121と同様であるため、説明を省略する。
ステップS509では、制御部11は、関数構造情報121から抽出したレコードを参照することで、対象のパラメータと依存関係を有する他のパラメータを特定し、依存関係を特定した結果及びレコードの探索経路の情報を中間データ226の各レコードに格納する。
図14Bの例では、中間データ226はテーブル構造を有しており、各レコード(行データ)は、「DEVICE」、「INSTANCE」、「DEP」、「ID」及び「TRACE」のフィールドを有している。1つのレコードが、依存関係を特定した1つの結果、すなわち、関数構造情報121により定義を与えた1つの結果に対応する。ただし、中間データ226の構成は、このような例に限定されなくてもよく、実施の形態に応じて適宜決定されてよい。
「DEVICE」フィールドには、解析対象のデバイス変数の名称が格納される。「INSTANCE」フィールドには、関数構造情報121から抽出したレコードにより依存関係を特定した標準関数のインスタンスの名称が格納される。この標準関数のインスタンスの名称は、ステップS505により抽出された終端のレコードの「INSTANCE」フィールドから得られる。
「DEP」フィールドには、解析対象のデバイス変数と依存関係を有する標準関数のインスタンスにおけるパラメータであって、関数構造情報121により定義が与えられたパラメータの種別が格納される。上記の検索において、終端のレコードの「PARAMETER」フィールドの値を関数構造情報121の各レコードの「PAR_X」と照合した場合には、「DEP」フィールドには、入力パラメータであることを示す情報(図では、「PAR_X」)が格納される。一方、終端のレコードの「PARAMETER」フィールドの値を関数構造情報121の各レコードの「PAR_Y」と照合した場合には、「DEP」フィールドには、出力パラメータであることを示す情報(図では、「PAR_Y」)が格納される。
「ID」フィールドには、ステップS508により抽出されたレコードの識別子(「ID」フィールドの値)が格納される。「TRACE」フィールドには、ステップS505により始端のレコードから終端のレコードまで探索した経路を示す情報が格納される。
上記図12の例において、解析対象のデバイス変数が「D1」である場合に、ステップS503では、1番目のレコードが始端のレコードとして抽出される。ステップS505では、2番目のレコードが終端のレコードとして抽出される。これに応じて、ステップS508では、図14Aにより例示される関数構造情報121の2番目のレコード(「ID」が「2」のレコード)が抽出される。その結果、ステップS509では、依存関係を特定した結果及びレコードの探索経路の情報として、図14Bの1番目のレコード(「DEVICE」が「D1」のレコード)が得られる。
また、例えば、解析対象のデバイス変数が「D2」である場合に、ステップS503では、3番目のレコードが始端のレコードとして抽出される。ステップS505では、4番目のレコードが終端のレコードとして抽出される。これに応じて、ステップS508では、図14Aにより例示される関数構造情報121の1番目~3番目の各レコード(「ID」が「1」~「3」の各レコード)が抽出される。その結果、ステップS509では、依存関係を特定した結果及びレコードの探索経路の情報として、図14Bの2~4番目のレコード(「DEVICE」が「D2」の各レコード)が得られる。
対象のパラメータに関する依存関係を特定し、依存関係を特定した結果及びレコードの探索結果の情報の保存が完了すると、制御部11は、次のステップS510に処理を進める。
(ステップS510)
ステップS510では、制御部11は、ステップS503でリストアップされた全ての始端のレコードについてステップS504以下の処理が終了したか否かを判定する。ステップS504以下の処理を実行していない始端のレコードがリストに残っている場合には、制御部11は、リストアップされた全ての始端のレコードについてはまだステップS504以下の処理は終了していないと判定する。この場合には、制御部11は、ステップS504に処理を戻し、リストに残っている別の始端のレコードを処理対象の始端のレコードとしてピックアップして、ステップS505以下の処理を繰り返す。一方、そうではない場合には、制御部11は、リストアップされた全ての始端のレコードについて処理が終了したと判定し、次のステップS511に処理を進める。
(ステップS511)
ステップS511では、制御部11は、ステップS501でリストアップされた全てのデバイス変数についてステップS502以下の処理が終了したか否かを判定する。ステップS502以下の処理を実行していないデバイス変数がリストに残っている場合には、制御部11は、リストアップされた全てのデバイス変数についてはまだステップS502以下の処理は終了していないと判定する。この場合には、制御部11は、ステップS502に処理を戻し、リストに残っている別のデバイス変数を解析対象のデバイス変数としてピックアップして、ステップS503以下の処理を繰り返す。一方、そうではない場合には、制御部11は、リストアップされた全てのデバイス変数について処理が終了したと判定し、次のステップS512に処理を進める。
(ステップS512)
ステップS512では、制御部11は、ステップS507による依存関係の認定結果、及びステップS509によるパラメータに関する依存関係の特定結果に基づいて、全てのデバイス変数間の依存関係を特定する。
図15は、本実施形態に係る解析装置1によりデバイス変数間の依存関係を特定した結果を示す特定結果データ227の一例を例示する。図15の例では、特定結果データ227は隣接行列により表現されており、互いに依存関係を有するデバイス変数の組に対応する該当要素(成分)は「1」であり、そうではない要素(成分)は「0」である。列が依存元を示し、行が依存先を示している。ただし、特定結果データ227の構成は、このような例に限定されなくてもよく、実施の形態に応じて適宜決定されてよい。
ステップS507による認定結果は、始端のレコードに対応するデバイス変数と終端のレコードに対応する他のデバイス変数とが依存関係を有していることを示す。そのため、制御部11は、ステップS507による認定結果をそのまま利用して、各デバイス変数間の依存関係と特定する。具体的には、制御部11は、ステップS507により互いに依存関係を有すると認定されるデバイス変数の組に対応する該当要素を「1」にする。
一方、ステップS509による特定結果は、標準関数のインスタンスのパラメータに対する各デバイス変数の依存関係、及び標準関数における入出力間の依存関係を示す。そこで、制御部11は、中間データ226を参照し、制御プログラム221内で利用される標準関数のうちのいずれかの標準関数の入力パラメータに依存関係を有する一のデバイス変数が、当該入力パラメータとの間に依存関係を有する当該いずれかの標準関数の出力パラメータに依存関係を有する他のデバイス変数との間に依存関係を有すると認定する。
具体的には、制御部11は、「INSTANCE」及び「ID」フィールドの値が一致するレコードの組み合わせを中間データ226から抽出する。抽出された組み合わせのうち一方のレコードの「DEP」フィールドの値が「PAR_X」であり、他方のレコードの「DEP」フィールドの値が「PAR_Y」であると想定する。この場合に、制御部11は、一方のレコードの「DEVICE」フィールドにより示されるデバイス変数から他方のレコードの「DEVICE」フィールドにより示されるデバイス変数に依存関係が存在すると認定する。そして、制御部11は、互いに依存関係を有すると認定されたデバイス変数の組に対応する該当要素を「1」にする。
図14Bの例では、1番目のレコード及び3番目のレコードにより、デバイス変数「D1」からデバイス変数「D2」に依存関係が存在すると認定することができる。同様に、2番目のレコード及び5番目のレコードにより、デバイス変数「D3」からデバイス変数「D2」に依存関係が存在すると認定することができる。6番目のレコード及び8番目のレコードにより、デバイス変数「D3」からデバイス変数「D4」に依存関係が存在すると認定することができる。そのため、図15により例示される特定結果データ227では、それぞれに該当する1行2列目の要素、3行2列目の要素、及び3行4列目の要素が「1」であり、その他の要素は「0」である。
このように全てのデバイス変数間の依存関係を特定し、特定結果データ227の生成が完了すると、制御部11は、各デバイス変数31間の依存関係と特定するための処理を終了する。これにより、ステップS106及びステップS107の一連の処理が完了すると、制御部11は、次のステップS108に処理を進める。
[ステップS108及びステップS109]
ステップS108では、制御部11は、グラフ生成部117として動作し、依存関係を特定した結果に基づいて、特定された各デバイス変数31間の依存関係を示す有向グラフを生成する。ステップS109では、制御部11は、出力部118として動作し、各デバイス変数31間の依存関係を特定した結果に関する情報として、生成された有向グラフを表示装置15に出力する。本実施形態では、制御部11は、以下の第1モード~第10モードいずれかの有向グラフを生成し、生成した有向グラフを表示装置15に出力する。
(1)第1モード
図16を用いて、第1モードの有向グラフの一例について説明する。図16は、本実施形態に係る解析装置1により生成される第1モードの有向グラフ51の一例を模式的に例示する。第1モードは、各デバイス変数間の依存関係を示す最もシンプルなモードである。第1モードの有向グラフ51は、各デバイス変数31をそれぞれ表現する複数のノード61、及び依存関係を有することを表現する1つ以上のエッジ62を含む。ノード61は、本発明の「第1ノード」の一例である。
制御部11は、ステップS108において、依存関係を特定した結果に基づいて、当該有向グラフ51を生成する。具体的には、制御部11は、特定結果データ227を参照して、第1モードの有向グラフ51を生成する。上記図15の例では、特定結果データ227は、4つのデバイス変数D1~D4について、D1からD2に、D3からD2に、及びD3からD4に依存関係を有していることを示している。そのため、図16の例では、有向グラフ51は、4つのデバイス変数D1~D4にそれぞれ対応する4つのノード61を含んでいる。「D1」のノード61から「D2」のノード61にエッジ62が延びている。「D3」のノード61から「D2」のノード61にエッジ62が延びている。「D3」のノード61から「D4」のノード61にエッジ62が延びている。
制御部11は、ステップS109において、このように生成された有向グラフ51を表示装置15に出力する。この有向グラフ51によれば、各デバイス変数31の表現を介して、生産ライン27を構成する各デバイス28間の依存関係をシンプルに示すことができる。そのため、表示装置15の表示領域の消費量を抑えながら、各デバイス28間の依存関係をユーザに的確に示すことができる。
(2)第2モード
次に、図17Aを用いて、第2モードの有向グラフの一例について説明する。図17Aは、本実施形態に係る解析装置1により生成される第2モードの有向グラフ52の一例を模式的に例示する。第2モードは、関数を更に示すモードである。
この第2モードでは、有向グラフ52は、上記複数のノード61、上記1つ以上のエッジ62の他に、関数のインスタンスを表現する1つ以上のブロック(63、64)を更に含むように生成される。各ブロック(63、64)は、表現される関数のインスタンスにおける入力パラメータ又は出力パラメータに対して依存関係を有するデバイス変数を表現するノード61にエッジ62を介して連結される。
制御部11は、ステップS108において、依存関係を特定した結果に基づいて、当該有向グラフ52を生成する。具体的には、制御部11は、特定結果データ227から中間データ226及び抽出結果データ224をさかのぼって参照する。例えば、デバイス変数「D1」とデバイス変数「D2」との依存関係は、中間データ226の1番目及び3番目のレコードから導出されている。また、中間データ226の1番目及び3番目のレコードは、抽出結果データ224の1番目~4番目のレコードから導出されている。中間データ226と抽出結果データ224との対応関係を示す情報は、中間データ226の「TRACE」フィールドに格納されている。制御部11は、特定結果データ227からさかのぼって中間データ226を参照し、該当レコードの「TRACE」フィールドの値に基づいて中間データ226からさかのぼって抽出結果データ224を参照する。
制御部11は、抽出結果データ224の該当レコードから、デバイス変数「D1」とデバイス変数「D2」との間にユーザ定義関数のインスタンス「Inst_MyFB」が介在していることを特定することができる。同様に、制御部11は、抽出結果データ224の該当レコードから、デバイス変数「D3」とデバイス変数「D2」との間にユーザ定義関数のインスタンス「Inst_MyFB」が介在しており、デバイス変数「D3」とデバイス変数「D4」との間に標準関数のインスタンス「Inst_StdFB2」が介在していることを特定することができる。これらの参照結果に基づいて、制御部11は、第2モードの有向グラフ52を生成する。
制御部11は、ステップS109において、このように生成された有向グラフ52を表示装置15に出力する。この有向グラフ52によれば、制御プログラム221における各デバイス変数31間の依存関係と関数の各パラメータに対する各デバイス変数31の依存関係とを関連付けて示すことができる。そのため、関数の各パラメータに対する各デバイス変数31の依存関係を各デバイス変数31間の依存関係に関連付けて把握することができるようになる。
なお、上記の例では、ユーザ定義関数「My_FB」の内部で標準関数「Std_FB1」が利用されている。制御部11は、抽出結果データ224の該当レコードから、このような各関数の関係を特定することができる。例えば、抽出結果データ224の2番目のレコードは、「PARENT」フィールドの値に示されるとおり、1番目のレコードに従属している。1番目のレコードは、ユーザ定義関数「My_FB」のインスタンス「Inst_MyFB」の入力パラメータ「Arg1」にデバイス変数「D1」が依存関係を有していることを示している。2番目のレコードは、標準関数「Std_FB1」のインスタンス「Inst_StdFB1」の入力パラメータ「Input1」に「Arg1」が依存関係を有していることを示している。制御部11は、抽出結果データ224の該当レコードからこれらの各関数の入れ子関係を特定することができる。この第2モードでは、制御部11は、最も外部で利用されている関数を示すように有向グラフ52を生成する。そのため、図17Aの例では、制御部11は、ユーザ定義関数のインスタンス「Inst_MyFB」を選択して、選択されたインスタンス「Inst_MyFB」に対応するブロック64を含む有向グラフ52を生成している。
ここで、上記の例では、制御プログラム221は、標準関数のインスタンス「Inst_StdFB2」の他に、ユーザ定義関数のインスタンス「Inst_MyFB」を含んでいる。このように、制御プログラム221における複数の命令は複数の関数のインスタンスを含んでもよく、複数の関数のインスタンスは、1つ以上の標準関数のインスタンスの他に、標準関数とは異なる1つ以上のユーザ定義関数のインスタンスを含んでもよい。ユーザ定義関数は、制御プログラム221内でユーザにより定義される。この場合に、有向グラフは、各関数をそれぞれ表現する複数のブロックのうち、複数の関数のインスタンスのうちの標準関数のインスタンスを表現する第1のブロックを第1の形態で示し、ユーザ定義関数のインスタンスを表現する第2のブロックを第1の形態とは異なる第2の形態で示すように生成されてもよい。
図17Aの例では、標準関数のインスタンス「Inst_StdFB2」を表現するブロック63が、第1のブロックの一例であり、ユーザ定義関数のインスタンス「Inst_MyFB」を表現するブロック64が、第2のブロックの一例である。また、図17Aの例では、ブロック63を表現する実線が第1の形態の一例であり、ブロック64を表現する点線が第2の形態の一例である。なお、異なる形態で各ブロック(63、64)を表現する方法は、このような線の種類による方法に限られなくてもよく、実施の形態に応じて適宜選択されてよい。例えば、各ブロック(63、64)の形態は、図17Aで例示される線の種類の他、色、形状、文字のフォント等の属性により規定されてよい。また、各ブロック(63、64)に対応するシンボルを定義し、定義された各シンボルを各ブロック(63、64)の表示に利用してもよい。
このように、有向グラフ52は、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とを異なる形態で示すように生成されてもよい。ただし、関数の各ブロック(63、64)を表現する方法は、このような例に限定されなくてもよい。標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とは同じ形態で示されてもよい。
(3)第3モード
次に、図17Bを用いて、第3モードの有向グラフの一例について説明する。図17Bは、本実施形態に係る解析装置1により生成される第3モードの有向グラフ53の一例を模式的に例示する。第3モードは、関数の各パラメータを区別して示すモードである。
上記第2モードでは、有向グラフ52は、表現される関数のインスタンスにおける入力パラメータ及び出力パラメータそれぞれの名称を示さずに、依存関係を有するデバイス変数31を表現するノード61をブロック(63、64)にエッジ62を介して連結する表示形態を有している。これに対して、第3モードでは、有向グラフ53は、表現される関数のインスタンスにおける入力パラメータ及び出力パラメータそれぞれを区別して、依存関係を有するデバイス変数31を表現するノード61にブロック(63、64)がエッジ62を介して連結し、かつエッジ62付近には、対応する入力パラメータ又は出力パラメータの名称を示す表示形態を有するように生成される。
制御部11は、ステップS108において、依存関係を特定した結果に基づいて、当該有向グラフ53を生成する。具体的には、上記第2モードと同様に、制御部11は、特定結果データ227から中間データ226及び抽出結果データ224をさかのぼって参照する。制御部11は、抽出結果データ224の該当レコードに基づいて、関数の各パラメータに対して依存関係を有する各デバイス変数31を特定する。制御部11は、抽出結果データ224の各レコードの「PARAMETER」フィールドから各パラメータの名称を得ることができる。この第3モードでは、制御部11は、「PARAMETER」フィールドから特定された各パラメータの名称の表記を各ブロックの対応する箇所に配置する。
上記の例では、ユーザ定義関数のインスタンス「Inst_MyFB」における入力パラメータ「Arg1」に対してデバイス変数「D1」が依存関係を有しており、入力パラメータ「Enable」に対してデバイス変数「D3」が依存関係を有している。制御部11は、デバイス変数「D1」を表現するノード61から延びるエッジ62とデバイス変数「D3」を表現するノード61から延びるエッジ62とを区別して、ユーザ定義関数のインスタンス「Inst_MyFB」するブロック64に接続する。そして、制御部11は、各入力パラメータの名称の表記641を各エッジ62付近に配置する。
同様の処理により、制御部11は、デバイス変数「D2」とブロック64とを連結するエッジ62付近に、デバイス変数「D2」と依存関係を有する出力パラメータの名称の表記642を配置する。制御部11は、デバイス変数「D3」とブロック63とを連結するエッジ62付近に、デバイス変数「D3」と依存関係を有する入力パラメータの名称の表記631を配置する。制御部11は、デバイス変数「D4」とブロック63とを連結するエッジ62付近に、デバイス変数「D4」と依存関係を有する出力パラメータの名称の表記632を配置する。これにより、制御部11は、第3モードの有向グラフ53を生成することができる。
制御部11は、ステップS109において、このように生成された有向グラフ53を表示装置15に出力する。この有向グラフ53によれば、各デバイス変数31が依存関係を有する関数のパラメータを識別することができるようになる。そのため、関数の各パラメータに対する各デバイス変数31の依存関係を、各デバイス変数31間の依存関係に関連付けてかつより明確に示すことができる。
なお、この第3モードにおいても、上記第2モードと同様に、有向グラフ53は、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とを異なる形態で示すように生成されてもよい。図17Bの例では、各ブロック(63、64)は、上記図17Aと同様の形態で示されている。ただし、第3モードにおける関数の各ブロック(63、64)を表現する方法は、このような例に限定されなくてもよい。この第3モードにおいても、上記第2モードと同様に、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とは同じ形態で示されてもよい。
(4)第4モード
次に、図17Cを用いて、第4モードの有向グラフの一例について説明する。図17Cは、本実施形態に係る解析装置1により生成される第4モードの有向グラフ54の一例を模式的に例示する。第4モードは、デバイス変数とは異なる他の変数であって、関数の外部で利用される他の変数を示すモードである。
上記の例では、制御プログラム221は、各デバイス変数31とは異なる他の変数「A1」を含んでおり、この他の変数「A1」は、デバイス変数「D1」と関数のインスタンスにおける入力パラメータ「Arg1」との間で利用されている。このように、制御プログラム221における複数の変数は、各デバイス変数31とは異なる1つ以上の他の変数であって、複数のデバイス変数31のうちのいずれかといずれかの関数の入力パラメータ又は出力パラメータとの間で利用される1つ以上の他の変数を含んでもよい。この場合に、第4モードの有向グラフ54は、1つ以上の他の変数を表現する1つ以上のノード65であって、複数のデバイス変数31のうちのいずれかを表現するノード61及び関数を表現するブロック(63、64)の間に配置され、それぞれにエッジ62を介して連結された1つ以上のノード65を含むように生成される。ノード65は、本発明の「第2ノード」の一例である。
制御部11は、ステップS108において、依存関係を特定した結果に基づいて、当該有向グラフ53を生成する。具体的には、上記第2モード及び第3モードと同様に、制御部11は、特定結果データ227から中間データ226及び抽出結果データ224をさかのぼって参照する。制御部11は、抽出結果データ224の各レコードの「VARIABLE」フィールドから、デバイス変数と関数の各パラメータとの間で利用されている他の変数を特定することができる。この第4モードでは、制御部11は、「VARIABLE」フィールドから特定された他の変数を表現するノード65を対応する箇所に配置する。
上記の例では、制御部11は、抽出結果データ224の1番目のレコードから、デバイス変数「D1」とユーザ定義関数のインスタンス「Inst_MyFB」の入力パラメータ「Arg1」との間に、他の変数「A1」が介在していることを特定することができる。この参照結果に基づいて、制御部11は、デバイス変数「D1」を表現するノード61とユーザ定義関数のインスタンス「Inst_MyFB」を表現するブロック64との間に、他の変数「A1」を表現するノード65を配置する。そして、制御部11は、ノード65とノード61及びブロック64とをエッジ62で連結する。なお、制御部11は、抽出結果データ224の各レコードの「DIRECTION」フィールドの値に基づいてノード65に連結する各エッジ62の向きを決定する。これにより、制御部11は、第4モードの有向グラフ54を生成することができる。
制御部11は、ステップS109において、このように生成された有向グラフ54を表示装置15に出力する。この有向グラフ54によれば、各デバイス変数31だけではなく、制御プログラム221で利用される他の変数も表現することができる。そのため、各デバイス変数31間に他の変数が介在する場合に、その他の変数に関する依存関係を各デバイス変数31間の依存関係に関連付けて示すことができる。
ここで、図17Dを用いて、第4モードの有向グラフの異なる表示形態の一例について説明する。図17Dは、本実施形態に係る解析装置1により、図17Cとは異なる表示形態で生成された第4モードの有向グラフ541の一例を模式的に例示する。図17Cの例では、有向グラフ54は、上記第3モードと同様に、各表記(631、632、641、642)により、関数のインスタンスにおける入力パラメータ及び出力パラメータそれぞれの名称を示す表示形態で生成されている。これに対して、図17Dで例示される有向グラフ541は、上記第2モードと同様に、関数のインスタンスにおける入力パラメータ及び出力パラメータそれぞれの名称を示さない表現形態で生成されている。この点を除いて、有向グラフ541は、上記有向グラフ54と同様に生成されている。このように、第4モードの有向グラフの表示形態は、上記第3モードの表示形態に限られなくてもよく、実施の形態に応じて適宜選択されてよい。
また、この第4モードにおいても、上記第2モード及び第3モードと同様に、各有向グラフ(54、541)は、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とを異なる形態で示すように生成されてもよい。図17C及び図17Dの例では、各ブロック(63、64)は、上記図17Aと同様の形態で示されている。ただし、第4モードにおける関数の各ブロック(63、64)を表現する方法は、このような例に限定されなくてもよい。この第4モードにおいても、上記第2モード及び第3モードと同様に、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とは同じ形態で示されてもよい。
(5)第5モード
次に、図18Aを用いて、第5モードの有向グラフの一例について説明する。図18Aは、本実施形態に係る解析装置1により生成される第5モードの有向グラフ55の一例を模式的に例示する。第5モードは、関数の内部構造を示すモードである。
この第5モードでは、有向グラフ55は、上記複数のノード61、上記1つ以上のエッジ62、及びブロック(63、64)の他に、ブロック(63、64)内に配置され、表現される関数のインスタンスにおける入力パラメータ及び出力パラメータそれぞれをそれぞれ表現する複数のノード(634、635、644、645)を更に含むように生成される。各ノード(634、635、644、645)は、表現される入力パラメータ及び出力パラメータそれぞれに対して依存関係を有するデバイス変数31を表現するノード61にエッジ62を介して連結される。また、表現される関数において互いに依存関係を有する入力パラメータ及び出力パラメータそれぞれを表現するノード(634、635)(644、645)同士は、エッジ62を介して連結される。各ノード(634、635、644、645)は、本発明の「第3ノード」の一例である。
制御部11は、ステップS108において、依存関係を特定した結果に基づいて、当該有向グラフ55を生成する。具体的には、上記第2モード~第4モードと同様に、制御部11は、特定結果データ227から中間データ226及び抽出結果データ224をさかのぼって参照する。制御部11は、上記第3モードと同様に、抽出結果データ224の該当レコードに基づいて、関数の各パラメータに対して依存関係を有する各デバイス変数31を特定する。この特定結果に基づいて、制御部11は、エッジ62により連結する各ノード61と各ノード(634、635、644、645)との組み合わせを決定する。
また、制御部11は、標準関数のインスタンスを表現するブロック63内に、入力パラメータを表現するノード634及び出力パラメータを表現するノード635を配置する。そして、制御部11は、関数構造情報121(及び、追加の関数構造情報123)を参照することで、標準関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定する。上記の例では、例えば、関数構造情報121の4番目~6番目のレコードを参照することで、制御部11は、標準関数のインスタンス「Inst_StdFB2」における入力パラメータと出力パラメータとの依存関係を特定することができる。この特定結果に基づいて、制御部11は、エッジ62により連結するノード634及びノード635の組み合わせを決定する。
更に、制御部11は、ユーザ定義関数のインスタンスを表現するブロック64内に、入力パラメータを表現するノード644及び出力パラメータを表現するノード645を配置する。ユーザ定義関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係は適宜特定されてよい。例えば、制御部11は、抽出結果データ224の該当レコードに基づいて、ユーザ定義関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定してもよい。また、例えば、制御部11は、ユーザ定義関数のインスタンスにおける各パラメータを上記デバイス変数31と同様に取り扱い、上記ステップS102~ステップS107の処理を実行することで、ユーザ定義関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定してもよい。この特定結果に基づいて、制御部11は、エッジ62により連結するノード644及びノード645の組み合わせを決定する。これにより、制御部11は、第5モードの有向グラフ55を生成することができる。
制御部11は、ステップS109において、このように生成された有向グラフ55を表示装置15に出力する。この有向グラフ55によれば、各パラメータを表現する各ノード(634、635、644、645)を含むグラフ表現により、制御プログラム221における各デバイス変数31間の関数を介した依存関係を示すことができる。そのため、各デバイス変数31間の関数を介した依存関係を適切に把握ことができるようになる。
なお、この第5モードにおいても、上記第2モード~第4モードと同様に、有向グラフ55は、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とを異なる形態で示すように生成されてもよい。図18Aの例では、各ブロック(63、64)は、上記図17Aと同様の形態で示されている。ただし、第5モードにおける関数の各ブロック(63、64)を表現する方法は、このような例に限定されなくてもよい。この第5モードにおいても、上記第2モード~第4モードと同様に、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とは同じ形態で示されてもよい。
(6)第6モード
次に、図18Bを用いて、第6モードの有向グラフの一例について説明する。図18Bは、本実施形態に係る解析装置1により生成される第6モードの有向グラフ56の一例を模式的に例示する。第6モードは、ユーザ定義関数の内部で利用される変数を示すモードである。
上記の例では、制御プログラム221は、各デバイス変数31とは異なるローカル変数「Exe」を含んでいる。このローカル変数「Exe」は、ユーザ定義関数「My_FB」の内部において、互いに依存関係を有する入力パラメータ「Enable」及び出力パラメータ「Out1」の間で利用されている。このように、制御プログラム221における複数の変数は、各デバイス変数31とは異なる1つ以上のローカル変数であって、ユーザ定義関数の内部において、互いに依存関係を有する入力パラメータ及び出力パラメータの間で利用される1つ以上のローカル変数を含んでもよい。この場合に、第6モードの有向グラフ56は、上記第5モードに加えて、1つ以上のローカル変数を表現する1つ以上のノード67であって、ユーザ定義関数のインスタンスを表現するブロック64内において、互いに依存関係を有する入力パラメータ及び出力パラメータそれぞれを表現するノード(644、645)間に配置され、かつそれぞれにエッジ62を介して連結された1つ以上のノード67を更に含むように生成される。ノード67は、本発明の「第4ノード」の一例である。
関数の各パラメータに対する各デバイス変数31の依存関係を特定する過程で、各デバイス変数31と関数の各パラメータとの間で利用される他の変数の存在を特定することができる。抽出結果データ224の各レコードの「VARIABLE」フィールドにはその結果を示す情報が格納されており、上記第4モードでは、制御部11は、その情報を利用して、他の変数を表現するノード65の配置及びエッジ62の連結を決定している。これと同様に、ユーザ定義関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定する過程で、入力パラメータと出力パラメータとの間で利用されているローカル変数の存在を特定することができる。
例えば、制御部11は、ステップS108において、上記第5モードと同様の方法で、ユーザ定義関数のインスタンスにおける入力パラメータと出力パラメータとの間の依存関係を特定してもよい。その過程で、制御部11は、ローカル変数の利用されている場所を特定する。この特定結果を利用して、制御部11は、ローカル変数を表現するノード67をブロック64内に配置し、そのローカル変数と依存関係を有する各パラメータを表現する各ノード(644、645)とノード67とをエッジ62により連結する。これにより、制御部11は、第6モードの有向グラフ56を生成することができる。
制御部11は、ステップS109において、このように生成された有向グラフ56を表示装置15に出力する。この有向グラフ56によれば、ユーザ定義関数内で利用されているローカル変数を表現することができる。そのため、制御プログラム221におけるデバイス変数31間のユーザ定義関数を介した依存関係を当該ユーザ定義関数の内部構造に関連付けて示すことができる。
なお、この第6モードにおいても、上記第2モード~第5モードと同様に、有向グラフ56は、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とを異なる形態で示すように生成されてもよい。図18Bの例では、各ブロック(63、64)は、上記図17Aと同様の形態で示されている。ただし、第6モードにおける関数の各ブロック(63、64)を表現する方法は、このような例に限定されなくてもよい。この第6モードにおいても、上記第2モード~第5モードと同様に、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック64とは同じ形態で示されてもよい。
(7)第7モード
次に、図18Cを用いて、第7モードの有向グラフの一例について説明する。図18Cは、本実施形態に係る解析装置1により生成される第7モードの有向グラフ57の一例を模式的に例示する。第7モードは、ユーザ定義関数の内部で利用される標準関数を示すモードである。
上記の例では、制御プログラム221は、ユーザ定義関数「My_FB」の内部において、互いに依存関係を有する入力パラメータ「Arg1」「Exe」及び出力パラメータ「Out1」の間で利用される標準関数「STD_FB1」を含んでいる。このように、制御プログラム221における複数の関数のインスタンスは、ユーザ定義関数の内部において、互いに依存関係を有する入力パラメータ及び出力パラメータの間で利用される1つ以上の標準関数のインスタンスを含んでもよい。この場合に、第7モードの有向グラフ57は、ユーザ定義関数のインスタンスの内部で利用される標準関数のインスタンスを表現するブロック66が、ユーザ定義関数のインスタンスを表現するブロック64内において、互いに依存関係を有する入力パラメータ及び出力パラメータそれぞれを表現するノード(644、645)間に配置され、かつそれぞれにエッジ62を介して連結されるように生成される。ブロック66は、本発明の「第1のブロック」の一例である。
制御部11は、ステップS108において、上記第6モードにおけるローカル変数と同様に、ユーザ定義関数のインスタンスの内部で利用される標準関数のインスタンスを表現するブロック66の配置及びエッジ62を介してブロック66と連結する各ノード(644、645)を特定することができる。また、制御部11は、抽出結果データ224の該当レコードからも、ブロック66の配置及びエッジ62を介してブロック66と連結する各ノード(644、645)を特定することができる。これらの特定結果を利用して、制御部11は、標準関数のインスタンスを表現するブロック66をブロック64内に配置し、その標準関数のインスタンスの各パラメータと依存関係を有する各パラメータを表現する各ノード(644、645)とブロック66をエッジ62により連結する。これにより、制御部11は、第7モードの有向グラフ57を生成することができる。
制御部11は、ステップS109において、このように生成された有向グラフ57を表示装置15に出力する。この有向グラフ57によれば、ユーザ定義関数内で利用されている標準関数を表現することができる。そのため、制御プログラム221におけるデバイス変数31間のユーザ定義関数を介した依存関係を当該ユーザ定義関数の内部構造に関連付けて示すことができる。
なお、図18Cの例では、有向グラフ57は、上記第6モードと同様に、ローカル変数を表現するノード67を含むように生成されている。このように、第7モードの表示形態においても、第6モードの表示形態が採用されてもよい。ただし、第7モードの表示形態は、このような例に限定されなくてもよい。第7モードの表示形態において、第6モードの表示形態は省略されてもよい。図18Cにより例示される有向グラフ57から、ノード67の表示は省略されてもよい。この場合、入力パラメータ「Enable」を表現するノード644からブロック66にエッジ62が連結される。
また、この第7モードにおいて、上記第2モード~第6モードと同様に、有向グラフ57は、標準関数のインスタンスを表現するブロック(63、66)とユーザ定義関数のインスタンスを表現するブロック64とを異なる形態で示すように生成されてもよい。図18Cの例では、各ブロック(63、64、66)は、上記図17Aと同様の形態で示されている。ただし、第7モードにおける関数の各ブロック(63、64、66)を表現する方法は、このような例に限定されなくてもよい。この第7モードにおいても、上記第2モード~第6モードと同様に、標準関数のインスタンスを表現するブロック(63、66)とユーザ定義関数のインスタンスを表現するブロック64とは同じ形態で示されてもよい。
また、図18Cの例では、ブロック63は、上記第5モードと同様の形態で示されており、ブロック66は、上記第2モード等におけるブロック63と同様の形態で示されている。ただし、第7モードにおけるブロック66を表現する方法は、このような例に限定されなくてもよい。ブロック66も、上記第5モードにおけるブロック63と同様の形態で示されてよい。
(8)第8モード
次に、図18Dを用いて、第8モードの有向グラフの一例について説明する。図18Dは、本実施形態に係る解析装置1により生成される第8モードの有向グラフ58の一例を模式的に例示する。第8モードは、ユーザ定義関数の内部で利用される他のユーザ定義関数を示すモードである。
上記の例では、制御プログラム221は、ユーザ定義関数「My_FB」の内部で利用される標準関数「STD_FB1」を含んでいる。この標準関数「STD_FB1」に代えて、あるいはこの標準関数「STD_FB1」と共に、ユーザ定義関数「My_FB」の内部において、ユーザ定義関数が利用されてもよい。つまり、制御プログラム221における複数の関数は、ユーザ定義関数の内部において、互いに依存関係を有する入力パラメータ及び出力パラメータの間で利用される他のユーザ定義関数を含んでもよい。この場合に、第8モードの有向グラフ58は、ユーザ定義関数のインスタンスの内部で利用される他のユーザ定義関数のインスタンスを表現するブロック661が、ユーザ定義関数のインスタンスを表現するブロック64内において、互いに依存関係を有する入力パラメータ及び出力パラメータそれぞれを表現するノード(644、645)間に配置され、かつそれぞれにエッジ62を介して連結されるように生成される。ブロック661は、本発明の「他の第2のブロック」の一例である。
第8モードは、ユーザ定義関数内で表示する関数の種別が異なる点を除き、上記第7モードと同様である。そのため、制御部11は、ステップS108において、上記第7モードと同様の方法により、ユーザ定義関数のインスタンスの内部で利用される他のユーザ定義関数のインスタンスを表現するブロック661の配置及びエッジ62を介してブロック661と連結する各ノード(644、645)を特定することができる。これらの特定結果を利用して、制御部11は、他のユーザ定義関数のインスタンスを表現するブロック661をブロック64内に配置し、当該他のユーザ定義関数のインスタンスの各パラメータと依存関係を有する各パラメータを表現する各ノード(644、645)とブロック661とをエッジ62により連結する。これにより、制御部11は、第8モードの有向グラフ58を生成することができる。
制御部11は、ステップS109において、このように生成された有向グラフ58を表示装置15に出力する。この有向グラフ58によれば、ユーザ定義関数内で利用されている他のユーザ定義関数を表現することができる。そのため、制御プログラム221におけるデバイス変数31間のユーザ定義関数を介した依存関係を当該ユーザ定義関数の内部構造に関連付けて示すことができる。
なお、図18Dの例では、有向グラフ58は、上記第6モードと同様に、ローカル変数を表現するノード67を含むように生成されている。このように、第8モードにおいても、第6モードの表示形態が採用されてもよい。ただし、第8モードの表示形態は、このような例に限定されなくてもよい。第8モードの表示形態において、第6モードの表示形態は省略されてもよい。図18Dにより例示される有向グラフ58から、ノード67の表示は省略されてもよい。この場合、入力パラメータ「Enable」を表現するノード644からブロック661にエッジ62が連結される。
また、上記第7モードと同様に、制御プログラム221が、ユーザ定義関数内で利用される標準関数を含む場合、第8モードの表示形態において、第7モードの表示形態を更に採用してもよい。更に、図18Dにより例示されるとおり、第8モードにおいて、上記第2モード~第7モードと同様に、有向グラフ57は、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック(64、661)とを異なる形態で示すように生成されてもよい。ただし、第8モードにおける関数の各ブロック(63、64、661)を表現する方法は、このような例に限定されなくてもよい。第8モードにおいても、上記第2モード~第7モードと同様に、標準関数のインスタンスを表現するブロック63とユーザ定義関数のインスタンスを表現するブロック(64、661)とは同じ形態で示されてもよい。
また、図18Dの例では、ブロック661は、上記第5モード~第8モードにおけるブロック64とは異なり、上記第2モード~第4モードにおけるブロック64と同様の形態で示されている。しかしながら、第8モードにおけるブロック661を表現する方法は、このような例に限定されなくてもよい。ブロック661も、上記第5モード~第8モードにおけるブロック64と同様の形態で、すなわち、他のユーザ定義関数の内部構造が表現された状態で示されてよい。
(9)第9モード
次に、図19及び図20Aを用いて、第9モードの有向グラフの一例について説明する。図19は、制御プログラム221の変形例である制御プログラム221Aの一例を示す。図20Aは、図19の制御プログラム221Aに対して依存関係を特定した結果に基づいて、本実施形態に係る解析装置1により生成された第9モードの有向グラフ591の一例を模式的に例示する。第9モードは、各デバイス変数と制御プログラム内のサブプログラムとの対応関係を示すモードである。
図19に例示される制御プログラム221Aは、サブプログラム2211を2つのサブプログラム(2291、2292)に分割した点を除き、上記図7に例示される制御プログラム221と同様である。以下の第9モード及び第10モードの説明では、図19に例示される制御プログラム221Aに対してステップS101~S109の処理が実行されるものと想定する。なお、図19に例示される制御プログラムを区別して称す場合に「221A」と符合し、区別せずに称す場合には「221」と符合する。
図19に例示される制御プログラム221Aは、3つのサブプログラム2291~2293に分割されている。このように、制御プログラム221は、複数のサブプログラムに分割されていてよい。この場合に、第9モードの有向グラフ591は、各サブプログラムにそれぞれ対応する複数の領域681を含み、各ノード61が、複数の領域681のうち、表現するデバイス変数31を利用するサブプログラムの領域681に配置される、ように生成される。
制御部11は、ステップS108において、制御プログラム221Aを構成する各サブプログラム2291~2293を特定する。制御プログラム221Aを構成する各サブプログラム2291~2293を特定する方法は、特に限定されなくてもよい。例えば、制御部11は、制御プログラム221Aから直接的に各サブプログラム2291~2293を特定してもよい。また、依存性解析の結果として得られる抽出結果データ224の各レコードの「PROGRAM」フィールドには、対応するプログラム部分の所在を示す情報が格納されている。そのため、制御部11は、抽出結果データ224の各レコードの「PROGRAM」フィールドの値を参照することで、各サブプログラム2291~2293を特定してもよい。
次に、制御部11は、特定された各サブプログラム2291~2293に対応する領域681を設定する。続いて、制御部11は、特定された各サブプログラム2291~2293から、各デバイス変数31を利用するサブプログラムを特定する。図19の制御プログラム221Aでは、例えば、デバイス変数「D1」は、サブプログラム2291で利用されている。また、例えば、デバイス変数「D3」は、2つのサブプログラム(2291、2292)で利用されている。この利用関係は、適宜特定されてよい。例えば、制御部11は、抽出結果データ224の各レコードの「PROGRAM」フィールドの値を参照することで、各デバイス変数31を利用するサブプログラムを特定することができる。そして、制御部11は、各デバイス変数31を表現する各ノード61を該当の領域681に配置する。有向グラフ591の生成処理に関して、その他の点については、上記第1モード~第8モードまでと同様であってよい。これにより、制御部11は、第9モードの有向グラフ591を生成することができる。
なお、図20Aに例示されるように、有向グラフ591は、上記第2モード~第8モードまでと同様に、関数のインスタンスを表現する各ブロック(63、64)を含むように生成されてよい。この場合、制御部11は、各デバイス変数31と同様に、関数を利用するサブプログラムを特定する。そして、制御部11は、関数のインスタンスを表現する各ブロック(63、64)を該当の領域681に配置する。
同様に、有向グラフ591は、上記第4モードと同様に、他の変数を表現するノード65を含むように生成されてよい。この場合、制御部11は、各デバイス変数31と同様に、他の変数を利用するサブプログラムを特定する。そして、制御部11は、他の変数を表現するノード65を該当の領域681に配置する。
また、デバイス変数「D3」のように、複数のサブプログラムで利用されているデバイス変数が存在する場合、制御部11は、当該デバイス変数を表現するノード61をそれぞれの領域681に配置してもよい。図20Aの例では、デバイス変数「D3」を表現するノード61は、サブプログラム「Program0」及び「Program1」に対応する領域681それぞれに配置されている。この場合、図20Aに例示されるように、制御部11は、同じデバイス変数に対応するノード61同士をエッジ684で連結してもよい。これにより、エッジ684に連結されたノード61が同じデバイス変数に対応することを示すことができる。その他の変数及び関数それぞれが複数のサブプログラムで利用されている場合についても同様である。
更に、図20Aに示されるように、有向グラフ591は、各ノード61の付近に、表現する各デバイス変数31の制御プログラム221Aにおける所在を示すように生成されてもよい。この所在を示す情報は、適宜取得されてよい。例えば、この所在を示す情報は、抽出結果データ224の各レコードの「PROGRAM」フィールドに格納されていてもよい。この場合、制御部11は、抽出結果データ224の各レコードの「PROGRAM」フィールドを参照することで、各デバイス変数31の所在を示す情報を取得することができる。また、制御部11は、各デバイス変数31の所在を示す情報を制御プログラム221Aから直接的に取得してもよい。そして、制御部11は、各デバイス変数31を表現するノード61付近に取得された所在を示す情報を表示する。制御部11は、その他の変数及び関数についても同様に取り扱ってよい。図20Aの例では、有向グラフ591は、各ノード61、ノード65、及び各ブロック(63、64)付近に、表現する各デバイス変数31、他の変数、及び関数の制御プログラム221Aにおける所在を示す各所在表記683が配置されるように生成されている。
制御部11は、ステップS109において、このように生成された有向グラフ591を表示装置15に出力する。この有向グラフ591によれば、各デバイス変数31と各サブプログラム2291~2293との間の対応関係を示すことができる。そのため、分割プログラミングが行われた場合に、各デバイス28に対応するデバイス変数31の制御プログラム221Aにおける所在と各デバイス変数31間の依存関係とを関連付けて示すことができる。
なお、図20Aに例示される有向グラフ591は、関数のインスタンスを表現する各ブロック(63、64)を含むように生成されている。ただし、第9モードの有向グラフ591は、このような例に限定されなくてもよい。第9モードの有向グラフ591において、上記第1モードと同様に、各ブロック(63、64)の表示は省略されてよい。
また、図20Aに例示される有向グラフ591は、上記第4モードと同様に、他の変数を表現するノード65を含むように生成されている。ただし、第9モードの有向グラフ591は、このような例に限定されなくてもよい。第9モードの有向グラフ591において、上記第1モード等と同様に、ノード65の表示は省略されてよい。
更に、図20Aに例示される有向グラフ591は、各所在表記683を示すように生成されている。ただし、第9モードの有向グラフ591は、このような例に限定されなくてもよい。第9モードの有向グラフ591において、各所在表記683は省略されてもよい。
(10)第10モード
次に、図20Bを用いて、第10モードの有向グラフの一例について説明する。図20Bは、図19の制御プログラム221Aに対して依存関係を特定した結果に基づいて、本実施形態に係る解析装置1により生成された第10モードの有向グラフ592の一例を模式的に例示する。第10モードは、各デバイス変数とサブプログラム内のセクションとの対応関係を示すモードである。
上記図19の例では、制御プログラム221Aのサブプログラム2291は、セクション2295に分割され、サブプログラム2292は、セクション2296に分割されている。このように、制御プログラム221Aが、複数のサブプログラムに分割されている場合に、複数のサブプログラムのうちの少なくともいずれかのサブプログラムは、1つ以上のセクションに分割されていてもよい。この場合に、第10モードの有向グラフ592は、1つ以上のセクションに分割されたサブプログラムの領域681が、1つ以上のセクションに対応する1つ以上のサブ領域682を含み、かつセクションで利用されたデバイス変数31を表現するノード61が当該セクションに対応するサブ領域682に配置される、ように生成される。
制御部11は、ステップS108において、上記第9モードにおけるサブプログラム2291~2293と同様に、各サブプログラム2291~2293で利用されているセクション(2295、2296)を特定し、各セクション(2295、2296)に対応するサブ領域682を該当の領域681内に設定する。次に、制御部11は、上記第9モードにおいて、各サブプログラム2291~2293と各デバイス変数31との間の利用関係を特定した方法と同様に、各セクション(2295、2296)と各デバイス変数31との間の利用関係を特定する。そして、制御部11は、各デバイス変数31を表現する各ノード61を該当のサブ領域682に配置する。有向グラフ592の生成処理に関して、その他の点については、上記第9モードと同様であってよい。これにより、制御部11は、第10モードの有向グラフ592を生成することができる。
制御部11は、ステップS109において、このように生成された有向グラフ592を表示装置15に出力する。この有向グラフ592によれば、各デバイス変数31と各サブプログラム2291~2293の各セクション(2295、2296)との間の対応関係を示すことができる。そのため、分割プログラミングが行われた場合に、各デバイス28に対応するデバイス変数31の制御プログラム221Aにおける所在と各デバイス変数31間の依存関係とを関連付けてかつより明確に示すことができる。
なお、図20Bに例示される有向グラフ592は、関数のインスタンスを表現する各ブロック(63、64)を含むように生成されている。ただし、第10モードの有向グラフ592は、このような例に限定されなくてもよい。第10モードの有向グラフ592において、上記第1モードと同様に、各ブロック(63、64)の表示は省略されてよい。
また、図20Bに例示される有向グラフ592は、上記第4モードと同様に、他の変数を表現するノード65を含むように生成されている。ただし、第10モードの有向グラフ592は、このような例に限定されなくてもよい。第10モードの有向グラフ592において、上記第1モード等と同様に、ノード65の表示は省略されてよい。
更に、図20Bに例示される有向グラフ592は、上記第9モードと同様に、各所在表記683を示すように生成されている。ただし、第10モードの有向グラフ592は、このような例に限定されなくてもよい。第10モードの有向グラフ592において、各所在表記683は省略されてもよい。
(表示制御)
ステップS109により、制御部11は、上記第1モード~第10モードの有向グラフ(51~54、541、55~58、591、592)のいずれかを表示装置15に出力する。この際、制御部11、入力装置14を介して、出力する有向グラフの形態の指定をユーザから受け付けてもよい。そして、制御部11は、ユーザの指定に応じて、任意のモードから他のモードに有向グラフの形態を切り替えて表示装置15に表示させてもよい。
例えば、制御部11は、ユーザの指示に応じて、第1モードの有向グラフ51及び第2モードの有向グラフ52を表示装置15に切り替えて表示させてもよい。また、制御部11は、ユーザの指示に応じて、第2モードの有向グラフ52及び第3モードの有向グラフ53を表示装置15に切り替えて表示させてもよい。この場合、制御部11は、第2モードの表示形態と第3モードの表示形態とを切り替え可能に有向グラフ(52、53)を生成する。更に、制御部11は、ユーザの指示に応じて、第1モードの有向グラフ51、第2モードの有向グラフ52、及び第4モードの有向グラフ(54、541)を表示装置15に切り替えて表示させてもよい。なお、第4モードの有向グラフ54では、第3モードの表示形態が採用されている。第4モードの有向グラフ541では、第2モードの表示形態が採用されている。第2モード及び第3モードの両方の表示形態を第4モードで採用する場合には、制御部11は、各表示形態を切り替えて表示装置15に表示可能に第4モードの有向グラフ(54、541)を生成してもよい。
また、例えば、制御部11は、ユーザの指示に応じて、第2モードの有向グラフ52及び第5モードの有向グラフ55を表示装置15に切り替えて表示させてもよい。このケースにおいて、制御部11は、第2モードの有向グラフ52に代えて、第3モードの有向グラフ53又は第4モードの有向グラフ(54、541)を表示装置15に表示させてもよい。加えて、制御部11は、ユーザの指示に応じて、第5モード~第8モードの有向グラフ55~58を表示装置15に切り替えて表示させてもよい。この場合、制御部11は、第5モード~第8モードの表示形態を切り替え可能に有向グラフ55~58を生成する。なお、このケースにおいて、第6モード~第8モードのいずれかは省略されてよい。
また、例えば、制御部11は、ユーザの指示に応じて、第1モードの有向グラフ51及び第9モードの有向グラフ591を表示装置15に切り替えて表示させてもよい。このケースにおいて、制御部11は、第1モードの有向グラフ51に代えて、第2モード~第8モードの有向グラフ(52~54、541、55~58)のいずれかを表示装置15に表示させてもよい。加えて、制御部11は、ユーザの指示に応じて、第9モードの有向グラフ591及び第10モードの有向グラフ592を表示装置15に切り替えて表示させてもよい。この場合、制御部11は、第9モードの表示形態と第10モードの表示形態とを切り替え可能に有向グラフ(591、592)を生成する。
任意のモードから他のモードに変更する場合、制御部11は、有向グラフ全体の表示を切り替えてもよい。あるいは、制御部11は、有向グラフの一部の表示を切り替えてもよい。この場合、制御部11は、有向グラフにおいてモードを変更する部分の指定を受け付けて、指定された部分の表示を切り替えてもよい。一例として、第1モードの有向グラフ51を表示装置15に表示させている間に、制御部11は、モードを変更する部分の指定としてエッジ62の選択を受け付けてもよい。そして、制御部11は、選択されたエッジ62により連結された2つデバイス変数間の依存関係を第2モードで示すように有向グラフの表示を切り替えてもよい。
なお、上記第2モード~第10モードにおいて、「エッジを介して連結すること」は、直接的に依存関係を有する変数及び関数をそれぞれ表現するノード及びブロックを互いに直接的にエッジで連結することを含んでよい。加えて、上記第2モード~第10モードにおいて、「エッジを介して連結すること」は、他の変数又は/及び関数が介在し、間接的に依存関係を有する変数及び関数をそれぞれ表現するノード及びブロックを、他の変数又は/及び関数を表現するノード又は/及びブロックを介在させて、それぞれをエッジで連結するケースを含んでよい。
また、上記第4モード~第6モードのように、例えば、各ノード(61、65、67、634、635、644、645)等の種別の異なる変数を表現する複数のノードを表示する場合、制御部11は、上記各関数のブロックと同様に、各ノードを異なる形態で示してもよい。例えば、制御部11は、デバイス変数/その他の変数、外部変数/内部変数、及びローカル変数/グローバル変数のいずれかの種別の相違に応じて、各ノードを異なる形態で示してもよい。各ノードの形態は、例えば、線の種類、色、形状、文字のフォント等の属性により規定されてよい。また、各ノードに対応するシンボルを定義し、定義された各シンボルを各ノードの表示に利用してもよい。
このように、上記第1モード~第10モードの有向グラフ(51~54、541、55~58、591、592)のいずれかを表示装置15に出力すると、制御部11は、本動作例に係る処理を終了する。
[特徴]
以上のとおり、本実施形態に係る解析装置1は、上記ステップS106(ステップS508)において、関数構造情報121を参照して、標準関数41の入力パラメータ43と出力パラメータ44との間の依存関係を特定する。関数構造情報121では依存関係の定義されていない標準関数が制御プログラム221に含まれている場合には、本実施形態に係る解析装置1は、上記ステップS105において、追加の関数構造情報123の入力を受け付ける。そして、本実施形態に係る解析装置1は、上記ステップS106(ステップS508)において、関数構造情報121及び追加の関数構造情報123を参照して、標準関数41の入力パラメータ43と出力パラメータ44との間の依存関係を特定する。これにより、本実施形態に係る解析装置1は、上記ステップS107(ステップS509)において、標準関数41を介在する複数のデバイス変数31間の依存関係を特定することができる。したがって、本実施形態によれば、制御プログラム221が標準関数41を含む場合でも、その制御プログラム221から生産ライン27を構成する複数のデバイス28間の依存関係を適切に導出することができる。
§4 変形例
以上、本発明の実施の形態を詳細に説明してきたが、前述までの説明はあらゆる点において本発明の例示に過ぎない。本発明の範囲を逸脱することなく種々の改良や変形を行うことができることは言うまでもない。例えば、以下のような変更が可能である。なお、以下では、上記実施形態と同様の構成要素に関しては同様の符号を用い、上記実施形態と同様の点については、適宜説明を省略した。以下の変形例は適宜組み合わせ可能である。
<4.1>
上記実施形態では、ステップS108において、制御部11は、上記第1モード~第10モードの有向グラフ(51~54、541、55~58、591、592)を生成する。しかしながら、制御部11により生成可能な有向グラフは、このような例に限られなくてもよい。例えば、上記第1モード~第10モードのうちの少なくともいずれかは省略されてもよい。また、例えば、制御部11は、上記第1モード~第10モードとは異なる形態の有向グラフを生成してもよい。
また、上記実施形態では、ステップS109において、制御部11は、各デバイス変数31間の依存関係を特定した結果に関する情報として有向グラフ(51~54、541、55~58、591、592)を出力する。しかしながら、各デバイス変数31間の依存関係を特定した結果に関する情報の形態は、このような有向グラフに限られなくてもよく、実施の形態に応じて適宜選択されてよい。例えば、制御部11は、各デバイス変数31間の依存関係を特定した結果を、無向グラフにより示してもよいし、あるいはグラフ以外の表現(例えば、文字表現)により示してもよい。
また、上記実施形態では、制御部11は、各デバイス変数31間の依存関係を特定した結果に関する情報を表示装置15に出力している。しかしながら、情報の出力先は、このような例に限られなくてもよく、実施の形態に応じて適宜選択されてよい。例えば、制御部11は、各デバイス変数31間の依存関係を特定した結果に関する情報を、表示装置15とは別の表示装置に出力してもよいし、表示装置以外の出力先(例えば、メモリ、表示装置以外の出力装置)に出力してもよい。
<4.2>
上記実施形態では、解析装置1は、ステップS103において、未定義の標準関数のインスタンスが制御プログラム221に含まれているか否かを判定する。そして、未定義の標準関数のインスタンスが制御プログラム221に含まれていると判定した場合に、解析装置1は、ステップS105において、追加の関数構造情報123の入力を受け付ける。これらのステップS103~ステップS105の処理は省略されてもよい。この場合、解析装置1のソフトウェア構成において、定義判定部113及び定義受付部114は省略されてよい。
<4.3>
上記実施形態では、解析装置1は、ステップS101~ステップS107の処理により、制御プログラム221から各デバイス変数31間の依存関係を特定している。そして、解析装置1は、ステップS108及びステップS109の処理により、特定結果を示す有向グラフを生成し、生成した有向グラフを表示装置15に出力している。これらの依存関係を特定する処理及び特定結果を出力する処理の両方を実行する上記解析装置1は、「グラフ表示装置」の一例である。上記プログラム取得部111~関係特定部116は、「情報取得部」の一例である。ただし、これらの処理は、必ずしも同一のコンピュータで実行されなくてもよい。すなわち、これらの依存関係を特定する処理及び特定結果を出力する処理は、別々のコンピュータで実行されてよい。この場合に、特定結果を出力する処理を実行するコンピュータを「グラフ表示装置」と称してもよい。
(ハードウェア構成)
図21は、本変形例に係るグラフ表示装置7のハードウェア構成の一例を模式的に例示する。図21に示されるとおり、本変形例に係るグラフ表示装置7は、制御部71、記憶部72、通信インタフェース73、入力装置74、表示装置75、及びドライブ76が電気的に接続されたコンピュータである。なお、図21では、通信インタフェースを「通信I/F」と記載している。
グラフ表示装置7の制御部71~ドライブ76はそれぞれ、上記解析装置1の制御部11~ドライブ16と同様であってよい。本変形例では、記憶部72は、グラフ表示プログラム82等の各種情報を記憶する。グラフ表示プログラム82は、各デバイス変数31間の因果関係を特定した結果を示す有向グラフを生成し、生成した有向グラフを表示装置(例えば、表示装置75)に出力するための情報処理(後述する図23)をグラフ表示装置7に実行させるためのプログラムである。グラフ表示プログラム82は、この情報処理の一連の命令を含む。グラフ表示プログラム82は、記憶媒体92に記憶されていてもよい。また、グラフ表示装置7は、ドライブ76を介して記憶媒体92からグラフ表示プログラム82を取得してもよい。
なお、上記解析装置1と同様に、グラフ表示装置7の具体的なハードウェア構成に関して、実施形態に応じて、適宜、構成要素の省略、置換及び追加が可能である。グラフ表示装置7は、複数台のコンピュータで構成されてもよい。この場合、各コンピュータのハードウェア構成は、一致していてもよいし、一致していなくてもよい。また、グラフ表示装置7は、提供されるサービス専用に設計された情報処理装置の他、デスクトップPC、タブレットPC等の汎用の情報処理装置、汎用のサーバ装置等であってもよい。
(ソフトウェア構成)
図22は、本変形例に係るグラフ表示装置7のソフトウェア構成の一例を模式的に例示する。グラフ表示装置7の制御部71は、記憶部72に記憶されたグラフ表示プログラム82をRAMに展開する。そして、制御部71は、RAMに展開されたグラフ表示プログラム82をCPUにより解釈及び実行して、各構成要素を制御する。これによって、図22に示されるとおり、本実施形態に係るグラフ表示装置7は、情報取得部711、グラフ生成部712、及び表示制御部713をソフトウェアモジュールとして備えるコンピュータとして動作する。すなわち、本変形例では、グラフ表示装置7の各ソフトウェアモジュールは、制御部71(CPU)により実現される。
情報取得部711は、制御プログラム221から特定された各デバイス変数31間の依存関係を示す依存関係情報721を取得する。情報取得部711は、関数における入力パラメータと出力パラメータとの間の依存関係を示す関数情報723を更に取得してもよい。依存関係情報721及び関数情報723は、上記関数構造情報121、追加の関数構造情報123、抽出結果データ224、中間データ226、特定結果データ227等により構成されてよい。グラフ生成部712は、依存関係情報721(及び関数情報723)に基づいて、上記各モードの有向グラフを生成する。グラフ生成部712は、上記グラフ生成部117と同様であってよい。表示制御部713は、生成された各モードの有向グラフを表示装置(例えば、表示装置75)に切り替えて表示させる。表示制御部713は、上記出力部118と同様であってよい。
グラフ表示装置7の各ソフトウェアモジュールに関しては後述する動作例で詳細に説明する。なお、本実施形態では、グラフ表示装置7の各ソフトウェアモジュールがいずれも汎用のCPUにより実現される例について説明している。しかしながら、以上のソフトウェアモジュールの一部又は全部が、1又は複数の専用のハードウェアプロセッサにより実現されてもよい。また、グラフ表示装置7のソフトウェア構成に関して、実施形態に応じて、適宜、ソフトウェアモジュールの省略、置換及び追加が行われてもよい。
(動作例)
図23は、本変形例に係るグラフ表示装置7の処理手順の一例を例示する。以下で説明するグラフ表示装置7の処理手順は、「グラフ表示方法」の一例である。ただし、以下で説明する処理手順は一例に過ぎず、各処理は可能な限り変更されてもよい。また、以下で説明する処理手順について、実施の形態に応じて、適宜、ステップの省略、置換、及び追加が可能である。
ステップS701では、制御部71は、情報取得部711として動作し、依存関係情報721を取得する。依存関係情報721は、制御プログラム221から特定された各デバイス変数31間の依存関係を示す。依存関係情報721は、例えば、上記特定結果データ227を含むように構成されてよい。また、上記第2モード等の関数を表現するブロックを含む有向グラフを生成する場合、依存関係情報721は、関数の各パラメータに対する各デバイス変数31の依存関係を更に示してもよい。この場合、依存関係情報721は、上記抽出結果データ224及び中間データ226を更に含むように構成されてよい。また、上記第9モード及び第10モードのように、サブプログラム、セクション等の制御プログラム221内の各デバイス変数31の所在を示す有向グラフを生成する場合、依存関係情報721は、抽出結果データ224の各レコードの「PROGRAM」フィールド等のように所在を示す情報を含むように構成されてよい。ただし、依存関係情報721の構成は、このような例に限定されなくてもよい。また、依存関係情報721のデータ形式は、特に限定されなくてもよく、実施の形態に応じて適宜設定されてよい。
加えて、上記第5モード~第8モードのように、関数の内部構造を示す有向グラフを生成する場合、制御部71は、関数情報723を更に取得してもよい。この関数情報723は、関数構造情報121、追加の関数構造情報123、抽出結果データ224のユーザ定義関数に関するレコード、ユーザ定義関数の各パラメータに対して依存関係を特定した結果を示すデータ等により構成されてよい。ただし、関数情報723の構成は、このような例に限定されなくてもよい。また、関数情報723のデータ形式は、特に限定されなくてもよく、実施の形態に応じて適宜設定されてよい。
依存関係情報721及び関数情報723は、上記解析装置1等の、各デバイス変数31間の依存関係を特定するように構成された他の情報処理装置により生成されてよい。制御部71は、例えば、ネットワーク、記憶媒体92等を介して、当該他の情報処理装置から依存関係情報721及び関数情報723を取得してもよい。また、依存関係情報721及び関数情報723は、NAS(Network Attached Storage)等の外部記憶装置に記憶されていてもよい。この場合、制御部71は、依存関係情報721及び関数情報723を外部記憶装置から取得してもよい。また、依存関係情報721及び関数情報723は、予め記憶部72に記憶されていてもよい。この場合、制御部71は、依存関係情報721及び関数情報723を記憶部72から取得してもよい。依存関係情報721及び関数情報723を取得する方法は、特に限定されなくてもよく、実施の形態に応じて適宜選択されてよい。依存関係情報721(及び関数情報723)を取得すると、制御部71は、次のステップS702に処理を進める。
ステップS702では、制御部71は、依存関係情報721(及び関数情報723)に基づいて、上記各モードの有向グラフ(51~54、541、55~58、591、592)を生成する。ステップS702の処理は、上記ステップS108の処理と同様であってよい。ステップS703では、制御部71は、生成された各モードの有向グラフ(51~54、541、55~58、591、592)を表示装置に切り替えて表示させる。出力先は、表示装置75であってもよいし、その他の表示装置(例えば、他の情報処理装置の表示装置)であってもよい。ステップS703の処理は、上記ステップS109の処理と同様であってよい。当該出力処理が完了すると、制御部71は、本変形例に係る処理を終了する。本変形例によれば、各デバイス変数31間の依存関係を特定する処理を実行するコンピュータと特定結果を出力する処理を実行するコンピュータとを別々に構成することができる。
<4.4>
上記実施形態では、解析装置1及びPLC2は別々のコンピュータにより構成されている。しかしながら、本発明が適用可能なシステムの構成は、このような例に限定されなくてもよい。解析装置1及びPLC2は一体のコンピュータにより構成されてよい。
図24は、本変形例に係る制御装置1Aの適用場面を模式的に例示する。本変形例に係る制御装置1Aは、上記実施形態に係る解析装置1及びPLC2の両方の役割を果たすように構成されたコンピュータである。この制御装置1Aのハードウェア構成は、上記解析装置1のハードウェア構成にPLC2の入出力インタフェース23を追加することで得られてよい。また、各デバイス28間の依存関係を特定する処理に関して、制御装置1Aのソフトウェア構成は、上記解析装置1のソフトウェア構成と同様であってよい。このように、生産ライン27の動作を制御する装置(PLC等)に本発明が適用されてよい。