(57)【要約】【課題】ラダー図プログラムについて不合理な回路や冗長な回路を検出する。【解決手段】経路抽出部１１は、ラダー図格納部２１の要素情報に基づいて、左母線からコイルに至る経路を全て抽出する。経路毎信号重複抽出部１２は、各経路毎に、その経路上の信号名（接点名）の重複を調べる。重複した信号名を抽出できた場合、合理性判定部１３が、その接点種類を比較し、接点種類が異なっている場合（Ａ接点とＢ接点）、その経路は不合理である（ＯＮにならない）と判定する。【選択図】図１
2016001377.tif 000002
【特許請求の範囲】
【請求項１】
検査対象のラダー図プログラムの各要素間の接続関係を示す情報が含まれる要素情報を記憶する要素情報記憶手段と、
該要素情報に基づいて左母線からコイルに至る経路を全て抽出して、該各経路毎にその経路上の各接点の信号名を記憶する経路抽出・記憶手段と、
該抽出された各経路毎に、その経路上に同一信号名の接点があるか否かを判定する重複検査手段と、
を有することを特徴とするラダー図合理性検査装置。
【請求項２】
前記経路抽出・記憶手段は、前記経路上の各接点について前記信号名と共にその接点種類を記憶し、
前記同一信号名の接点の前記接点種類に基づいて、不合理であるか冗長であるかを判定する不合理判定手段を更に有することを特徴とする請求項１記載のラダー図合理性検査装置。
【請求項３】
前記不合理判定手段は、前記同一信号名の接点の接点種類が同一である場合には前記冗長であると判定することを特徴とする請求項１または２記載のラダー図合理性検査装置。
【請求項４】
前記不合理判定手段は、前記同一信号名の接点の接点種類が異なる場合には前記不合理であると判定することを特徴とする請求項１または２記載のラダー図合理性検査装置。
【請求項５】
前記要素には、前記左母線、前記接点、前記コイルが含まれることを特徴とする請求項１〜４の何れかに記載のラダー図合理性検査装置。
【請求項６】
スタック記憶手段を更に有し、
前記経路抽出・記憶手段は、前記経路の探索中に分岐を検出する毎に前記左母線から該分岐までの経路である途中経路情報を前記スタック記憶手段にスタックし、探索対象が前記コイルに至ることで１つの経路を抽出完了する毎に、前記スタック記憶手段に前記途中経路情報がスタックされている場合には該途中経路情報の１つを取り出して、該途中経路情報を用いて次の経路の探索を開始することを特徴とする請求項１〜５の何れかに記載のラダー図合理性検査装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ラダー図プログラムの合理性検査に関する。
【背景技術】
【０００２】
シーケンス制御は、工業製品の制御や、鉄鋼、化学、電力などの広範なプラントの制御等に用いられている。シーケンス制御用のプログラム作成には、ラダー図が用いられることが多い。プログラムは、支援装置等と呼ばれるコンピュータ装置上でユーザによって任意に作成される。作成されたプログラムは、プログラマブル・コントローラ（ＰＬＣ：Programmable Logic Controller）に転送されて実行されることで、ユーザ所望のシーケンス制御が実行される。
【０００３】
ラダー図は、リレーロジックを模したものであり、ＯＮ／ＯＦＦの入力信号を、論理和／論理積の組み合わせにより演算を行い、その結果を出力する。ＰＬＣは、ラダー図で作成された上記演算を実行するものである。リレーロジック（ラダー図）は入力条件の組み合わせで出力を決定するものであり、シーケンス制御に慣れた技術者には簡単に制御を行えるものであるが、作成されたロジックの機能を検証することについては十分に配慮されていない。
【０００４】
作成されたロジックの機能（ラダー図）の検証に関しては、例えば特許文献１，２に記載されている従来技術が知られている。
特許文献１の従来技術では、プログラムの実行の度に演算結果を記録して、演算結果の変化回数を累積して変化回数の数から不動作回路や動作回数は閾値以下の回路を検出する。特許文献２の従来技術では、ＰＬＣにトレース機能を設け、レジスタの変化を記録することによりシーケンスの動作網羅率を求める。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開平９−２６５３０６号公報
【特許文献２】特開２０００−２９３２０８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
ここで、例えば、図１０（ａ）に示す様に回路中（経路中）に同一名称の信号（接点）‘C000’があった場合、試験の入力値である接点の値を自由に選ぶことができないという問題が生じる。すなわち、この様な同一名称の接点に関して、ある接点（信号）の値を設定すると、その回路中で使用している別の接点の値が決まってしまう。そのため、生成された試験データを使用した試験を実行することができない場合がある。例えばコイルがＯＮすることが無い場合がある。このような回路は“不合理な回路”であるといえる。
【０００７】
この様な“不合理な回路”の簡単な例を図１０（ｂ）に示す。図１０（ｂ）に示す回路では、左母線からコイルに至る経路中に同一信号（＝‘C000’）のＡ接点（常開接点）とＢ接点（常閉接点）が存在するため、コイル（Coil）がＯＮすることはない。
【０００８】
このように同一信号が２か所以上で使用される回路は、プログラマーの間違いである場合等が考えられる。従って、不合理な回路であることを判別してプログラマーに知らせることで、問題を解消させることが可能となる。
【０００９】
本発明の課題は、ラダー図プログラムについて不合理な回路や冗長な回路を検出することができるラダー図合理性検査装置等を提供することである。
【課題を解決するための手段】
【００１０】
本発明のラダー図合理性検査装置は、検査対象のラダー図プログラムの各要素間の接続関係を示す情報が含まれる要素情報を記憶する要素情報記憶手段と、該要素情報に基づいて左母線からコイルに至る経路を全て抽出して、該各経路毎にその経路上の各接点の信号名を記憶する経路抽出・記憶手段と、該抽出された各経路毎に、その経路上に同一信号名の接点があるか否かを判定する重複検査手段とを有する。
【発明の効果】
【００１１】
本発明のラダー図合理性検査装置等によれば、ラダー図プログラムについて不合理な回路や冗長な回路を検出することができる。
【図面の簡単な説明】
【００１２】
【図１】本例のラダー図合理性検査装置の機能ブロック図である。
【図２】（ａ）はラダー図プログラムの一例、（ｂ）はセル一覧と点一覧である。
【図３】図２（ｂ）の例の場合に求められる経路を示す図である。
【図４】経路抽出部の処理フローチャート図である。
【図５】（ａ）は途中経路記憶部、（ｂ）は経路記憶部のデータ格納例である。
【図６】（ａ）、（ｂ）は、経路毎信号重複抽出部の処理フローチャート図である。
【図７】信号重複リストの一例を示す図である。
【図８】合理性判定部の処理フローチャート図である。
【図９】（ａ）は判定結果リストの一例、（ｂ）は判定結果表示例である。
【図１０】（ａ）、（ｂ）は、不合理な回路の一例である。
【発明を実施するための形態】
【００１３】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例のラダー図合理性検査装置１０の機能ブロック図である。
尚、本例のラダー図合理性検査装置１０は、パソコン、サーバ装置等の汎用コンピュータ上で実現できるものであり、特に所謂“支援装置”の機能の１つと見做しても良いものである。よく知られているように、“支援装置”上でユーザは所望のシーケンス制御プログラムを作成できるものであり、一例としてラダー図によるプログラムを作成できるものである。
【００１４】
そして、本例のラダー図合理性検査装置１０は、例えば、ユーザが任意に作成したラダー図プログラムの合理性を、自動的に検査できるものである。
また、上記のように本例のラダー図合理性検査装置１０は、汎用コンピュータ上で実現できるものであり、ハードウェア的には汎用コンピュータの一般的な構成を有している。つまり、特に図示しないが、ＣＰＵ、記憶装置（ハードディスク、メモリ等）等を備えている。このＣＰＵが、記憶装置に予め記憶されているアプリケーションプログラムを実行することで、図１に示す各種処理機能部１１〜１３や後述する図４や図６、図８に示すフローチャートの処理等が実現される。
【００１５】
図１に示す例では、ラダー図合理性検査装置１０は、経路抽出部１１、経路毎信号重複抽出部１２、合理性判定部１３の各種処理機能部を有する。
また、ラダー図合理性検査装置１０は、各種データを記憶する各種記憶部も有する。すなわち、例えば図示のラダー図格納部２１、途中経路記憶部２２、経路記憶部２３等を有する。
【００１６】
ラダー図格納部２１は、予め例えば上記のようにユーザ等が任意に作成したラダー図プログラム等を記憶する。これは、ラダー図の要素（左右母線、接点、コイル）とそれぞれの要素間の接続関係を示す情報等が格納されていればよい。この様な情報の一例を図２に示し、詳細は後に説明するが、以下、簡単に説明する。
【００１７】
例えば図２（ａ）に示すようなラダー図プログラムの場合、ラダー図格納部２１には図２（ｂ）に示すセル一覧３０及び点一覧４０が格納される。
この例では、左右の母線、接点、コイル等をセルとして、セル一覧３０には各セルの種類３１、名前３２、接続点との接続関係（左３３、右３４）等が格納される。また、各接続点に関する情報が、点一覧４０に格納される。各接続点には、ユニークな識別ＩＤであるＩＤ４１が割り当てられており、各セル毎に、そのセルに接続する接続点の上記識別ＩＤが上記左３３、右３４に格納される構造となっている。また、点一覧４０においては、各接続点毎に、その接続点の後段（右側）のセルを示す情報が、接続情報４４に格納されている。
【００１８】
尚、ここでは、図２（ａ）に示す接続点１のＩＤ４１が‘１’、接続点２のＩＤ４１が‘２’であるものとする。これより、例えばセル“Ａ接点C000”に関しては、左３３が‘１’、右３４が‘２’となっている。他の接続点や、各セルの接続点との接続関係も、図示の通りである。
【００１９】
以上、図２の例について簡単に説明したが、更に詳しい説明は後述する。
経路抽出部１１は、上記ラダー図格納部２１の格納データに基づいて経路探索を行って、左母線からコイルに至る経路を全て求める。これは、基本的には複数の経路が求まることになる。例えば、上記図２に示す例の場合、図３に示す（１）、（２）、（３）の３つの経路が、求められることになる。当該求められた複数経路の情報は、経路記憶部２３に記憶される。その一例を図５（ｂ）に示し後に説明する。
【００２０】
また、経路抽出部１１の処理フローチャート図を、図４に示し、後に説明する。
また、途中経路記憶部２２は、経路抽出部１１の経路探索処理の際に利用されるものであり、当該経路探索処理中に、途中までの経路を記録するものである。つまり、経路を辿る途中で分岐を検出した場合、左母線から当該分岐までの経路（中途経路）を記録しておくものである。
【００２１】
尚、本例の経路抽出部１１の処理例の場合には、後から検出した分岐の方を先に処理する必要があるので、途中経路記憶部２２はスタック構造で構成する。但し、これは一例であり、この例に限らない。途中経路記憶部２２のデータ格納例は、図５（ａ）に示し、後に説明する。
【００２２】
何れにしても、経路抽出部１１は、経路探索処理中に途中経路記憶部２２に対して中途経路データの格納・取り出しを行う。そして、最終的には、上記複数の経路を求めることになる。
【００２３】
本例のラダー図合理性検査装置１０は、処理対象のラダー図の左母線からコイルに至る経路を全て抽出する。そして、抽出した各経路毎に、例えば信号（接点）名称が重複していないか等を判定する。この処理は、経路毎信号重複抽出部１２が行うが、これについては後述する。更に、経路毎信号重複抽出部１２による判定結果に基づいて、合理性判定部１３が、不合理な回路であるか、冗長な回路であるか等を判定する。合理性判定部１３の処理についても後述する。
【００２４】
この様に、経路毎信号重複抽出部１２、合理性判定部１３については、後述するものとし、以下、まず、経路抽出部１１の処理について、詳細に説明するものとする。
ラダー図の左母線からコイルに至る経路を全て抽出する為に、探索中に途中までの経路を記録するスタック構造を設け、経路を探索する途中で分岐を検出した場合、そこまでの経路をスタック構造に記録して、分岐の一方の経路を続けて辿る。経路探索がコイルまで到達した場合、一つの経路の探索を終了し、経路を記録する。そして、スタック構造にデータが記録されている場合（途中までの経路が残っている場合）、当該スタック構造からデータ（途中までの経路）を取得することで、分岐のもう一方の経路を辿ってコイルに至るまで経路探索を行う。
【００２５】
尚、スタック構造からデータを取得することで、当該データはスタック構造から無くなることになる。また、スタック構造であるので、任意の分岐の後に更に別の分岐があった場合、上記一つの経路の探索を終了後、後の分岐の箇所から探索を再開することになる。
【００２６】
以上の操作を全ての経路の探索が終了するまで行う。これは、換言すれば、スタック構造に途中経路データが無くなるまで行うものと言える。
図４は、経路抽出部１１の処理フローチャート図である。
【００２７】
ここで、本説明では、図４の処理について具体例を用いて説明する際に、図２の例を用いるものとする。
これより、以下、まず、図２について説明する。
【００２８】
図２（ｂ）に示すセル一覧３０は、種類３１、名前３２、左３３、右３４から成る。
これらについては既に説明したように、例えば図２（ａ）に示すラダー図プログラムについて、各セル毎に、その種類（母線orＡ接点orＢ接点orコイル）と名前が、種類３１と名前３２に格納される。更に、そのセルに接続する接続点の上記識別ＩＤが、左３３と右３４に格納される。左３３にはそのセルから左母線側（図２（ａ）では図上左側）の接続点の識別ＩＤが格納される。右３４にはそのセルから右母線側（図２（ａ）では図上右側）の接続点の識別ＩＤが格納される。
【００２９】
また、点一覧４０は、各接続点の情報であり、ＩＤ４１、座標４２、分岐４３、接続情報４４等から成る。
ＩＤ４１は既に説明した通りであり、座標４２についてはここでは関係ないので特に説明しないものとする。分岐４３には、その接続点が分岐点である場合には、分岐であることを示す情報（本例では‘１’）が格納される。図示の例では、接続点２と接続点４が分岐点である。
【００３０】
後述する図４のステップＳ３の処理では、処理対象セルが接続点であって且つその分岐４３が‘１’である場合に、「分岐」と判定してステップＳ６、Ｓ７の処理を実行することになる。更に、このステップＳ７の処理では、処理対象セルのＩＤ４１を用いて、セル一覧３０において左３３が当該ＩＤ４１と同一であるレコードを求めることで、２つの走査対象候補を判別できる。これより、当該２つの走査対象候補の何れか一方を走査対象に決定する。残りが後にステップＳ１１で走査対象に決定されることになる。これについては、後に詳しく説明する。
【００３１】
尚、図示の例に限らず、例えば分岐４３は無くてもよい。接続情報４４に複数データが格納されている場合には分岐点であると判別できるからである。また、座標４２も無くてもよい。座標４２は、単に、分岐点に係わる識別情報と見做しても構わない。
【００３２】
また、接続情報４４には、その接続点の後段（図上右側）に接続されるセルの識別情報等が格納される。よって、例えば、接続点１に関しては“C000”が格納されるが、分岐点である接続点２に関しては“C001”と“C002”の２つが格納されることになる。
【００３３】
また、ここで、図５（ａ）に示す途中経路記録部２２の格納データの一例についても説明しておく。尚、以下の説明では、途中経路記録部２２の格納データを、途中経路情報２２と記すものとする。
【００３４】
図示の例では、途中経路情報２２は、分岐位置５１、経路５２から成る。尚、分岐位置５１は、必ずしも必要ないものであり、説明する都合上、示しているものと見做しても構わない。
【００３５】
また、図示の例では、２つのレコードが格納されている状態を示すが、これは説明の都合上示しているだけであり、本具体例の場合、この様な格納状況となる場合はない。すなわち、本具体例の場合、最初に図示の分岐位置５１＝ａのレコードが後述するステップＳ６で格納（スタック）され、その後、当該スタックデータが後述するステップＳ１０で取り出される。これによって格納データが何も無い状態となった後、分岐位置５１＝ｂのレコードがステップＳ６で格納（スタック）され、その後、当該スタックデータがステップＳ１０で取り出されることになる。従って、図示の２つのレコードの両方が格納された状態となることはない。
【００３６】
以上、説明の都合上、図２等について説明した。
以下、図４のフローチャート図の処理について説明する。
図４の処理は、概略的には、処理対象のラダー図要素のデータを取得する（ステップＳ２）毎に、ステップＳ３以降の処理を実行することを、ステップＳ９の判定がＮＯとなるまで繰り返し実行するものである。
【００３７】
最初は、ラダー図プログラムの左母線の右側を走査することで、処理対象を左母線に接続されているラダー図要素として（ステップＳ１）、この対象要素に関するデータをステップＳ２で取得することになる。その後は、ステップＳ５、Ｓ７，Ｓ１１等で対象要素を変更しながら、上記処理を繰り返すことになる。尚、ここでは、ラダー図要素を単に要素と記す場合もあるものとする。
【００３８】
ステップＳ１では、例えば、セル一覧３０において、種類３１が“母線”であるレコードの右３４のデータ（＝‘１’）より、対象要素を決定する。尚、上記“要素”には、上記セルや接続点が含まれる。つまり、接点やコイルだけでなく、接続点も含まれる。
【００３９】
そして、セル一覧３０及び点一覧４０を検索して、該当レコード（対象要素のレコード）を求める（ステップＳ２）。つまり、セル一覧３０または点一覧４０において、そのＩＤ４１または名前３２が、上記対象要素を示すデータ（識別ＩＤまたは名前であり、本例では最初は‘１’）と一致するレコードを、該当レコードとする。そして、この該当レコードの種類３１または分岐４３を参照することで、対象要素が接点であるか、分岐を伴う接続点であるか、コイルであるか等を判定する処理を行う（ステップＳ３）。
【００４０】
そして、対象要素が接点（Ａ接点ｏｒＢ接点）である場合にはステップＳ４，Ｓ５の処理を実行し、分岐である場合にはステップＳ６、Ｓ７の処理を実行し、コイルである場合にはステップＳ８〜Ｓ１１の処理を実行する。但し、ステップＳ９の判定がＹＥＳとなった場合には本処理を終了する。それ以外の場合には、ステップＳ２の処理に戻る。
【００４１】
尚、図示していないが、対象要素が「分岐点ではない接続点」である場合には、その接続情報４４によって次の対象要素を認識したうえでステップＳ２に戻る。図示の例では最初はステップＳ１で上記の通り‘１’が取得され、ここでは数値は接続点の識別ＩＤを意味するものとし、これより取得データを用いて点一覧４０を検索して該当レコードを求めるものとする。この例では、点一覧４０の先頭レコードが該当レコードとなるので、その分岐４３が‘１’ではないことから、上記「分岐点ではない接続点」であると判定することになる。これより、上記処理を行って、次の対象要素を“Ｃ０００”として、ステップＳ２に戻ることになる。
【００４２】
この例の場合、ステップＳ２では、“Ｃ０００”を用いてセル一覧３０、点一覧４０を検索して、該当レコードを求める。つまり、その名前３２またはＩＤ４１が“Ｃ０００”であるレコードを求める。但し、図示の例では、セル一覧３０には名前３２が“Ｃ０００”であるレコードが２つある。この様な場合、例えば、その左３３が上記元の該当レコードのＩＤ４１と一致する方を、該当レコードする。この例では、セル一覧３０の上から２番目のレコードが、該当レコードとなる。
【００４３】
該当レコードが点一覧４０内にある場合の処理は、既に述べた通りである。一方、該当レコードがセル一覧３０内にある場合には、この該当レコードの種類３１によって、ステップＳ３の判定を行う。図示の例では、上記該当レコードの種類３１は“Ａ接点”であるので、上記の通り、ステップＳ４、Ｓ５の処理を実行することになる。
【００４４】
ステップＳ４では、処理対象のラダー図要素（接点）の接点名（信号名）すなわち上記該当レコードの名前３２を、経路６１に格納する。ここでは、上記“Ｃ０００”が格納されることになる。
【００４５】
ここで、図５（ｂ）に、上記経路記憶部２３の格納データの一例を示す。この例では、経路記憶部２３には図示の経路６１のみが格納される。図示の例では、経路６１は、複数のレコードから成り、各レコードは各経路に対応するものである。本例では上記の通り３つの経路が抽出されるので、図示のように３つのレコードが生成されることになる。そして、上記一例では、図示のように先頭レコードにまず最初に接点名“Ｃ０００”が格納されることになる。尚、図５（ｂ）には図４の処理完了時の状態を示してあり、上記の段階では、図示の先頭レコードの接点名“Ｃ０００”のみが格納された状態となっている。
【００４６】
ここで、上記該当レコードの種類３１が“Ｂ接点”であった場合には、経路記憶部２３（経路６１）に上記接点名“Ｃ０００”等の接点情報を格納する際に、接頭辞（！）を付与して格納する。
【００４７】
ここで、“！”は、感嘆符（あるいは俗にビックリマーク）等と呼ばれる記号であり、必ずしも接頭辞の一例とはならないかもしれないが、ここでは“！”は接頭辞の一例であるものとして扱うものとする。また、接頭辞は一例であり、この例に限らず、例えば接尾辞や接中辞等であってもよく、つまり接辞であればなんでもよい。あるいは、接辞に限るものではなく、接点の種類を区別可能とする為の識別情報であればよく、接辞は一例に過ぎない。また、この様な接点種類の識別情報は、“Ｂ接点”の接点名に付与する例に限らず、“Ａ接点”の接点名に付与するようにしてもよい。但し、本説明においては、上記の通り、“Ｂ接点”の接点名に接頭辞（！）を付与する例を用いて説明するものとする。
【００４８】
ここでは、上記のように該当レコードの種類３１は“Ａ接点”であるので、上記の通りに先頭レコードには接頭辞（！）を付与されない接点名“Ｃ０００”が格納される。一方、図２の例の場合、図５（ｂ）に示す最後のレコードのように、接点名“！Ｃ０００”等が格納される場合もある。
【００４９】
上記ステップＳ４の処理を実行したら、走査対象を右へ移動して（ステップＳ５）、ステップＳ２に戻る。ステップＳ５の処理は、上記該当レコードの右３４を用いて、次の処理対象要素を決定するものである。上記の例では該当レコードの右３４は‘２’であるので、識別ＩＤ＝‘２’の接続点が、次の処理対象要素となり、ステップＳ２でＩＤ４１＝‘２’のレコードが該当レコードとして取得されることになる。これより、図２（ｂ）に示す例では該当レコードの分岐４３が‘１’であることから、上記ステップＳ３で“分岐”と判定されるので、ステップＳ６．Ｓ７の処理を実行することになる。
【００５０】
ステップＳ６では、ここまでの経路を途中経路記憶部２２に記録する。これは、例えば、上記該当レコードの座標４２を分岐位置５１に格納すると共に、ここまでの経路を経路５２に格納する。
【００５１】
尚、特に図示しないが、各経路毎に、その探索開始から現在までに処理対象要素となった接点を全て記憶しておき、これを上記“ここまでの経路”とする。この例では、これまでに処理対象要素となった接点は、上記“Ｃ０００”のみであるので、図５（ａ）に示すように、分岐位置５１が“ａ”で経路５２が“C000”のデータが、途中経路記憶部２２にスタックされることになる。尚、上記の通り、実際には分岐位置５１は無く、経路５２のデータのみが格納されるものと見做してもよい。
【００５２】
また、例えば、１つの経路が探索終了する毎に、上記“ここまでの経路”のデータをクリアして、途中経路記憶部２２から取り出した経路５２を、“ここまでの経路”に格納することで、これを次に探索する経路に関する“ここまでの経路”の初期状態とする。
【００５３】
そして、走査対象を分岐の一方に移動して（ステップＳ７）、ステップＳ２に戻る。ステップＳ７の処理では、上記該当レコードの接続情報４４を用いて次の処理対象要素を決定する。この例では、該当レコードの接続情報４４には、「C001,C002」が格納されているので、C001とC002の何れか一方を、次の処理対象要素とする。
【００５４】
あるいは、上記該当レコードのＩＤ４１を用いて、次の処理対象要素を決定してもよい。この場合、セル一覧３０において、その左３３が、上記該当レコードのＩＤ４１と同一であるレコードを求める。これは、例えば２つのレコードが求められるはずであるので、何れか一方を次の処理対象要素とする。ここでは、ＩＤ４１＝‘２’であるので、セル一覧３０の上から３番目と４番目のレコードの何れか一方が、次の処理対象要素となる。
【００５５】
ここでは仮に３番目のレコード（名前３２＝“COO1”）が次の処理対象要素となったものとすると、ステップＳ３では“接点”と判定されることになり、上記ステップＳ４，Ｓ５の処理が実行される。特に説明しないが、それ以降、接点“C003”、接点“C006”が順次処理対象要素となって、同様にしてステップＳ４、Ｓ５の処理が実行されることになる。その結果、上記経路記憶部２３は、図５（ｂ）の先頭レコードが生成された状態となる。つまり、先頭レコードには、図示の「C000，C001，C003，C006」が，格納された状態となっている。
【００５６】
この状態で、次の処理対象要素が“コイル（Coil）”となるので、ステップＳ３では“コイル”と判定され、ステップＳ８の処理へ移行する。尚、特に図示していないが、ステップＳ８の処理の前に、１つの経路探索完了と見做して、経路記憶部２３に空レコードを追加作成する処理を実行する。ここでは、上記図５（ｂ）の先頭レコードを１つの経路として確定させると共に、図示の２番目のレコードを追加する。但し、この段階では２番目のレコードには未だデータは何も格納されていない状態（空レコード）となっている。
【００５７】
そして、ステップＳ８では、途中経路記憶部２２からデータを１つ取得する。スタック構造であるので、最新のスタックデータを取得することになる。但し、途中経路記憶部２２に１つもデータが格納されていない場合には（ステップＳ９，ＹＥＳ）、本処理を終了する。
【００５８】
一方、途中経路記憶部２２からデータを１つ取得できた場合には（ステップＳ９，ＮＯ）、ステップＳ１０、Ｓ１１の処理を実行して、ステップＳ２に戻る。まず、途中経路記憶部２２からの取得データを、経路６１の上記“空レコード”に格納する。ここでは途中経路記憶部２２には１つのデータのみが格納された状態であり、その経路５２は“C000”であるので、図５（ｂ）に示す２番目のレコードに“C000”が格納されることになる。尚、この段階では、図５（ｂ）に示す２番目のレコードには、“C000”のみが格納された状態であり、図示の“C002”、“C004”、“C006”は、未だ格納されていない。
【００５９】
そして、走査対象を分岐の他方に移動させて（ステップＳ１１）、ステップＳ２に戻る。ステップＳ１１の処理は、例えば、上記ステップＳ８で取得した経路５２における最後の要素（接点）を基点として、次の処理対象要素を決定する。ここでは、経路５２は“C000”のみであるので、“C000”を基点として次の処理対象要素を決定する。
【００６０】
この決定方法は、例えば、セル一覧３０において、その名前３２が上記基点（C000）と同一であるレコードを検索して、該当レコードの右３４を取得する。
但し、図示の例では名前３２が“C000”であるレコードは２つあるので、名前３２だけでなく種類３１も同一であるレコードを検索するようにしてもよい。勿論、その為には、途中経路記憶部２２にデータを格納する際に、Ｂ接点に関しては接頭辞（！）を付与して格納する等して、Ａ接点とＢ接点とが区別できるようにしておく必要がある。
【００６１】
尚、これは他の処理でも同様とする。すなわち、本説明において名前３２を用いて何等かの判定を行う処理は、名前３２だけでなく種類３１も用いて判定するようにしてもよい。勿論、その為には、種類３１を判別可能としておく必要があり、一例としてはＢ接点に関しては接頭辞（！）を付与するが、この例に限らない。
【００６２】
そして、その左３３が、上記該当レコードの右３４と同一であるレコードを検索する。上記の例では、右３４は‘２’であるので、名前３２が“C001”と“C002”の２つのレコードが求められることになる。そして、この２つのうち、未だ経路６１に１つも格納されていない方を、次の処理対象要素に決定する。この例では、“C002”が次の処理対象要素に決定されることになる。勿論、この例に限らず、例えば、上記分岐の一方に分岐した際に、分岐の他方の接点の名前等を、別途記憶しておき、これを次の処理対象要素に決定するようにしてもよい。
【００６３】
但し、次の処理対象要素の決定方法は、上記の例に限らない。例えば、途中経路記憶部２２に更に分岐先を格納するようにしてもよい。つまり、上記ステップＳ６、Ｓ７の処理において、ステップＳ７の「何れか一方の接点を走査対象に決定する処理」を先に行ったうえで、ステップＳ６において、他方の接点の名前も一緒に途中経路記憶部２２に格納するようにしてもよい。上記の例では“C002”が格納されることになる。
【００６４】
尚、ステップＳ１１の処理の際に、上記ステップＳ８で取得した経路５２を、新たな上記“ここまでの経路”とする。これによって、“ここまでの経路”が「C000」の状態で、次の経路探索を開始することになる。
【００６５】
そして、処理対象要素が“C002”であるので、ステップＳ３で“接点”と判定されて、ステップＳ４で経路６１の対象レコード（ここでは２番目のレコード）に“C002”が追加格納され、ステップＳ５で次の処理対象要素は接続点４（ＩＤ＝４）となる。これより、図２の例に応じて、ステップＳ３の判定は“分岐”となり、ステップＳ６で途中経路記憶部２２に図５（ａ）に示す“分岐位置５１が‘ｂ’で経路５２が「C000，C002」のデータ”が、スタックされることになる。
【００６６】
そして、ここではステップＳ７で“C004”の方へ分岐するものとし、これよりその後にステップＳ８の処理が実行されるときには、経路６１は図５（ｂ）の２番目のレコード「C000，C002，C004，C006」が、完成した状態となっている。更に、その後のステップＳ１０の処理によって、経路６１の３番目のレコードに「C000，C002」が格納された状態となる。勿論、このときには未だ図示の“！C000”は、格納されていない。
【００６７】
そして、３つ目の経路の探索が終了したときには、経路６１は図５（ｂ）に示す状態となっていることになる。
ここで、上記の通り本例ではＡ接点の場合には信号名に接頭辞（！）をつけないものとし、Ｂ接点の場合には信号名に接頭辞（！）をつけるものとする。そして、図２の例では、最後に探索される接点は、図２（ａ）の下側に示すＢ接点“C000”であり、上記の通りＢ接点に関しては接頭辞（！）を付与するので、図示のように経路６１の３番目のレコードの最後には「！C000」が格納されることになる。
【００６８】
尚、上記接頭辞（！）を付与する方法は、一例であり、この例に限らず、Ａ接点であるかＢ接点であるかを区別できれば、何でも良い。また、接頭辞（！）を付与するのは、経路６１に限らない。例えば図２（ｂ）の点一覧４０の例に示すように、接続情報４４において接頭辞（！）を用いて、接点の種別を区別可能となるようにしてもよい。また、接頭辞（！）を用いずに、セル一覧３０に示すように、名前と種類とをペアにして扱うようにしてもよい。
【００６９】
以上、経路抽出部１１の処理について、詳細に説明した。
以下、経路毎信号重複抽出部１２、合理性判定部１３について説明する。
まず、経路毎信号重複抽出部１２について説明する。
【００７０】
経路毎信号重複抽出部１２は、上記図４の処理等によって経路記憶部２３に記憶されている上記経路６１を用いて、各経路毎に、その経路上の各信号名（接点名）から接頭辞を除いたものを逐次比較することによって、重複した信号名を抽出する。
【００７１】
図６（ａ）、（ｂ）は、経路毎信号重複抽出部１２の処理フローチャート図である。
図６（ａ）は全体フローであり、そのステップＳ２２の処理の詳細フローを図６（ｂ）に示してある。
【００７２】
図６（ａ）に示す全体フローは、概略的には、経路記憶部２３に記憶された各経路を処理対象として当該各経路毎にステップＳ２１〜Ｓ２６の処理を実行し、全ての経路について処理実行したら（ステップＳ２６，ＹEＳ）本処理を終了するものである。
【００７３】
ステップＳ２１〜Ｓ２６の処理は、概略的には、上記処理対象の経路に関して、その経路上の上記各接点名（信号名）を順次抽出して処理対象とし、この処理対象の接点名に関してステップＳ２２〜Ｓ２５の処理を実行するものである。処理対象の経路上の全ての接点名についてステップＳ２２〜Ｓ２５の処理を実行したら（ステップＳ２５，ＹＥＳ）、ステップＳ２６へ移行し、未処理の経路がある場合には（ステップＳ２６，ＮＯ）ステップＳ２１へ戻る。
【００７４】
まず、ステップＳ２１で経路記憶部２３から処理対象の経路上の接点名（信号名）を１つ抽出し、これを処理対象の接点名としてステップＳ２２〜Ｓ２５の処理を実行する。これを、処理対象の経路上の全ての接点名を処理対象の接点名としてステップＳ２２〜Ｓ２５の処理を実行するまで、繰り返し実行する。
【００７５】
例えば図５（ｂ）に示す例の場合、例えば最初の経路に関しては、ステップＳ２１で各信号名（接点名）“C000”、“C001”、“C003”、“C006”が順次抽出されて、これらを上記処理対象の接点名としてステップＳ２２〜Ｓ２５の処理が実行されることになる。但し、本例では、信号名に接頭辞（！）が付されている場合には、この接頭辞（！）を除去したうえでステップＳ２２の比較処理等を実行する。従って、例えば“C000”と“！C000”とを比較した場合には、両者は同一である（重複あり）と判定されることになる。
【００７６】
上記ステップＳ２２〜Ｓ２５の処理について、以下に説明する。
まず、上記処理対象の信号名を、その経路上の他の信号名と比較して、一致するか否かをチェックする（ステップＳ２２）。尚、上記の通り、処理対象の信号名も他の信号名も、接頭辞（！）が付されている場合には接頭辞（！）を除去して信号名だけにしたうえで比較を行う。上記の通り、ステップＳ２２の処理の詳細は図６（ｂ）に示してあり、これについては後述する。
【００７７】
上記ステップＳ２２の比較処理は、同一経路上の他の信号名全てについて行う。
そして、もし、上記他の信号名のなかに上記処理対象の信号名と一致するものが１つでもあるならば、重複ありと判定して（ステップＳ２３、ＹＥＳ）、この処理対象の信号名を、信号重複リストに登録する（ステップＳ２４）。
【００７８】
図７に、この信号重複リストの一例を示す。
図示の例の信号重複リスト７０は、経路Ｎｏ．７１、重複信号名７２から成る。
上記ステップＳ２４の処理では、そのときの処理対象の経路の識別情報を経路Ｎｏ．７１に格納すると共に、上記重複ありと判定された処理対象の信号名を、重複信号名７２に格納する。上記経路の識別情報は、何でもよいが、ここでは経路記憶部２３のおける処理対象経路のレコードの順番を用いるものとする。図５（ｂ）の例では、３番目のレコードに関して上記重複ありの判定が行われるので、図７に示すように‘３’が格納されることになる。
【００７９】
ステップＳ２４の処理を実行したら、上記処理対象経路上の全ての信号名を上記処理対象の信号名としたか否かを判定し、未処理の信号名がある場合には（ステップＳ２５．ＮＯ）ステップＳ２１に戻り、全ての信号名を処理対象とした場合には（ステップＳ２５，ＹＥＳ）ステップＳ２６へ移行する。
【００８０】
尚、上記ステップＳ２３の判定がＮＯの場合には、そのままステップＳ２５の処理へ移行する。
尚、図７の信号重複リストには、一つの経路に対して複数の重複信号をリストとして保存することを可能としておく。
【００８１】
ここで、図６（ｂ）を参照して、上記ステップＳ２２の処理の詳細例について説明する。尚、ここでは、図６（ｂ）の処理を図６（ａ）の処理から呼び出されるサブルーチンとして説明するものとし、よって図６（ｂ）の処理結果は呼び出し元に返すことになる。
【００８２】
図６（ｂ）に示す処理は、上記処理対象の経路上の各信号名のなかで上記ステップＳ２１で処理対象とした信号名以外の他の信号名を、順次抽出する。そして、当該“他の信号名”を１つ抽出する毎に、まず上記接頭辞（！）が付されている場合にはこの接頭辞（！）を除去したうえで（ステップＳ３１）、当該“他の信号名”が、上記処理対象の信号名と同じであるか否かをチェックする（ステップＳ３２）。もし、両者が同じである場合には（信号名が一致する場合には）（ステップＳ３３，ＹＥＳ）、当該一致した信号名を判定結果（一致／重複あり）と共に上記呼び出し元に返し（ステップＳ３５）、本処理を終了する。
【００８３】
一方、信号名が不一致の場合には（ステップＳ３３，ＮＯ）、未処理の上記“他の信号名”がある場合には（ステップＳ３４，ＮＯ）ステップＳ３１に戻り、そうでなければ（ステップＳ３４，ＹＥＳ）判定結果（不一致）を上記呼び出し元に返して本処理を終了する。
【００８４】
尚、図示の例に限らず、例えばステップＳ３５の処理を実行したら、ステップＳ３６の処理へ移行して、未処理の“他の信号名”がある場合には、処理を続行するようにしてもよい。これは、重複する他の信号名が１つは限らないことを想定した処理である。
【００８５】
次に、以下、合理性判定部１３について図８、図９を参照して説明する。
合理性判定部１３は、上記経路毎信号重複抽出部１２による処理結果すなわち上記信号重複リスト７０に記録された上記重複している信号名について、上記経路記録部２３を参照することで、その経路が上記“不合理な回路”であるか否かを判定する。つまり、単に信号名が重複使用されているだけであるのか（冗長であるのか）、上記“不合理な回路”であるのかを、判別する。尚、上述してあるように、“不合理な回路”とは、例えば「左母線からコイルに至る経路中に同一信号名のＡ接点（常開接点）とＢ接点（常閉接点）が存在するため、コイルがＯＮすることはない」回路などである。
【００８６】
上記“不合理な回路”判定の為に、合理性判定部１３は、例えば、上記経路Ｎｏ．７１と重複信号名７２を用いて、経路記録部２３を検索して、該当する経路上の該当する信号を求める。これは複数の信号が求まるはずである。そして、該当する複数の信号の接頭辞を判定することにより、不合理な回路であるか否かを判定する。つまり、経路上の同一信号名の接点が、相互に種類が異なっているならば、その経路は上記“不合理な回路”であると判定する。
【００８７】
一方、該当経路上の同一信号名の接点の種類が同じであるならば、単に信号名が重複して用いられている（冗長である）と判定する。尚、この場合でも、何等問題ないことにはならないが、少なくとも“不合理な回路”のような大きな問題とはならない。
【００８８】
図８は、合理性判定部１３の処理フローチャート図である。
図示の処理例では、まず、上記信号重複リスト７０から１つのレコードの情報（経路Ｎｏ．７１と重複信号名７２）を取得して（ステップＳ４１）、まず経路Ｎｏ．７１を用いて経路記録部２３から該当する経路の情報（信号名リスト）を取得する（ステップＳ４２）。図７の例では経路Ｎｏ．７１＝‘３’であるので、図５（ｂ）の例において３番目のレコードの情報（C000,C002,！C000）が、上記信号名リストとして取得されることになる。
【００８９】
そして、この信号名リストの各信号名のなかに接頭辞（！）がある場合にはこれを除去した修正版信号名リストを作成したうえで、修正版信号名リストから上記重複信号名７２と同一の信号名を全て検出する（ステップＳ４３）。上記修正版信号名リストからは、必ず上記重複信号名７２と同じ信号名が２個以上検出できるはずである。これに伴って、例えば、検出した信号名のリスト上の順番を認識する。上記一例では、上記３番目のレコードの１番目と３番目の信号名が、検出されることになる。
【００９０】
これより、元の信号名リストにおいて該当する信号名を全て抽出して、これらが一致するか否かを判定する（ステップＳ４４）。上記の例では、経路記録部２３の３番目のレコードにおける１番目と３番目の信号名が抽出されることになる。つまり、‘C000’と‘！C000’とが抽出されることになる。そして、両者を比較すると、一方には接頭辞（！）が無いが、他方には接頭辞（！）があることから、不一致と判定されることになる（ステップＳ４４，ＮＯ）。
【００９１】
そして、ステップＳ４４の結果に応じて、判定結果リストに判定結果を登録する。すなわち、ステップＳ４４で一致すると判定された場合には（ステップＳ４４，ＹＥＳ）、判定結果リストには「冗長回路」である旨が登録される（ステップＳ４５）。一方、ステップＳ４４で不一致と判定された場合には（ステップＳ４４，ＮＯ）、判定結果リストには「不合理な回路」である旨が登録される（ステップＳ４６）。尚、判定結果リストには、判定対象の経路と信号名（上記の例では、３番目の経路で‘C000’と‘！C000’）が、更に格納される。
【００９２】
上記ステップＳ４５、Ｓ４６の何れかの処理を実行したら、上記信号重複リスト７０に未処理のレコードがあれば（ステップＳ４７，ＮＯ）、ステップＳ４１に戻り、未処理のレコードが無ければ（ステップＳ４７，ＹＥＳ）本処理を終了する。
【００９３】
ここで、図９（ａ）に、上記判定結果リストの一例を示す。
図示の例の判定結果リスト８０は、回路Ｎｏ．８１、信号名８２、判定８３等から成る。
【００９４】
回路Ｎｏ．８１と信号名８２には、例えば、上記判定対象の上記経路Ｎｏ．７１と重複信号名７２が格納され、この判定対象に係わる判定結果が、判定８３に格納される。すなわち、ステップＳ４４で一致すると判定された場合には（ステップＳ４４，ＹＥＳ）、上記ステップＳ４５によって「冗長」等と格納される。ステップＳ４４で不一致と判定された場合には（ステップＳ４４，ＮＯ）、上記ステップＳ４６によって「不合理」等と格納される。
【００９５】
上記一例では、１番目が‘C000’で３番目が‘！C000’であるので、１番目が接頭辞なしで３番目が接頭辞“！”であるので、上記ステップＳ４４の判定結果は不一致となる（ステップＳ４４、ＮＯ）。従って、図示のように、信号名８２には「C000」が格納されると共に、判定８３には「不合理」が格納されることになる。
【００９６】
尚、上記回路Ｎｏ．８１は、上述した意味に限らず、例えばユーザが該当回路を認識することを可能とするための情報であってもよく、プログラミングツール（支援装置）から与えられる情報であってユーザが該当回路を認識するための任意の記号等であってもよい。
【００９７】
上記処理により判定結果リスト８０が作成されたら、この判定結果リスト８０を用いて判定結果をディスプレイ等に表示する。
図９（ｂ）に、判定結果表示例を示す。
【００９８】
図示のように、判定結果リスト８０に基づいて、どの経路上のどの接点（信号）が「不合理」または「冗長」であるのかを示す表示が行われる。また、図示の例では、「不合理」、「冗長」それぞれに対応して予め登録されている文章が表示されている。例えば、「不合理」に対しては、図示のように「該当の信号がＡ／Ｂ接点で直列に使用されています。このラダー経路は常にＯＦＦとなります。」等の文章が表示されることになる。
【００９９】
この様な表示が行われることで、ユーザは、特に不合理である（常にＯＦＦとなる）と判定された接点（信号）に関しては、修正を行うことになる。つまり、本手法によれば、不合理な回路が検出されて、不合理な回路が解消されることが期待できる。
【０１００】
ここで、上記図１に示す各種機能部は、換言すれば、下記のように言うこともできるものである。
すなわち、まず、上記ラダー図格納部２１は、例えば、試験データ作成対象のラダー図プログラムの各要素間の接続関係を示す情報が含まれる要素情報を記憶するものと言うこともできる。この要素情報の一例が、上記セル一覧３０と点一覧４０であるが、これらの例に限るものではない。
【０１０１】
尚、上記の通り、“要素”には、上記セル（左母線、接点、コイル等）が含まれるが、更に上記接続点も含まれると見做してもよい。上記の通り、接続点の情報は、任意のセル間の接続に係わる情報であり、分岐を示す情報も含まれていてもよい。
【０１０２】
また、上記経路抽出部１１は、上記要素情報に基づいて、左母線からコイルに至る経路を全て抽出する処理部と言うこともできる。上記の通り、図２の例の場合は、図５（ｂ）に示す３つの経路が抽出されることになる。
【０１０３】
上記経路抽出部１１は、例えば、経路の探索中に分岐を検出する毎に左母線から該分岐までの経路である途中経路情報をスタック記憶部にスタックする。そして、探索対象がコイルに至ることで１つの経路を抽出完了する毎に、上記スタック記憶部に上記途中経路情報がスタックされている場合には該途中経路情報の１つを取り出して、該途中経路情報を用いて次の経路の探索を開始する。
【０１０４】
尚、上記スタック記憶部の一例が上記途中経路記憶部２２である。
そして、経路毎信号重複抽出部１２が、上記抽出された各経路毎に、その経路上の信号名（接点名）の重複を調べる。この重複の検索は、一例としては、信号名の逐次比較や、信号名の整列（ソート）を行って実現するが、これらの例に限らない。
【０１０５】
重複した信号名を抽出できた場合、合理性判定部１３が、その接点種類を比較し、接点種類が異なっている場合（Ａ接点とＢ接点）、その経路は不合理である（ＯＮにならない）と判定する。更に判定結果をユーザ等に通知／表示する。また、接点種類が同じ場合、その信号が単に重複している（冗長である）と判定する。更に判定結果をユーザ等に通知／表示してもよい。
【符号の説明】
【０１０６】
１０  ラダー図合理性検査装置
１１  経路抽出部
１２  経路毎信号重複抽出部
１３  合理性判定部
２１  ラダー図格納部
２２  途中経路記憶部
２３  経路記憶部
３０  セル一覧
３１  種類
３２  名前
３３  左
３４  右
４０  点一覧
４１  ＩＤ
４２  座標
４３  分岐
４４  接続情報
５１  分岐位置
５２  経路
６１  経路
７０  信号重複リスト
７１  経路Ｎｏ．
７２  重複信号名
８０  判定結果リスト
８１  回路Ｎｏ．
８２  信号名
８３  判定
【図１】
2016001377.tif 000003
【図２】
2016001377.tif 000004
【図３】
2016001377.tif 000005
【図４】
2016001377.tif 000006
【図５】
2016001377.tif 000007
【図６】
2016001377.tif 000008
【図７】
2016001377.tif 000009
【図８】
2016001377.tif 000010
【図９】
2016001377.tif 000011
【図１０】
2016001377.tif 000012