(57)【要約】【課題】ＳＦＣに関して、プログラムの品質を客観的に評価できるようにする。【解決手段】経路計数記録部１２は、ＳＦＣ格納部１１に格納されているＳＦＣプログラムを、チャート毎に走査することで、各チャートの経路数を求める。更に、各チャートにおけるＳＦＣコンポーネントの数を、種別毎に計数する。複雑度計算部１３は、ＳＦＣチャート毎の経路検出数や、各チャート内でのＳＦＣコンポーネント種別毎の検出数を、予め登録されている所定の複雑度計算式に当てはめて、チャート毎の複雑度を計算する。【選択図】図１
2018018510.tif 000002
【特許請求の範囲】
【請求項１】
任意のＳＦＣプログラムの開始から終了までの経路の数を求め、又は、該ＳＦＣプログラムにおける種別毎の要素数を計数する計数手段と、
該計数手段により求められた前記経路数又は前記種別毎の要素数に基づいて、前記ＳＦＣプログラムの複雑度を算出する複雑度計算手段と、
を有することを特徴とするＳＦＣメトリクス測定装置。
【請求項２】
前記経路数に応じた任意の第１係数又は前記各種別に応じた任意の各種第２係数が、予め設定されており、
前記複雑度計算手段は、前記経路数に対して前記第１係数を乗じた乗算値を求めて、又は、前記種別毎にその種別に係る前記要素数に該当する前記第２係数を乗じた乗算値を求めて、該乗算値に基づいて前記複雑度を算出することを特徴とする請求項１記載のＳＦＣメトリクス測定装置。
【請求項３】
前記第１係数又は前記各種第２係数の何れか一方を‘０’にすることで、前記複雑度を、前記経路数に応じた値、又は、前記種別毎の要素数に応じた値とすることを特徴とする請求項２記載のＳＦＣメトリクス測定装置。
【請求項４】
前記第１係数による乗算値と前記種別毎の前記第２係数による各乗算値の合計値を、前記複雑度とすることを特徴とする請求項２記載のＳＦＣメトリクス測定装置。
【請求項５】
前記種別には、選択分岐と並列分岐が含まれ、
前記計数手段は、選択分岐の要素数と並列分岐の要素数をそれぞれ計数することを特徴とする請求項１〜４の何れかに記載のＳＦＣメトリクス測定装置。
【請求項６】
前記種別には、選択分岐と並列分岐が含まれ、
前記計数手段は、前記ＳＦＣプログラムを前記開始から走査して各要素を検出し、前記選択分岐又は前記並列分岐を検出すると、該検出した選択分岐内の経路数を求める処理又は該検出した並列分岐内の経路数を求める処理を実行することを特徴とする請求項１〜４の何れかに記載のＳＦＣメトリクス測定装置。
【請求項７】
前記選択分岐内の経路数を求める処理は、該選択分岐内の分岐毎に、その分岐上に更に選択分岐又は並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数を求めて、全ての分岐の前記分岐経路数の総和を、該選択分岐内の経路数とすることを特徴とする請求項６記載のＳＦＣメトリクス測定装置。
【請求項８】
前記並列分岐内の経路数を求める処理は、該並列分岐内の分岐毎に、その分岐上に更に選択分岐又は並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数を求めて、全ての分岐の前記分岐経路数の積を、該並列分岐内の経路数とすることを特徴とする請求項６又は７記載のＳＦＣメトリクス測定装置。
【請求項９】
前記計数手段は、経路数の初期値を１とした後、前記検出した選択分岐内の経路数を求める処理又は前記検出した並列分岐内の経路数を求める処理が実行される毎に、実行結果として得られる値を現在の前記経路数の値に乗じることで経路数の値を更新し、最終的な前記経路数の値を、前記任意のＳＦＣプログラムの開始から終了までの経路の数とすることを特徴とする請求項６〜８の何れかに記載のＳＦＣメトリクス測定装置。
【請求項１０】
前記算出された複雑度を表示する複雑度表示手段を有し、
該複雑度表示手段は、予め設定された任意の上限値を越える複雑度に関しては、警告を示す表示も一緒に表示することを特徴とする請求項１〜３の何れかに記載のＳＦＣメトリクス測定装置。
【請求項１１】
前記種別には、活性状態／非活性状態となるステップと、該ステップが活性状態のときの動作を表すアクションが含まれ、
前記計数手段は、前記ＳＦＣプログラムにおける前記アクションを検出して該アクションの数を計数することを特徴とする請求項１〜４の何れかに記載のＳＦＣメトリクス測定装置。
【請求項１２】
前記アクションには、アクションクオリファイア種別、又は、アクション言語種別があり、
前記計数手段は、前記検出したアクションのアクションクオリファイア種別、又は、アクション言語種別を判別して、前記アクションの数の計数と共に、アクションクオリファイア種別に応じた又はアクション言語種別に応じた計数を行うことを特徴とする請求項１１記載のＳＦＣメトリクス測定装置。
【請求項１３】
前記アクションには、アクションクオリファイア種別があり、
前記計数手段は、前記検出したアクションのアクションクオリファイア種別が、セット動作又はリセット動作に係わるアクションクオリファイア種別である場合には、該検出したアクションに基づいてセット動作過多又はリセット動作過多を判別することを特徴とする請求項１１記載のＳＦＣメトリクス測定装置。
【請求項１４】
前記複雑度計算手段は、前記セット動作過多の数又は前記リセット動作過多の数も用いて、前記ＳＦＣプログラムの複雑度を算出することを特徴とする請求項１３記載のＳＦＣメトリクス測定装置。
【請求項１５】
前記セット動作に係わるアクションクオリファイア種別は“Ｓ”、“ＤＳ”、“ＳＤ”であり、前記リセット動作に係わるアクションクオリファイア種別は“Ｒ”であることを特徴とする請求項１３記載のＳＦＣメトリクス測定装置。
【請求項１６】
コンピュータにおけるＳＦＣメトリクスの算出方法であって、
記憶されている任意のＳＦＣプログラムの開始から終了までの経路の数を計数し、又は、該ＳＦＣプログラムにおける種別毎の要素数を計数し、
該計数した前記経路数又は前記種別毎の要素数に基づいて、前記ＳＦＣプログラムの複雑度を算出することを特徴とするＳＦＣメトリクス算出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＳＦＣで作成された制御装置のプログラムの品質評価方法に関する。
【背景技術】
【０００２】
シーケンス制御は、工業製品の制御及び、鉄鋼、化学、電力などの広範なプラントの制御に用いられている。ＳＦＣ（Sequential Function Chart：シーケンシャル・ファンクション・チャート）は、シーケンス制御において製造ラインなどの制御の順序を図示表現したプログラム言語（図示言語）の一つとして、IEC61131-3で定められている。
【０００３】
ＳＦＣのプログラム（チャート）は、基本的には、「ステップ（step）」、「トランジション（transition）」等のコンポーネント（要素）と、これらのコンポーネントを「リンク」によって結線して成るものである。ステップは、それ自体が１制御単位であって、活性状態と非活性状態の２種類があり、その状態はステップ前後の移行条件である「トランジション」の成立条件により変化する。
【０００４】
チャート内の各ステップには、それぞれに固有な動作出力「アクション」が定義されている。ＳＦＣによる動作出力は、活性状態のステップに定義されたアクションによって行われる。制御装置はＳＦＣで作成されたプログラムを実行するものである。
【０００５】
ＳＦＣのステップ、トランジション、アクションについて、以下、詳しく説明する。
「ステップ」は、プログラムの起動時に活性状態である「イニシャルステップ」と、プログラムの起動時には非活性状態である「通常のステップ」とに分類される。ステップとトランジションは必ず交互に接続されており、ステップの次にはトランジション、トランジションの次にはステップが「リンク」により接続され、ステップ同士、トランジションが上下に接続されることはない。
【０００６】
また、「アクション」は、ステップが活性状態になったときの動作出力を表すものであり、ステップには０個以上のアクション（アクションブロック）が連結される。アクションブロックには、例えばそのアクションの実行タイミングを指示するアクションクオリファイアなどが記述されている。アクションブロックは、アクションクオリファイア種別（N/S/R/L/D/P/SD/DS/SL/P1/P0）や、アクション名や、アクションの内容（言語種別、変数名／処理名、TIME型の持続時間など）等の所定の情報群からなる。
【０００７】
ステップの活性状態は前後に接続するトランジションの条件によって変わっていく。すなわち、活性状態のステップに後続するトランジションの条件が成立するとそのステップは非活性状態に変わり、そのトランジションに後続するステップが活性状態に変わる。全体処理の小さな１工程であるステップが、その工程の移行条件であるトランジションで歩進していくことから、「あらかじめ定められた順序または手続きに従って制御の各段階を逐次進めていく制御」（JIS-C0401）であるシーケンス制御に、非常に適した言語であることがいえる。
【０００８】
ステップ、トランジションの接続形態としてステップの下に複数のトランジションを接続することや、トランジションの下に複数のステップを接続することは可能である。図２４に示す、選択分岐、並列分岐がその例である。
【０００９】
図２４は、ＳＦＣで作成されたプログラム（チャート）の一例であり、簡単な例を示す。
【００１０】
図２４に示されているＳＦＣコンポーネントは、図示のS001, S002, S003, S004, S005, S006がステップであり、その中でS001がイニシャルステップに相当する。また、図示のT002_S, T003_S, T002_E, T003_E, T004_E, T005_006_Eがトランジションである。S001からS002およびS003への分岐が選択分岐ａ（どちらか一方のステップが活性）、S004からS005およびS006への分岐が並列分岐ｃ（両方のステップが同時に活性）となる。
【００１１】
すなわち、ステップS001に複数のトランジションT002_S、T003_Sを接続するものが選択分岐（図２４に示すａの部分）であり、S001が活性状態の時、T002_S、T003_Sの状態によってS002, S003のどちらか一方が活性状態に移行する。T002_S、T003_Sが同時に条件成立した場合、左側が優先される（またはどちらが優先かをユーザ等が予め指示しておく）。
【００１２】
この選択分岐が存在する場合、その収束（図２４に示すbの部分）は各分岐ルートの末端のトランジション（T002_E、T003_E）の次に同じステップ（S004）を接続することで実現する。選択分岐の場合、活性状態となるステップは何れか一つの分岐ルート上にしかなく、シーケンスが分岐されている。
【００１３】
尚、コンポーネントの一種として選択分岐ａとその収束ｂがあるものと見做しても構わないし、ステップの次に複数のトランジションが接続されている場合に選択分岐があるものと判定するものであっても構わない。
【００１４】
一方、トランジションT004_Eに複数のステップS005、S006を接続するものが並列分岐（図２４に示すｃの部分）であり、S004が活性状態の時、T004_Eの条件が成立すると、S005、S006が両方とも活性状態になり、その後のシーケンスは両方同時に進んでいく。並列分岐が存在する場合、その収束（図２４に示すdの部分）はそれぞれのルートの末端のステップに、同じトランジション（T005_006_E）を接続することで実現する。
【００１５】
並列分岐の場合、活性状態となるステップは各分岐先に後続するステップとなり、複数のステップが活性状態となり、シーケンスは並行動作する。選択分岐と並列分岐は組み合わせて使用してもよく、図２５（ａ）の例のように選択分岐の一方の分岐ルート上に並列分岐を入れてもよいし、あるいは図２５（ｂ）の例のように並列分岐の各分岐ルート上に選択分岐を入れてもよい。勿論、これらの例に限らない。
【００１６】
尚、図２５（ａ）、（ｂ）は、ＳＦＣプログラムの具体例（その２）（その３）である。
【００１７】
尚、コンポーネントの一種として並列分岐ｃとその収束ｄがあるものと見做しても構わないし、トランジションの次に複数のステップが接続されている場合に並列分岐があるものと判定するものであっても構わない。
【００１８】
尚、図２５（ａ）、（ｂ）に示す例については、特に詳細には説明しないが、簡単に述べるならば、図２５（ａ）ではまず選択分岐ａ（と対応する収束ｂ）があり、その一方の分岐ルート上に選択分岐ｃ（と対応する収束ｄ）があり、他方の分岐ルート上に並列分岐ｅ（と対応する収束ｆ）がある。図２５（ｂ）ではまず並列分岐ｇ（と対応する収束ｈ）があり、その一方の分岐ルート上に選択分岐ｉ（と対応する収束ｊ）があり、他方の分岐ルート上に選択分岐ｋ（と対応する収束ｌ）がある。
【００１９】
尚、図２４、図２５に示すようなＳＦＣのプログラム（図示表現したプログラム）に関する説明では、図示に従った“上下左右”や“前後”で説明する場合もあるものとする。つまり、例えば、図２５（ａ）においてはトランジションT001の“下側”（または“後側”）にステップS002が接続され、選択分岐ａによって“左側”（トランジションT001）と“右側”（トランジションT003）とに分岐する、等の説明となる。
【００２０】
ＳＦＣは制御対象の動作シーケンスとプログラムとの対応が容易に行える利点がある。しかし、作成されたチャート（ＳＦＣプログラム）を定量的に評価することについては十分に配慮されていない。
【００２１】
また、特許文献１には、オブジェクト指向プログラムのソフトウェアメトリクス（品質評価尺度）に関する従来技術が開示されている。
【先行技術文献】
【特許文献】
【００２２】
【特許文献１】特開平１１−３３８６９１号公報
【発明の概要】
【発明が解決しようとする課題】
【００２３】
ソフトウェア・メトリクスは、ソフトウェアの品質を定量的に評価する尺度として、多くの開発現場で利用されてきている。例えば、Cyclomatic（サイクロマチック）複雑度と呼ばれるメトリクスは、プログラムの複雑度を測る目的で、プログラムのソースコードから、プログラムが実行される可能性がある独立した経路の数を数える。その結果、テストカバレッジの一つである分岐網羅率（C1カバレッジ）を100％にするために必要なテストケースの下限値を知ることが可能になる。つまり、サイクロマチック複雑度の高いプログラムはテストケースが多く必要になり、テストに時間がかかることが分かる。また複雑度の高いプログラムは、経験的に不具合の発生率が高いことが知られており、複雑度が高いプログラムを作成することは避けられている。
【００２４】
C/C++、JAVA（登録商標）等のテキスト言語では、前述したようなソフトウェア・メトリクスをソフトウェアの品質の一つと考え、様々な面で計測し、定量的な評価としている。しかしながら、図示言語であるＳＦＣにおいては、品質を定量的に評価するものが存在しないため、個々のプログラムの品質を比べることができない。
【００２５】
ＳＦＣプログラムは、前述したとおり、「ステップ」、「トランジション」等を「リンク」によって結線したものである。これを、チャートの上から順番にステップの活性状態が変わっていく処理フローと捉えると、フローチャートに類似したものと考えることができる。ＳＦＣの選択分岐をフローチャートの分岐ととらえることにより、選択分岐しかないＳＦＣではフローチャートに変換することでサイクロマチック複雑度を計算することが可能である。しかし、ＳＦＣの並列分岐はフローチャートの分岐とは異なる特徴を持つものであるから、これをフローチャートと同様の観点でサイクロマチック複雑度の計算をすることはできない。
【００２６】
また、ＳＦＣは様々なコンポーネントから構成されるものであるが、図示言語であるために品質を定量的に評価するものが存在しないため、個々のプログラム（ここではチャート）の品質を比べることができない。
【００２７】
本発明の課題は、図示言語であるＳＦＣで作成されたプログラムに関して、複雑度を算出することができ、プログラムの品質を客観的に評価できるようにするＳＦＣメトリクス測定装置等を提供することである。
【課題を解決するための手段】
【００２８】
本発明のＳＦＣメトリクス測定装置は、下記の各手段を有する。
・任意のＳＦＣプログラムの開始から終了までの経路の数を求め、又は、該ＳＦＣプログラムにおける種別毎の要素数を計数する計数手段；
・該計数手段により求められた前記経路数又は種別毎の要素数に基づいて、前記ＳＦＣプログラムの複雑度を算出する複雑度演算手段。
【発明の効果】
【００２９】
本発明のＳＦＣメトリクス測定装置等によれば、図示言語であるＳＦＣで作成されたプログラムに関して、複雑度を測定することができ、プログラムの品質を客観的に評価できるようになる。
【図面の簡単な説明】
【００３０】
【図１】実施例１のＳＦＣメトリクス測定装置の構成図である。
【図２】（ａ）は経路数記録部、（ｂ）は内部経路記録部のデータ格納例である。
【図３】（ａ）〜（ｃ）は、各種設定画面例または表示例である。
【図４】実施例１の経路計数部の処理フローチャート図である。
【図５】図４のステップＳ１７の詳細フローチャート図である。
【図６】図４のステップＳ１８の詳細フローチャート図である。
【図７】図２４のＳＦＣ例における経路を示す図である。
【図８】（ａ）、（ｂ）は、図２５（ａ）、（ｂ）のＳＦＣ例における経路を示す図である。
【図９】ＳＦＣプログラムの具体例（その４）である。
【図１０】アクションクオリファイアの具体例を示す図である。
【図１１】実施例２のＳＦＣメトリクス測定装置の構成図である。
【図１２】実施例２の経路計数部の処理フローチャート図である。
【図１３】実施例２におけるＳＦＣコンポーネントカウント処理の詳細フローチャート図である。
【図１４】図１２のステップＳ７２の詳細フローチャート図である。
【図１５】図１２のステップＳ７３の詳細フローチャート図である。
【図１６】実施例２における検出結果例である。
【図１７】実施例２における複雑度係数設定画面例である。
【図１８】実施例３のＳＦＣメトリクス測定装置の構成図である。
【図１９】ＳＦＣプログラムの具体例（その５）である。
【図２０】実施例３におけるＳＦＣコンポーネントカウント処理の詳細フローチャート図である。
【図２１】実施例３における検出結果例である。
【図２２】アクション対応テーブルの具体例である。
【図２３】実施例３における複雑度係数設定画面例である。
【図２４】ＳＦＣプログラムの具体例（その１）である。
【図２５】（ａ）、（ｂ）は、ＳＦＣプログラムの具体例（その２）（その３）である。
【発明を実施するための形態】
【００３１】
以下、図面を参照して本発明の実施の形態について説明する。
以下、まず、実施例１について説明する。
【００３２】
図１に、実施例１のＳＦＣメトリクス測定装置の構成図を示す。
尚、ＳＦＣは、（Sequential Function Chart：シーケンシャル・ファンクション・チャート）の略である。ここでは、ＳＦＣで任意に作成されたプログラムを、ＳＦＣプログラムまたはＳＦＣチャートと記すものとする。
【００３３】
図示の例のＳＦＣメトリクス測定装置１０は、ＳＦＣ格納部１１、経路計数記録部１２、複雑度計算部１３、複雑度表示部１４を有する。
【００３４】
上記経路計数記録部１２は、経路計数部２１、内部経路記録部２２、経路数記録部２３を有する。
【００３５】
上記複雑度計算部１３は、複雑度演算部３１、係数入力部３２を有する。
上記複雑度表示部１４は、複雑度一覧表示部４１、複雑度上限入力部４２を有する。
【００３６】
尚、ＳＦＣメトリクス測定装置１０は、例えばパソコン、サーバ装置等の一般的なコンピュータ装置上で実現される。これより、ＳＦＣメトリクス測定装置１０は、ハードウェア的には、特に図示しないが一般的なコンピュータ装置の構成を有する。つまり、例えば不図示のＣＰＵ等の演算プロセッサ、ハードディスク、メモリ等の記憶部、通信機能部、ディスプレイ等の表示部、キーボード、マウス等の操作入力部などを有する。
【００３７】
上記不図示の記憶部には予め所定のアプリケーションプログラムが記憶されている。上記不図示の演算プロセッサがこのアプリケーションプログラムを実行することで、図１に示す上記各種処理機能部、すなわち上記経路計数記録部１２（その経路計数部２１、内部経路記録部２２、経路数記録部２３）、複雑度計算部１３（その複雑度演算部３１、係数入力部３２）、複雑度表示部１４（その複雑度一覧表示部４１、複雑度上限入力部４２）などの処理機能が実現される。
【００３８】
また、後述する図３（ａ）（ｂ）（ｃ）の各種表示は上記表示部で行われ、これら表示上の入力は上記操作入力部を介して行われる。
【００３９】
図１における上記ＳＦＣ格納部１１は、ＳＦＣプログラムを図示情報として保存するものであり、任意のＳＦＣプログラム（チャート）について、チャート毎にＳＦＣの各種コンポーネント（ステップ、トランジション、分岐（選択分岐や並列分岐）、収束等の各種要素）と、それぞれのコンポーネント間の位置を含めた接続関係が格納されていればよい。
【００４０】
但し、この例に限らず、例えば、図示情報としてではなく、テーブル情報として保存されていてもよい。このテーブル情報は、例えばユーザが手作業で作成してもよいが、この例に限らない。上記図２４で図示表現したＳＦＣプログラムの例であれば、テーブル情報としては例えば下記のようになる。下記のテーブルは、「名称」、「種類」、「次のコンポーネントの名称」の３つのデータ項目から成る。
【００４１】
名称          種類                  次のコンポーネントの名称
S001          ステップ              ａ
ａ            選択分岐              T002_S，T003_S
T002_S        トランジション        S002
S002          ステップ              T002_E
T002_E        トランジション        ｂ
ｂ            選択分岐（収束）      S004
T003_S        トランジション        S003
（以下、省略）
【００４２】
コンポーネント（要素：プログラム構成要素）毎に、その識別情報である「名称」と、ステップ、トランジション等の「種類」と、次のコンポーネント（図示情報では下側に接続されるコンポーネント）の名称が、格納される。分岐の場合には、「次のコンポーネントの名称」は複数あることになる。
【００４３】
経路計数記録部１２は、ＳＦＣ格納部１１に格納されているＳＦＣの各チャートを走査することで、各チャートの経路数を求める。更に、各チャートにおけるＳＦＣコンポーネントの数を、種別毎に計数するようにしてもよい。この処理は、上記経路計数部２１が実行し、処理結果が経路数記録部２３や内部経路記録部２２に記録される。
【００４４】
経路計数部２１は、ＳＦＣ格納部１１に格納されているＳＦＣのチャート毎に、図示情報等を走査し、そのチャートの開始から終了までの経路数を計測（検出）する。これは、例えば、イニシャルステップからチャート終端（又は、イニシャルステップに戻る）までの各経路を探索して経路数を計測（検出）する。また、各チャートにおけるＳＦＣコンポーネントの数を、種別毎に計数するようにしてもよい。
【００４５】
経路計数部２１による上記処理の詳細な具体例を、図４、図５、図６に示し、後に説明するものとする。
【００４６】
内部経路記録部２２は、経路計数部２１の経路探索中に検出したＳＦＣコンポーネントの数を、種別毎に記録するものである。ここでは、具体例として、選択分岐、並列分岐それぞれの数を記録するが、この例に限らない。本例の場合、経路計数部２１は、ＳＦＣのチャート内の経路数を走査する途中で分岐コンポーネント（選択分岐または並列分岐）を検出すると、その数をカウントして内部経路記録部２２に記録しておく。
【００４７】
経路数記録部２３は、経路計数部２１の経路探索中に検出した経路数を、記録するものである。
【００４８】
図２（ａ）に、経路数記録部２３のデータ格納例を示す。
図において、ＳＦＣＮｏ．５１は、各ＳＦＣチャートの識別情報である。検出経路数５２は、ＳＦＣＮｏ．５１のＳＦＣチャートについて上記経路計数部２１による処理を実行した結果として得られた、そのＳＦＣチャートの経路数である。
【００４９】
また、図２（ｂ）に、内部経路記録部２２のデータ格納例を示す。
ここでは、検出対象となるＳＦＣコンポーネントの種別は、選択分岐と並列分岐の２つだけとした例を示すが、この例に限らない。各ＳＦＣコンポーネント種別６１のＳＦＣチャートにおける検出数（要素数）が、検出数６２に記録される。ここでは、図２４の例に応じた数を示す。図２４の例では、選択分岐、並列分岐の両方とも、その数は‘１’であるので、図２（ｂ）に示す結果となる。
【００５０】
尚、図には示していないが、図２（ｂ）において更に上記ＳＦＣＮｏ．５１と同じくＳＦＣＮｏ．があってもよい。この例に限らないが、何れにしても、どのＳＦＣチャートにおける選択分岐または並列分岐の検出数であるのかが、分かるようになっていればよい。
【００５１】
尚、ＳＦＣコンポーネント種別６１＝“選択分岐”に対応する検出数６２の欄には、後述する図５のステップＳ４４の処理による“選択分岐検出数”が記録されることになる。ＳＦＣコンポーネント種別６１＝“並列分岐”に対応する検出数６２の欄には、後述する図６のステップＳ６４の処理による“並列分岐検出数”が記録されることになる。
【００５２】
複雑度計算部１３は、上記経路計数記録部１２によって求められたＳＦＣチャート毎の経路検出数や、各チャート内でのＳＦＣコンポーネント種別毎の検出数を、予め登録されている所定の複雑度計算式に当てはめて、チャート毎の複雑度を計算する。
【００５３】
本例では、この複雑度計算式には、所定の係数（各種の複雑度係数）が含まれるが、この例に限らない。これら各種の複雑度係数の値は、本例では係数入力部３２を介して任意の値が設定される（例えばユーザが設定する）。
【００５４】
係数入力部３２は、複雑度演算部３１による複雑度計算で使用される各複雑度係数（経路数に応じた複雑度係数、あるいはＳＦＣコンポーネントの各種別に応じた各複雑度係数）の値を、ユーザ等に任意に設定させる機能部である。複雑度係数値は‘０’であっても構わない。
【００５５】
図３（ａ）に、係数入力部３２による係数設定画面例を示す。
この係数設定画面例は、下記の複雑度の算出式例（計算式（１））に応じたものであり、図示のように経路数、選択分岐、並列分岐それぞれに関して任意の複雑度係数値を設定させるものである。ここで設定された係数値は、メモリ等に記憶されて、複雑度演算部３１による例えば下記の複雑度計算に利用される。
【００５６】
複雑度演算部３１は、上記経路検出数や種別毎のコンポーネント検出数や複雑度計算式と、上記各種の複雑度係数の値を用いて、複雑度を計算する。例えば、次式のような計算式（１）でＳＦＣの１つのチャートの複雑度を求める。
【００５７】
ＳＦＣの複雑度＝経路数の複雑度係数×ＳＦＣチャート内の経路の検出数
＋選択分岐の複雑度係数×ＳＦＣチャート内の選択分岐の検出数
＋並列分岐の複雑度係数×ＳＦＣチャート内の並列分岐の検出数
・・・計算式（１）
【００５８】
例えば、上記“ＳＦＣチャート内の経路の検出数”は上記検出経路数５２を用い、“ＳＦＣチャート内の選択分岐の検出数”は選択分岐に応じた検出数６２を用い、“ＳＦＣチャート内の並列分岐の検出数”は並列分岐に応じた検出数６２を用いる。
【００５９】
この例では、上記各種の複雑度係数として上記経路数の複雑度係数と選択分岐の複雑度係数と並列分岐の複雑度係数とがあり、上記種別毎のコンポーネント検出数として上記選択分岐の検出数と並列分岐の検出数とがあるが、これは一例であり、この例に限らない。
【００６０】
ここで、例えば、経路数の複雑度係数を‘１’、選択分岐と並列分岐の複雑度係数を両方とも‘０’とすれば、経路数を複雑度として表現することができる。一方、分岐の検出数を複雑度とする場合には、経路数の複雑度係数を‘０’、選択分岐と並列分岐の複雑度係数を両方とも‘１’と設定する。分岐の種別で重み付けを変えて複雑度を算出させることも可能である（例えば、選択分岐の複雑度係数を‘２’、並列分岐の複雑度係数を‘１’とするなど）。
【００６１】
また、上記の通り、上記複雑度の算出式は一例であり、例えば上記複雑度算出式に、ＳＦＣコンポーネントの種類を追加することにより変更してもよい。例えば、経路計数記録部１２が更にステップやトランジションの数をカウントするようにし、係数入力部３２によりステップの複雑度係数やトランジションの複雑度係数を設定させるようにし、これらも用いて複雑度を計算するようにしてもよい。つまり、この例の場合、複雑度の算出式は下記の計算式（２）ようになる。
【００６２】
ＳＦＣの複雑度＝経路数の複雑度係数×ＳＦＣチャート内の経路の検出数
＋選択分岐の複雑度係数×ＳＦＣチャート内の選択分岐の検出数
＋並列分岐の複雑度係数×ＳＦＣチャート内の並列分岐の検出数
＋ステップの複雑度係数×ＳＦＣチャート内のステップの検出数
＋トランジションの複雑度係数×ＳＦＣチャート内のトランジションの検出数          ・・・計算式（２）
【００６３】
複雑度表示部１４は、上記複雑度計算部１３により計算されたチャート毎の複雑度の値を表示する。
【００６４】
複雑度一覧表示部４１は、上記複雑度演算部３１によって算出されたチャート毎の複雑度の値を、例えば一覧で表示する。
【００６５】
図３（ｂ）に、複雑度一覧表示部４１による表示例を示す。
図示の例では、上記複雑度計算部１３による計算対象の各チャートの識別情報であるチャートＮｏ．７１に対応付けて、そのチャートの上記算出された複雑度の値が図示の複雑度７２の欄に表示される。尚、チャートＮｏ．７１は上記ＳＦＣＮｏ．５１と同義と見做して構わない。
【００６６】
また、複雑度一覧表示部４１は、更に、上記各複雑度７２の値を、予め設定されている所定の上限値と比較して、複雑度の値が所定の上限値を超えていた場合、そのことを示す警告を、該当するチャートの例えば複雑度７２の欄内に表示するようにしてもよい。この一例が図示の警告マーク７３である。
【００６７】
上記上限値は、例えば、上記複雑度上限入力部４２を介してユーザにより任意の値が設定されて記憶されているものである。
【００６８】
図３（ｃ）に、複雑度上限入力部４２によって表示・管理される上限値設定画面の一例を示す。この設定画面上でユーザが任意の上限値を設定でき、図示の例では‘１０’が設定されている。
【００６９】
以下、図４、図５、図６に示すフローチャート図について説明する。
図４は、実施例１の経路計数部の処理フローチャート図であり、本例のＳＦＣプログラム経路数判別処理のフローチャート図である。
【００７０】
図５は、図４のステップＳ１７の処理の詳細フローチャート図である。
図６は、図４のステップＳ１８の処理の詳細フローチャート図である。
【００７１】
図４の処理では、まず、変数“経路数”に初期値（＝１）を設定し（ステップＳ１１）、走査開始位置（最上位）をセットして（ステップＳ１２）、ステップＳ１３以降の処理を開始する。つまり、概略的には、処理対象のＳＦＣプログラムを最上位（の位置にあるイニシャルステップ）から順次走査して、ＳＦＣプログラムの各ＳＦＣコンポーネントを順次処理対象としてステップＳ１４〜Ｓ２０の処理を実行し、全てのＳＦＣコンポーネントについて処理実行したら（次のＳＦＣコンポーネントが無くなったら；ステップＳ１３，ＮＯ）ステップＳ２１を実行して本処理を終了する。
【００７２】
次のＳＦＣコンポーネントがあるならば（ステップＳ１３，ＹＥＳ）、このＳＦＣコンポーネントを取得して（ステップＳ１４）、その種別を判別する（ステップＳ１５）。ＳＦＣコンポーネントの種別は、上記の通り、ステップ、トランジション、選択分岐、並列分岐、これらの収束などである。そして、処理対象のＳＦＣコンポーネントの種別が分岐以外であるならば（ステップＳ１５，ＮＯ）、ステップＳ２０へ移行する。ステップＳ２０では走査対象を次の（下側の）ＳＦＣコンポーネントへ移動させる。そして、ステップＳ１３へ戻る。
【００７３】
一方、処理対象のＳＦＣコンポーネントの種別が分岐であるならば（ステップＳ１５，ＹＥＳ）、選択分岐であれば（ステップＳ１６，ＹＥＳ）ステップＳ１７の処理を実行し、並列分岐であれば（ステップＳ１６，ＮＯ）ステップＳ１８の処理を実行する。ステップＳ１７の詳細処理例が図５に示す処理であり、ステップＳ１８の詳細処理例が図６に示す処理である。
【００７４】
そして、上記ステップＳ１７，Ｓ１８の何れかの処理結果（戻り値；検出経路数）に基づいて、経路数を以下の式により更新する（ステップＳ１９）。
【００７５】
経路数  ＝  経路数（現経路数）×検出経路数
尚、経路数の初期値は、本例では上記の通り‘１’である。
【００７６】
上記ステップＳ１９の処理を実行したら、上記ステップＳ２０の処理を実行してステップＳ１３へ戻る。
【００７７】
ここで、ステップＳ１７、Ｓ１８の処理については後に図５、図６で説明するが、上記図２４の例の場合、まずステップＳ１７が実行されて戻り値が‘２’となり、この時点では経路数は初期値の‘１’なので、経路数＝１×２＝２となる。次にステップＳ１８が実行されて戻り値は‘１’となり、現時点の経路数は‘２’であるので、経路数＝２×１＝２となる。
【００７８】
図２４の例では、その後は選択分岐も並列分岐もないまま最後のＳＦＣコンポーネントである図示のトランジションT005_006_Eを処理対象とする処理実行後、ステップＳ１３がＮＯとなり、現在の（最終的な）経路数を戻り値にセットして（ステップＳ２１）本処理を終了することになる。上記の通り、最終的な経路数は‘２’であるので、戻り値（検出経路数）は‘２’となり、これは、図７に示すように正しい結果が得られたことになる。
【００７９】
図２４のＳＦＣチャートの例の場合には、図７に示すように、チャート前半の選択分岐ａによる経路が２通り、チャート後半の並列分岐ｃによる経路は１つとなるので、チャート全体での経路数は２となる。
【００８０】
次に、以下、図５、図６について説明する。まず、図５について説明する。
図５に示す上記ステップＳ１７の処理の詳細例では、まず、当該処理対象の選択分岐内の分岐数を取得する（ステップＳ３１）。これは、例えば上記テーブル構成の例であれば、当該選択分岐に対応する上記“次のコンポーネントの名称”に格納される名称の数をカウントすればよい。
【００８１】
次に、分岐走査カウンタを初期化（＝０）すると共に、変数“分岐毎の内部経路検出数”に初期値（＝１）をセットする（ステップＳ３２）。ここで、変数“分岐毎の内部経路検出数”は、上記ステップＳ３１で得た分岐数の分だけ用意する。ここでは、この様な各変数を、α、β等で表現するものとすると、仮に分岐数＝３であったならば、変数α、β、γを用意すると共に、これら複数の変数全てに初期値（＝１）をセットする（α＝１、β＝１、γ＝１）。
【００８２】
但し、本説明においては、具体例として、分岐数は２であるものとし（図２４、図２５の例のように、左側と右側とに分岐）、これより、上記変数“分岐毎の内部経路検出数”として変数αと変数βの２つが用意され、各々に初期値（＝１）がセットされるものとして説明する。尚、左側の分岐に対しては変数α、右側の分岐に対しては変数βが、割り当てられるものとする。これは、後述する図６の処理（並列分岐）においても同様とするが、並列分岐の場合は変数γ、δとするものとする。
【００８３】
上記ステップＳ３２の処理を実行したら、まず、最初の処理対象の分岐（最も左の分岐）を走査先にセットして（ステップＳ３３）、処理対象の分岐上の先頭から順次ＳＦＣコンポーネントを走査して、これら各ＳＦＣコンポーネントの種別に応じて処理を分岐させる（ステップＳ３４）。
【００８４】
すなわち、まず、対象のＳＦＣコンポーネントの種別が分岐・収束以外であれば、走査対象を次の（下側の）ＳＦＣコンポーネントへ移動させて（ステップＳ３９）ステップＳ３４に戻る。
【００８５】
また、対象のＳＦＣコンポーネントの種別が分岐であれば、ステップＳ３５〜Ｓ３８の処理を実行する。
【００８６】
これは、分岐の種類が選択分岐である場合には（ステップＳ３５，ＹＥＳ）ステップＳ３６の処理を実行し、分岐の種類が並列分岐である場合には（ステップＳ３５，ＮＯ）ステップＳ３７の処理を実行する。そして、ステップＳ３６，Ｓ３７の何れかの処理を実行後、ステップＳ３８の処理を実行する。
【００８７】
ステップＳ３６の処理は上記ステップＳ１７の処理と同じであり、従って図５の処理を行うことになる。上記ステップＳ３６の処理（図５の処理）の終了時の後述するステップＳ４７の処理により戻り値（検出経路数）が得られるので、この戻り値を該当する（処理対象の分岐に応じた）上記“分岐毎の内部経路検出数”にセットする（ステップＳ３８）。
【００８８】
一方、ステップＳ３７の処理は上記ステップＳ１８の処理と同じであり、従って図６の処理を行うことになる。上記ステップＳ３７の処理（図６の処理）の終了時の後述するステップＳ６７の処理により戻り値（検出経路数）が得られるので、この戻り値を該当する（処理対象の分岐に応じた）上記“分岐毎の内部経路検出数”にセットする（ステップＳ３８）。
【００８９】
例えば図２５（ａ）の例の場合、まず図示の選択分岐ａに応じてステップＳ１７の処理が開始され、このステップＳ１７の処理中であって選択分岐ａの左側分岐に係わる処理中に（よって該当する変数は変数α）入れ子の分岐（図示の選択分岐ｃ）があることから、選択分岐ｃに応じたステップＳ３６の処理が実行されることになる。この場合、ステップＳ３６の処理による戻り値（検出経路数）は‘２’となるので、ステップＳ３８で変数αに‘２’がセットされることになる。
【００９０】
また、図２５（ａ）の例の場合、ステップＳ１７の処理中であって選択分岐ａの右側分岐に係わる処理中に（よって該当する変数は変数β）入れ子の分岐（図示の並列分岐ｅ）があることから、並列分岐ｅに応じたステップＳ３７の処理（図６の処理）が実行されることになる。この場合、ステップＳ３７の処理による戻り値（検出経路数）は‘１’となるので、ステップＳ３８で変数βに‘１’がセットされることになる。
【００９１】
この例の場合、最終的に、変数αは‘２’、変数βは‘１’となるので、後述するステップＳ４５で総和を求めると２＋１＝３となり、ステップＳ４７による戻り値は‘３’となり、従って上記ステップＳ１９で経路数＝３となる。
【００９２】
また、ステップＳ３４において処理対象のＳＦＣコンポーネントの種別が“収束”であると判定された場合には、この収束が選択の収束であることを確認し（ステップＳ４０）、もし並列の収束である場合には（ステップＳ４０，ＮＯ）、ＳＦＣ異常終了とする（ステップＳ４６）。図５の処理は選択分岐に応じて開始されるので、その収束は選択でなければならず、もし並列の収束であるならば、対象のプログラム自体に異常（記述ミスなど）があることになるからである。
【００９３】
選択の収束であるならば（ステップＳ４０，ＹＥＳ）、上記分岐走査カウンタを＋１インクリメントして（ステップＳ４１）、このカウンタ値が上記分岐数に達したか否かをチェックする（分岐走査カウンタ＜分岐数？）（ステップＳ４２）。カウンタ値が分岐数未満である場合には（ステップＳ４２，ＹＥＳ）未処理の分岐があることになるので、次の分岐を走査先にセットして（ステップＳ４３）ステップＳ３４に戻る。そして、次の処理対象の分岐に関しても、上記と同様に、“収束”が検出されるまでステップＳ３４〜Ｓ３８またはＳ３９の処理を繰り返し実行し、“収束”が検出されたらステップＳ４０の処理へ移行する。
【００９４】
本例では分岐数が‘２’であり（左側と右側）、左側の分岐に係わる処理実行完了してステップＳ４１でカウンタ値＝１に更新した後、処理対象を右側の分岐にして、右側の分岐に係わる処理実行完了してステップＳ４１でカウンタ値＝２に更新すると、ステップＳ４２の判定がＮＯとなり（分岐走査カウンタ＝分岐数）、ステップＳ４４へ移行する。
【００９５】
ステップＳ４４では、変数“選択分岐検出数”を＋１インクリメントする。
ここで、説明していなかったが、変数“選択分岐検出数”は、処理対象のＳＦＣプログラム全体における“選択分岐”の数をカウントする為の変数である。つまり、上記変数“分岐毎の内部経路検出数”とは異なるものである。この変数“選択分岐検出数”は、例えば図４の処理開始の際に初期値＝０が設定されている。そして、図５の処理が実行される毎に＋１インクリメントされる。
【００９６】
そして、最後に、全ての“分岐毎の内部経路検出数”の「総和」を求めて、この「総和」を戻り値（検出経路数）にセットして（ステップＳ４５）本処理を正常終了する（ステップＳ４７）。この戻り値（検出経路数）を用いて上記ステップＳ１９の処理が実行されることになる。
尚、上記の通り、本例では「総和」＝変数α＋変数βとなる。
【００９７】
次に、以下、図６について説明する。
図６に示す上記ステップＳ１８の処理の詳細例では、まず、当該処理対象の並列分岐内の分岐数を取得する（ステップＳ５１）。
【００９８】
次に、分岐走査カウンタを初期化（＝０）すると共に、変数“分岐毎の内部経路検出数”に初期値（＝１）をセットする（ステップＳ５２）。図５で説明したように、本説明においては、分岐数は２であるものとし、これより、上記変数“分岐毎の内部経路検出数”として変数γと変数δの２つが用意され、各々に初期値（＝１）がセットされるものとして説明する。尚、左側の分岐に対しては変数γ、右側の分岐に対しては変数δが、割り当てられるものとする。
【００９９】
上記ステップＳ５２の処理を実行したら、まず、最初の処理対象の分岐（最も左の分岐）をセットして（ステップＳ５３）、処理対象の分岐上の先頭から順次ＳＦＣコンポーネントを走査して、これら各ＳＦＣコンポーネントの種別に応じて処理を分岐させる（ステップＳ５４）。
【０１００】
すなわち、まず、対象のＳＦＣコンポーネントの種別が分岐・収束以外であれば、走査対象を次の（下側の）ＳＦＣコンポーネントへ移動させて（ステップＳ５９）ステップＳ５４に戻る。
【０１０１】
また、対象のＳＦＣコンポーネントの種別が分岐であれば、ステップＳ５５〜Ｓ５８の処理を実行する。
【０１０２】
これは、分岐の種類が選択分岐である場合には（ステップＳ５５，ＹＥＳ）ステップＳ５６の処理を実行し、分岐の種類が並列分岐である場合には（ステップＳ５５，ＮＯ）ステップＳ５７の処理を実行する。そして、ステップＳ５６，Ｓ５７の何れかの処理を実行後、ステップＳ５８の処理を実行する。
【０１０３】
ステップＳ５６の処理は上記ステップＳ１７の処理と同じであり、従って図５の処理を行うことになる。ステップＳ５６の処理（図５の処理）の終了時の上記ステップＳ４７の処理により戻り値（検出経路数）が得られるので、この戻り値を該当する（処理対象の分岐に応じた）上記“分岐毎の内部経路検出数”にセットする（ステップＳ５８）。
【０１０４】
一方、ステップＳ５７の処理は上記ステップＳ１８の処理と同じであり、従って図６の処理を行うことになる。ステップＳ５７の処理（図６の処理）の終了時の後述するステップＳ６７の処理により戻り値（検出経路数）が得られるので、この戻り値を該当する上記“分岐毎の内部経路検出数”にセットする（ステップＳ５８）。
【０１０５】
例えば図２５（ｂ）の例の場合、まず図示の並列分岐ｇに応じてステップＳ１８の処理が開始され、このステップＳ１８の処理中であって並列分岐ｇの左側分岐に係わる処理中に（よって該当する変数は変数γ））入れ子の分岐（図示の選択分岐ｉ）があることから、選択分岐ｉに応じたステップＳ５６の処理が実行されることになる。この場合、ステップＳ５６の処理による戻り値（検出経路数）は‘２’となるので、ステップＳ５８で変数γに‘２’がセットされることになる。
【０１０６】
また、図２５（ｂ）の例の場合、ステップＳ１８の処理中であって並列分岐ｇの右側分岐に係わる処理中に（よって該当する変数は変数δ）入れ子の分岐（図示の選択分岐ｋ）があることから、選択分岐ｋに応じたステップＳ５６の処理（図５の処理）が実行されることになる。この場合、ステップＳ５６の処理による戻り値（検出経路数）は‘２’となるので、ステップＳ５８で変数δに‘２’がセットされることになる。
【０１０７】
この例の場合、最終的に、変数γは‘２’、変数δは‘２’となるので、後述するステップＳ６５で後述する「積」を求めると２×２＝４となり、ステップＳ６７による戻り値は‘４’となり、従って上記ステップＳ１９で経路数＝４となる。
【０１０８】
また、ステップＳ５４において処理対象のＳＦＣコンポーネントの種別が“収束”であると判定された場合には、この収束が並列の収束であることを確認し（ステップＳ６０）、もし選択の収束である場合には（ステップＳ６０，ＮＯ）、ＳＦＣ異常終了とする（ステップＳ６６）。図６の処理は並列分岐に応じて開始されるので、その収束は並列でなければならず、もし選択の収束であるならば、対象のプログラム自体に異常（記述ミスなど）があることになるからである。
【０１０９】
並列の収束であるならば（ステップＳ６０，ＹＥＳ）、上記分岐走査カウンタを＋１インクリメントして（ステップＳ６１）、このカウンタ値が上記分岐数に達したか否かをチェックする（分岐走査カウンタ＜分岐数？）（ステップＳ６２）。カウンタ値が分岐数未満である場合には（ステップＳ６２，ＹＥＳ）未処理の分岐があることになるので、次の分岐を走査先にセットして（ステップＳ６３）ステップＳ５４に戻る。そして、次の処理対象の分岐に関しても、上記と同様に、“収束”が検出されるまでステップＳ５４〜Ｓ５８またはＳ５９の処理を繰り返し実行し、“収束”が検出されたらステップＳ６０の処理へ移行する。
【０１１０】
本例では分岐数が‘２’であり（左側と右側）、左側の分岐に係わる処理実行完了してステップＳ６１でカウンタ値＝１に更新した後、処理対象を右側の分岐にして、右側の分岐に係わる処理実行完了してステップＳ６１でカウンタ値＝２に更新すると、ステップＳ６２の判定がＮＯとなり、ステップＳ６４へ移行する。
【０１１１】
ステップＳ６４では、変数“並列分岐検出数”を＋１インクリメントする。
ここで、説明していなかったが、変数“並列分岐検出数”は、処理対象のＳＦＣプログラム全体における“並列分岐”の数をカウントする為の変数である。つまり、上記変数“分岐毎の内部経路検出数”や変数“選択分岐検出数”とは異なるものである。この変数“並列分岐検出数”は、例えば図４の処理開始の際に初期値＝０が設定されている。そして、図６の処理が実行される毎に＋１インクリメントされる。
【０１１２】
そして、最後に、全ての“分岐毎の内部経路検出数”の「積」を求めて、この「積」を戻り値（検出経路数）にセットして（ステップＳ６５）本処理を正常終了する（ステップＳ６７）。この戻り値を用いて上記ステップＳ１９の処理が実行されることになる。
【０１１３】
尚、上記の通り、本例では「積」＝変数γ×変数δとなる。
図２４のＳＦＣチャートの例の場合には、図７に示すように、チャート前半の選択分岐ａによる経路が２通り、チャート後半の並列分岐ｃによる経路は１つとなるので、チャート全体での経路数は２となる。
【０１１４】
これに対して、上述した処理によって得られる経路数も‘２’となるので、正しい結果が得られることになる。すなわち、図２４の例の場合、まず選択分岐ａによりステップＳ１６がＹＥＳとなってステップＳ１７（図５）の処理が実行されると、当該選択分岐ａの中には入れ子の分岐は存在しないのでステップＳ３６、Ｓ３７の処理が実行されることなく、従って上記変数α、βは初期値（＝１）のままとなるので、これらの総和は‘２’となる。従って、ステップＳ１７の戻り値（検出経路数）は‘２’となるので、ステップＳ１９で経路数＝１×２＝２となる。尚、選択分岐ａの中とは、選択分岐ａとその収束ｂとの間を意味する。
【０１１５】
図２４の例の場合、続いて、並列分岐ｃによりステップＳ１６がＮＯとなってステップＳ１８（図６）の処理が実行されると、当該並列分岐ｃの中には入れ子の分岐は存在しないのでステップＳ５６、Ｓ５７の処理が実行されることなく、従って上記変数γ、δは初期値（＝１）のままとなるので、これらの積は‘１’となる。従って、ステップＳ１８の戻り値（検出経路数）は‘１’となるので、ステップＳ１９で経路数＝２×１＝２となって、この‘２’がステップＳ２１で戻り値にセットされることになる。従って、経路数＝２が計測されることになる。
【０１１６】
また、上記図２５（ａ）、（ｂ）に示すＳＦＣプログラムの例の場合には、上記処理により検出される経路数は、図８（ａ）、（ｂ）に示す通りとなる。
【０１１７】
まず、図２５（ａ）の例の場合には、図８（ａ）に示すように、まず、最上段の選択分岐ａによる経路は２通りであり、その左側分岐経路内において選択分岐ｃにより２通りの経路があり、結果として、T001からT002に至る左側の経路は２通りとなる。一方、T003からT006に至る右側の経路は、並列分岐のため経路は１つとなる。
【０１１８】
以上から、このチャートの経路数は図８（ａ）に示す通り‘３’となる。これに対して、上述した処理によって計測される経路数も‘３’となるので、正しい計測結果が得られることになる。
【０１１９】
図２５（ｂ）の例の場合には、図８（ｂ）に示すように、まず、最上段の並列分岐ｇによる経路は１つであるが、その内部の左側分岐経路内に選択分岐ｉがあり、この経路が２通りとなる。一方、右側分岐経路も選択分岐ｋがあるので、同様に経路が２通りとなる。これらの左右の経路は同時活性するため、同時活性となる経路の組合せは２×２＝４通りとなる。
【０１２０】
以上から、このチャートの経路数は図８（ｂ）に示す通り‘４’となる。これに対して、上述した処理によって計測される経路数も‘４’となるので、正しい計測結果が得られることになる。
【０１２１】
尚、上記“チャートの経路数”や“上述した処理によって計測される経路数”は、対象のＳＦＣプログラムの開始から終了までのルートの数（開始から終了に至るまでに取り得るルートの数）である。但し、ここでは、上記並列分岐のようにルートが複数あってもシーケンスが並行動作する場合には、並列分岐に係わる経路数は‘１’とするものと定義している。
【０１２２】
（発明の効果）
本発明により、図示表現プログラムであるＳＦＣにおいても、プログラムの品質を客観的に評価することが可能となる。
【０１２３】
本手法では、対象となるＳＦＣチャートの経路数を求める。または／及び、対象となるＳＦＣチャート中に含まれるＳＦＣコンポーネント（種別が、ステップ/トランジション/分岐/収束、等）の数を、種別毎にカウントする。そして、経路数または種別毎のコンポーネント数の何れか一方、あるいは経路数と種別毎のコンポーネント数の両方を用いて、ＳＦＣチャートの複雑度を算出する。これは、例えば上述したように、経路数、各種コンポーネントそれぞれに対応する任意の係数を、それぞれ、経路数、種別毎のコンポーネント数に乗じたうえで、総和を求めることで、複雑度を算出する。係数は‘０’であってもよい。仮に、各種コンポーネントに対応する係数を全て‘０’にしたならば、複雑度は、経路数のみを用いて算出されることになる。
【０１２４】
上記ＳＦＣ複雑度をチャート毎に計算し、その結果を一覧表等に表示する。更に、設定された上限値を超えた場合、強調表示する等の評価を加えた表示を行うことにより、ＳＦＣプログラムの複雑度評価結果をユーザが把握し易くできるようにしてもよい。
【０１２５】
このように、本発明によれば、図示言語であるＳＦＣで作成されたプログラムについて、複雑度を定義し測定することができ、プログラムの品質を客観的に評価することができる。
【０１２６】
尚、本説明において“／”は基本的には“または”“あるいは”の意味であり（数式は除く）、例えば、「または／及び」は、「または、あるいは、及び」を意味する。
【０１２７】
また、尚、上記経路計数記録部１２は、例えば、任意のＳＦＣプログラムの開始から終了までの経路の数を求め、または／及び、該ＳＦＣプログラムにおける種別毎の要素数を計数する計数部であると言える。種別毎の要素数の一例が、上述した種別毎のコンポーネント検出数であり、上述した一例ではＳＦＣチャート内の選択分岐の検出数、ＳＦＣチャート内の並列分岐の検出数等であるが、これらの例に限らない。
【０１２８】
上記複雑度計算部１３は、この計数部により求められた上記経路数または／及び種別毎の要素数に基づいて、上記ＳＦＣプログラムの複雑度を算出する機能部であると言える。
【０１２９】
また、上記図５の処理（選択分岐内経路数検出処理）は、例えば、該選択分岐内の分岐毎に、その分岐上に更に選択分岐または並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数（一例が上記変数α、βの最終値）を求めて、全ての分岐の分岐経路数の総和を、該選択分岐内の経路数とする処理であると言うこともできる。
【０１３０】
また、上記図６の処理（並列分岐内経路数検出処理）は、例えば、該並列分岐内の分岐毎に、その分岐上に更に選択分岐または並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数（一例が上記変数γ、δの最終値）を求めて、全ての分岐の前記分岐経路数の積を、該並列分岐内の経路数とする処理であると言うこともできる。
【０１３１】
また、上記図４の処理は、例えば、対象のＳＦＣプログラムの開始から走査して各要素を検出し、選択分岐または並列分岐を検出すると、該検出した選択分岐内の経路数を求める処理（一例が図５の処理）または該検出した並列分岐内の経路数を求める処理（一例が図６の処理）を実行する処理であると言うこともできる。
【０１３２】
更に、上記図４の処理は、例えば、経路数の初期値を１とした後、上記検出した選択分岐内の経路数を求める処理または前記検出した並列分岐内の経路数を求める処理が実行される毎に、実行結果として得られる値（上記検出経路数）を現在の上記経路数の値に乗じることで経路数の値を更新し（一例が上記ステップＳ１９の処理）、最終的な経路数の値を、上記対象のＳＦＣプログラムの開始から終了までの経路の数とする処理であると言うこともできる。
以上、実施例１について説明した。
【０１３３】
以下、実施例２について説明する。
実施例２は、アクションまで含めた複雑度の評価を可能とする実施例である。
ここで、「アクション」については従来技術で簡単に説明したが、ここでは具体例を示して更に詳細に説明する。
【０１３４】
「アクション」については従来技術で簡単に説明したように、任意のステップに連結される場合があり、アクションクオリファイア種別などの情報が含まれる。アクションクオリファイア種別は、例えば１１種類存在する（N/S/R/L/D/P/SD/DS/SL/P1/P0,ヌルクオリファイア含まず）。各「アクション」は、これらのうち１つのアクションクオリファイア種別を有する。
【０１３５】
図９は、ＳＦＣプログラムの具体例（その４）である。
図１０は、アクションクオリファイア種別の具体例を示す図である。
【０１３６】
図９は、ＳＦＣで作成されたプログラム（チャート）の一例であり、アクションも記述された例である。この例では、アクションの記述以外は（各ステップ、各トランジション、分岐・収束の構成は）、上記図２４に示す例と同一であり、その説明は省略する。
【０１３７】
そして、図９の例では、ステップS001、S004にはそれぞれ一つのアクションが連結され、ステップS006には二つのアクションが連結されている。
【０１３８】
上記従来技術で説明したように、「アクション」（アクションブロック）は、連結しているステップが活性になった時の動作を表すものであり、各ステップに０個以上のアクションブロックが連結される。換言すれば、アクションブロックが連結されないステップも存在する。
【０１３９】
上述したように、アクションブロックは、アクションクオリファイア種別やアクション名や、アクションの内容（言語種別、変数名／処理名、TIME型の持続時間など）等の所定の情報群からなる。尚、変数名は例えばBOOL型の識別子であり、処理名はステップ活性化中に動作するプログラム（予め任意に作成されている）のプログラム名などである。持続時間は、時間設定が必要なアクションクオリファイア種別（L/D/SD/DS/SL）である場合に設定され、それ以外のアクションクオリファイア種別の場合には未設定で時間‘０’の扱いとなる。
【０１４０】
図９では、各アクションに関して、アクションクオリファイア種別とアクション名を示してあり、更に場合によって持続時間（設定時間）も示している。
【０１４１】
図９の例では、ステップS001に連結されるアクションは、アクションクオリファイア種別が“Ｓ”でアクション名が“ACT001”のアクションである。また、ステップS004に連結されるアクションは、アクションクオリファイアが“ＤＳ”でアクション名が“ACT002”で設定時間が５秒のアクションである。また、ステップS006には、アクションクオリファイアが“Ｒ”でアクション名が“ACT001”のアクションと、アクションクオリファイアが“Ｒ”でアクション名が“ACT002”のアクションが、連結されている。
【０１４２】
尚、ここでは、アクション名は変数名（BOOL型変数名）と同じになっているものとする。これより、図９の例では、各アクションにはACT001またはACT002というBOOL型の変数が設定されている。また、ステップS004に連結されているアクション（ACT002）は、持続時間の設定を必要としているアクションクオリファイアであり、設定時間として５秒が設定されている。各アクションは、連結しているステップが活性状態の時のみ、定義された内容に基づいて動作する。
【０１４３】
ステップS001が活性状態に移行すると、S001のアクションとしてBOOL型変数ACT001に対するＳ（セット（保持））動作が行われる。具体的にはACT001がTRUE（=1）となる。シーケンスが進み、ステップS004が活性状態に移行すると、S004のアクションとしてACT002に対するDS（遅延後保持）動作が行われ、S004が活性となった時点から５秒後にACT002がTRUE（=1）となる。更にシーケンスが進み、S006が活性状態に移行すると、S006のアクションとしてACT001およびACT002に対するR（リセット）動作が行われ、これよりACT001、ACT002は両方ともFALSE（=0）となる。
【０１４４】
このように、セット動作後の状態が保持されるアクションに対しては、通常は、保持された状態をリセットする為のリセット動作が用意される。つまり、通常は、任意の同一のアクション名（変数名）に対して、セットのアクションとリセットのアクションとがペアになって記述されている。図９の例では、ステップS001に連結される“Ｓ”で“ACT001”のアクションと、ステップS006に連結される“Ｒ”で“ACT001”のアクションとが、ペアになっている。同じく、ステップS004に連結される“ＤＳ”で“ACT002”のアクションと、ステップS006に連結される“Ｒ”で“ACT002”のアクションとが、ペアになっている。
【０１４５】
通常は、上記のようにペアになっているが、ペアになっていない場合も起こり得る。これは、何等かの理由があって意図的に行っている場合もあるが、単純に、記述ミスである場合も少なくない。後述する実施例３では、この様にペアになっていない記述を検出することもできる。
【０１４６】
尚、上記１１種類のアクションクオリファイア（N/S/R/L/D/P/SD/DS/SL/P1/P0）の意味は、図１０に示す通りであり、以下、簡単に説明する。
【０１４７】
Ｎは“非保持”、Ｒは“リセット（優先）”、Ｓは“セット（保持）”、Ｌは“時間限定”、“Ｄ”は時間遅延、Ｐは“パルス”、ＳＤは“保持後遅延”、ＤＳは“遅延後保持”、ＳＬは“保持後時間限定”、Ｐ１は“パルス（立ち上がりエッジ）”、Ｐ２は“パルス（立ち下がりエッジ）”を意味するが、これらについて特に詳細には説明しない。尚、１１種類の何れも付与されない場合は、非保持（ヌルクオリファイア）を意味する。
【０１４８】
ここで、これら１１種類のうちの特定の５種類（L/D/SD/DS/SL）が、時間設定が必要なアクションクオリファイアであり、アクションクオリファイアがこれら５種類の何れかであるアクションブロックでは、上記の通り持続時間が設定される。
【０１４９】
「アクションブロック」には、例えば以下に列挙する各種情報（管理情報）が、含まれている。
・アクション設定情報
・アクション名
・アクションクオリファイア
・アクションボディ（アクションの内容；以下の（ａ）、（ｂ）、（ｃ）の内容を含む）
（ａ）アクション言語種別（（変数/IL/ST/FBD/SFC/複数言語の複合）のどれかを示す数値／記号など）
（ｂ）アクション（ブール型変数名、又は、アクション処理として呼び出す処理名）
（ｃ）時間（遅延時間などの設定内容）
少なくともこれらの情報がアクション毎に設定されているものとする。
【０１５０】
また、尚、ここでは、アクション言語種別が「変数」である場合、アクション名とアクションボディ内のアクションに設定されるブール変数名は同じとする。
【０１５１】
図１１に、実施例２のＳＦＣメトリクス測定装置の構成図を示す。
図示の例のＳＦＣメトリクス測定装置８０は、ＳＦＣ格納部８１、経路計数記録部８２、複雑度計算部８３、複雑度表示部８４を有する。
【０１５２】
上記経路計数記録部８２は、経路計数部９１、内部経路記録部９２、経路数記録部９３を有する。
【０１５３】
上記複雑度計算部８３は、複雑度演算部１０１、係数入力部１０２を有する。
上記複雑度表示部８４は、複雑度一覧表示部１１１、複雑度上限入力部１１２を有する。
【０１５４】
尚、ＳＦＣメトリクス測定装置８０や後述するＳＦＣメトリクス測定装置１５０は、例えばパソコン、サーバ装置等の一般的なコンピュータ装置上で実現される。これより、ＳＦＣメトリクス測定装置８０，１５０等は、ハードウェア的には、特に図示しないが一般的なコンピュータ装置の構成を有する。つまり、例えば不図示のＣＰＵ等の演算プロセッサ、ハードディスク、メモリ等の記憶部、通信機能部、ディスプレイ等の表示部、キーボード、マウス等の操作入力部などを有する。
【０１５５】
上記不図示の記憶部には予め所定のアプリケーションプログラムが記憶されている。上記不図示の演算プロセッサがこのアプリケーションプログラムを実行することで、図１１に示す上記各種処理機能部８１，８２，８３，８４，９１，９２，９３，１０１，１０２，１１１，１１２などの処理機能が実現される。これは後述する図１８に示すＳＦＣメトリクス測定装置１５０の各種処理機能についても同様である。
【０１５６】
図１１における上記ＳＦＣ格納部８１や後述する図１８におけるＳＦＣ格納部１５１は、ＳＦＣプログラムを図示情報として保存するものであり、任意のＳＦＣプログラム（チャート）について、チャート毎にＳＦＣの各種コンポーネント（ステップ、トランジション、分岐（選択分岐や並列分岐）、収束、アクション等の各種要素）と、それぞれのコンポーネント間の位置を含めた接続関係が格納されていればよい。
【０１５７】
但し、この例に限らず、特に具体例などは示さないが例えばＳＦＣ格納部１１に関して説明したように、図示情報としてではなくテーブル情報としてＳＦＣプログラムが保存されていてもよい。尚、この場合、各「アクションブロック」にはユニークな識別情報が付与されており、ステップには自己に連結している「アクションブロック」の識別情報が含まれているものとしてもよいが、この例に限らない。
【０１５８】
経路計数記録部８２は、ＳＦＣ格納部８１に格納されているＳＦＣの各チャートを走査することで、各チャートの経路数を求める。更に、各チャートにおけるＳＦＣコンポーネントの数を、種別毎に計数する。種別毎とは、例えば、ステップ、トランジション、選択分岐、並列分岐、アクション等である。更に、アクションに関して更に詳細に分類して（例えばアクションクオリファイアの種別毎、アクション言語種別毎など）計数してもよい。この処理は、上記経路計数部９１が実行し、処理結果が経路数記録部９３や内部経路記録部９２に記録される。
【０１５９】
経路計数部９１は、ＳＦＣ格納部８１に格納されているＳＦＣのチャート毎に、図示情報等を走査し、そのチャートの開始から終了までの経路数を計測（検出）する。これは、例えば、イニシャルステップからチャート終端（又は、イニシャルステップに戻る）までの各経路を探索して経路数を計測（検出）する。当該経路数の検出自体は、上記経路計数部２１と同じであってよく、ここでは特に説明しない。
【０１６０】
また、経路計数部９１は、チャート内に出現するＳＦＣコンポーネントの数を、種別毎に計数する。当該各ＳＦＣコンポーネントの種別毎の計数は、例えば、分岐の検出の他、ステップ、トランジション、アクションについてそれぞれ検出するものであり、アクションの検出以外は、上記経路計数部２１と略同様と見做しても構わない。
【０１６１】
アクションの検出には、例えば、アクションクオリファイアの種別毎の検出、アクション処理の言語種別毎の検出等が、含まれてもよい。
【０１６２】
経路計数部２１による上記処理の詳細な具体例を、図１２、図１３、図１４、図１５に示し、後に説明するものとする。
【０１６３】
内部経路記録部９２は、経路計数部９１が経路探索中に検出したＳＦＣコンポーネントの数を、種別毎に記録するものである。例えば、分岐の検出数の他、ステップ、トランジション、アクションの検出数、アクションにおけるアクションクオリファイアの種別毎の検出数、アクション処理の言語種別毎の検出数が、記録される（一例を図１６に示し後に説明する）。
【０１６４】
経路数記録部９３は、経路計数部９１の経路探索中に検出した経路数を、記録するものである。これは、上記経路数記録部２３と略同様に、ＳＦＣのチャート内の経路数を走査する途中で分岐コンポーネントを検出した場合、経路情報としてその数を記録しておくものである。尚、図９のＳＦＣチャートの例では、アクションを除く構成は図２４と同様であるので、検出される経路数も同じく‘２’となる。
【０１６５】
複雑度計算部８３は、上記経路計数記録部８２によって求められたＳＦＣチャート毎の経路検出数や、各チャート内でのＳＦＣコンポーネント種別毎の検出数を、予め登録されている所定の複雑度計算式に当てはめて、チャート毎の複雑度を計算する。
【０１６６】
本例では、この複雑度計算式には、各種の複雑度係数が含まれるが、この例に限らない。これら各種の複雑度係数の値は、本例では係数入力部１０２を介して任意の値が設定される（例えばユーザが設定する）。係数入力部１０２は、複雑度演算部１０１による複雑度計算で使用される各複雑度係数（経路数に応じた複雑度係数、あるいはＳＦＣコンポーネントの各種別に応じた各複雑度係数）の値を、ユーザ等に任意に設定させる機能部である。当該複雑度係数の設定画面の一例を図１７に示し後に説明する。尚、複雑度係数値は‘０’であっても構わない。
【０１６７】
複雑度演算部１０１が、これら各種の複雑度係数の値と、上記経路計数記録部８２によって得られた上記各種検出数と、上記複雑度計算式を用いて、チャート毎の複雑度を計算する。
上記複雑度計算式の一例を以下に示すが（計算式（３））、この例に限らない。
【０１６８】
【数１】
2018018510.tif 000003
【０１６９】
上記複雑度計算式（３）によって、例えば、分岐の検出数、ステップ、トランジション、アクションの各検出数、アクションにおけるアクションクオリファイアの種別毎の各検出数、アクション処理の言語種別毎の各検出数の全てを考慮した複雑度計算が実現できるが、この例に限らない。上記複雑度計算式（上記計算式（３））を用いて、これらの中の一部の検出数のみを考慮した複雑度計算も実現できる。これは、対象以外の複雑度係数を全て‘０’にすることで実現できる。
【０１７０】
例えば、上記複雑度計算式において、経路数の複雑度係数を‘１’、その他の複雑度係数を全て‘０’とすれば、実質的に、経路数に応じた複雑度を計算するものとなる。あるいは、上記複雑度計算式を、実質的に、分岐の検出数に応じた複雑度を計算するものとしたい場合には、選択分岐と並列分岐の複雑度係数をそれぞれ‘１’とし、その他の複雑度係数を全て‘０’とすればよい。
【０１７１】
あるいは、アクションに着目して複雑度を求めたいならば、アクションクオリファイアやアクション言語種別の複雑度係数を‘０’以外の値に設定し、その他の複雑度係数を全て‘０’とすれば、アクションに応じた複雑度を算出するものとすることができる。
【０１７２】
あるいは、上記のような任意の複雑度係数を‘０’にする例に限らず、特に重視したい対象の複雑度係数を他より大きくするようにしてもよい。例えば、時間設定を必要とするアクションクオリファイア（L/D/SD/DS/SL）を重視し、これらの複雑度係数を比較的大きく設定する等してもよい。あるいは、アクションの言語種別に着目して、特定の言語で書かれたアクションの複雑度係数を比較的大きく設定するなどしてもよい。
【０１７３】
複雑度表示部８４は、上記複雑度計算部８３により計算されたチャート毎の複雑度の値を表示する。複雑度表示部８４（その複雑度一覧表示部１１１、複雑度上限入力部１１２）の機能自体は、上記複雑度表示部１４（その複雑度一覧表示部４１、複雑度上限入力部４２）の機能と同様であってよい。よって、ここでは特に説明しないが、例えば上記図３（ｂ）や図３（ｃ）と同様の表示が行われるものであってよい。
【０１７４】
図１２、図１３、図１４、図１５に、経路計数部２１の処理フローチャート図を示す。
尚、これら図面において上記図４、図５、図６における処理ステップと、同様の処理ステップには、同一のステップ番号を付してあり、その説明は省略する。
【０１７５】
図１２において、図示のステップＳ１１、Ｓ１２、Ｓ１３、Ｓ１４、Ｓ１５、Ｓ１６、Ｓ１９，Ｓ２０、Ｓ２１の処理は、上記図４におけるステップＳ１１、Ｓ１２、Ｓ１３、Ｓ１４、Ｓ１５、Ｓ１６、Ｓ１９，Ｓ２０、Ｓ２１の処理と略同様であってよく、ここでは特に説明しない。
【０１７６】
図１２の処理が図４と異なる点は、まず、ステップＳ１５の判定がＮＯである場合（つまり、処理対象のＳＦＣコンポーネントの種別が“分岐”以外である場合）、図４ではそのままステップＳ２０に移行したが、図１２ではステップＳ７１の「ＳＦＣコンポーネントカウント処理」を実行して、ステップＳ２０へ移行する。
【０１７７】
ここで、図１３に、ステップＳ７１の「ＳＦＣコンポーネントカウント処理」の詳細フローチャートを示す。図１３については後に説明する。
【０１７８】
また、図１２の処理が図４と異なる点は、処理対象のＳＦＣコンポーネントの種別が、選択分岐であれば（ステップＳ１６，ＹＥＳ）ステップＳ７２の“選択分岐内経路数取得”処理を実行し、並列分岐であれば（ステップＳ１６，ＮＯ）ステップＳ７３の“並列分岐内経路数取得”処理を実行する点である。
【０１７９】
ここで、図１４はステップＳ７２の“選択分岐内経路数取得”処理の詳細フローチャート図である。図１５はステップＳ７３の“並列分岐内経路数取得”処理の詳細フローチャート図である。
【０１８０】
図１４において、図５における処理ステップと、同様の処理ステップには、同一のステップ番号を付してあり、その説明は省略する。これより、図１４に示すように、図５の処理と異なる点は、下記の１点のみである。
【０１８１】
すなわち、図５では、ステップＳ３４の判定において、処理対象のＳＦＣコンポーネントの種別が“分岐・収束以外”と判定された場合、上記ステップＳ３９の処理を実行した。これに対して、図１４では、ステップＳ３４の判定において、処理対象のＳＦＣコンポーネントの種別が“分岐・収束以外”と判定された場合、ステップＳ９１の「ＳＦＣコンポーネントカウント処理」を実行して、ステップＳ３９を実行する。ステップＳ９１の「ＳＦＣコンポーネントカウント処理」は、ステップＳ７１の「ＳＦＣコンポーネントカウント処理」と同じであってよく、上記の通りその詳細は図１３に示し後に説明する。
【０１８２】
また、図１５において、図６における処理ステップと、同様の処理ステップには、同一のステップ番号を付してあり、その説明は省略する。これより、図１５に示すように、図６の処理と異なる点は、下記の１点のみである。
【０１８３】
すなわち、図６では、ステップＳ５４の判定において、処理対象のＳＦＣコンポーネントの種別が“分岐・収束以外”と判定された場合、上記ステップＳ５９の処理を実行した。これに対して、図１５では、ステップＳ５４の判定において、処理対象のＳＦＣコンポーネントの種別が“分岐・収束以外”と判定された場合、ステップＳ９２の「ＳＦＣコンポーネントカウント処理」を実行して、ステップＳ５９を実行する。ステップＳ９２の「ＳＦＣコンポーネントカウント処理」は、ステップＳ７１の「ＳＦＣコンポーネントカウント処理」と同じであってよく、上記の通りその詳細は図１３に示し後に説明する。
【０１８４】
ここで、以下、図１３の処理について説明する。
上記の通り、図１３は、「ＳＦＣコンポーネントカウント処理」の詳細フローチャート図である。
【０１８５】
図１３の処理例では、処理対象のコンポーネントがステップであるか否かを判定し（ステップＳ８１）、ステップでは無い場合（すなわち、トランジションである場合には）（ステップＳ８１，ＮＯ）、トランジション数を＋１インクリメントして（ステップＳ８３）、本処理を終了する。尚、トランジション数に限らず、本処理における何等かの検出数のカウント処理（＋１インクリメント）は、例えば図１６に示す検出数記録テーブル１２０における該当レコードの検出数１２３に対して行う。例えば上記ステップＳ８３の処理は、図１６のＳＦＣコンポーネント種別１２２が“トランジション”のレコードの検出数１２３を、＋１インクリメントするものとなる。
【０１８６】
一方、処理対象のコンポーネントがステップである場合には（ステップＳ８１，ＹＥＳ）、まず、ステップの数を＋インクリメントする（ステップＳ８２）。そして、このステップに、１以上のアクションが連結されているか否かを判定し（ステップＳ８４）、アクションが連結されていないならば（ステップＳ８４，ＮＯ）、そのまま本処理を終了する。
【０１８７】
一方、そのステップにアクション（アクションブロック）が１以上連結されている場合には（ステップＳ８４，ＹＥＳ）、連結されているアクションブロックを１つ取得して（ステップＳ８５）、取得した情報に基づいてステップＳ８６，Ｓ８７の処理を実行する。尚、ステップＳ８６，Ｓ８７のインクリメント処理も、上記と同様、内部経路記録部９２の検出数記録テーブル１２０の該当レコードの検出数１２３を更新する処理となる。
【０１８８】
ここで、アクションブロックに含まれる情報の一例は、既に述べたように、上記アクション名、アクションクオリファイア、アクション言語種別等である。これより、取得したアクションブロックのアクションクオリファイア種別により、このアクションクオリファイア種別の検出数（該当レコードの検出数１２３）を＋１インクリメントする（ステップＳ８６）。また、取得したアクションブロックのアクション言語種別により、このアクション言語種別の検出数（該当レコードの検出数１２３）を＋１インクリメントする。
【０１８９】
仮に、取得したアクションブロックのアクションクオリファイアが“Ｒ”、アクション言語種別が“ＩＬ”であったとするならば、後述する図１６において、ＳＦＣコンポーネント種別１２２が「アクションクオリファイア：Ｒ」に対応する検出数１２３が、＋１インクリメントされると共に、「アクション言語種別：ＩＬ」に対応する検出数１２３が、＋１インクリメントされることになる。
【０１９０】
尚、図には示していないが、例えばステップＳ８５の処理に伴って、アクションの検出数もカウントする。ステップＳ８５の処理の際に、例えば、検出数記録テーブル１２０においてＳＦＣコンポーネント種別１２２が“アクション”であるレコードの検出数１２３を、＋１インクリメントする。
【０１９１】
上述したように、アクションを検出した場合、アクションの検出数をカウントするだけでなく、アクションクオリファイア種別ごと、アクション言語種ごとにカウントすることで、アクションに関してより詳細な記録が残せることになる。
【０１９２】
上記ステップに連結しているアクションが他にもある場合には（ステップ８８，ＹＥＳ）、ステップＳ８５に戻って次のアクションブロックの取得処理などや上記ステップＳ８６，Ｓ８７の処理を実行し、次のアクションが無ければ（ステップＳ８８，ＮＯ）本処理を終了する。
【０１９３】
図１６は、内部経路記録部９２に記録される検出数記録テーブル１２０の具体例である。
【０１９４】
図示の例の検出数記録テーブル１２０は、Ｎｏ．１２１、ＳＦＣコンポーネント種別１２２、検出数１２３の各データ項目から成る。Ｎｏ．１２１は単なる通し番号などである。ＳＦＣコンポーネント種別１２２には、予め、各種のＳＦＣコンポーネント種別が登録されている。つまり、ＳＦＣコンポーネント種別１２２には、予め、図示のステップ、トランジション、選択分岐、並列分岐、アクション、各種のアクションクオリファイア、各種のアクション言語種別が、登録されている。
【０１９５】
検出数１２３には、各種のＳＦＣコンポーネント種別の処理対象プログラム（チャート）における検出数が記録される。つまり、様々なＳＦＣコンポーネント種別１２２それぞれの検出数が、検出数１２３に記録される。全ての検出数１２３は初期値が‘０’であり、検出される毎に上記ステップＳ８２，Ｓ８３、Ｓ８６，Ｓ８７等のように＋１インクリメントされる。
【０１９６】
そして、上記のように、これら各種のＳＦＣコンポーネント種別毎の検出数１２３と、任意に設定された各種の複雑度係数に基づいて、上記複雑度計算式（上記計算式（３））などを用いて処理対象チャートの複雑度が算出される。
【０１９７】
ここで、上記のように係数入力部１０２がユーザに各種の複雑度係数を任意に設定させるが、その為の係数設定画面の一例を図１７に示す。
【０１９８】
図１７に示す複雑度係数設定画面１３０では、図示のように、各種のＳＦＣコンポーネント種別に対応する複雑度係数が、任意に設定可能となっており、設定内容が所定の記憶領域に記憶されることになる。
【０１９９】
上述したように、実施例２では、実施例１の特徴に加えて更に、アクションに係わる所定の出現数検出を行って、アクションについて、アクションクオリファイア種別や、アクション言語種別について、出現状況についても検出して、複雑度計算に反映させる。アクション言語種別は、上記の通り、アクションに定義されている内容が、BOOL型変数であるか、何等かの記述言語で記載された処理であるかといったことを示す情報である。
以上、実施例２について説明した。
【０２００】
以下、実施例３について説明する。
実施例３は、上記実施例１の特徴、または／及び、上記実施例２の特徴に加えて更に、セットによる保持動作とリセット動作とのペア関係を判別し、場合によってはこれに基づいて複雑度を計算するものである。
【０２０１】
図１８に、実施例３のＳＦＣメトリクス測定装置の構成図を示す。
図示の例のＳＦＣメトリクス測定装置１５０は、ＳＦＣ格納部１５１、経路計数記録部１５２、複雑度計算部１５３、複雑度表示部１５４を有する。
【０２０２】
上記経路計数記録部１５２は、経路計数部１６１、内部経路記録部１６２、経路数記録部１６３を有する。
【０２０３】
上記複雑度計算部１５３は、複雑度演算部１７１、係数入力部１７２を有する。
上記複雑度表示部１５４は、複雑度一覧表示部１８１、複雑度上限入力部１８２を有する。
【０２０４】
ここで、ＳＦＣメトリクス測定装置１５０は、基本的には上記実施例２のＳＦＣメトリクス測定装置８０と略同等の機能を有し、そのうえで更に、セット＆リセットに係わる特徴も有している。これより、以下、主に、ＳＦＣメトリクス測定装置８０とは異なる点について説明するものとし、ＳＦＣメトリクス測定装置８０と略同等の機能についての説明は省略または簡略化するものとする。
【０２０５】
まず、ＳＦＣ格納部１５１は上記ＳＦＣ格納部８１と同じであってよい。但し、ここでは説明の都合上、ＳＦＣ格納部１５１に格納される処理対象チャート（ＳＦＣプログラム）の具体例を、図１９に示すものとする。
【０２０６】
ここで、図１９に示すチャートの具体例について、主に図９に示す具体例と異なる点について説明する。
【０２０７】
図１９は、ＳＦＣで作成されたプログラム（チャート）の一例であり、アクションも記述された例である。この例では、アクションの記述以外は（各ステップ、各トランジション、分岐・収束の構成は）、上記図２４に示す例と同一であり、その説明は省略する。
【０２０８】
図１９の例では、アクションの連結に関して、図９とは多少異なる点がある。すなわち、図９の例では、ステップS004には一つのアクションが連結され、ステップS006には二つのアクションが連結されている。これに対して、図１９の例では、まず、図９と同様に、ステップS001には、アクションクオリファイアが“Ｓ”でアクション名が“ACT001”のアクションが、連結されている。
【０２０９】
図１９では、図９とは異なり、ステップS004には２つのアクションが連結されている。つまり、アクションクオリファイアが“ＤＳ”でアクション名が“ACT002”のアクション（これは図９と同様）と、アクションクオリファイアが“Ｓ”でアクション名が“ACT003”のアクションとが、ステップS004に連結されている。
【０２１０】
また、図１９では、図９とは異なり、ステップS006には３つのアクションが連結されている。アクションクオリファイアが“Ｒ”でアクション名が“ACT001”のアクションと、アクションクオリファイアが“Ｒ”でアクション名が“ACT002”のアクションが、連結されている点は、図９と同様である。図１９では、ステップS006には更に、アクションクオリファイアが“Ｒ”でアクション名が“ACT004”のアクションが、連結されている
経路計数部１６１は、ＳＦＣ格納部１５１に格納されている処理対象チャートに対して、基本的には上記経路計数部９１と同等の処理を行うが、一部異なる処理を行う。例えば、経路計数部１６１は、上記図１３の処理の代わりに図２０に示す処理を実行する。
【０２１１】
図２０は、実施例３におけるＳＦＣコンポーネントカウント処理の詳細フローチャート図である。
【０２１２】
図２０の処理において、図１３の処理と同様の処理には同一符号を付してあり、その説明は省略する。これより、図２０の処理では、図示のステップＳ８１、Ｓ８２，Ｓ８３、Ｓ８４，Ｓ８５，Ｓ８６，Ｓ８７，Ｓ８８の処理を行うが、これについては図１３と同じであり特に説明しない。
【０２１３】
そして、図２０では、ステップＳ８７の処理に続いて、まず、ステップＳ８５で取得したアクションブロックから“変数名／処理名”を取得する（ステップＳ１０１）。続いて、ステップＳ８６で取得済みのアクションクオリファイアに基づいて、処理を分岐させる（ステップＳ１０２）。すなわち、ステップＳ１０２において、アクションクオリファイアがＳ／ＤＳ／ＳＤの何れかであった場合にはステップＳ１０３へ移行し、Ｒであった場合にはステップＳ１０４へ移行し、Ｓ／ＤＳ／ＳＤ／Ｒの何れでも無い場合にはそのままステップＳ８８へ移行する。
【０２１４】
ここで、経路計数部１６１は、上記経路計数部９１と同様に上記検出数記録テーブル１２０を作成する（各種ＳＦＣコンポーネントの検出数をカウントする）が、更に、アクション対応テーブル１９０も作成する。
【０２１５】
ここで、図２１には上記図１９の例に応じた上記検出数記録テーブル１２０の例を示すが、これについては特に説明しない（データ構成自体は図１６と同じであり、同一符号を付してあり、検出数１２３の各数値が異なるだけなので、特に説明しない）。
【０２１６】
図２２に、アクション対応テーブル１９０の具体例を示す。
図示の例のアクション対応テーブル１９０は、アクション定義内容１９１、セット動作検出数１９２、リセット動作検出数１９３、差分１９４の各データ項目より成る。
【０２１７】
経路計数部１６１は、上記ステップＳ１０３，Ｓ１０４のどちらを実行する場合でも共通の処理として、まず、アクション対応テーブル１９０に登録済みの全レコードのアクション定義内容１９１を参照して、ステップＳ１０１で取得した“変数名／処理名”が登録済みか否かを判定する（該当レコードがあるか否かをチェックする）。そして、未登録である場合にはアクション対応テーブル１９０に新規レコードを追加して、この新規レコードのアクション定義内容１９１に、ステップＳ１０１で取得した“変数名／処理名”を登録する。
【０２１８】
尚、新規レコードにおいて、セット動作検出数１９２、リセット動作検出数１９３、差分１９４には全て初期値‘０’を設定する。
【０２１９】
そして、ステップＳ１０３では、上記共通の処理に続いて更に、該当レコードのセット動作検出数１９２の値を更新する（＋１インクリメントする）。尚、新規レコード追加の場合には新規レコードが該当レコードとなる。更に、更新後のセット動作検出数１９２の値と、リセット動作検出数１９３の値とを用いて、差分１９４の値を下記のように更新する。
【０２２０】
差分１９４＝セット動作検出数１９２ − リセット動作検出数１９３
つまり、セット動作検出数１９２の現在値（更新値）からリセット動作検出数１９３の現在値を差し引いた値を、新たな差分１９４の値とする。
【０２２１】
一方、ステップＳ１０４では、上記共通の処理に続いて更に、該当レコードのリセット動作検出数１９３の値を更新する（＋１インクリメントする）。更に、セット動作検出数１９２の値と、更新後のリセット動作検出数１９３の値とを用いて、差分１９４の値を下記のように更新する。
【０２２２】
差分１９４＝セット動作検出数１９２ − リセット動作検出数１９３
つまり、セット動作検出数１９２の現在値からリセット動作検出数１９３の現在値（更新値）を差し引いた値を、新たな差分１９４の値とする。
【０２２３】
上記ステップＳ１０３，Ｓ１０４の何れを実行した場合でも、処理実行後はステップＳ８８へ移行する。
【０２２４】
尚、経路計数部１６１は、上記図２（ａ）のような経路数も検出する。
複雑度演算部１７１は、上記経路計数記録部１５２によって検出・記録されたデータ（図２１の検出数記録テーブル１２０や図２２のアクション対応テーブル１９０や経路数など）や、係数入力部１７２により設定された各種複雑度係数などに基づいて、下記の複雑度計算式（計算式（４））によって処理対象チャートの複雑度を算出する。
【０２２５】
【数２】
2018018510.tif 000004
【０２２６】
上記計算式（４）におけるセット動作過多の検出数は、アクション対応テーブル１９０において差分１９４の値が正の値となっているレコードの数である。リセット動作過多の検出数は、アクション対応テーブル１９０において差分１９４の値が負の値となっているレコードの数である。よって図２２の例の場合、セット動作過多の検出数は‘１’となり、リセット動作過多の検出数も‘１’となる。
【０２２７】
尚、図２３は、係数入力部１７２による複雑度係数設定画面２００の具体例である。
図示の複雑度係数設定画面２００について、上記図１７の複雑度係数設定画面１３０との相違についてのみ述べるならば、複雑度係数設定画面１３０の各種複雑度係数設定欄に加えて更に、図示のセット動作過多、リセット動作過多の各複雑度係数が任意に設定できる点である。
【０２２８】
また、尚、上記計算式（４）によって、例えば、分岐の検出数、ステップ、トランジション、アクションの各検出数、アクションにおけるアクションクオリファイアの種別毎の各検出数、アクション処理の言語種別毎の各検出数、アクションのセット動作とリセット動作の対応関係の不一致に応じた値の全てを考慮した複雑度計算が実現できるが、この例に限らない。上記計算式（４）を用いて、これらの中の一部の検出数のみを考慮した複雑度計算も実現できる。これは、対象以外の複雑度係数を全て‘０’にすることで実現できる。
【０２２９】
例えば、上記計算式（４）において、セット動作過多の複雑度係数とリセット動作過多の複雑度係数は‘０’以外の任意の値に設定し、これら以外の複雑度係数は全て‘０’に設定することで、計算式（４）を実質的にアクションのセット動作とリセット動作の対応関係の不一致に着目した複雑度を求める式とすることができる。
【０２３０】
尚、上記計算式（３）、計算式（４）は、何れも、本例による複雑度計算式の一例である。
【０２３１】
尚、以下、SFC（シーケンシャル・ファンクション・チャート）におけるアクション「DS」「SD」の違いについて、説明する。
【０２３２】
・ＤＳ：DS(Delayed and Stored)では、ステップが活性になってから、予め設定された時間遅れてアクションの実行が開始される。この場合も設定された時間内（実行開始前）にステップが非活性になると、設定時間が経過して実行開始時刻となってもアクションは実行されない。ただし、アクションの実行開始後はステップが非活性になってもアクション実行を継続する。アクションの実行打ち切りはＲ(Reset) による。
【０２３３】
・ＳＤ：SD(Stored and time Delayed) では、ステップが活性になってから、予め設定された時間遅れてアクションの実行が開始される。この場合は設定された時間内（実行開始前）にステップが非活性になっても設定時間が経過して実行開始時刻となるとアクションが実行される。アクションの実行打ち切りはＲ(Reset) による。
【０２３４】
尚、アクションクオリファイア“Ｓ”も、アクションの実行打ち切りはＲ(Reset) による。
【０２３５】
この様に、アクションクオリファイア“Ｓ”、“ＤＳ”、“ＳＤ”は、何れも、アクションの実行打ち切りにはＲ(Reset)が必要であり、それ故、上記ステップＳ１０２の判定を行って、処理対象アクションのアクションクオリファイア種別が“Ｓ”、“ＤＳ”、“ＳＤ”、“Ｒ”の何れかである場合には、検出数記録テーブル１２０への記録を行うようにしている。  上記アクションクオリファイア“Ｓ”、“ＤＳ”、“ＳＤ”は、セット動作に係わるアクションクオリファイアである。上記アクションクオリファイア“Ｒ” は、リセット動作に係わるアクションクオリファイアである。セット動作に対してはリセット動作が必要であり、任意のチャート中にセット動作があった場合、これとペアになるリセット動作が記述されていることが、基本的には必要となる。つまり、任意の“変数名／処理名”のセット動作を行うアクションがあった場合、これとペアとなるアクションとして、同じ“変数名／処理名”のアクションであってリセット動作を行うアクションが記述されていることが、基本的には必要となる。
【０２３６】
これより、任意の“変数名／処理名”のセット動作を行うアクションがあるが、これとペアとなるアクションが記述されていない場合、セット動作過多とする。その逆に、任意の“変数名／処理名”のリセット動作を行うアクションがあるが、これとペアとなるアクションが記述されていない場合、リセット動作過多とする。これらは何れも記述ミスである可能性がある。
【０２３７】
これに対して実施例３では上記検出数記録テーブル１２０を用いることで、セット動作過多またはリセット動作過多を判別することができる。更に、この判別結果に基づき、セット動作過多の数またはリセット動作過多の数も用いて、ＳＦＣプログラムの複雑度を算出するようにしてもよい（一例が上記計算式（４）であるが、この例に限らない）。
【０２３８】
なお、以上説明した実施の形態１〜３は、これらの技術的思想の範囲内で、様々な変形が可能である。
【符号の説明】
【０２３９】
１０  ＳＦＣメトリクス測定装置
１１  ＳＦＣ格納部
１２  経路計数記録部
１３  複雑度計算部
１４  複雑度表示部
２１  経路計数部
２２  内部経路記録部
２３  経路数記録部
３１  複雑度演算部
３２  係数入力部
４１  複雑度一覧表示部
４２  複雑度上限入力部
５１  ＳＦＣＮｏ．
５２  経路数
６１  ＳＦＣコンポーネント種別
６２  検出数
７１  チャートＮｏ．
７２  複雑度
８０  ＳＦＣメトリクス測定装置
８１  ＳＦＣ格納部
８２  経路計数記録部
８３  複雑度計算部
８４  複雑度表示部
９１  経路計数部
９２  内部経路記録部
９３  経路数記録部
１０１  複雑度演算部
１０２  係数入力部
１１１  複雑度一覧表示部
１１２  複雑度上限入力部
１２１  Ｎｏ．
１２２  ＳＦＣコンポーネント種別
１２３  検出数
１３０  複雑度係数設定画面
１５０  ＳＦＣメトリクス測定装置
１５１  ＳＦＣ格納部
１５２  経路計数記録部
１５３  複雑度計算部
１５４  複雑度表示部
１６１  経路計数部
１６２  内部経路記録部
１６３  経路数記録部
１７１  複雑度演算部
１７２  係数入力部
１８１  複雑度一覧表示部
１８２  複雑度上限入力部
１９０  アクション対応テーブル
１９１  アクション定義内容
１９２  セット動作検出数
１９３  リセット動作検出数
１９４  差分
【図１】
2018018510.tif 000005
【図２】
2018018510.tif 000006
【図３】
2018018510.tif 000007
【図４】
2018018510.tif 000008
【図５】
2018018510.tif 000009
【図６】
2018018510.tif 000010
【図７】
2018018510.tif 000011
【図８】
2018018510.tif 000012
【図９】
2018018510.tif 000013
【図１０】
2018018510.tif 000014
【図１１】
2018018510.tif 000015
【図１２】
2018018510.tif 000016
【図１３】
2018018510.tif 000017
【図１４】
2018018510.tif 000018
【図１５】
2018018510.tif 000019
【図１６】
2018018510.tif 000020
【図１７】
2018018510.tif 000021
【図１８】
2018018510.tif 000022
【図１９】
2018018510.tif 000023
【図２０】
2018018510.tif 000024
【図２１】
2018018510.tif 000025
【図２２】
2018018510.tif 000026
【図２３】
2018018510.tif 000027
【図２４】
2018018510.tif 000028
【図２５】
2018018510.tif 000029