(57)【要約】【課題】ラダー図プログラムの品質を定量的に評価できるようにする。【解決手段】経路抽出部１１は、ラダー図格納部２に格納されているラダー図回路から、全ての経路と各経路上の各要素（ラダー要素）を抽出して、経路記録部１３に記録する。この記録内容を用いて、ラダー要素計数部１４が、ラダー図回路全体における各種別毎のラダー要素数を計数する。この計数結果に基づいて複雑度計算部２０が複雑度を算出し、複雑度表示部３０が複雑度を表示する。【選択図】図１
2017151568.tif 000002
【特許請求の範囲】
【請求項１】
検査対象のラダー図プログラムの各要素間の接続関係を示す情報が含まれる要素情報を記憶するラダー図格納手段と、
該要素情報に基づいて左母線からコイルに至る経路を全て抽出すると共に該各経路上の所定の種別の要素全てを抽出して記憶する経路抽出・記憶手段と、
該経路抽出・記憶手段の記憶内容に基づいて、前記検査対象のラダー図プログラムにおける前記各種別毎の要素数を計数するラダー要素計数手段と、
該計数結果に基づいて、前記検査対象のラダー図プログラムの複雑度を算出する複雑度演算手段と、
を有することを特徴とするラダー図メトリクス測定装置。
【請求項２】
前記各種別毎に予め、その種別に応じた任意の係数が設定されており、
前記複雑度演算手段は、前記各種別毎に、その種別に係る前記要素数に前記係数を乗じた乗算値を求めて、全ての種別の該乗算値の合計値を前記複雑度とすることを特徴とする請求項１記載のラダー図メトリクス測定装置。
【請求項３】
前記算出された複雑度を表示する複雑度表示手段を有し、
該複雑度表示手段は、予め設定された任意の上限値を越える複雑度に関しては、警告を示す表示も一緒に表示することを特徴とする請求項２記載のラダー図メトリクス測定装置。
【請求項４】
前記複雑度表示手段は、複数の前記ラダー図プログラムに関して算出された複数の前記複雑度を一覧表示することを特徴とする請求項３記載のラダー図メトリクス測定装置。
【請求項５】
前記種別は、前記コイルと、接点、分岐点、結合点であることを特徴とする請求項１〜４の何れかに記載のラダー図メトリクス測定装置。
【請求項６】
スタック記憶手段を更に有し、
前記経路抽出・記憶手段は、前記経路の探索中に分岐を検出する毎に前記左母線から該分岐までの経路である途中経路情報を前記スタック記憶手段にスタックし、探索対象が前記コイルに至ることで１つの経路を抽出完了する毎に、前記スタック記憶手段に前記途中経路情報がスタックされている場合には該途中経路情報の１つを取り出して、該途中経路情報を用いて次の経路の探索を開始することを特徴とする請求項１〜４の何れかに記載のラダー図メトリクス測定装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ラダー図プログラム（回路）の品質評価方法に関する。
【背景技術】
【０００２】
シーケンス制御は、工業製品の制御及び、鉄鋼、化学、電力などの広範なプラントの制御に用いられている。シーケンス制御ではラダー図プログラムが用いられることが多い。
ラダー図は、リレーロジックを模したものであり、On/Offの入力信号を論理和/論理積の組み合わせにより演算を行い、その結果を出力する。制御装置はラダー図で作成されたその演算を実行するものである。リレーロジック（ラダー図）は入力条件の組み合わせで出力を決定するものであり、シーケンス制御に慣れた技術者には簡単に制御を行えるものであるが、作成されたロジックを定量的に評価することについては十分に配慮されていない。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００３−９１３０１号公報
【特許文献２】特開２０１６−１３７７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ソフトウェアメトリクスは、ソフトウェアの品質を定量的に評価する尺度として、多くの開発現場で利用されてきている。例えば、Cyclomatic（サイクロマチック）複雑度と呼ばれるメトリクスは、プログラムの複雑度を測る目的で、プログラムのソースコードから、プログラムが実行される可能性がある独立した経路の数を数える。
【０００５】
その結果、テストカバレッジの一つである分岐網羅率を100％にするために必要なテストケースの下限値を知ることが可能になる。つまり、サイクロマチック複雑度の高いプログラムはテストケースが多く必要になり、テストに時間がかかることが分かる。また複雑度の高いプログラムは、経験的に不具合の発生率が高いことが知られており、複雑度が高いプログラムを作成することは避けられている。
【０００６】
このようにC/C++、JAVA等のテキスト言語では、ソフトウェアメトリクスをソフトウェアの品質の一つと考え、様々な面で計測し、定量的な評価としている。しかしながら、図示言語であるラダー図においては、品質を定量的に評価するものが存在しないため、個々のプログラムの品質を比べることができない。
【０００７】
本発明の課題は、ラダー図プログラムの品質を定量的に評価できる値を算出することができるラダー図メトリクス測定装置等を提供することである。
【課題を解決するための手段】
【０００８】
本発明のラダー図メトリクス測定装置は、下記の各手段を有する。
・検査対象のラダー図プログラムの各要素間の接続関係を示す情報が含まれる要素情報を記憶するラダー図格納手段；
・該要素情報に基づいて左母線からコイルに至る経路を全て抽出すると共に該各経路上の所定の種別の要素全てを抽出して記憶する経路抽出・記憶手段；
・該経路抽出・記憶手段の記憶内容に基づいて、前記検査対象のラダー図プログラムにおける前記各種別毎の要素数を計数するラダー要素計数手段；
・該計数結果に基づいて、前記検査対象のラダー図プログラムの複雑度を算出する複雑度演算手段。
【発明の効果】
【０００９】
本発明のラダー図メトリクス測定装置等によれば、ラダー図プログラムの品質を定量的に評価できる値を算出することができる。
【図面の簡単な説明】
【００１０】
【図１】本例のラダー図メトリクス測定装置の機能ブロック図である。
【図２】（ａ）はラダー図プログラムの一例、（ｂ）はその図示情報の具体例を示す図である。
【図３】経路抽出部の処理フローチャート図である。
【図４】（ａ）〜（ｃ）は、経路と要素の抽出処理結果や処理中の情報の具体例である。
【図５】ラダー要素計数部の処理結果の一例を示す図である。
【図６】係数入力部による設定画面例である。
【図７】（ａ）は複雑度一覧表示例、（ｂ）は上限値設定画面例である。
【発明を実施するための形態】
【００１１】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例のラダー図メトリクス測定装置１の機能ブロック図である。
ラダー図メトリクス測定装置１は、例えば図示のラダー図格納部２、ラダー要素計数部１０、複雑度計算部２０、複雑度表示部３０等の各種処理機能部を有する。
【００１２】
ラダー図格納部２は、ラダー図プログラム（ラダー図回路）を図示情報として保存する装置である。この図示情報は、例えば、ラダー図回路毎にラダー図の要素（左右母線、接点、コイルなど）とそれぞれの要素間の位置を含めた接続関係等の情報から成る。この情報は、例えば、ラダー図プログラムの各要素間の接続関係を示す情報が含まれる要素情報であると言える。
【００１３】
ここでは、図２（ａ）にはラダー図プログラムの一例を示し、これに応じた図示情報の具体例を図２（ｂ）に示し、後にこの具体例を用いて説明するものとする。尚、図２に示す図示情報の例は、上記特許文献２に示すセル一覧と点一覧等の例とほぼ同様であるが、この例に限らない。
【００１４】
ラダー要素計数部１０は、経路抽出部１１、途中経路記録部１２、経路記録部１３、ラダー要素計数部１４の各種処理機能部を有する。
ラダー要素計数部１０は、概略的には、ラダー図格納部２に格納されているラダー図（図示情報）を走査することで、ラダー図回路毎に経路全てを抽出し、各経路上のラダー要素を種別毎に計数する。この処理を、上記４つの処理機能部１１〜１４によって実現する。
【００１５】
すなわち、まず、経路抽出部１１が、ラダー図格納部２に格納されているラダー図プログラム（ラダー図回路）毎の図示情報を走査し、ラダー図回路から幾つかの経路（左母線からコイルに至る経路）を抽出する。経路抽出部１１は、更に、抽出した経路毎に、その経路上の各要素（ラダー要素）を経路記録部１３に記録する。
【００１６】
図３に経路抽出部１１のフローチャート図を示し、後に説明するものとする。
また、図２の具体例に応じて図３の処理によって幾つかの経路（左母線からコイルに至る経路）を抽出した結果を、図４（ａ）に示し、後に説明するものとする。
【００１７】
途中経路記録部１２は、経路抽出部１１により利用されるもので、経路抽出部１１による経路抽出処理中に途中までの経路を記録するものである。経路抽出部１１は、ラダー図回路中の経路をたどる途中で分岐を検出した場合、経路情報として、そこまでの経路上に現れたラダー要素を、途中経路記録部１２に記録しておく。つまり、経路を辿る途中で分岐を検出した場合、左母線から当該分岐までの経路（中途経路）を記録しておくものである。
【００１８】
上記具体例に応じた途中経路記録部１２の記録状態の一例を、図４（ｂ）に示し、後に説明する。
尚、途中経路記録部１２はスタック構造で構成され、記録するデータは、分岐が現れた位置、及び、そこまでの経路上に現れたラダー図要素とその種別である。尚、本処理例の場合には、後から検出した分岐の方を先に処理する必要があるので、途中経路記録部１２はスタック構造で構成するが、これは一例であり、この例に限らない。
【００１９】
尚、経路記録部１３は、経路抽出部１１が、上記抽出した経路とその経路上の要素を記録するものであり、図４（ｃ）に上記具体例に応じた経路記録部１３の記録内容の一例を示し、後に説明する。
【００２０】
ラダー要素計数部１４は、上記経路記録部１３に記録された情報に基づいて、ラダー図回路全体における各種別毎のラダー要素数を計数する。これは、例えば、上記経路記録部１３に記録された情報に基づいて、各種別毎に、その種別に属するラダー要素を検出して記録していく。但し、その際、同一のラダー要素を重複して検出した場合には、２回目以降の検出は記録しない。そして、この記録結果に基づいて、各種別毎に、その種別に属するラダー要素のラダー図回路全体における数（合計値）を求める。
【００２１】
尚、種別とは、例えば、接点、コイル、分岐点、結合点などである。単なる接続点は、ラダー要素（種別）として扱わなくてもよいが、特別な接続点である分岐点、結合点は、ラダー要素（種別）として扱うものとする。
【００２２】
種別毎のラダー要素の検出数を求める場合、経路記録部１３に記録された内容にはラダー要素の重複が有るので、例えば上記のように同一要素の２回目以降の検出は記録しないようにするが、この例に限らず、例えば一度カウントされたラダー要素を重複してカウントしないようにしてもよい。この場合、例えば、ラダー要素をカウントする際に、カウントしたラダー要素と同じものは経路分割情報から消し込むなどして、重複カウントされないようにする。
【００２３】
図５に、上記具体例に応じたラダー要素計数部１４の上記処理結果の一例を示し、後に説明する。
複雑度計算部２０は、複雑度演算部２１、係数入力部２２を有し、上記ラダー要素計数部１０によって求められた上記ラダー要素の種別毎の検出数（一例が図５）を、所定の複雑度計算式に当て嵌めて、ラダー図回路の複雑度を計算する。
【００２４】
係数入力部２２によって、任意の複雑度係数が入力されて登録される。これは、上記ラダー要素の種別毎に、それぞれ、その種別に応じた任意の複雑度係数が入力されて登録される。この各複雑度係数は、例えばユーザ（人間）が任意に決めて入力し、係数入力部２２はこれを記録（登録）する。ここでは、一例として例えば、接点の複雑度係数、コイルの複雑度係数、分岐の複雑度係数、タイマの複雑度係数、カウンタの複雑度係数が、登録されているものとする。
【００２５】
尚、この例に応じた係数入力部２２による設定画面例を、図６に示すが、これについては特に説明しないが、この設定画面を介してユーザは何時でも自由に、複雑度係数の設定を変更することができる。
【００２６】
複雑度演算部２１は、上記ラダー要素計数部１０の処理結果として得られる、上記ラダー図回路内のラダー要素の種別毎の検出数（一例が図５）と、上記係数入力部２２で設定された上記複雑度係数を用いて、所定の計算式により複雑度を計算する。
【００２７】
例えば、次式のような計算式でラダー図回路の複雑度を求める。
ラダー図回路の複雑度＝接点の複雑度係数×ラダー図回路内の接点の検出数
＋コイルの複雑度係数×ラダー図回路内のコイルの検出数
＋分岐の複雑度係数×ラダー図回路内の分岐の検出数
＋タイマの複雑度係数×ラダー図回路内のタイマの検出数
＋カウンタの複雑度係数×ラダー図回路内のカウンタの検出数
つまり、予め、ラダー要素の各種別毎に、その種別に応じた任意の係数が設定されており、複雑度演算部２１は、各種別毎に、その種別に係る要素数にその種別に係る係数を乗じた乗算値を求めて、全ての種別の該乗算値の合計値を上記複雑度とするものである。
【００２８】
尚、上記複雑度の計算式は、ラダー要素の種別を細分化することにより変更してもよい。例えば接点については通常の常開接点（Ａ接点）、常閉接点（Ｂ接点）や微分接点等に細分化され、これら各細分化種別毎に、それぞれに別の複雑度係数を与えてもよい。
【００２９】
同様にして、タイマ、カウンタについても、その細分化種別（Onディレータイマ、Offディレータイマ、アップカウンタ、ダウンカウンタ、アップダウンカウンタ等）毎に、それぞれに別の複雑度係数を与えても良い。
【００３０】
そして、このようにラダー要素の種別を細分化する場合、ラダー要素計数部１０において、例えば一例としては、細分化されたラダー要素種別毎に要素数をカウントするようにしておく。
【００３１】
複雑度演算部２１は、任意の処理対象のラダー図回路について上述した処理によって複雑度を求める毎に、例えば処理対象のラダー図回路の識別情報等に対応付けて、算出した複雑度を記録する。
【００３２】
複雑度表示部３０は、この様に記録された複雑度の一覧を表示する。つまり、上記各処理対象のラダー図回路に関する、上記算出した複雑度を、一覧表示する。その際、複雑度上限値越えを示す警告を、表示するようにしてもよい。
【００３３】
複雑度表示部３０は、複雑度一覧表示部３１、複雑度上限入力部３２を有する。
複雑度一覧表示部３１は、上記複雑度演算部２１によって算出された各ラダー図回路の複雑度の値を、一覧で表示する。この表示例を図７（ａ）に示す。
【００３４】
図７（ａ）の表示例では、各回路Ｎｏ．に対応付けて、この回路Ｎｏ．のラダー図回路の複雑度が表示される。回路Ｎｏ．が、上記処理対象のラダー図回路の識別情報の一例である。
【００３５】
図示の例では、更に、上記“複雑度上限値越えを示す警告”を表示した例を示している。これについて以下説明する。
上記複雑度上限入力部３２は、例えばユーザに任意の上限値を設定させる。これは、上記複雑度一覧表示部３１で複雑度の計算結果を表示する際に、所定の上限値を超える複雑度を持つラダー図回路について、そのことを警告表示するための複雑度の上限値を設定させるものである。
【００３６】
複雑度一覧表示部３１は、複雑度の計算結果がこの上限値を超えていた場合、そのことを示す警告を、該当するラダー図回路の複雑度の表示箇所付近に表示する。
上記上限値の設定画面例を図７（ｂ）に示す。図７（ｂ）に示す上限値設定画面例では、上限値として‘１０’が設定されており、図７（ａ）にはこの設定例に応じた表示例を示している。すなわち、図７（ａ）に示す例においてその複雑度が上限値‘１０’を超えているのは回路Ｎｏ．＝‘４’のラダー図回路だけであるので、回路Ｎｏ．＝‘４’に対応する位置に図示のような上限値越えを示す警告である“！マーク”を表示する。
【００３７】
尚、本例のラダー図メトリクス測定装置１は、例えば汎用コンピュータ（パソコン等）上で実現できるものであり、ハードウェア的には汎用コンピュータの一般的な構成を有している。つまり、特に図示しないが、ＣＰＵ、記憶装置（ハードディスク、メモリ等）等を備えている。このＣＰＵが、記憶装置に予め記憶されているアプリケーションプログラムを実行することで、図１に示す各種処理機能部２、１０（１１〜１４）、２０（２１，２２）、３０（３１，３２）の処理や、後述する図３のフローチャートの処理等が実現される。
【００３８】
以下、図３の処理について、上記図２、図４、図５の具体例も用いて説明する。
例えば図２（ａ）に示すようなラダー図プログラムの場合、ラダー図格納部２には図２（ｂ）に示すセル一覧４０及び点一覧５０が上記図示情報として格納される。
【００３９】
この例では、左右の母線、接点、コイル等をセルとして、セル一覧４０には各セルの種類４１、名前４２、接続点との接続関係（左４３、右４４）等が格納される。また、各接続点に関する情報が、点一覧５０に格納される。各接続点には予めユニークな識別ＩＤであるＩＤ５１が割り当てられており、各セル毎に、そのセルに接続する接続点の上記識別ＩＤが上記左４３、右４４に格納される構造となっている。
【００４０】
また、点一覧５０においては、各接続点毎に、その接続点の後段（右側）のセルを示す情報が、接続情報５５に格納されている。また、その接続点が分岐点である場合には分岐５３に、その接続点が結合点である場合には結合５４に、それぞれ所定のデータ（本例では‘１’）が格納される。
【００４１】
尚、ここでは、図２（ａ）に示す接続点１のＩＤ５１が‘１’、接続点２のＩＤ５１が‘２’であるものとする。これより、例えばセル“接点C000”に関しては、左４３が‘１’、右４４が‘２’となっている。他の接続点や、各セルの接続点との接続関係も、図示の通りである。
【００４２】
上記経路抽出部１１は、上記ラダー図格納部２の格納データに基づいて経路探索を行って、左母線からコイルに至る経路を全て求める。これは、基本的には複数の経路が求まることになる。例えば、上記図２に示す例の場合、図４（ａ）に示す（１）、（２）、（３）の３つの経路が、求められることになる。当該求められた（複数の）経路と各経路上の要素に関する情報が、経路記録部１３に記憶される。
【００４３】
上記経路抽出部１１は、任意のラダー図回路の左母線からコイルに至る経路を全て抽出する為に、経路を探索する途中で分岐を検出した場合、そこまでの経路を上記スタック構造（途中経路記録部１２）に記録して、分岐の一方の経路を続けて辿る。経路探索がコイルまで到達した場合、一つの経路の探索を終了し、経路を経路記録部１３に記録する。そして、スタック構造にデータが記録されている場合（途中までの経路が残っている場合）、当該スタック構造からデータ（途中までの経路）を取得することで、分岐のもう一方の経路を辿ってコイルに至るまで経路探索を行う。
【００４４】
尚、スタック構造からデータを取得することで、当該データはスタック構造から無くなることになる。また、スタック構造であるので、任意の分岐の後に更に別の分岐があった場合、上記一つの経路の探索を終了後、後の分岐の箇所から探索を再開することになる。
【００４５】
以上の操作を全ての経路の探索が終了するまで行う。これは、換言すれば、スタック構造に途中経路データが無くなるまで行うものと言える。
図３は、この様な経路抽出部１１の処理の詳細例を示すフローチャート図である。
【００４６】
但し、図３の処理例を説明する前に、まず、図２について説明する。
図２（ｂ）に示すセル一覧４０は、種類４１、名前４２、左４３、右４４から成る。
種類４１は、セルの種類であり、これは例えば上記ラダー要素の種別の一部に相当し、図示のように接点、コイルはあるが、分岐点、結合点はない。ラダー図要素の種別は、例えば、接点、コイル、分岐点、結合点などである。
【００４７】
例えば図２（ａ）に示すラダー図プログラムについて、各セル毎に、その種類（母線or接点orコイル）と名前が、種類４１と名前４２に格納される。更に、そのセルに接続する接続点の識別ＩＤが、左４３と右４４に格納される。左４３にはそのセルから左母線側（図２（ａ）では図上左側）の接続点の識別ＩＤが格納される。右４４にはそのセルから右母線側（図２（ａ）では図上右側）の接続点の識別ＩＤが格納される。
【００４８】
また、点一覧５０は、各接続点の情報であり、ＩＤ５１、座標５２、分岐５３、結合５４、接続情報５５等から成る。
ＩＤ４１は既に説明した通りである。座標５２には、その接続点が分岐点または結合点である場合には、この分岐点または結合点の識別子や名称等が格納される。図示の例では接続点２，４が分岐点であり分岐点ａ、分岐点ｂとし、接続点５，６が結合点であり結合点ｃ、分岐点ｄとしている。分岐５３には、その接続点が分岐点である場合には、分岐点であることを示す為に本例では‘１’が格納される。図示の例では、接続点２と接続点４が分岐点であるので‘１’が格納されている。結合５４には、その接続点が結合点であることを示す為に本例では‘１’が格納される。図示の例では、接続点５と接続点６が結合点であるので‘１’が格納されている（但し、接続点６については図示を省略して示してある）。
【００４９】
後述する図３のステップＳ１３の処理では、処理対象要素が接続点であって且つその分岐５３が‘１’である場合に、「分岐」と判定してステップＳ１６〜Ｓ１８の処理を実行することになる。更に、このステップＳ１８の処理では、処理対象要素のＩＤ５１を用いて、セル一覧４０において左４３が当該ＩＤ５１と同一であるレコードを求めることで、２つの走査対象候補を判別できる。これより、当該２つの走査対象候補の何れか一方を走査対象に決定する。残りが後にステップＳ２４で走査対象に決定されることになる。これについては、後に詳しく説明する。
【００５０】
尚、図示の例に限らず、例えば分岐５３は無くてもよい。接続情報５５に複数データが格納されている場合には分岐点であると判別できるからである。
また、接続情報５５には、その接続点の後段（図上右側）に接続されるセルの識別情報等が格納される。よって、例えば、接続点１に関しては“C000”が格納されるが、分岐点である接続点２に関しては“C001”と“C002”の２つが格納されることになる。
【００５１】
また、ここで、図４（ｂ）に示す途中経路記録部１２の格納データの一例についても説明しておく。尚、以下の説明では、途中経路記録部１２の格納データを、途中経路情報１２と記すものとする。
【００５２】
図示の例では、途中経路情報１２は、分岐位置６１、経路６２から成る。尚、分岐位置６１は、必ずしも必要ないものであり、説明する都合上、示しているものと見做しても構わない。
【００５３】
また、ここでは探索が分岐点ｂの位置まで来た時点での記録内容を示している。すなわち、本具体例の場合、まず探索が分岐点ａの位置まで来た時点でそこまでの経路が経路情報６２に記録され（スタックされ）、その後、当該スタックデータが取り出される。これによって格納データが何も無い状態となった後、探索が分岐点ｂの位置まで来た時点で、図示の分岐位置６１＝ｂのレコードが格納（スタック）される。経路６２には、それまでの探索経路が格納される。これについて詳しくは後述する。
【００５４】
以上、説明の都合上、図２等について説明した。
以下、図３のフローチャート図の処理について説明する。
図３の処理は、概略的には、処理対象のラダー図要素のデータを取得する（ステップＳ１２）毎に、ステップＳ１３以降の処理を実行することを、ステップＳ２２の判定がＮＯとなるまで繰り返し実行するものである。
【００５５】
最初は、ラダー図プログラムの左母線の右側を走査することで、処理対象を左母線に接続されているラダー図要素として（ステップＳ１１）、この対象要素に関するデータをステップＳ１２で取得することになる。その後は、ステップＳ１５、Ｓ１８，Ｓ２４等で対象要素を変更しながら、上記処理を繰り返すことになる。尚、ここでは、ラダー図要素を単に要素と記す場合もあるものとする。
【００５６】
ステップＳ１１では、例えば、セル一覧４０において、種類４１が“母線”であるレコードの右４４のデータ（＝‘１’）より、対象要素を決定する。尚、上記“要素”には、上記セルや接続点が含まれる。つまり、接点やコイルだけでなく、接続点も含まれる。
【００５７】
そして、セル一覧４０及び点一覧５０を検索して、該当レコード（対象要素のレコード）を求める（ステップＳ１２）。つまり、セル一覧４０または点一覧５０において、そのＩＤ５１または名前４２が、上記対象要素を示すデータ（識別ＩＤまたは名前であり、本例では最初は‘１’）と一致するレコードを、該当レコードとする。そして、この該当レコードの種類４１または分岐５３と結合５４を参照することで、対象要素の種別（対象要素が接点であるか、分岐または結合を伴う接続点（分岐点または接続点）であるか、コイルであるか等）を判定する処理を行う（ステップＳ１３）。
【００５８】
そして、対象要素が接点である場合にはステップＳ１４，Ｓ１５の処理を実行し、分岐または結合である場合にはステップＳ１６〜Ｓ１８の処理を実行し、コイルである場合にはステップＳ１９〜Ｓ２４の処理を実行する。但し、ステップＳ２２の判定がＮＯとなった場合には本処理を終了する。それ以外の場合には、ステップＳ１２の処理に戻る。
【００５９】
尚、図示していないが、対象要素が「分岐点でもなく結合点でもない接続点」である場合には、その接続情報５５によって次の対象要素を認識したうえでステップＳ１２に戻る。図示の例では最初はステップＳ１１で上記の通り‘１’が取得され、ここでは数値は接続点の識別ＩＤを意味するものとし、これより取得データを用いて点一覧５０を検索して該当レコードを求めるものとする。この例では、点一覧５０の先頭レコードが該当レコードとなるので、その分岐５３が‘１’ではなく且つ結合５４も‘１’ではないことから、上記「分岐点でもなく結合点でもない接続点」であると判定することになる。これより、上記処理を行って、次の対象要素を“Ｃ０００”として、ステップＳ１２に戻ることになる。
【００６０】
これより、ステップＳ１２では、“Ｃ０００”を用いてセル一覧４０、点一覧５０を検索して、該当レコードを求める。つまり、その名前４２またはＩＤ５１が“Ｃ０００”であるレコードを求める。この例では、セル一覧４０の上から２番目のレコードが、該当レコードとなる。
【００６１】
該当レコードが点一覧５０内にある場合の処理は、既に述べた通りである。一方、該当レコードがセル一覧４０内にある場合には、この該当レコードの種類４１によって、ステップＳ１３の判定を行う。図示の例では、上記該当レコードの種類４１は“接点”であるので、上記の通り、ステップＳ１４、Ｓ１５の処理を実行することになる。
【００６２】
ここで、本例では、所定の記憶領域または所定のファイル等である「経路一時情報」を、予め用意しておくものとする。この「経路一時情報」は、初期状態では、何もデータが格納されていないものとする。
【００６３】
ステップＳ１４では、処理対象のラダー図要素（接点）の接点名（信号名）すなわち上記該当レコードの名前４２を、上記「経路一時情報」に格納する。ここでは、上記“Ｃ０００”が「経路一時情報」に格納されることになる。その際、ステップＳ１３で判別した種別（接点／分岐／結合／コイル）も一緒に格納する。これより、ここでは“Ｃ０００（接点）”が「経路一時情報」に格納されるものとする。尚、この段階では「経路一時情報」には“Ｃ０００（接点）”のみが記録された状態となっている。
【００６４】
上記ステップＳ１４の処理を実行したら、走査対象を右へ移動して（ステップＳ１５）、ステップＳ１２に戻る。ステップＳ１５の処理は、上記該当レコードの右４４を用いて、次の処理対象要素を決定するものである。上記の例では該当レコードの右４４は‘２’であるので、識別ＩＤ＝‘２’の接続点が、次の処理対象要素となり、ステップＳ１２でＩＤ５１＝‘２’のレコードが該当レコードとして取得されることになる。これより、図２（ｂ）に示す例では該当レコードの分岐５３が‘１’であることから、上記ステップＳ１３で“分岐”と判定されるので、ステップＳ１６〜Ｓ１８の処理を実行することになる。
【００６５】
まず、上記処理対象要素を示す情報（ここでは、その種別（＝“分岐”）と、上記該当レコードの座標５２（＝ａ））を、上記「経路一時情報」に追加記録する（ステップＳ１６）。これによって、「経路一時情報」には、上記“Ｃ０００（接点）”と「ａ（分岐）」が記録された状態になることになる。
【００６６】
続いて、ステップＳ１７では、ここまでの経路を途中経路記憶部１２（スタック）に記録する。これは、図４（ｂ）に示す経路情報６２に現在の「経路一時情報」がコピーされて格納され、分岐位置６１に上記該当レコードの座標５２が格納されたレコードが、スタックに積まれることになる。このレコードは、図４（ｂ）には示されないが、分岐位置６１には「ａ」が、経路情報６２には「Ｃ０００（接点）、ａ（分岐）」が、記録されたものとなる。
【００６７】
尚、上記「経路一時情報」は、各経路毎に、その経路について探索開始から現在までに処理対象要素となった接点、分岐点、結合点、コイルを全て記憶するものと定義することもできる。
【００６８】
尚、実際には「分岐でもなく結合でもない接続点」も処理対象要素となるが、この様な接続点を処理対象要素とした場合の処理については、図示していない。
そして、走査対象を分岐の一方に移動して（ステップＳ１８）、ステップＳ１２に戻る。ステップＳ１８の処理では、上記該当レコードの接続情報５５を用いて次の処理対象要素を決定する。この例では、該当レコードの接続情報５５には、「C001,C002」が格納されているので、C001とC002の何れか一方を、次の処理対象要素とする。
【００６９】
あるいは、上記該当レコードのＩＤ５１を用いて、次の処理対象要素を決定してもよい。この場合、セル一覧４０において、その左４３が、上記該当レコードのＩＤ５１と同一であるレコードを求める。これは、例えば２つのレコードが求められるはずであるので、何れか一方を次の処理対象要素とする。ここでは、ＩＤ５１＝‘２’であるので、セル一覧４０の上から３番目と４番目のレコードの何れか一方が、次の処理対象要素となる。
【００７０】
ここでは仮に３番目のレコード（名前４２＝“COO1”）が次の処理対象要素となったものとすると、ステップＳ１３では“接点”と判定されることになり、上記ステップＳ１４，Ｓ１５の処理が実行される。特に説明しないが、それ以降、接点“C003”、結合点ｃ、接点“C006”、結合点ｄが順次処理対象要素となって、上記のようにしてステップＳ１４、Ｓ１５の処理またはステップＳ１６〜Ｓ１８の処理が実行されることになる。
【００７１】
その結果、この段階では、上記「経路一時情報」には、不図示の「C000（接点）、ａ（分岐）、C001（接点）、C003（接点）、ｃ（結合），C006（接点）、ｄ（結合）」が，格納された状態となっている。
【００７２】
この状態で、次の処理対象要素の種別が“コイル（Coil）”となるので、ステップＳ１３では“コイル”と判定され、ステップＳ１９の処理へ移行する。
ステップＳ１９では、上記処理対象要素を示す情報（ここでは、上記該当レコードの種類４１（＝“コイル”）と名前（Coil）を、上記「経路一時情報」に追加記録する。その結果、この段階では、上記「経路一時情報」には、不図示の「C000（接点）、ａ（分岐）、C001（接点）、C003（接点）、ｃ（結合），C006（接点）、ｄ（結合）、Coil（コイル）」が，格納された状態となる。
【００７３】
そして、この状態の「経路一時情報」を、上記経路記録部１３に記録する（ステップＳ２０）。これは、例えば、上記経路記録部１３に新規レコード（空レコード）を追加して、この新規レコードの経路情報７２に、上記「経路一時情報」の現在のデータを格納する。これによって、この段階では、例えば図４（ｃ）に示す先頭レコードのみが生成された状態となる。尚、経路７１には、例えばシリアル番号（先頭レコードであれば（１））を格納すればよい。
【００７４】
ここで、図４（ｃ）に、上記経路記録部１３の格納データの一例を示す。尚、図４（ｃ）には図３の処理が完了した時点での上記経路記録部１３のデータ格納状態を示しており、上記の通り、現段階では図示の先頭レコードのみが記録された状態となっている。
【００７５】
図示の先頭レコードに示す通り、その経路情報７２には上記「C000（接点）、ａ（分岐）、C001（接点）、C003（接点）、ｃ（結合），C006（接点）、ｄ（結合）、Coil（コイル）」が，格納された状態となる。
【００７６】
尚、経路７１には、各経路毎に任意の識別子等が生成されて格納され、ここでは（１）、（２）、（３）等が生成されて格納されるものとする。
また、本例では上記の通り３つの経路が抽出されるので、最終的には図示のように３つのレコードが生成されることになる。
【００７７】
そして、ステップＳ２１では、途中経路記憶部１２からデータを１つ取得する。スタック構造であるので、最上位（最新）のスタックデータを取得することになる。但し、途中経路記憶部２２に１つもデータが格納されていない場合には（ステップＳ２２，ＮＯ）、本処理を終了する。
【００７８】
一方、途中経路記憶部２２からデータを１つ取得できた場合には（ステップＳ２２，ＹＥＳ）、例えば「経路一時情報」を消去したうえで、取得データにおける経路情報６２を「経路一時情報」に格納することで、次の経路探索に係わる「経路一時情報」の初期状態を生成する。更に、取得データにおける分岐位置６１を、分岐位置にセットする（つまり、次の経路探索に係わる操作開始位置とする）（ステップＳ２３）。
【００７９】
そして、上記セットされた分岐位置に基づいて、走査対象を分岐の他方（下側）に移動させて（ステップＳ２４）、ステップＳ１２に戻る。例えば、分岐の一方に分岐した際に、分岐の他方の接点の名前等を、別途記憶しておき、これを次の走査対象要素に決定するようにしてもよい。あるいは、例えば、途中経路記録部１２に更に分岐先を格納するようにして、これを参照することで上記走査対象を決定するようにしてもよい。
【００８０】
本例では、上記１つ目の経路（１）の走査が完了して上記図４（ｃ）の先頭レコードが生成され、上記ステップＳ２３によって「経路一時情報」には「C000（接点）、ａ（分岐）」が格納された状態となり、上記分岐位置は分岐点ａの位置となり、ここから下側の要素（つまり、C002）が走査対象となる。
【００８１】
そして、この状態で２つ目の経路について探索開始することになり、最初の処理対象要素が“C002”であるので、ステップＳ１３で“接点”と判定されて、ステップＳ１４で「経路一時情報」に“C002（接点）”が追加格納され、ステップＳ１５で次の処理対象要素は接続点４（分岐点ｂ；ＩＤ＝４）となる。これより、図２の例に応じて、ステップＳ１３の判定は“分岐”となり、ステップＳ１６で途中経路記憶部１２に図４（ｂ）に示す“分岐位置６１が‘ｂ’で経路情報６２が「C000（接点），ａ（分岐）、C002（接点）、ｂ（分岐）」のデータ”が、スタックされることになる。
【００８２】
そして、ここではステップＳ１８で“C004”の方へ分岐するものとし、これよりその後の処理対象要素は、接点“C004”、接続点５（結合点ｃ）、接点“C006”、接続点６（結合点ｄ）となって、最後にコイル（Coil）となる。これら各処理対象要素について上述した処理が行われる結果、経路記録部１３には図４（ｃ）に示す２番目のレコードが生成・記録されることになる。また、ステップＳ２１では図４（ｂ）に示すデータが取得されることになり、その経路情報６２が新たな「経路一時情報」となって分岐点ｂから下側に走査対象が移ることになる。これより、３つめの経路の探索が開始されることになり、この探索処理についての説明は省略するが、その結果として経路記録部１３には図４（ｃ）に示す３番目のレコードが生成・記録されることになる。また、このときにはスタックにはデータはないので、ステップＳ２１でデータ取得できず、以ってステップＳ２２の判定がＮＯとなり、本処理を終了する。
【００８３】
そして、例えば図４（ｃ）に示す経路記録部１３の記録内容を参照して、上記ラダー要素計数部１４が上述した処理を行うことで、ラダー図回路全体における各種別毎のラダー要素数が、図５に示す例のように計数（検出）される。これは、同じラダー図要素が重複してカウントされないようにして計数する。
【００８４】
例えば、接点の数を計数する場合には、まず、図４（ｃ）に示す全レコードからその種別が“接点”である要素を全て抽出して、同じものが複数ある場合には１つのみ残して残りは消去する（例えば、C000は３つ抽出されるので、1つを残して残りは消去する。これによって、接点として図５に示すようにC000、C001、C002、C003、C004、C005の6個が、検出されることになる。他のラダー要素種別についても同様の処理を行うことで、図５に示すように、接点は６つ、コイルは１つ、分岐は２つ、結合は２つが、それぞれ計数されることになる。
【００８５】
上述したように、本例のラダー図メトリクス測定装置１では、ラダー図回路中に含まれるラダー要素（接点/コイル/分岐/収束/タイマ/カウンタ等）の出現数を数え、それぞれの種別毎に任意の係数を掛け、その総和を求めたものをラダー図回路複雑度として算出する。
【００８６】
このラダー図回路複雑度を処理対象の各ラダー図回路毎に計算し、その結果を一覧表等に表示し、更に、設定された上限値を超えた場合、強調表示する等の評価を加えた表示を行うことにより、ラダー図プログラムの複雑度評価を行う。
【００８７】
上記本手法によれば、図示表現プログラムであるラダー図においても、複雑度を定義し算出することができ、プログラムの品質を評価する方法を提供することができる。つまり、本手法によれば、図示表現プログラムであるラダー図回路についても、プログラムの品質を客観的に評価することが可能となる。
【００８８】
尚、本例のラダー図メトリクス測定装置１は、不図示の下記の処理機能部を有するものと見做してもよい。
・検査対象のラダー図プログラムの各要素間の接続関係を示す情報が含まれる要素情報を記憶する要素情報記憶部；
・該要素情報に基づいて左母線からコイルに至る経路を全て抽出すると共に該各経路上の所定の種別の要素全てを抽出して記憶する経路抽出・記憶部；
・該経路抽出・記憶部の記憶内容に基づいて、上記検査対象のラダー図プログラムにおける上記各種別毎の要素数を計数するラダー要素計数部；
・該計数結果に基づいて、上記検査対象のラダー図プログラムの複雑度を算出する複雑度演算部。
【００８９】
そして、例えば、上記各種別毎に予め、その種別に応じた任意の係数が設定されており、上記複雑度演算部は、上記各種別毎に、その種別に係る上記要素数に上記係数を乗じた乗算値を求めて、全ての種別の該乗算値の合計値を上記複雑度とする。
【００９０】
また、例えば、上記算出された複雑度を表示する複雑度表示部を有し、該複雑度表示部は、予め設定された任意の上限値を越える複雑度に関しては、警告を示す表示も一緒に表示する。
【００９１】
また、例えば、上記複雑度表示部は、複数の上記ラダー図プログラムに関して算出された複数の上記複雑度を一覧表示する。
また、例えば、上記種別は、上記コイルと、接点、分岐点、結合点である。
【００９２】
あるいは、例えば、ラダー図メトリクス測定装置１は、スタック記憶部を更に有し、上記経路抽出・記憶部は、上記経路の探索中に分岐を検出する毎に上記左母線から該分岐までの経路である途中経路情報を上記スタック記憶部にスタックし、探索対象が上記コイルに至ることで１つの経路を抽出完了する毎に、上記スタック記憶部に上記途中経路情報がスタックされている場合には該途中経路情報の１つを取り出して、該途中経路情報を用いて次の経路の探索を開始する。
【符号の説明】
【００９３】
１  ラダー図メトリクス測定装置
２  ラダー図格納部
１０  ラダー要素計数部
１１  経路抽出部
１２  途中経路記録部
１３  経路記録部
１４  ラダー要素計数部
２０  複雑度計算部
２１  複雑度演算部
２２  係数入力部
３０  複雑度表示部
３１  複雑度一覧表示部
３２  複雑度上限入力部
４０  セル一覧
４１  種類
４２  名前
４３  左
４４  右
５０  点一覧
５１  ＩＤ
５２  座標
５３  分岐
５４  結合
５５  接続情報
６１  分岐位置
６２  経路情報
７１  経路
７２  経路情報
【図１】
2017151568.tif 000003
【図２】
2017151568.tif 000004
【図３】
2017151568.tif 000005
【図４】
2017151568.tif 000006
【図５】
2017151568.tif 000007
【図６】
2017151568.tif 000008
【図７】
2017151568.tif 000009