以下に添付図面を参照し、本発明の検索装置に係る実施例を詳細に説明する。なお、以下に示す実施形態では、検索装置を、プログラム制御装置に適用した場合を示すこととするが、本発明はこれに制限するものではなく、変数を検索可能な装置であれば適用可能である。
図1は、本実施形態のシステム1をツリー形式で示した図である。図1に示されるように、本実施形態のシステム1は、複数のステーション100、101を備えている。
ステーション100は、コントローラ150、151の監視、操作用の端末であって、複数のコントローラ150、151と接続されている。なお、ステーション101は、ステーション100と同様の構成を備えているものとして、説明を省略する。
コントローラ150は、プログラム161、162を備え、プラントを制御する装置である。本実施形態のコントローラ150は、プログラム161、162に従ってプラント制御を行う。なお、コントローラ151は、プログラム163、164を備え、コントローラ150と同様の制御を行う。
プログラム161、162は、プラントを制御するためのプログラムとする。プログラム161は、ファンクション171、ファンクションブロック172を備えている。
本実施形態では、図1で示したように、階層構造となっている構成毎に変数の定義が可能となる。
図2は、本実施形態の階層ごとに定義されている変数を例示した図である。図2に示されるように、システム1は、ネットワーク251、261と、ステーション100、101と、を含んでいる。図2に示されるように、システム、ステーション、コントローラ、ローカルに従って、参照可能な範囲が定義されている。
図2に示されるように、ステーション100、101の間は、複数のネットワーク251、261で接続されているが、ネットワーク構成を制限するものではない。
ネットワーク251は、ネットワーク変数252が定義され、ネットワーク261には、ネットワーク変数262が定義されている。
ネットワーク変数252、262は、例えば、スキャン伝送方式のLAN上のスキャンデータとする。
ステーション100には、ステーション変数201と、I/O変数205と、が定義されていると共に、メインモジュール202、203、204と、I/Oモジュール206と、を備えている。なお、ステーション101は、ステーション100と同様の構成として説明を省略する。
ステーション変数201は、コントローラ間のデータの送受信に使用される。
I/O変数205は、プロセスI/O信号219や、I/Oデータ220の送受信に使用される。
メインモジュール202は、コンフィグレーション211と、タスク212と、を備え、コントローラ変数213が、定義されている。メインモジュール203は、コンフィグレーション214と、タスク215と、を備え、コントローラ変数216が、定義されている。
コンフィグレーション211、214は、メインユニットや、I/Oなどのハードウェア構成情報とする。
タスク212、215は、制御プログラムの実行スケジュール単位とする。タスク212は、ローカル変数217が定義され、タスク215は、ローカル変数218が定義されている。ローカル変数217、218は、タスク内でのみ参照できる変数とする。
コントローラ変数213、216は、コントローラ内の各種レジスタ、パラメータ、データとする。
メインモジュール(伝送モジュール)204は、ネットワーク251とデータの送受信を行うためのモジュールとする。メインモジュール(伝送モジュール)204は、ネットワーク変数252を用いることで、データの送受信を可能とする。
図2に示されるように、変数毎に、参照可能な範囲が定義されている。これら変数から、所望の変数を検索するためには、クロスリファレンス検索が用いられている。クロスリファレンス検索は、変数が、どこ(例えば、システム、ステーション、コントローラ、プログラム、及びファンクション等)で使用されているかを特定することができる。このようなクロスリファレンス検索では、変数名に基づいた検索が一般的である。
しかしながら、複数の異なる変数が、同一のアドレスを参照する場合も多い。このような場合に、変数名に基づいた検索では、当該異なる変数を関連する変数として検出するのは難しい。そこで、本実施形態においては、同一のアドレスに割り当てられた変数を検出するよう制御を行うこととした。
図3は、本実施形態のプログラム制御装置300と、コントローラ150と、の構成をツリー形式で示した図である。本実施形態のプログラム制御装置300と、コントローラ150と、は、ネットワーク251を介して接続されている。
コントローラ150は、通信部351と、メモリ部352と、で構成されている。
通信部351は、ネットワーク251を介して接続されているプログラム制御装置300とデータの送受信を制御する。
メモリ部352は、読み書き可能な記憶媒体とする。メモリ部352は、プログラム制御装置300から通信部351を介して受信した、プログラム情報361と、バイナリプログラム情報362と、を格納する。
プログラム情報361は、プログラム制御装置300から受信したプログラムに関する情報を記憶する。
バイナリプログラム情報362は、プログラム制御装置300から受信したバイナリプログラムを記憶する。
これにより、コントローラ150は、当該バイナリプログラム情報362に従って、プラント制御が可能となる。
プログラム制御装置300とは、制御プログラム編集部301と、データベース部302と、通信部303と、で構成されている。
通信部303は、ネットワーク251を介して接続されているコントローラ150とデータの送受信を制御する。本実施形態の通信部303は、プログラムコンパイラ312によってコンパイルされたプログラム(例えば、バイナリプログラム)を、コントローラ150に送信する。
制御プログラム編集部301は、プログラムエディタ311と、プログラムコンパイラ312とを備え、コントローラ150用の制御プログラム(例えば、プログラム161、162)を作成するためのツールとする。
プログラムコンパイラ312は、プログラムエディタ311で編集されたプログラムソースをコンパイルする。
プログラムエディタ311は、プログラム表示部321と、変数検索部322と、を備え、コントローラに出力する制御プログラムを作成するために、プログラムソースの編集を行う。
プログラム表示部321は、プログラムの編集画面を表示する。
図4は、プログラム表示部321によって表示されるプログラムの編集画面を例示した図である。図4に示される例では、“XV1”から10個の行列を“XV2”に移動させるテーブル移動(TMOV)401と、“XV5”に“XV4”の代入する演算402と、“XV5_B2”による判定結果が“XV5_B3”に格納されると共に“XV4_B2”による判定結果が“XV4_B3”に格納される演算403と、が示されている。図4で示された演算は、最も左に配置された演算から右方向の順に行われるが、演算の順番を制限するものではない。
図3に戻り、データベース部302は、変数データベース341と、ソースコードデータベース342と、テーブル命令データベース343と、を備えている。
変数データベース341は、プログラム制御装置300で作成された全てのプログラムソース用いられている変数毎に、当該変数によって参照されるアドレスに関する情報を記憶する。
図5は、本実施形態の変数データベース341のテーブル構成を例示した図である。図5に示されるように、変数データベース341は、ワード番号と、変数名と、データ型と、ビット番号と、ワードサイズと、配置数と、を対応付けている。
ワード番号は、当該変数が割り当てられているワード番号とする。本実施形態においてはワード単位でアドレスが割り当てられている。つまり、ワード番号を参照することで、当該変数がどのアドレスに割り当てられているか判断できる。これにより、ワード番号が同一の場合には、同一のアドレスに変数が割り当てられていることになる。なお、ワードのメモリサイズは、実施態様に応じて定められるものとする。
データ型は、当該変数に対して定義された型とする。本実施形態では、少なくとも“WORD型”と、“BOOL型”と、“WORD”型の配列(ARRAY[] OF WORD)と、“BOOL”型の配列(ARRAY[] OF BOOL)と、が定義可能とする。“WORD型”は、ワード単位で変数をメモリに割り当て、“BOOL型は、ビット単位で変数をメモリに割り当てる。
ビット番号は、変数に対して定義された型が“BOOL”型の場合に、ワード番号で示されたワードのうち、どのビットが、当該変数に割り当てられているかを識別する。
ワードサイズは、当該変数に割り当てられたワードのサイズを示している。なお、“BOOL”型の場合であっても、ワードサイズは“1”とする。
配列数は、“WORD”型の配列(ARRAY[] OF WORD)と、“BOOL”型の配列(ARRAY[] OF WORD)と、の場合に、当該配列に格納可能な要素の数とする。
図5の変数データベース341には全ての変数が格納される。例えば、コントローラ150のコントローラ変数が格納されてもよいし、ネットワーク変数、ローカル変数、I/O変数、ローカル変数が格納されてもよい。
ソースコードデータベース342は、プログラムエディタ311によって編集されたプログラムのソースコードをデータベースとして記憶する。
図6は、ソースコードデータベース342のテーブル構成を例示した図である。図6に示されるように、行と、列と、命令後番号と、ファンクション名と、変数名と、が対応付けられている。
行、及び列により、プログラムエディタの位置を特定している。そして、ファンクション名又は変数名は、行及び列によって特定された位置に対して設定されたファンクション又は変数を定義している。命令後番号は、従来と同様として説明を省略する。
テーブル命令データベース343は、プログラムエディタ311によって編集されたプログラムのソースコードに用いられているテーブル命令毎に、テーブル命令の入力及び出力で利用される変数に関する情報を記憶する。
図7は、テーブル命令データベース343のテーブル構成を例示した図である。図7に示されるように、ファンクション名と、行と、列と、接続されている変数名と、入力/出力と、転送数と、実際の転送数と、が対応付けられている。
ファンクション名は、テーブル命令を示すファンクション名とする。図7で示される例では、テーブル命令として、テーブル転送(TMOV)が設定されている例とする。
本実施形態においては、設定可能なテーブル命令を、テーブル転送(TMOV)に制限するものではない。テーブル命令としては、テーブル転送以外に、テーブル論理積、テーブル論理和、テーブル論理否定、テーブル排他的論理和、テーブル否定排他的論理和、テーブルマルチプレクサ、テーブル初期化を設定可能とする。
行、及び列により、テーブル命令が設定された位置を特定している。
接続されている変数名は、当該テーブル命令で利用されている変数を示している。
入力/出力は、接続されている変数名が入力又は出力で用いられているのかを示している。“0”の場合は入力で、“1”の場合は出力で用いられている。
転送数、実際の転送数は、当該テーブル命令で転送される変数の数を示している。
プログラム表示部321は、データベース部302を参照して、様々な情報を表示可能とする。
図8は、プログラム表示部321が表示するコントロール変数の一覧画面を例示した図である。図8に示される例では、コントロール変数の一覧を示しているが、本実施形態では、他の変数であっても同様に一覧表示を可能としている。図8に示される一覧では、変数毎に、データ型と、値と、ワード番号、ビット番号と、ワード長と、を対応付けて表示している。つまり、変数毎に、ワード番号及びビット番号を示しているため、変数毎に他の変数と同一アドレスを参照しているか否かを認識できる。
図9は、メモリ領域における各変数の割り当て状態を例示した図である。図9に示される例では、ワード番号で示されるアドレス毎に、当該アドレスに割り当てられた、WORD型の変数(ワード変数)と、BOOL型の変数(ブール変数)と、を示している。
図9に示される例では、例えばワード番号4、5、22、23、24等に示されるように、一つのワード番号に複数の変数が割り当てられていることが確認できる。
図3に戻り、変数検索部322は、上述したデータベース部302を参照して、変数のクロスリファレンス検索を行う。
変数検索部322は、選択受付部331と、アドレス抽出部332と、テーブル抽出部333と、クロスリファレンス検索部334と、検索結果表示部335と、を備えている。
選択受付部331は、プログラムエディタ311で編集された制御プログラムのソースコードに含まれている変数の選択を受け付ける。
テーブル抽出部333は、プログラム制御装置300で作成された制御プログラムのソースコードのうち、選択を受け付けた変数と同一スコープ内に設定されているテーブル命令における、入力又は出力で用いられる配列に、選択を受け付けた変数と同一のアドレスを参照する要素が含まれている場合に、当該入力又は出力に用いられている配列の先頭を示す、他の変数を抽出する。本実施形態のテーブル命令とは、複数の変数(要素)をまとめた配列の処理を行う命令とする。本実施形態のテーブル抽出部333は、テーブル命令データベースに基づいて、他の変数を抽出する。
アドレス抽出部332は、プログラム制御装置300で作成された制御プログラムのソースコードで定義された変数であって、選択を受け付けた変数と同一スコープの変数のうち、選択受付部331で選択を受け付けた変数と同一のアドレスを参照する、他の変数を抽出する。本実施形態においては、アドレス抽出部332は、変数データベース341に基づいて、選択を受け付けた変数の格納先を示したアドレスを参照する、他の変数を抽出する。本実施形態においては、型が同じ変数同士は以下の手法で抽出される。
“BOOL”型以外の場合には、参照するワードアドレスが同一の場合が抽出される。換言すれば、ワード番号が一致する変数が抽出される。“BOOL”型以外とは、基本データ型(例えば“WORD”型)の他に、配列や、構造体(ユーザが定義するデータ型)を含んでいる。
また、“BOOL”型の場合には、参照するビットアドレスが同一の場合が抽出される。換言すれば、ワード番号及びブール番号が一致する変数が抽出される。
また、本実施形態のアドレス抽出部332は、変数の型が異なるか否かにかかわらず、同一のアドレスを参照する変数であれば抽出する。型の異なる場合抽出手法は、以下に示す手法で行うことが考えられる。
“BOOL”型と“BOOL”型以外との場合、参照するワードアドレスが同一の場合が検出される。換言すれば、ワード番号が一致する変数が抽出される。
クロスリファレンス検索部334は、テーブル抽出部333により抽出された変数と、アドレス抽出部332により抽出された変数と、についてクロスリファレンス検索を行う。
クロスリファレンス検索部334によるクロスリファレンス検索は、従来の手法と同様に、複数のプログラムやファンクション等において、相互参照されている同一名の変数を検索するものとして、説明を省略する。
検索結果表示部335は、アドレス抽出部332により抽出された他の変数と、テーブル抽出部333により抽出された他の変数と、クロスリファレンス検索部334により検索された変数と、を表示する。次に、具体的な画面例に従って説明する。
図10は、プログラム表示部321により表示された編集画面から、ソースコードに含まれている変数の選択を受け付ける画面例を示した図である。
図10に示されるように、カーソル1001で変数“XV4”を指し示している状態で、左クリックがなされた場合に、変数“XV4”が選択状態1002となる。その後、プルダウンメニュー1003からクロスリファレンスリスト1004の選択を受け付けた場合に、選択受付部331は、変数“XV4”のクロスリファレンス検索を受け付けたこととなる。
テーブル抽出部333は、テーブル命令における、入力又は出力で用いられる配列に、選択を受け付けた変数“XV4”と同一のアドレスを参照する要素が含まれている場合に、テーブル命令データベース343及び変数データベース341に基づいて、当該配列の先頭を示す、他の変数を抽出する。
具体的には、テーブル抽出部333は、テーブル命令データベース343のレコード毎に、変数“XV4”と同一のアドレスを参照する要素を含む配列であるか否かを判断する。
図7に示されるテーブル命令データベース343の1行目においては、変数“XV1”から転送数“10”の場合、図5において、変数“XV1”のワード番号“1”から10個、換言すればワード番号“1”〜“10”が転送される。つまり、転送される配列には、変数“XV4”と同一アドレスであるワード番号“4”を参照する要素が含まれているため、テーブル抽出部333は、変数“XV1”を抽出する。
図7に示されるテーブル命令データベース343の2行目においては、変数“XV2”から転送数“10”の場合、図5において、変数“XV2”のワード番号“2”から10個、換言すればワード番号“2”〜“11”に転送される。つまり、転送先の配列には、変数“XV4”と同一アドレスであるワード番号“4”を参照する要素が含まれているため、テーブル抽出部333は、変数“XV2”を抽出する。
そして、アドレス抽出部332は、変数データベース341を参照して、選択受付部331で選択を受け付けた変数“XV4”と同一のワード番号と対応付けられた(換言すれば、当該変数と同一のアドレスを参照する)、他の変数を抽出する。本実施形態においては、アドレス抽出部332は、図5に示される変数データベース341を参照し、変数“XV4”とワード番号“4”が同一の変数“XV4_B2”、“XV4_B3”を抽出する。
そして、クロスリファレンス検索部334は、テーブル抽出部333により抽出された変数“XV1”、“XV2”と、アドレス抽出部332により抽出された変数“XV4_B2”、“XV4_B3”と、についてクロスリファレンス検索を行う。
図11は、検索結果表示部335により表示される検索結果画面例を示した図である。図11に示される例では、変数“XV4”のクロスリファレンス検索を受け付けた場合を示している。このため、アドレス抽出部332により抽出される変数“XV4_B2”、“XV4_B3”と、テーブル抽出部333により抽出される変数“XV1”、“XV2”と、が表示される。また、クロスリファレンス検索部334により検索された変数も表示されるが、図11では省略し、図12〜図18についても同様とする。また、表示された変数毎に、ステーション、コントローラ、タスクと、当該変数が設定された位置と、が表示される。これにより、変数毎の状況を認識できる。
次に、選択受付部331が、図4に示されるプログラムの編集画面において、変数“XV5_B2”の選択を受け付けた状態で、クロスリファレンス検索の選択を受け付けた場合について説明する。
テーブル抽出部333は、テーブル命令の入力又は出力で用いられる配列に、選択を受け付けた変数“XV5_B2”と同一のアドレスを参照する要素が含まれている場合に、テーブル命令データベース343及び変数データベース341に基づいて、当該配列の先頭を示す、他の変数を抽出する。
テーブル抽出部333は、テーブル命令データベース343のレコード毎に、変数“XV5_B2”と同一のアドレスを参照する要素を含む配列であるか否かを判断する。
図7に示されるテーブル命令データベース343の1行目においては、変数“XV1”から転送数“10”の場合、図5において、変数“XV1”のワード番号“1”から10個、換言すればワード番号“1”〜“10”が転送される。つまり、転送される配列には、変数“XV5_B2”と同一アドレスであるワード番号“5”を参照する要素が含まれているため、テーブル抽出部333は、変数“XV1”を抽出する。
図7に示されるテーブル命令データベース343の2行目においては、変数“XV2”から転送数“10”の場合、図5において、変数“XV2”のワード番号“2”から10個、換言すればワード番号“2”〜“11”に転送される。つまり、転送先の配列には、変数“XV5_B2”と同一アドレスであるワード番号“5”を参照する要素が含まれているため、テーブル抽出部333は、変数“XV2”を抽出する。
そして、アドレス抽出部332は、変数データベース341を参照して、選択受付部331で選択を受け付けた変数“XV5_B2”と同一のワード番号と対応付けられた(換言すれば、当該変数と同一のアドレスを参照する)、他の変数を抽出する。本実施形態においては、アドレス抽出部332は、図5に示される変数データベース341を参照し、変数“XV5_B2”とワード番号“5”が同一の変数“XV5”を抽出する。なお、“BOOL”型同士の場合は、ブール番号も一致する必要がある。このため、変数“XV5_B2”は、変数“XV5_B2”とワード番号“5”が一致するが、ブール番号が一致しないため抽出されない。
図12は、検索結果表示部335により表示される検索結果画面例を示した図である。図12に示される例では、変数“XV5_B2”のクロスリファレンス検索を受け付けた場合を示している。このため、アドレス抽出部332により抽出される変数“XV5”と、テーブル抽出部333により抽出される変数“XV1”、“XV2”と、が表示される。
次に、選択受付部331が、図4に示されるプログラムの編集画面において、変数“XV2”の選択を受け付けた状態で、クロスリファレンス検索を受け付けた場合について説明する。
テーブル抽出部333は、テーブル命令データベース343のレコード毎に、変数“XV2”と同一のアドレスを参照する要素を含む配列であるか否かを判断する。
図7に示されるテーブル命令データベース343の1行目においては、変数“XV1”から転送数“10”の場合、図5において、変数“XV1”のワード番号“1”から10個、換言すればワード番号“1”〜“10”が転送される。つまり、転送される配列には、変数“XV2”と同一アドレスであるワード番号“2”を参照する要素が含まれているため、テーブル抽出部333は、変数“XV1”を抽出する。
図7に示されるテーブル命令データベース343の2行目においては、“接続された変数名”が、変数“XV2”と一致している。
テーブル抽出部333は、テーブル命令データベース343の“接続された変数名”で示された、配列の先頭を示す変数が、選択を受け付けた変数名と一致している場合に、当該ソースコードのうち、当該配列に含まれている要素と同一のアドレスを参照する変数を全て抽出する。換言すれば、テーブル抽出部333は、当該ソースコードにおいて、変数“XV2”のワード番号“2”から10個、換言すればワード番号“2”〜“11”を参照する全ての変数を抽出する。抽出には、図5に示されるような変数データベース341を用いるが、図9を用いて説明する。
図9に示されるようなメモリ領域における各変数の割り当て状態において、テーブル移動(TMOV)401は、変数“XV1”からの配列901を、変数“XV2”からの配列902に移動させている。
そして、テーブル抽出部333は、変数“XV2”からの配列902(ワード番号“2”〜“11”)で示される範囲のうち、図4の編集画面に示されている、全ての変数“XV4”、“XV4_B2”、“XV4_B3”、“XV5”、“XV5_B2”、“XV5_B3”を抽出する。
アドレス抽出部332は、変数データベース341を参照して、選択受付部331で選択を受け付けた変数“XV2”と同一のワード番号と対応付けられた他の変数を抽出する。図5に示された変数データベース341においては、変数“XV2”と同一のワード番号の変数は存在しない。このため、アドレス抽出部332は、変数を抽出しない。
図13は、検索結果表示部335により表示される検索結果画面例を示した図である。図13に示される例では、変数“XV2”のクロスリファレンス検索を受け付けた場合を示している。このため、テーブル抽出部333により抽出される変数“XV1”、“XV4”、“XV4_B2”、“XV4_B3”、“XV5”、“XV5_B2”、“XV5_B3”と、が表示される。
図14は、プログラム表示部321によって表示されるプログラムの編集画面を例示した図である。図14に示される例では、変数“XV20_ARRAY[0]”から5個の行列を変数“XV20_ARRAY[2]”に移動させるテーブル移動(TMOV)1401と、変数“XV20_ARRAY[2]”を変数“XV20_ARRAY[4]”の代入する演算1402と、変数“XV23”を変数“XV24”に代入する演算1403と、変数“XV22_B_ARRAY[0]”による判定結果が変数“XV22_B_ARRAY[5]”に格納される演算1404と、が示されている。
次に、選択受付部331が、図14に示されるプログラムの編集画面において、変数“XV20_ARRAY[4]”1411の選択を受け付けた状態で、クロスリファレンス検索を受け付けた場合について説明する。
テーブル移動(TMOV)1401の入力では、変数“XV20_ARRAY[0]”から5ワード参照されている。変数“XV20_ARRAY[0]”から5ワードには、変数“XV20_ARRAY[4]”が含まれている。従って、テーブル抽出部333は、配列の先頭を示す変数“XV20_ARRAY[0]”を抽出する。
テーブル移動(TMOV)1401では、出力で変数“XV20_ARRAY[2]”から5ワード参照されている。変数“XV20_ARRAY[2]”から5ワードには、変数“XV20_ARRAY[4]”が含まれている。従って、テーブル抽出部333は、配列の先頭を示す変数“XV20_ARRAY[2]”を抽出する。
そして、アドレス抽出部332は、変数データベース341を参照して、選択受付部331で選択を受け付けた変数“XV20_ARRAY[4]”と同一のワード番号と対応付けられた、他の変数を抽出する。本実施形態においては、アドレス抽出部332は、図5に示される変数データベース341を参照し、変数“XV20_ARRAY[4]”とワード番号“24”が同一の変数“XV24”を抽出する。
図15は、検索結果表示部335により表示される検索結果画面例を示した図である。図15に示される例では、変数“XV20_ARRAY[4]”のクロスリファレンス検索を受け付けた場合を示している。このため、アドレス抽出部332により抽出される変数“XV24”と、テーブル抽出部333により抽出される変数“XV20_ARRAY[0]”、“XV20_ARRAY[2]”と、が表示される。
次に、選択受付部331が、図14に示されるプログラムの編集画面において、変数“XV22_B_ARRAY[0]”1412の選択を受け付けた状態で、クロスリファレンス検索を受け付けた場合について説明する。
テーブル抽出部333は、テーブル命令データベース343のレコード毎に、当該テーブル命令で変数“XV22_B_ARRAY[0]”が参照されているか否かを判断する。
テーブル移動(TMOV)1401の入力では、変数“XV20_ARRAY[0]”から5ワード参照されている。変数“XV20_ARRAY[0]”から5ワードには、変数“XV22_B_ARRAY[0]”が含まれている。従って、テーブル抽出部333は、配列の先頭を示す変数“XV20_ARRAY[0]”を抽出する。
テーブル移動(TMOV)1401の出力では、変数“XV20_ARRAY[2]”から5ワード参照されている。変数“XV20_ARRAY[2]”から5ワードには、変数“XV22_B_ARRAY[0]”が含まれている。従って、テーブル抽出部333は、配列の先頭を示す変数“XV20_ARRAY[2]”を抽出する。
そして、アドレス抽出部332は、変数データベース341を参照して、選択受付部331で選択を受け付けた変数“XV22_B_ARRAY[0]”と同一のワード番号と対応付けられた、他の変数を抽出する。本実施形態においては、アドレス抽出部332は、図5に示される変数データベース341を参照し、変数“XV22_B_ARRAY[0]”とワード番号“22”が同一の変数“XV20_ARRAY[2]”を抽出する。
図16は、検索結果表示部335により表示される検索結果画面例を示した図である。図16に示される例では、変数“XV22_B_ARRAY[0]”のクロスリファレンス検索を受け付けた場合を示している。このため、テーブル抽出部333により抽出される変数“XV20_ARRAY[0]”、“XV20_ARRAY[2]”と、アドレス抽出部332により抽出される変数“XV20_ARRAY[2]”と、が表示される。
上述したように、選択を受け付けた変数名と、テーブル命令の入力又は出力で用いられている、配列の先頭の変数と、が一致している場合には、プログラムソースに含まれる変数のうち、当該配列に含まれている要素と同一のアドレスを参照する変数を全て抽出する。しかしながら、1つのプログラムソースに、1つの変数が複数箇所で設定されている場合に、選択を受け付けた変数の箇所に応じて、検出結果を異ならせても良い。例えば、同一の変数名の選択を受け付けた場合であっても、テーブル命令の入力又は出力に用いられる配列の先頭の変数であるか否かに応じて、抽出結果を異ならせても良い。
例えば、図14に示されるプログラムの編集画面において、変数“XV20_ARRAY[2]”1413が選択された場合と、変数“XV20_ARRAY[2]”1414が選択された場合と、で抽出される変数を異ならせることが考えられる。
まずは、選択受付部331が、図14に示されるプログラムの編集画面において、変数“XV20_ARRAY[2]”1414の選択を受け付けた状態(テーブル命令の入力又は出力に用いられる配列の先頭の変数を選択していない場合)で、クロスリファレンス検索を受け付けた場合について説明する。
テーブル移動(TMOV)1401の入力では、変数“XV20_ARRAY[0]”から5ワード参照されている。“XV20_ARRAY[0]”から5ワードには、変数“XV20_ARRAY[2]”が含まれている。従って、テーブル抽出部333は、配列の先頭を示す変数“XV20_ARRAY[0]”を抽出する。
テーブル移動(TMOV)1401の出力では、変数“XV20_ARRAY[2]”から5ワード参照されている。“XV20_ARRAY[2]”から5ワードには、変数“XV20_ARRAY[2]”が含まれている。従って、テーブル抽出部333は、配列の先頭を示す変数“XV20_ARRAY[2]”を抽出する。
そして、アドレス抽出部332は、変数データベース341を参照して、選択受付部331で選択を受け付けた変数“XV20_ARRAY[2]”と同一のワード番号と対応付けられた、他の変数を抽出する。本実施形態においては、アドレス抽出部332は、図5に示される変数データベース341を参照し、変数“XV20_ARRAY[2]”とワード番号“22”が同一の変数“XV22_B_ARRAY[0]”、及び変数“XV22_B_ARRAY[5]”を抽出する。
図17は、検索結果表示部335により表示される検索結果画面例を示した図である。図17に示される例では、変数“XV20_ARRAY[2]”1414のクロスリファレンス検索を受け付けた場合を示している。このため、テーブル抽出部333により抽出される変数“XV20_ARRAY[0]”、及び変数“XV20_ARRAY[2]”と、アドレス抽出部332により抽出される変数“XV22_B_ARRAY[0]”、及び変数“XV22_B_ARRAY[5]”と、が表示される。
次に、選択受付部331が、図14に示されるプログラムの編集画面において、変数“XV20_ARRAY[2]”1413の選択を受け付けた状態(テーブル命令の入力又は出力に用いられる配列の先頭の変数を選択した場合)で、クロスリファレンス検索を受け付けた場合について説明する。
テーブル移動(TMOV)1401の入力では、変数“XV20_ARRAY[0]”から5ワード参照されている。変数“XV20_ARRAY[0]”から5ワードには、変数“XV20_ARRAY[2]”が含まれている。従って、テーブル抽出部333は、配列の先頭を示す変数“XV20_ARRAY[2]”を抽出する。
テーブル移動(TMOV)1401の出力では、選択を受け付けた変数“XV20_ARRAY[2]”1413が、配列の先頭の変数である。そこで、テーブル抽出部333は、ソースコードのうち、変数“XV20_ARRAY[2]”を先頭とした配列に含まれている要素と同一のアドレスを参照する変数を全て抽出する。換言すれば、テーブル抽出部333は、当該ソースコードにおいて、変数“XV20_ARRAY[2]”のワード番号“22”から5個、換言すればワード番号“22”〜“26”を参照する全ての変数を抽出する。抽出には、図5に示されるような変数データベース341を用いるが、図9を用いて説明する。
図9に示されるようなメモリ領域における各変数の割り当て状態において、テーブル移動(TMOV)1401は、変数“XV20_ARRAY[0]”からの配列911を、変数“XV20_ARRAY[2]”からの配列912に移動させている。
そして、テーブル抽出部333は、変数“XV20_ARRAY[2]”からの配列912で示される範囲のうち、図14のプログラムの編集画面に示されている、変数“XV20_ARRAY[4]”、“XV22_B_ARRAY[0]”、“XV22_B_ARRAY[5]”、“XV23”、及び“XV24”を抽出する。
そして、アドレス抽出部332は、変数データベース341を参照して、選択受付部331で選択を受け付けた変数“XV20_ARRAY[2]”と同一のワード番号と対応付けられた、他の変数を抽出する。本実施形態においては、アドレス抽出部332は、図5に示される変数データベース341を参照し、変数“XV20_ARRAY[2]”とワード番号“22”が同一の変数“XV22_B_ARRAY[0]”、及び“XV22_B_ARRAY[5]”を抽出する。
図18は、検索結果表示部335により表示される検索結果画面例を示した図である。図18に示される例では、変数“XV20_ARRAY[2]”1414のクロスリファレンス検索を受け付けた場合を示している。このため、テーブル抽出部333及びアドレス抽出部332により抽出される変数“XV20_ARRAY[0]”、“XV20_ARRAY[2]”、“XV20_ARRAY[4]”、“XV22_B_ARRAY[0]”、“XV22_B_ARRAY[5]”、“XV23”、及び“XV24”が表示される。
次に、本実施形態のプログラム制御装置300におけるクロスリファレンス検索処理について説明する。図19は、本実施形態のプログラム制御装置300における上述した処理の手順を示すフローチャートである。
まずは、選択受付部331が、プログラムの編集画面に表示されている変数の選択を受け付けた状態で、クロスリファレンス検索の選択を受け付ける(S1901)。
テーブル抽出部333は、選択を受け付けた変数が含まれているソースコードに設定されているテーブル命令における、入力又は出力で用いられる配列に、選択を受け付けた変数と同一のアドレスを参照する要素が含まれている場合に、当該入力又は出力に用いられている配列の先頭を示す、他の変数を抽出する(S1902)。また、テーブル命令の入力又は出力における、配列の先頭の変数が、選択を受け付けた変数の場合に、テーブル抽出部333は、ソースコードのうち、当該配列に含まれている要素と同一のアドレスを参照する変数を全て抽出する。
次に、アドレス抽出部332は、選択を受け付けた変数と同一スコープの変数のうち、選択を受け付けた変数と同一のアドレスを参照する、他の変数を抽出する(S1903)。
クロスリファレンス検索部334は、S1902で抽出された、配列の先頭を示す他の変数について、クロスリファレンス検索を行う(S1904)。
クロスリファレンス検索部334は、S1903で抽出された、同一のアドレスを参照する他の変数について、クロスリファレンス検索を行う(S1905)。
検索結果表示部335は、配列の先頭を示す他の変数、同一のアドレスを参照する他の変数、及びS1904及びS1905のクロスリファレンス検索で検出された変数を表示する(S1906)。
上述した処理手順により、選択を受け付けた変数に関連する他の変数が表示されるため、プログラムソースの開発負担を軽減できる。
図20は、プログラム表示部321によって表示されるプログラムの編集画面を例示した図である。図20に示される例では、変数“XV1”から10個の行列を変数“XV2”に移動させるテーブル移動(TMOV)2001と、変数“XV5”に変数“XV4”の代入する演算2002と、変数“XV5_B2”による判定結果が変数“XV5_B3”に格納されると共に変数“XV4_B2”による判定結果が変数“XV4_B3”に格納される演算2003と、変数“V1”を用いて所定の演算を行った結果変数“V2”を出力する演算2004と、を行うプログラムソース2000と、変数“INV”と変数“XV1”とを用いた演算結果として変数“OUTV”を出力する所定の演算2011を行うプログラムソース2010と、が示されている。
そして、選択受付部331は、変数“XV4”の選択を受け付けた状態2050で、クロスリファレンス検索の選択を受け付けたものとする。図20で示される例では、選択を受け付けた変数“XV4”がローカル変数の場合とする。
この場合、テーブル抽出部333は、同一スコープ内のテーブル移動(TMOV)から、変数“XV1”と変数“XV2”とを抽出する。そして、アドレス抽出部332は、変数“XV4”と同一スコープ内の変数のうち、変数“XV4”と同一のアドレスを参照する(ワード番号が一致する)、変数“XV_B2”、変数“XV_B3”を抽出する。
さらに、クロスリファレンス検索部334は、変数“XV1”と変数“XV2”についてクロスリファレンス検索を行うことで、プログラムソース2010の演算2011の入力に用いられている変数“XV1”を検出する。同様に、クロスリファレンス検索部334は、変数“XV_B2”、変数“XV_B3”についてクロスリファレンス検索を行うが、特に検出されなかったものとする。
図21は、検索結果表示部335により表示される検索結果画面例を示した図である。図21に示される例では、変数XVのクロスリファレンス検索を受け付けた場合を示している。このため、テーブル抽出部333により抽出される変数“XV1”、変数“XV2”、変数“XV20_ARRAY[2]”と、アドレス抽出部332により抽出される変数“XV4_B2”、変数“XV4_B3”に加えて、クロスリファレンス検索部334により検出された変数“XV1”(レコード2101)が表示される。
本実施形態のプログラム制御装置300は、アドレス抽出部332により変数を抽出することで、変数名が異なる場合であっても、選択を受け付けた変数と同一アドレスを参照する変数が抽出されるので、変数に関する変更を行う場合に影響を与える範囲を認識できるので、プログラムの作成、変更する際の負担を軽減できる。
また、本実施形態のプログラム制御装置300は、テーブル抽出部333により変数を抽出することで、テーブル命令の入力又は出力で用いられる変数の配列に、選択を受け付けた変数が含まれる場合に、当該入力又は出力で用いられる変数を抽出するので、変数に関する変更を行う場合に影響を与える範囲を認識できるので、プログラムの作成、変更する際の負担を軽減できる。
また、本実施形態のプログラム制御装置300は、アドレス抽出部332により抽出された変数と、テーブル抽出部333により抽出された変数と、を用いてクロスリファレンス検索を行うことで、同一スコープ内に限らず、他のスコープに影響を与える範囲を認識できるので、プログラムの作成、変更する際の負担を軽減できる。
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。