JP2018018510A - Sfcメトリクス測定装置、sfcメトリクス算出方法 - Google Patents

Sfcメトリクス測定装置、sfcメトリクス算出方法 Download PDF

Info

Publication number
JP2018018510A
JP2018018510A JP2017094041A JP2017094041A JP2018018510A JP 2018018510 A JP2018018510 A JP 2018018510A JP 2017094041 A JP2017094041 A JP 2017094041A JP 2017094041 A JP2017094041 A JP 2017094041A JP 2018018510 A JP2018018510 A JP 2018018510A
Authority
JP
Japan
Prior art keywords
sfc
branch
complexity
action
paths
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Pending
Application number
JP2017094041A
Other languages
English (en)
Inventor
東洋史 門崎
Toyoshi Kadosaki
東洋史 門崎
吉晴 丸山
Yoshiharu Maruyama
吉晴 丸山
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fuji Electric Co Ltd
Original Assignee
Fuji Electric Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fuji Electric Co Ltd filed Critical Fuji Electric Co Ltd
Publication of JP2018018510A publication Critical patent/JP2018018510A/ja
Pending legal-status Critical Current

Links

Images

Landscapes

  • Programmable Controllers (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)

Abstract

【課題】SFCに関して、プログラムの品質を客観的に評価できるようにする。【解決手段】経路計数記録部12は、SFC格納部11に格納されているSFCプログラムを、チャート毎に走査することで、各チャートの経路数を求める。更に、各チャートにおけるSFCコンポーネントの数を、種別毎に計数する。複雑度計算部13は、SFCチャート毎の経路検出数や、各チャート内でのSFCコンポーネント種別毎の検出数を、予め登録されている所定の複雑度計算式に当てはめて、チャート毎の複雑度を計算する。【選択図】図1

Description

本発明は、SFCで作成された制御装置のプログラムの品質評価方法に関する。
シーケンス制御は、工業製品の制御及び、鉄鋼、化学、電力などの広範なプラントの制御に用いられている。SFC(Sequential Function Chart:シーケンシャル・ファンクション・チャート)は、シーケンス制御において製造ラインなどの制御の順序を図示表現したプログラム言語(図示言語)の一つとして、IEC61131-3で定められている。
SFCのプログラム(チャート)は、基本的には、「ステップ(step)」、「トランジション(transition)」等のコンポーネント(要素)と、これらのコンポーネントを「リンク」によって結線して成るものである。ステップは、それ自体が1制御単位であって、活性状態と非活性状態の2種類があり、その状態はステップ前後の移行条件である「トランジション」の成立条件により変化する。
チャート内の各ステップには、それぞれに固有な動作出力「アクション」が定義されている。SFCによる動作出力は、活性状態のステップに定義されたアクションによって行われる。制御装置はSFCで作成されたプログラムを実行するものである。
SFCのステップ、トランジション、アクションについて、以下、詳しく説明する。
「ステップ」は、プログラムの起動時に活性状態である「イニシャルステップ」と、プログラムの起動時には非活性状態である「通常のステップ」とに分類される。ステップとトランジションは必ず交互に接続されており、ステップの次にはトランジション、トランジションの次にはステップが「リンク」により接続され、ステップ同士、トランジションが上下に接続されることはない。
また、「アクション」は、ステップが活性状態になったときの動作出力を表すものであり、ステップには0個以上のアクション(アクションブロック)が連結される。アクションブロックには、例えばそのアクションの実行タイミングを指示するアクションクオリファイアなどが記述されている。アクションブロックは、アクションクオリファイア種別(N/S/R/L/D/P/SD/DS/SL/P1/P0)や、アクション名や、アクションの内容(言語種別、変数名/処理名、TIME型の持続時間など)等の所定の情報群からなる。
ステップの活性状態は前後に接続するトランジションの条件によって変わっていく。すなわち、活性状態のステップに後続するトランジションの条件が成立するとそのステップは非活性状態に変わり、そのトランジションに後続するステップが活性状態に変わる。全体処理の小さな1工程であるステップが、その工程の移行条件であるトランジションで歩進していくことから、「あらかじめ定められた順序または手続きに従って制御の各段階を逐次進めていく制御」(JIS-C0401)であるシーケンス制御に、非常に適した言語であることがいえる。
ステップ、トランジションの接続形態としてステップの下に複数のトランジションを接続することや、トランジションの下に複数のステップを接続することは可能である。図24に示す、選択分岐、並列分岐がその例である。
図24は、SFCで作成されたプログラム(チャート)の一例であり、簡単な例を示す。
図24に示されているSFCコンポーネントは、図示のS001, S002, S003, S004, S005, S006がステップであり、その中でS001がイニシャルステップに相当する。また、図示のT002_S, T003_S, T002_E, T003_E, T004_E, T005_006_Eがトランジションである。S001からS002およびS003への分岐が選択分岐a(どちらか一方のステップが活性)、S004からS005およびS006への分岐が並列分岐c(両方のステップが同時に活性)となる。
すなわち、ステップS001に複数のトランジションT002_S、T003_Sを接続するものが選択分岐(図24に示すaの部分)であり、S001が活性状態の時、T002_S、T003_Sの状態によってS002, S003のどちらか一方が活性状態に移行する。T002_S、T003_Sが同時に条件成立した場合、左側が優先される(またはどちらが優先かをユーザ等が予め指示しておく)。
この選択分岐が存在する場合、その収束(図24に示すbの部分)は各分岐ルートの末端のトランジション(T002_E、T003_E)の次に同じステップ(S004)を接続することで実現する。選択分岐の場合、活性状態となるステップは何れか一つの分岐ルート上にしかなく、シーケンスが分岐されている。
尚、コンポーネントの一種として選択分岐aとその収束bがあるものと見做しても構わないし、ステップの次に複数のトランジションが接続されている場合に選択分岐があるものと判定するものであっても構わない。
一方、トランジションT004_Eに複数のステップS005、S006を接続するものが並列分岐(図24に示すcの部分)であり、S004が活性状態の時、T004_Eの条件が成立すると、S005、S006が両方とも活性状態になり、その後のシーケンスは両方同時に進んでいく。並列分岐が存在する場合、その収束(図24に示すdの部分)はそれぞれのルートの末端のステップに、同じトランジション(T005_006_E)を接続することで実現する。
並列分岐の場合、活性状態となるステップは各分岐先に後続するステップとなり、複数のステップが活性状態となり、シーケンスは並行動作する。選択分岐と並列分岐は組み合わせて使用してもよく、図25(a)の例のように選択分岐の一方の分岐ルート上に並列分岐を入れてもよいし、あるいは図25(b)の例のように並列分岐の各分岐ルート上に選択分岐を入れてもよい。勿論、これらの例に限らない。
尚、図25(a)、(b)は、SFCプログラムの具体例(その2)(その3)である。
尚、コンポーネントの一種として並列分岐cとその収束dがあるものと見做しても構わないし、トランジションの次に複数のステップが接続されている場合に並列分岐があるものと判定するものであっても構わない。
尚、図25(a)、(b)に示す例については、特に詳細には説明しないが、簡単に述べるならば、図25(a)ではまず選択分岐a(と対応する収束b)があり、その一方の分岐ルート上に選択分岐c(と対応する収束d)があり、他方の分岐ルート上に並列分岐e(と対応する収束f)がある。図25(b)ではまず並列分岐g(と対応する収束h)があり、その一方の分岐ルート上に選択分岐i(と対応する収束j)があり、他方の分岐ルート上に選択分岐k(と対応する収束l)がある。
尚、図24、図25に示すようなSFCのプログラム(図示表現したプログラム)に関する説明では、図示に従った“上下左右”や“前後”で説明する場合もあるものとする。つまり、例えば、図25(a)においてはトランジションT001の“下側”(または“後側”)にステップS002が接続され、選択分岐aによって“左側”(トランジションT001)と“右側”(トランジションT003)とに分岐する、等の説明となる。
SFCは制御対象の動作シーケンスとプログラムとの対応が容易に行える利点がある。しかし、作成されたチャート(SFCプログラム)を定量的に評価することについては十分に配慮されていない。
また、特許文献1には、オブジェクト指向プログラムのソフトウェアメトリクス(品質評価尺度)に関する従来技術が開示されている。
特開平11−338691号公報
ソフトウェア・メトリクスは、ソフトウェアの品質を定量的に評価する尺度として、多くの開発現場で利用されてきている。例えば、Cyclomatic(サイクロマチック)複雑度と呼ばれるメトリクスは、プログラムの複雑度を測る目的で、プログラムのソースコードから、プログラムが実行される可能性がある独立した経路の数を数える。その結果、テストカバレッジの一つである分岐網羅率(C1カバレッジ)を100%にするために必要なテストケースの下限値を知ることが可能になる。つまり、サイクロマチック複雑度の高いプログラムはテストケースが多く必要になり、テストに時間がかかることが分かる。また複雑度の高いプログラムは、経験的に不具合の発生率が高いことが知られており、複雑度が高いプログラムを作成することは避けられている。
C/C++、JAVA(登録商標)等のテキスト言語では、前述したようなソフトウェア・メトリクスをソフトウェアの品質の一つと考え、様々な面で計測し、定量的な評価としている。しかしながら、図示言語であるSFCにおいては、品質を定量的に評価するものが存在しないため、個々のプログラムの品質を比べることができない。
SFCプログラムは、前述したとおり、「ステップ」、「トランジション」等を「リンク」によって結線したものである。これを、チャートの上から順番にステップの活性状態が変わっていく処理フローと捉えると、フローチャートに類似したものと考えることができる。SFCの選択分岐をフローチャートの分岐ととらえることにより、選択分岐しかないSFCではフローチャートに変換することでサイクロマチック複雑度を計算することが可能である。しかし、SFCの並列分岐はフローチャートの分岐とは異なる特徴を持つものであるから、これをフローチャートと同様の観点でサイクロマチック複雑度の計算をすることはできない。
また、SFCは様々なコンポーネントから構成されるものであるが、図示言語であるために品質を定量的に評価するものが存在しないため、個々のプログラム(ここではチャート)の品質を比べることができない。
本発明の課題は、図示言語であるSFCで作成されたプログラムに関して、複雑度を算出することができ、プログラムの品質を客観的に評価できるようにするSFCメトリクス測定装置等を提供することである。
本発明のSFCメトリクス測定装置は、下記の各手段を有する。
・任意のSFCプログラムの開始から終了までの経路の数を求め、又は、該SFCプログラムにおける種別毎の要素数を計数する計数手段;
・該計数手段により求められた前記経路数又は種別毎の要素数に基づいて、前記SFCプログラムの複雑度を算出する複雑度演算手段。
本発明のSFCメトリクス測定装置等によれば、図示言語であるSFCで作成されたプログラムに関して、複雑度を測定することができ、プログラムの品質を客観的に評価できるようになる。
実施例1のSFCメトリクス測定装置の構成図である。 (a)は経路数記録部、(b)は内部経路記録部のデータ格納例である。 (a)〜(c)は、各種設定画面例または表示例である。 実施例1の経路計数部の処理フローチャート図である。 図4のステップS17の詳細フローチャート図である。 図4のステップS18の詳細フローチャート図である。 図24のSFC例における経路を示す図である。 (a)、(b)は、図25(a)、(b)のSFC例における経路を示す図である。 SFCプログラムの具体例(その4)である。 アクションクオリファイアの具体例を示す図である。 実施例2のSFCメトリクス測定装置の構成図である。 実施例2の経路計数部の処理フローチャート図である。 実施例2におけるSFCコンポーネントカウント処理の詳細フローチャート図である。 図12のステップS72の詳細フローチャート図である。 図12のステップS73の詳細フローチャート図である。 実施例2における検出結果例である。 実施例2における複雑度係数設定画面例である。 実施例3のSFCメトリクス測定装置の構成図である。 SFCプログラムの具体例(その5)である。 実施例3におけるSFCコンポーネントカウント処理の詳細フローチャート図である。 実施例3における検出結果例である。 アクション対応テーブルの具体例である。 実施例3における複雑度係数設定画面例である。 SFCプログラムの具体例(その1)である。 (a)、(b)は、SFCプログラムの具体例(その2)(その3)である。
以下、図面を参照して本発明の実施の形態について説明する。
以下、まず、実施例1について説明する。
図1に、実施例1のSFCメトリクス測定装置の構成図を示す。
尚、SFCは、(Sequential Function Chart:シーケンシャル・ファンクション・チャート)の略である。ここでは、SFCで任意に作成されたプログラムを、SFCプログラムまたはSFCチャートと記すものとする。
図示の例のSFCメトリクス測定装置10は、SFC格納部11、経路計数記録部12、複雑度計算部13、複雑度表示部14を有する。
上記経路計数記録部12は、経路計数部21、内部経路記録部22、経路数記録部23を有する。
上記複雑度計算部13は、複雑度演算部31、係数入力部32を有する。
上記複雑度表示部14は、複雑度一覧表示部41、複雑度上限入力部42を有する。
尚、SFCメトリクス測定装置10は、例えばパソコン、サーバ装置等の一般的なコンピュータ装置上で実現される。これより、SFCメトリクス測定装置10は、ハードウェア的には、特に図示しないが一般的なコンピュータ装置の構成を有する。つまり、例えば不図示のCPU等の演算プロセッサ、ハードディスク、メモリ等の記憶部、通信機能部、ディスプレイ等の表示部、キーボード、マウス等の操作入力部などを有する。
上記不図示の記憶部には予め所定のアプリケーションプログラムが記憶されている。上記不図示の演算プロセッサがこのアプリケーションプログラムを実行することで、図1に示す上記各種処理機能部、すなわち上記経路計数記録部12(その経路計数部21、内部経路記録部22、経路数記録部23)、複雑度計算部13(その複雑度演算部31、係数入力部32)、複雑度表示部14(その複雑度一覧表示部41、複雑度上限入力部42)などの処理機能が実現される。
また、後述する図3(a)(b)(c)の各種表示は上記表示部で行われ、これら表示上の入力は上記操作入力部を介して行われる。
図1における上記SFC格納部11は、SFCプログラムを図示情報として保存するものであり、任意のSFCプログラム(チャート)について、チャート毎にSFCの各種コンポーネント(ステップ、トランジション、分岐(選択分岐や並列分岐)、収束等の各種要素)と、それぞれのコンポーネント間の位置を含めた接続関係が格納されていればよい。
但し、この例に限らず、例えば、図示情報としてではなく、テーブル情報として保存されていてもよい。このテーブル情報は、例えばユーザが手作業で作成してもよいが、この例に限らない。上記図24で図示表現したSFCプログラムの例であれば、テーブル情報としては例えば下記のようになる。下記のテーブルは、「名称」、「種類」、「次のコンポーネントの名称」の3つのデータ項目から成る。
名称 種類 次のコンポーネントの名称
S001 ステップ a
a 選択分岐 T002_S,T003_S
T002_S トランジション S002
S002 ステップ T002_E
T002_E トランジション b
b 選択分岐(収束) S004
T003_S トランジション S003
(以下、省略)
コンポーネント(要素:プログラム構成要素)毎に、その識別情報である「名称」と、ステップ、トランジション等の「種類」と、次のコンポーネント(図示情報では下側に接続されるコンポーネント)の名称が、格納される。分岐の場合には、「次のコンポーネントの名称」は複数あることになる。
経路計数記録部12は、SFC格納部11に格納されているSFCの各チャートを走査することで、各チャートの経路数を求める。更に、各チャートにおけるSFCコンポーネントの数を、種別毎に計数するようにしてもよい。この処理は、上記経路計数部21が実行し、処理結果が経路数記録部23や内部経路記録部22に記録される。
経路計数部21は、SFC格納部11に格納されているSFCのチャート毎に、図示情報等を走査し、そのチャートの開始から終了までの経路数を計測(検出)する。これは、例えば、イニシャルステップからチャート終端(又は、イニシャルステップに戻る)までの各経路を探索して経路数を計測(検出)する。また、各チャートにおけるSFCコンポーネントの数を、種別毎に計数するようにしてもよい。
経路計数部21による上記処理の詳細な具体例を、図4、図5、図6に示し、後に説明するものとする。
内部経路記録部22は、経路計数部21の経路探索中に検出したSFCコンポーネントの数を、種別毎に記録するものである。ここでは、具体例として、選択分岐、並列分岐それぞれの数を記録するが、この例に限らない。本例の場合、経路計数部21は、SFCのチャート内の経路数を走査する途中で分岐コンポーネント(選択分岐または並列分岐)を検出すると、その数をカウントして内部経路記録部22に記録しておく。
経路数記録部23は、経路計数部21の経路探索中に検出した経路数を、記録するものである。
図2(a)に、経路数記録部23のデータ格納例を示す。
図において、SFCNo.51は、各SFCチャートの識別情報である。検出経路数52は、SFCNo.51のSFCチャートについて上記経路計数部21による処理を実行した結果として得られた、そのSFCチャートの経路数である。
また、図2(b)に、内部経路記録部22のデータ格納例を示す。
ここでは、検出対象となるSFCコンポーネントの種別は、選択分岐と並列分岐の2つだけとした例を示すが、この例に限らない。各SFCコンポーネント種別61のSFCチャートにおける検出数(要素数)が、検出数62に記録される。ここでは、図24の例に応じた数を示す。図24の例では、選択分岐、並列分岐の両方とも、その数は‘1’であるので、図2(b)に示す結果となる。
尚、図には示していないが、図2(b)において更に上記SFCNo.51と同じくSFCNo.があってもよい。この例に限らないが、何れにしても、どのSFCチャートにおける選択分岐または並列分岐の検出数であるのかが、分かるようになっていればよい。
尚、SFCコンポーネント種別61=“選択分岐”に対応する検出数62の欄には、後述する図5のステップS44の処理による“選択分岐検出数”が記録されることになる。SFCコンポーネント種別61=“並列分岐”に対応する検出数62の欄には、後述する図6のステップS64の処理による“並列分岐検出数”が記録されることになる。
複雑度計算部13は、上記経路計数記録部12によって求められたSFCチャート毎の経路検出数や、各チャート内でのSFCコンポーネント種別毎の検出数を、予め登録されている所定の複雑度計算式に当てはめて、チャート毎の複雑度を計算する。
本例では、この複雑度計算式には、所定の係数(各種の複雑度係数)が含まれるが、この例に限らない。これら各種の複雑度係数の値は、本例では係数入力部32を介して任意の値が設定される(例えばユーザが設定する)。
係数入力部32は、複雑度演算部31による複雑度計算で使用される各複雑度係数(経路数に応じた複雑度係数、あるいはSFCコンポーネントの各種別に応じた各複雑度係数)の値を、ユーザ等に任意に設定させる機能部である。複雑度係数値は‘0’であっても構わない。
図3(a)に、係数入力部32による係数設定画面例を示す。
この係数設定画面例は、下記の複雑度の算出式例(計算式(1))に応じたものであり、図示のように経路数、選択分岐、並列分岐それぞれに関して任意の複雑度係数値を設定させるものである。ここで設定された係数値は、メモリ等に記憶されて、複雑度演算部31による例えば下記の複雑度計算に利用される。
複雑度演算部31は、上記経路検出数や種別毎のコンポーネント検出数や複雑度計算式と、上記各種の複雑度係数の値を用いて、複雑度を計算する。例えば、次式のような計算式(1)でSFCの1つのチャートの複雑度を求める。
SFCの複雑度=経路数の複雑度係数×SFCチャート内の経路の検出数
+選択分岐の複雑度係数×SFCチャート内の選択分岐の検出数
+並列分岐の複雑度係数×SFCチャート内の並列分岐の検出数
・・・計算式(1)
例えば、上記“SFCチャート内の経路の検出数”は上記検出経路数52を用い、“SFCチャート内の選択分岐の検出数”は選択分岐に応じた検出数62を用い、“SFCチャート内の並列分岐の検出数”は並列分岐に応じた検出数62を用いる。
この例では、上記各種の複雑度係数として上記経路数の複雑度係数と選択分岐の複雑度係数と並列分岐の複雑度係数とがあり、上記種別毎のコンポーネント検出数として上記選択分岐の検出数と並列分岐の検出数とがあるが、これは一例であり、この例に限らない。
ここで、例えば、経路数の複雑度係数を‘1’、選択分岐と並列分岐の複雑度係数を両方とも‘0’とすれば、経路数を複雑度として表現することができる。一方、分岐の検出数を複雑度とする場合には、経路数の複雑度係数を‘0’、選択分岐と並列分岐の複雑度係数を両方とも‘1’と設定する。分岐の種別で重み付けを変えて複雑度を算出させることも可能である(例えば、選択分岐の複雑度係数を‘2’、並列分岐の複雑度係数を‘1’とするなど)。
また、上記の通り、上記複雑度の算出式は一例であり、例えば上記複雑度算出式に、SFCコンポーネントの種類を追加することにより変更してもよい。例えば、経路計数記録部12が更にステップやトランジションの数をカウントするようにし、係数入力部32によりステップの複雑度係数やトランジションの複雑度係数を設定させるようにし、これらも用いて複雑度を計算するようにしてもよい。つまり、この例の場合、複雑度の算出式は下記の計算式(2)ようになる。
SFCの複雑度=経路数の複雑度係数×SFCチャート内の経路の検出数
+選択分岐の複雑度係数×SFCチャート内の選択分岐の検出数
+並列分岐の複雑度係数×SFCチャート内の並列分岐の検出数
+ステップの複雑度係数×SFCチャート内のステップの検出数
+トランジションの複雑度係数×SFCチャート内のトランジションの検出数 ・・・計算式(2)
複雑度表示部14は、上記複雑度計算部13により計算されたチャート毎の複雑度の値を表示する。
複雑度一覧表示部41は、上記複雑度演算部31によって算出されたチャート毎の複雑度の値を、例えば一覧で表示する。
図3(b)に、複雑度一覧表示部41による表示例を示す。
図示の例では、上記複雑度計算部13による計算対象の各チャートの識別情報であるチャートNo.71に対応付けて、そのチャートの上記算出された複雑度の値が図示の複雑度72の欄に表示される。尚、チャートNo.71は上記SFCNo.51と同義と見做して構わない。
また、複雑度一覧表示部41は、更に、上記各複雑度72の値を、予め設定されている所定の上限値と比較して、複雑度の値が所定の上限値を超えていた場合、そのことを示す警告を、該当するチャートの例えば複雑度72の欄内に表示するようにしてもよい。この一例が図示の警告マーク73である。
上記上限値は、例えば、上記複雑度上限入力部42を介してユーザにより任意の値が設定されて記憶されているものである。
図3(c)に、複雑度上限入力部42によって表示・管理される上限値設定画面の一例を示す。この設定画面上でユーザが任意の上限値を設定でき、図示の例では‘10’が設定されている。
以下、図4、図5、図6に示すフローチャート図について説明する。
図4は、実施例1の経路計数部の処理フローチャート図であり、本例のSFCプログラム経路数判別処理のフローチャート図である。
図5は、図4のステップS17の処理の詳細フローチャート図である。
図6は、図4のステップS18の処理の詳細フローチャート図である。
図4の処理では、まず、変数“経路数”に初期値(=1)を設定し(ステップS11)、走査開始位置(最上位)をセットして(ステップS12)、ステップS13以降の処理を開始する。つまり、概略的には、処理対象のSFCプログラムを最上位(の位置にあるイニシャルステップ)から順次走査して、SFCプログラムの各SFCコンポーネントを順次処理対象としてステップS14〜S20の処理を実行し、全てのSFCコンポーネントについて処理実行したら(次のSFCコンポーネントが無くなったら;ステップS13,NO)ステップS21を実行して本処理を終了する。
次のSFCコンポーネントがあるならば(ステップS13,YES)、このSFCコンポーネントを取得して(ステップS14)、その種別を判別する(ステップS15)。SFCコンポーネントの種別は、上記の通り、ステップ、トランジション、選択分岐、並列分岐、これらの収束などである。そして、処理対象のSFCコンポーネントの種別が分岐以外であるならば(ステップS15,NO)、ステップS20へ移行する。ステップS20では走査対象を次の(下側の)SFCコンポーネントへ移動させる。そして、ステップS13へ戻る。
一方、処理対象のSFCコンポーネントの種別が分岐であるならば(ステップS15,YES)、選択分岐であれば(ステップS16,YES)ステップS17の処理を実行し、並列分岐であれば(ステップS16,NO)ステップS18の処理を実行する。ステップS17の詳細処理例が図5に示す処理であり、ステップS18の詳細処理例が図6に示す処理である。
そして、上記ステップS17,S18の何れかの処理結果(戻り値;検出経路数)に基づいて、経路数を以下の式により更新する(ステップS19)。
経路数 = 経路数(現経路数)×検出経路数
尚、経路数の初期値は、本例では上記の通り‘1’である。
上記ステップS19の処理を実行したら、上記ステップS20の処理を実行してステップS13へ戻る。
ここで、ステップS17、S18の処理については後に図5、図6で説明するが、上記図24の例の場合、まずステップS17が実行されて戻り値が‘2’となり、この時点では経路数は初期値の‘1’なので、経路数=1×2=2となる。次にステップS18が実行されて戻り値は‘1’となり、現時点の経路数は‘2’であるので、経路数=2×1=2となる。
図24の例では、その後は選択分岐も並列分岐もないまま最後のSFCコンポーネントである図示のトランジションT005_006_Eを処理対象とする処理実行後、ステップS13がNOとなり、現在の(最終的な)経路数を戻り値にセットして(ステップS21)本処理を終了することになる。上記の通り、最終的な経路数は‘2’であるので、戻り値(検出経路数)は‘2’となり、これは、図7に示すように正しい結果が得られたことになる。
図24のSFCチャートの例の場合には、図7に示すように、チャート前半の選択分岐aによる経路が2通り、チャート後半の並列分岐cによる経路は1つとなるので、チャート全体での経路数は2となる。
次に、以下、図5、図6について説明する。まず、図5について説明する。
図5に示す上記ステップS17の処理の詳細例では、まず、当該処理対象の選択分岐内の分岐数を取得する(ステップS31)。これは、例えば上記テーブル構成の例であれば、当該選択分岐に対応する上記“次のコンポーネントの名称”に格納される名称の数をカウントすればよい。
次に、分岐走査カウンタを初期化(=0)すると共に、変数“分岐毎の内部経路検出数”に初期値(=1)をセットする(ステップS32)。ここで、変数“分岐毎の内部経路検出数”は、上記ステップS31で得た分岐数の分だけ用意する。ここでは、この様な各変数を、α、β等で表現するものとすると、仮に分岐数=3であったならば、変数α、β、γを用意すると共に、これら複数の変数全てに初期値(=1)をセットする(α=1、β=1、γ=1)。
但し、本説明においては、具体例として、分岐数は2であるものとし(図24、図25の例のように、左側と右側とに分岐)、これより、上記変数“分岐毎の内部経路検出数”として変数αと変数βの2つが用意され、各々に初期値(=1)がセットされるものとして説明する。尚、左側の分岐に対しては変数α、右側の分岐に対しては変数βが、割り当てられるものとする。これは、後述する図6の処理(並列分岐)においても同様とするが、並列分岐の場合は変数γ、δとするものとする。
上記ステップS32の処理を実行したら、まず、最初の処理対象の分岐(最も左の分岐)を走査先にセットして(ステップS33)、処理対象の分岐上の先頭から順次SFCコンポーネントを走査して、これら各SFCコンポーネントの種別に応じて処理を分岐させる(ステップS34)。
すなわち、まず、対象のSFCコンポーネントの種別が分岐・収束以外であれば、走査対象を次の(下側の)SFCコンポーネントへ移動させて(ステップS39)ステップS34に戻る。
また、対象のSFCコンポーネントの種別が分岐であれば、ステップS35〜S38の処理を実行する。
これは、分岐の種類が選択分岐である場合には(ステップS35,YES)ステップS36の処理を実行し、分岐の種類が並列分岐である場合には(ステップS35,NO)ステップS37の処理を実行する。そして、ステップS36,S37の何れかの処理を実行後、ステップS38の処理を実行する。
ステップS36の処理は上記ステップS17の処理と同じであり、従って図5の処理を行うことになる。上記ステップS36の処理(図5の処理)の終了時の後述するステップS47の処理により戻り値(検出経路数)が得られるので、この戻り値を該当する(処理対象の分岐に応じた)上記“分岐毎の内部経路検出数”にセットする(ステップS38)。
一方、ステップS37の処理は上記ステップS18の処理と同じであり、従って図6の処理を行うことになる。上記ステップS37の処理(図6の処理)の終了時の後述するステップS67の処理により戻り値(検出経路数)が得られるので、この戻り値を該当する(処理対象の分岐に応じた)上記“分岐毎の内部経路検出数”にセットする(ステップS38)。
例えば図25(a)の例の場合、まず図示の選択分岐aに応じてステップS17の処理が開始され、このステップS17の処理中であって選択分岐aの左側分岐に係わる処理中に(よって該当する変数は変数α)入れ子の分岐(図示の選択分岐c)があることから、選択分岐cに応じたステップS36の処理が実行されることになる。この場合、ステップS36の処理による戻り値(検出経路数)は‘2’となるので、ステップS38で変数αに‘2’がセットされることになる。
また、図25(a)の例の場合、ステップS17の処理中であって選択分岐aの右側分岐に係わる処理中に(よって該当する変数は変数β)入れ子の分岐(図示の並列分岐e)があることから、並列分岐eに応じたステップS37の処理(図6の処理)が実行されることになる。この場合、ステップS37の処理による戻り値(検出経路数)は‘1’となるので、ステップS38で変数βに‘1’がセットされることになる。
この例の場合、最終的に、変数αは‘2’、変数βは‘1’となるので、後述するステップS45で総和を求めると2+1=3となり、ステップS47による戻り値は‘3’となり、従って上記ステップS19で経路数=3となる。
また、ステップS34において処理対象のSFCコンポーネントの種別が“収束”であると判定された場合には、この収束が選択の収束であることを確認し(ステップS40)、もし並列の収束である場合には(ステップS40,NO)、SFC異常終了とする(ステップS46)。図5の処理は選択分岐に応じて開始されるので、その収束は選択でなければならず、もし並列の収束であるならば、対象のプログラム自体に異常(記述ミスなど)があることになるからである。
選択の収束であるならば(ステップS40,YES)、上記分岐走査カウンタを+1インクリメントして(ステップS41)、このカウンタ値が上記分岐数に達したか否かをチェックする(分岐走査カウンタ<分岐数?)(ステップS42)。カウンタ値が分岐数未満である場合には(ステップS42,YES)未処理の分岐があることになるので、次の分岐を走査先にセットして(ステップS43)ステップS34に戻る。そして、次の処理対象の分岐に関しても、上記と同様に、“収束”が検出されるまでステップS34〜S38またはS39の処理を繰り返し実行し、“収束”が検出されたらステップS40の処理へ移行する。
本例では分岐数が‘2’であり(左側と右側)、左側の分岐に係わる処理実行完了してステップS41でカウンタ値=1に更新した後、処理対象を右側の分岐にして、右側の分岐に係わる処理実行完了してステップS41でカウンタ値=2に更新すると、ステップS42の判定がNOとなり(分岐走査カウンタ=分岐数)、ステップS44へ移行する。
ステップS44では、変数“選択分岐検出数”を+1インクリメントする。
ここで、説明していなかったが、変数“選択分岐検出数”は、処理対象のSFCプログラム全体における“選択分岐”の数をカウントする為の変数である。つまり、上記変数“分岐毎の内部経路検出数”とは異なるものである。この変数“選択分岐検出数”は、例えば図4の処理開始の際に初期値=0が設定されている。そして、図5の処理が実行される毎に+1インクリメントされる。
そして、最後に、全ての“分岐毎の内部経路検出数”の「総和」を求めて、この「総和」を戻り値(検出経路数)にセットして(ステップS45)本処理を正常終了する(ステップS47)。この戻り値(検出経路数)を用いて上記ステップS19の処理が実行されることになる。
尚、上記の通り、本例では「総和」=変数α+変数βとなる。
次に、以下、図6について説明する。
図6に示す上記ステップS18の処理の詳細例では、まず、当該処理対象の並列分岐内の分岐数を取得する(ステップS51)。
次に、分岐走査カウンタを初期化(=0)すると共に、変数“分岐毎の内部経路検出数”に初期値(=1)をセットする(ステップS52)。図5で説明したように、本説明においては、分岐数は2であるものとし、これより、上記変数“分岐毎の内部経路検出数”として変数γと変数δの2つが用意され、各々に初期値(=1)がセットされるものとして説明する。尚、左側の分岐に対しては変数γ、右側の分岐に対しては変数δが、割り当てられるものとする。
上記ステップS52の処理を実行したら、まず、最初の処理対象の分岐(最も左の分岐)をセットして(ステップS53)、処理対象の分岐上の先頭から順次SFCコンポーネントを走査して、これら各SFCコンポーネントの種別に応じて処理を分岐させる(ステップS54)。
すなわち、まず、対象のSFCコンポーネントの種別が分岐・収束以外であれば、走査対象を次の(下側の)SFCコンポーネントへ移動させて(ステップS59)ステップS54に戻る。
また、対象のSFCコンポーネントの種別が分岐であれば、ステップS55〜S58の処理を実行する。
これは、分岐の種類が選択分岐である場合には(ステップS55,YES)ステップS56の処理を実行し、分岐の種類が並列分岐である場合には(ステップS55,NO)ステップS57の処理を実行する。そして、ステップS56,S57の何れかの処理を実行後、ステップS58の処理を実行する。
ステップS56の処理は上記ステップS17の処理と同じであり、従って図5の処理を行うことになる。ステップS56の処理(図5の処理)の終了時の上記ステップS47の処理により戻り値(検出経路数)が得られるので、この戻り値を該当する(処理対象の分岐に応じた)上記“分岐毎の内部経路検出数”にセットする(ステップS58)。
一方、ステップS57の処理は上記ステップS18の処理と同じであり、従って図6の処理を行うことになる。ステップS57の処理(図6の処理)の終了時の後述するステップS67の処理により戻り値(検出経路数)が得られるので、この戻り値を該当する上記“分岐毎の内部経路検出数”にセットする(ステップS58)。
例えば図25(b)の例の場合、まず図示の並列分岐gに応じてステップS18の処理が開始され、このステップS18の処理中であって並列分岐gの左側分岐に係わる処理中に(よって該当する変数は変数γ))入れ子の分岐(図示の選択分岐i)があることから、選択分岐iに応じたステップS56の処理が実行されることになる。この場合、ステップS56の処理による戻り値(検出経路数)は‘2’となるので、ステップS58で変数γに‘2’がセットされることになる。
また、図25(b)の例の場合、ステップS18の処理中であって並列分岐gの右側分岐に係わる処理中に(よって該当する変数は変数δ)入れ子の分岐(図示の選択分岐k)があることから、選択分岐kに応じたステップS56の処理(図5の処理)が実行されることになる。この場合、ステップS56の処理による戻り値(検出経路数)は‘2’となるので、ステップS58で変数δに‘2’がセットされることになる。
この例の場合、最終的に、変数γは‘2’、変数δは‘2’となるので、後述するステップS65で後述する「積」を求めると2×2=4となり、ステップS67による戻り値は‘4’となり、従って上記ステップS19で経路数=4となる。
また、ステップS54において処理対象のSFCコンポーネントの種別が“収束”であると判定された場合には、この収束が並列の収束であることを確認し(ステップS60)、もし選択の収束である場合には(ステップS60,NO)、SFC異常終了とする(ステップS66)。図6の処理は並列分岐に応じて開始されるので、その収束は並列でなければならず、もし選択の収束であるならば、対象のプログラム自体に異常(記述ミスなど)があることになるからである。
並列の収束であるならば(ステップS60,YES)、上記分岐走査カウンタを+1インクリメントして(ステップS61)、このカウンタ値が上記分岐数に達したか否かをチェックする(分岐走査カウンタ<分岐数?)(ステップS62)。カウンタ値が分岐数未満である場合には(ステップS62,YES)未処理の分岐があることになるので、次の分岐を走査先にセットして(ステップS63)ステップS54に戻る。そして、次の処理対象の分岐に関しても、上記と同様に、“収束”が検出されるまでステップS54〜S58またはS59の処理を繰り返し実行し、“収束”が検出されたらステップS60の処理へ移行する。
本例では分岐数が‘2’であり(左側と右側)、左側の分岐に係わる処理実行完了してステップS61でカウンタ値=1に更新した後、処理対象を右側の分岐にして、右側の分岐に係わる処理実行完了してステップS61でカウンタ値=2に更新すると、ステップS62の判定がNOとなり、ステップS64へ移行する。
ステップS64では、変数“並列分岐検出数”を+1インクリメントする。
ここで、説明していなかったが、変数“並列分岐検出数”は、処理対象のSFCプログラム全体における“並列分岐”の数をカウントする為の変数である。つまり、上記変数“分岐毎の内部経路検出数”や変数“選択分岐検出数”とは異なるものである。この変数“並列分岐検出数”は、例えば図4の処理開始の際に初期値=0が設定されている。そして、図6の処理が実行される毎に+1インクリメントされる。
そして、最後に、全ての“分岐毎の内部経路検出数”の「積」を求めて、この「積」を戻り値(検出経路数)にセットして(ステップS65)本処理を正常終了する(ステップS67)。この戻り値を用いて上記ステップS19の処理が実行されることになる。
尚、上記の通り、本例では「積」=変数γ×変数δとなる。
図24のSFCチャートの例の場合には、図7に示すように、チャート前半の選択分岐aによる経路が2通り、チャート後半の並列分岐cによる経路は1つとなるので、チャート全体での経路数は2となる。
これに対して、上述した処理によって得られる経路数も‘2’となるので、正しい結果が得られることになる。すなわち、図24の例の場合、まず選択分岐aによりステップS16がYESとなってステップS17(図5)の処理が実行されると、当該選択分岐aの中には入れ子の分岐は存在しないのでステップS36、S37の処理が実行されることなく、従って上記変数α、βは初期値(=1)のままとなるので、これらの総和は‘2’となる。従って、ステップS17の戻り値(検出経路数)は‘2’となるので、ステップS19で経路数=1×2=2となる。尚、選択分岐aの中とは、選択分岐aとその収束bとの間を意味する。
図24の例の場合、続いて、並列分岐cによりステップS16がNOとなってステップS18(図6)の処理が実行されると、当該並列分岐cの中には入れ子の分岐は存在しないのでステップS56、S57の処理が実行されることなく、従って上記変数γ、δは初期値(=1)のままとなるので、これらの積は‘1’となる。従って、ステップS18の戻り値(検出経路数)は‘1’となるので、ステップS19で経路数=2×1=2となって、この‘2’がステップS21で戻り値にセットされることになる。従って、経路数=2が計測されることになる。
また、上記図25(a)、(b)に示すSFCプログラムの例の場合には、上記処理により検出される経路数は、図8(a)、(b)に示す通りとなる。
まず、図25(a)の例の場合には、図8(a)に示すように、まず、最上段の選択分岐aによる経路は2通りであり、その左側分岐経路内において選択分岐cにより2通りの経路があり、結果として、T001からT002に至る左側の経路は2通りとなる。一方、T003からT006に至る右側の経路は、並列分岐のため経路は1つとなる。
以上から、このチャートの経路数は図8(a)に示す通り‘3’となる。これに対して、上述した処理によって計測される経路数も‘3’となるので、正しい計測結果が得られることになる。
図25(b)の例の場合には、図8(b)に示すように、まず、最上段の並列分岐gによる経路は1つであるが、その内部の左側分岐経路内に選択分岐iがあり、この経路が2通りとなる。一方、右側分岐経路も選択分岐kがあるので、同様に経路が2通りとなる。これらの左右の経路は同時活性するため、同時活性となる経路の組合せは2×2=4通りとなる。
以上から、このチャートの経路数は図8(b)に示す通り‘4’となる。これに対して、上述した処理によって計測される経路数も‘4’となるので、正しい計測結果が得られることになる。
尚、上記“チャートの経路数”や“上述した処理によって計測される経路数”は、対象のSFCプログラムの開始から終了までのルートの数(開始から終了に至るまでに取り得るルートの数)である。但し、ここでは、上記並列分岐のようにルートが複数あってもシーケンスが並行動作する場合には、並列分岐に係わる経路数は‘1’とするものと定義している。
(発明の効果)
本発明により、図示表現プログラムであるSFCにおいても、プログラムの品質を客観的に評価することが可能となる。
本手法では、対象となるSFCチャートの経路数を求める。または/及び、対象となるSFCチャート中に含まれるSFCコンポーネント(種別が、ステップ/トランジション/分岐/収束、等)の数を、種別毎にカウントする。そして、経路数または種別毎のコンポーネント数の何れか一方、あるいは経路数と種別毎のコンポーネント数の両方を用いて、SFCチャートの複雑度を算出する。これは、例えば上述したように、経路数、各種コンポーネントそれぞれに対応する任意の係数を、それぞれ、経路数、種別毎のコンポーネント数に乗じたうえで、総和を求めることで、複雑度を算出する。係数は‘0’であってもよい。仮に、各種コンポーネントに対応する係数を全て‘0’にしたならば、複雑度は、経路数のみを用いて算出されることになる。
上記SFC複雑度をチャート毎に計算し、その結果を一覧表等に表示する。更に、設定された上限値を超えた場合、強調表示する等の評価を加えた表示を行うことにより、SFCプログラムの複雑度評価結果をユーザが把握し易くできるようにしてもよい。
このように、本発明によれば、図示言語であるSFCで作成されたプログラムについて、複雑度を定義し測定することができ、プログラムの品質を客観的に評価することができる。
尚、本説明において“/”は基本的には“または”“あるいは”の意味であり(数式は除く)、例えば、「または/及び」は、「または、あるいは、及び」を意味する。
また、尚、上記経路計数記録部12は、例えば、任意のSFCプログラムの開始から終了までの経路の数を求め、または/及び、該SFCプログラムにおける種別毎の要素数を計数する計数部であると言える。種別毎の要素数の一例が、上述した種別毎のコンポーネント検出数であり、上述した一例ではSFCチャート内の選択分岐の検出数、SFCチャート内の並列分岐の検出数等であるが、これらの例に限らない。
上記複雑度計算部13は、この計数部により求められた上記経路数または/及び種別毎の要素数に基づいて、上記SFCプログラムの複雑度を算出する機能部であると言える。
また、上記図5の処理(選択分岐内経路数検出処理)は、例えば、該選択分岐内の分岐毎に、その分岐上に更に選択分岐または並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数(一例が上記変数α、βの最終値)を求めて、全ての分岐の分岐経路数の総和を、該選択分岐内の経路数とする処理であると言うこともできる。
また、上記図6の処理(並列分岐内経路数検出処理)は、例えば、該並列分岐内の分岐毎に、その分岐上に更に選択分岐または並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数(一例が上記変数γ、δの最終値)を求めて、全ての分岐の前記分岐経路数の積を、該並列分岐内の経路数とする処理であると言うこともできる。
また、上記図4の処理は、例えば、対象のSFCプログラムの開始から走査して各要素を検出し、選択分岐または並列分岐を検出すると、該検出した選択分岐内の経路数を求める処理(一例が図5の処理)または該検出した並列分岐内の経路数を求める処理(一例が図6の処理)を実行する処理であると言うこともできる。
更に、上記図4の処理は、例えば、経路数の初期値を1とした後、上記検出した選択分岐内の経路数を求める処理または前記検出した並列分岐内の経路数を求める処理が実行される毎に、実行結果として得られる値(上記検出経路数)を現在の上記経路数の値に乗じることで経路数の値を更新し(一例が上記ステップS19の処理)、最終的な経路数の値を、上記対象のSFCプログラムの開始から終了までの経路の数とする処理であると言うこともできる。
以上、実施例1について説明した。
以下、実施例2について説明する。
実施例2は、アクションまで含めた複雑度の評価を可能とする実施例である。
ここで、「アクション」については従来技術で簡単に説明したが、ここでは具体例を示して更に詳細に説明する。
「アクション」については従来技術で簡単に説明したように、任意のステップに連結される場合があり、アクションクオリファイア種別などの情報が含まれる。アクションクオリファイア種別は、例えば11種類存在する(N/S/R/L/D/P/SD/DS/SL/P1/P0,ヌルクオリファイア含まず)。各「アクション」は、これらのうち1つのアクションクオリファイア種別を有する。
図9は、SFCプログラムの具体例(その4)である。
図10は、アクションクオリファイア種別の具体例を示す図である。
図9は、SFCで作成されたプログラム(チャート)の一例であり、アクションも記述された例である。この例では、アクションの記述以外は(各ステップ、各トランジション、分岐・収束の構成は)、上記図24に示す例と同一であり、その説明は省略する。
そして、図9の例では、ステップS001、S004にはそれぞれ一つのアクションが連結され、ステップS006には二つのアクションが連結されている。
上記従来技術で説明したように、「アクション」(アクションブロック)は、連結しているステップが活性になった時の動作を表すものであり、各ステップに0個以上のアクションブロックが連結される。換言すれば、アクションブロックが連結されないステップも存在する。
上述したように、アクションブロックは、アクションクオリファイア種別やアクション名や、アクションの内容(言語種別、変数名/処理名、TIME型の持続時間など)等の所定の情報群からなる。尚、変数名は例えばBOOL型の識別子であり、処理名はステップ活性化中に動作するプログラム(予め任意に作成されている)のプログラム名などである。持続時間は、時間設定が必要なアクションクオリファイア種別(L/D/SD/DS/SL)である場合に設定され、それ以外のアクションクオリファイア種別の場合には未設定で時間‘0’の扱いとなる。
図9では、各アクションに関して、アクションクオリファイア種別とアクション名を示してあり、更に場合によって持続時間(設定時間)も示している。
図9の例では、ステップS001に連結されるアクションは、アクションクオリファイア種別が“S”でアクション名が“ACT001”のアクションである。また、ステップS004に連結されるアクションは、アクションクオリファイアが“DS”でアクション名が“ACT002”で設定時間が5秒のアクションである。また、ステップS006には、アクションクオリファイアが“R”でアクション名が“ACT001”のアクションと、アクションクオリファイアが“R”でアクション名が“ACT002”のアクションが、連結されている。
尚、ここでは、アクション名は変数名(BOOL型変数名)と同じになっているものとする。これより、図9の例では、各アクションにはACT001またはACT002というBOOL型の変数が設定されている。また、ステップS004に連結されているアクション(ACT002)は、持続時間の設定を必要としているアクションクオリファイアであり、設定時間として5秒が設定されている。各アクションは、連結しているステップが活性状態の時のみ、定義された内容に基づいて動作する。
ステップS001が活性状態に移行すると、S001のアクションとしてBOOL型変数ACT001に対するS(セット(保持))動作が行われる。具体的にはACT001がTRUE(=1)となる。シーケンスが進み、ステップS004が活性状態に移行すると、S004のアクションとしてACT002に対するDS(遅延後保持)動作が行われ、S004が活性となった時点から5秒後にACT002がTRUE(=1)となる。更にシーケンスが進み、S006が活性状態に移行すると、S006のアクションとしてACT001およびACT002に対するR(リセット)動作が行われ、これよりACT001、ACT002は両方ともFALSE(=0)となる。
このように、セット動作後の状態が保持されるアクションに対しては、通常は、保持された状態をリセットする為のリセット動作が用意される。つまり、通常は、任意の同一のアクション名(変数名)に対して、セットのアクションとリセットのアクションとがペアになって記述されている。図9の例では、ステップS001に連結される“S”で“ACT001”のアクションと、ステップS006に連結される“R”で“ACT001”のアクションとが、ペアになっている。同じく、ステップS004に連結される“DS”で“ACT002”のアクションと、ステップS006に連結される“R”で“ACT002”のアクションとが、ペアになっている。
通常は、上記のようにペアになっているが、ペアになっていない場合も起こり得る。これは、何等かの理由があって意図的に行っている場合もあるが、単純に、記述ミスである場合も少なくない。後述する実施例3では、この様にペアになっていない記述を検出することもできる。
尚、上記11種類のアクションクオリファイア(N/S/R/L/D/P/SD/DS/SL/P1/P0)の意味は、図10に示す通りであり、以下、簡単に説明する。
Nは“非保持”、Rは“リセット(優先)”、Sは“セット(保持)”、Lは“時間限定”、“D”は時間遅延、Pは“パルス”、SDは“保持後遅延”、DSは“遅延後保持”、SLは“保持後時間限定”、P1は“パルス(立ち上がりエッジ)”、P2は“パルス(立ち下がりエッジ)”を意味するが、これらについて特に詳細には説明しない。尚、11種類の何れも付与されない場合は、非保持(ヌルクオリファイア)を意味する。
ここで、これら11種類のうちの特定の5種類(L/D/SD/DS/SL)が、時間設定が必要なアクションクオリファイアであり、アクションクオリファイアがこれら5種類の何れかであるアクションブロックでは、上記の通り持続時間が設定される。
「アクションブロック」には、例えば以下に列挙する各種情報(管理情報)が、含まれている。
・アクション設定情報
・アクション名
・アクションクオリファイア
・アクションボディ(アクションの内容;以下の(a)、(b)、(c)の内容を含む)
(a)アクション言語種別((変数/IL/ST/FBD/SFC/複数言語の複合)のどれかを示す数値/記号など)
(b)アクション(ブール型変数名、又は、アクション処理として呼び出す処理名)
(c)時間(遅延時間などの設定内容)
少なくともこれらの情報がアクション毎に設定されているものとする。
また、尚、ここでは、アクション言語種別が「変数」である場合、アクション名とアクションボディ内のアクションに設定されるブール変数名は同じとする。
図11に、実施例2のSFCメトリクス測定装置の構成図を示す。
図示の例のSFCメトリクス測定装置80は、SFC格納部81、経路計数記録部82、複雑度計算部83、複雑度表示部84を有する。
上記経路計数記録部82は、経路計数部91、内部経路記録部92、経路数記録部93を有する。
上記複雑度計算部83は、複雑度演算部101、係数入力部102を有する。
上記複雑度表示部84は、複雑度一覧表示部111、複雑度上限入力部112を有する。
尚、SFCメトリクス測定装置80や後述するSFCメトリクス測定装置150は、例えばパソコン、サーバ装置等の一般的なコンピュータ装置上で実現される。これより、SFCメトリクス測定装置80,150等は、ハードウェア的には、特に図示しないが一般的なコンピュータ装置の構成を有する。つまり、例えば不図示のCPU等の演算プロセッサ、ハードディスク、メモリ等の記憶部、通信機能部、ディスプレイ等の表示部、キーボード、マウス等の操作入力部などを有する。
上記不図示の記憶部には予め所定のアプリケーションプログラムが記憶されている。上記不図示の演算プロセッサがこのアプリケーションプログラムを実行することで、図11に示す上記各種処理機能部81,82,83,84,91,92,93,101,102,111,112などの処理機能が実現される。これは後述する図18に示すSFCメトリクス測定装置150の各種処理機能についても同様である。
図11における上記SFC格納部81や後述する図18におけるSFC格納部151は、SFCプログラムを図示情報として保存するものであり、任意のSFCプログラム(チャート)について、チャート毎にSFCの各種コンポーネント(ステップ、トランジション、分岐(選択分岐や並列分岐)、収束、アクション等の各種要素)と、それぞれのコンポーネント間の位置を含めた接続関係が格納されていればよい。
但し、この例に限らず、特に具体例などは示さないが例えばSFC格納部11に関して説明したように、図示情報としてではなくテーブル情報としてSFCプログラムが保存されていてもよい。尚、この場合、各「アクションブロック」にはユニークな識別情報が付与されており、ステップには自己に連結している「アクションブロック」の識別情報が含まれているものとしてもよいが、この例に限らない。
経路計数記録部82は、SFC格納部81に格納されているSFCの各チャートを走査することで、各チャートの経路数を求める。更に、各チャートにおけるSFCコンポーネントの数を、種別毎に計数する。種別毎とは、例えば、ステップ、トランジション、選択分岐、並列分岐、アクション等である。更に、アクションに関して更に詳細に分類して(例えばアクションクオリファイアの種別毎、アクション言語種別毎など)計数してもよい。この処理は、上記経路計数部91が実行し、処理結果が経路数記録部93や内部経路記録部92に記録される。
経路計数部91は、SFC格納部81に格納されているSFCのチャート毎に、図示情報等を走査し、そのチャートの開始から終了までの経路数を計測(検出)する。これは、例えば、イニシャルステップからチャート終端(又は、イニシャルステップに戻る)までの各経路を探索して経路数を計測(検出)する。当該経路数の検出自体は、上記経路計数部21と同じであってよく、ここでは特に説明しない。
また、経路計数部91は、チャート内に出現するSFCコンポーネントの数を、種別毎に計数する。当該各SFCコンポーネントの種別毎の計数は、例えば、分岐の検出の他、ステップ、トランジション、アクションについてそれぞれ検出するものであり、アクションの検出以外は、上記経路計数部21と略同様と見做しても構わない。
アクションの検出には、例えば、アクションクオリファイアの種別毎の検出、アクション処理の言語種別毎の検出等が、含まれてもよい。
経路計数部21による上記処理の詳細な具体例を、図12、図13、図14、図15に示し、後に説明するものとする。
内部経路記録部92は、経路計数部91が経路探索中に検出したSFCコンポーネントの数を、種別毎に記録するものである。例えば、分岐の検出数の他、ステップ、トランジション、アクションの検出数、アクションにおけるアクションクオリファイアの種別毎の検出数、アクション処理の言語種別毎の検出数が、記録される(一例を図16に示し後に説明する)。
経路数記録部93は、経路計数部91の経路探索中に検出した経路数を、記録するものである。これは、上記経路数記録部23と略同様に、SFCのチャート内の経路数を走査する途中で分岐コンポーネントを検出した場合、経路情報としてその数を記録しておくものである。尚、図9のSFCチャートの例では、アクションを除く構成は図24と同様であるので、検出される経路数も同じく‘2’となる。
複雑度計算部83は、上記経路計数記録部82によって求められたSFCチャート毎の経路検出数や、各チャート内でのSFCコンポーネント種別毎の検出数を、予め登録されている所定の複雑度計算式に当てはめて、チャート毎の複雑度を計算する。
本例では、この複雑度計算式には、各種の複雑度係数が含まれるが、この例に限らない。これら各種の複雑度係数の値は、本例では係数入力部102を介して任意の値が設定される(例えばユーザが設定する)。係数入力部102は、複雑度演算部101による複雑度計算で使用される各複雑度係数(経路数に応じた複雑度係数、あるいはSFCコンポーネントの各種別に応じた各複雑度係数)の値を、ユーザ等に任意に設定させる機能部である。当該複雑度係数の設定画面の一例を図17に示し後に説明する。尚、複雑度係数値は‘0’であっても構わない。
複雑度演算部101が、これら各種の複雑度係数の値と、上記経路計数記録部82によって得られた上記各種検出数と、上記複雑度計算式を用いて、チャート毎の複雑度を計算する。
上記複雑度計算式の一例を以下に示すが(計算式(3))、この例に限らない。
Figure 2018018510
上記複雑度計算式(3)によって、例えば、分岐の検出数、ステップ、トランジション、アクションの各検出数、アクションにおけるアクションクオリファイアの種別毎の各検出数、アクション処理の言語種別毎の各検出数の全てを考慮した複雑度計算が実現できるが、この例に限らない。上記複雑度計算式(上記計算式(3))を用いて、これらの中の一部の検出数のみを考慮した複雑度計算も実現できる。これは、対象以外の複雑度係数を全て‘0’にすることで実現できる。
例えば、上記複雑度計算式において、経路数の複雑度係数を‘1’、その他の複雑度係数を全て‘0’とすれば、実質的に、経路数に応じた複雑度を計算するものとなる。あるいは、上記複雑度計算式を、実質的に、分岐の検出数に応じた複雑度を計算するものとしたい場合には、選択分岐と並列分岐の複雑度係数をそれぞれ‘1’とし、その他の複雑度係数を全て‘0’とすればよい。
あるいは、アクションに着目して複雑度を求めたいならば、アクションクオリファイアやアクション言語種別の複雑度係数を‘0’以外の値に設定し、その他の複雑度係数を全て‘0’とすれば、アクションに応じた複雑度を算出するものとすることができる。
あるいは、上記のような任意の複雑度係数を‘0’にする例に限らず、特に重視したい対象の複雑度係数を他より大きくするようにしてもよい。例えば、時間設定を必要とするアクションクオリファイア(L/D/SD/DS/SL)を重視し、これらの複雑度係数を比較的大きく設定する等してもよい。あるいは、アクションの言語種別に着目して、特定の言語で書かれたアクションの複雑度係数を比較的大きく設定するなどしてもよい。
複雑度表示部84は、上記複雑度計算部83により計算されたチャート毎の複雑度の値を表示する。複雑度表示部84(その複雑度一覧表示部111、複雑度上限入力部112)の機能自体は、上記複雑度表示部14(その複雑度一覧表示部41、複雑度上限入力部42)の機能と同様であってよい。よって、ここでは特に説明しないが、例えば上記図3(b)や図3(c)と同様の表示が行われるものであってよい。
図12、図13、図14、図15に、経路計数部21の処理フローチャート図を示す。
尚、これら図面において上記図4、図5、図6における処理ステップと、同様の処理ステップには、同一のステップ番号を付してあり、その説明は省略する。
図12において、図示のステップS11、S12、S13、S14、S15、S16、S19,S20、S21の処理は、上記図4におけるステップS11、S12、S13、S14、S15、S16、S19,S20、S21の処理と略同様であってよく、ここでは特に説明しない。
図12の処理が図4と異なる点は、まず、ステップS15の判定がNOである場合(つまり、処理対象のSFCコンポーネントの種別が“分岐”以外である場合)、図4ではそのままステップS20に移行したが、図12ではステップS71の「SFCコンポーネントカウント処理」を実行して、ステップS20へ移行する。
ここで、図13に、ステップS71の「SFCコンポーネントカウント処理」の詳細フローチャートを示す。図13については後に説明する。
また、図12の処理が図4と異なる点は、処理対象のSFCコンポーネントの種別が、選択分岐であれば(ステップS16,YES)ステップS72の“選択分岐内経路数取得”処理を実行し、並列分岐であれば(ステップS16,NO)ステップS73の“並列分岐内経路数取得”処理を実行する点である。
ここで、図14はステップS72の“選択分岐内経路数取得”処理の詳細フローチャート図である。図15はステップS73の“並列分岐内経路数取得”処理の詳細フローチャート図である。
図14において、図5における処理ステップと、同様の処理ステップには、同一のステップ番号を付してあり、その説明は省略する。これより、図14に示すように、図5の処理と異なる点は、下記の1点のみである。
すなわち、図5では、ステップS34の判定において、処理対象のSFCコンポーネントの種別が“分岐・収束以外”と判定された場合、上記ステップS39の処理を実行した。これに対して、図14では、ステップS34の判定において、処理対象のSFCコンポーネントの種別が“分岐・収束以外”と判定された場合、ステップS91の「SFCコンポーネントカウント処理」を実行して、ステップS39を実行する。ステップS91の「SFCコンポーネントカウント処理」は、ステップS71の「SFCコンポーネントカウント処理」と同じであってよく、上記の通りその詳細は図13に示し後に説明する。
また、図15において、図6における処理ステップと、同様の処理ステップには、同一のステップ番号を付してあり、その説明は省略する。これより、図15に示すように、図6の処理と異なる点は、下記の1点のみである。
すなわち、図6では、ステップS54の判定において、処理対象のSFCコンポーネントの種別が“分岐・収束以外”と判定された場合、上記ステップS59の処理を実行した。これに対して、図15では、ステップS54の判定において、処理対象のSFCコンポーネントの種別が“分岐・収束以外”と判定された場合、ステップS92の「SFCコンポーネントカウント処理」を実行して、ステップS59を実行する。ステップS92の「SFCコンポーネントカウント処理」は、ステップS71の「SFCコンポーネントカウント処理」と同じであってよく、上記の通りその詳細は図13に示し後に説明する。
ここで、以下、図13の処理について説明する。
上記の通り、図13は、「SFCコンポーネントカウント処理」の詳細フローチャート図である。
図13の処理例では、処理対象のコンポーネントがステップであるか否かを判定し(ステップS81)、ステップでは無い場合(すなわち、トランジションである場合には)(ステップS81,NO)、トランジション数を+1インクリメントして(ステップS83)、本処理を終了する。尚、トランジション数に限らず、本処理における何等かの検出数のカウント処理(+1インクリメント)は、例えば図16に示す検出数記録テーブル120における該当レコードの検出数123に対して行う。例えば上記ステップS83の処理は、図16のSFCコンポーネント種別122が“トランジション”のレコードの検出数123を、+1インクリメントするものとなる。
一方、処理対象のコンポーネントがステップである場合には(ステップS81,YES)、まず、ステップの数を+インクリメントする(ステップS82)。そして、このステップに、1以上のアクションが連結されているか否かを判定し(ステップS84)、アクションが連結されていないならば(ステップS84,NO)、そのまま本処理を終了する。
一方、そのステップにアクション(アクションブロック)が1以上連結されている場合には(ステップS84,YES)、連結されているアクションブロックを1つ取得して(ステップS85)、取得した情報に基づいてステップS86,S87の処理を実行する。尚、ステップS86,S87のインクリメント処理も、上記と同様、内部経路記録部92の検出数記録テーブル120の該当レコードの検出数123を更新する処理となる。
ここで、アクションブロックに含まれる情報の一例は、既に述べたように、上記アクション名、アクションクオリファイア、アクション言語種別等である。これより、取得したアクションブロックのアクションクオリファイア種別により、このアクションクオリファイア種別の検出数(該当レコードの検出数123)を+1インクリメントする(ステップS86)。また、取得したアクションブロックのアクション言語種別により、このアクション言語種別の検出数(該当レコードの検出数123)を+1インクリメントする。
仮に、取得したアクションブロックのアクションクオリファイアが“R”、アクション言語種別が“IL”であったとするならば、後述する図16において、SFCコンポーネント種別122が「アクションクオリファイア:R」に対応する検出数123が、+1インクリメントされると共に、「アクション言語種別:IL」に対応する検出数123が、+1インクリメントされることになる。
尚、図には示していないが、例えばステップS85の処理に伴って、アクションの検出数もカウントする。ステップS85の処理の際に、例えば、検出数記録テーブル120においてSFCコンポーネント種別122が“アクション”であるレコードの検出数123を、+1インクリメントする。
上述したように、アクションを検出した場合、アクションの検出数をカウントするだけでなく、アクションクオリファイア種別ごと、アクション言語種ごとにカウントすることで、アクションに関してより詳細な記録が残せることになる。
上記ステップに連結しているアクションが他にもある場合には(ステップ88,YES)、ステップS85に戻って次のアクションブロックの取得処理などや上記ステップS86,S87の処理を実行し、次のアクションが無ければ(ステップS88,NO)本処理を終了する。
図16は、内部経路記録部92に記録される検出数記録テーブル120の具体例である。
図示の例の検出数記録テーブル120は、No.121、SFCコンポーネント種別122、検出数123の各データ項目から成る。No.121は単なる通し番号などである。SFCコンポーネント種別122には、予め、各種のSFCコンポーネント種別が登録されている。つまり、SFCコンポーネント種別122には、予め、図示のステップ、トランジション、選択分岐、並列分岐、アクション、各種のアクションクオリファイア、各種のアクション言語種別が、登録されている。
検出数123には、各種のSFCコンポーネント種別の処理対象プログラム(チャート)における検出数が記録される。つまり、様々なSFCコンポーネント種別122それぞれの検出数が、検出数123に記録される。全ての検出数123は初期値が‘0’であり、検出される毎に上記ステップS82,S83、S86,S87等のように+1インクリメントされる。
そして、上記のように、これら各種のSFCコンポーネント種別毎の検出数123と、任意に設定された各種の複雑度係数に基づいて、上記複雑度計算式(上記計算式(3))などを用いて処理対象チャートの複雑度が算出される。
ここで、上記のように係数入力部102がユーザに各種の複雑度係数を任意に設定させるが、その為の係数設定画面の一例を図17に示す。
図17に示す複雑度係数設定画面130では、図示のように、各種のSFCコンポーネント種別に対応する複雑度係数が、任意に設定可能となっており、設定内容が所定の記憶領域に記憶されることになる。
上述したように、実施例2では、実施例1の特徴に加えて更に、アクションに係わる所定の出現数検出を行って、アクションについて、アクションクオリファイア種別や、アクション言語種別について、出現状況についても検出して、複雑度計算に反映させる。アクション言語種別は、上記の通り、アクションに定義されている内容が、BOOL型変数であるか、何等かの記述言語で記載された処理であるかといったことを示す情報である。
以上、実施例2について説明した。
以下、実施例3について説明する。
実施例3は、上記実施例1の特徴、または/及び、上記実施例2の特徴に加えて更に、セットによる保持動作とリセット動作とのペア関係を判別し、場合によってはこれに基づいて複雑度を計算するものである。
図18に、実施例3のSFCメトリクス測定装置の構成図を示す。
図示の例のSFCメトリクス測定装置150は、SFC格納部151、経路計数記録部152、複雑度計算部153、複雑度表示部154を有する。
上記経路計数記録部152は、経路計数部161、内部経路記録部162、経路数記録部163を有する。
上記複雑度計算部153は、複雑度演算部171、係数入力部172を有する。
上記複雑度表示部154は、複雑度一覧表示部181、複雑度上限入力部182を有する。
ここで、SFCメトリクス測定装置150は、基本的には上記実施例2のSFCメトリクス測定装置80と略同等の機能を有し、そのうえで更に、セット&リセットに係わる特徴も有している。これより、以下、主に、SFCメトリクス測定装置80とは異なる点について説明するものとし、SFCメトリクス測定装置80と略同等の機能についての説明は省略または簡略化するものとする。
まず、SFC格納部151は上記SFC格納部81と同じであってよい。但し、ここでは説明の都合上、SFC格納部151に格納される処理対象チャート(SFCプログラム)の具体例を、図19に示すものとする。
ここで、図19に示すチャートの具体例について、主に図9に示す具体例と異なる点について説明する。
図19は、SFCで作成されたプログラム(チャート)の一例であり、アクションも記述された例である。この例では、アクションの記述以外は(各ステップ、各トランジション、分岐・収束の構成は)、上記図24に示す例と同一であり、その説明は省略する。
図19の例では、アクションの連結に関して、図9とは多少異なる点がある。すなわち、図9の例では、ステップS004には一つのアクションが連結され、ステップS006には二つのアクションが連結されている。これに対して、図19の例では、まず、図9と同様に、ステップS001には、アクションクオリファイアが“S”でアクション名が“ACT001”のアクションが、連結されている。
図19では、図9とは異なり、ステップS004には2つのアクションが連結されている。つまり、アクションクオリファイアが“DS”でアクション名が“ACT002”のアクション(これは図9と同様)と、アクションクオリファイアが“S”でアクション名が“ACT003”のアクションとが、ステップS004に連結されている。
また、図19では、図9とは異なり、ステップS006には3つのアクションが連結されている。アクションクオリファイアが“R”でアクション名が“ACT001”のアクションと、アクションクオリファイアが“R”でアクション名が“ACT002”のアクションが、連結されている点は、図9と同様である。図19では、ステップS006には更に、アクションクオリファイアが“R”でアクション名が“ACT004”のアクションが、連結されている
経路計数部161は、SFC格納部151に格納されている処理対象チャートに対して、基本的には上記経路計数部91と同等の処理を行うが、一部異なる処理を行う。例えば、経路計数部161は、上記図13の処理の代わりに図20に示す処理を実行する。
図20は、実施例3におけるSFCコンポーネントカウント処理の詳細フローチャート図である。
図20の処理において、図13の処理と同様の処理には同一符号を付してあり、その説明は省略する。これより、図20の処理では、図示のステップS81、S82,S83、S84,S85,S86,S87,S88の処理を行うが、これについては図13と同じであり特に説明しない。
そして、図20では、ステップS87の処理に続いて、まず、ステップS85で取得したアクションブロックから“変数名/処理名”を取得する(ステップS101)。続いて、ステップS86で取得済みのアクションクオリファイアに基づいて、処理を分岐させる(ステップS102)。すなわち、ステップS102において、アクションクオリファイアがS/DS/SDの何れかであった場合にはステップS103へ移行し、Rであった場合にはステップS104へ移行し、S/DS/SD/Rの何れでも無い場合にはそのままステップS88へ移行する。
ここで、経路計数部161は、上記経路計数部91と同様に上記検出数記録テーブル120を作成する(各種SFCコンポーネントの検出数をカウントする)が、更に、アクション対応テーブル190も作成する。
ここで、図21には上記図19の例に応じた上記検出数記録テーブル120の例を示すが、これについては特に説明しない(データ構成自体は図16と同じであり、同一符号を付してあり、検出数123の各数値が異なるだけなので、特に説明しない)。
図22に、アクション対応テーブル190の具体例を示す。
図示の例のアクション対応テーブル190は、アクション定義内容191、セット動作検出数192、リセット動作検出数193、差分194の各データ項目より成る。
経路計数部161は、上記ステップS103,S104のどちらを実行する場合でも共通の処理として、まず、アクション対応テーブル190に登録済みの全レコードのアクション定義内容191を参照して、ステップS101で取得した“変数名/処理名”が登録済みか否かを判定する(該当レコードがあるか否かをチェックする)。そして、未登録である場合にはアクション対応テーブル190に新規レコードを追加して、この新規レコードのアクション定義内容191に、ステップS101で取得した“変数名/処理名”を登録する。
尚、新規レコードにおいて、セット動作検出数192、リセット動作検出数193、差分194には全て初期値‘0’を設定する。
そして、ステップS103では、上記共通の処理に続いて更に、該当レコードのセット動作検出数192の値を更新する(+1インクリメントする)。尚、新規レコード追加の場合には新規レコードが該当レコードとなる。更に、更新後のセット動作検出数192の値と、リセット動作検出数193の値とを用いて、差分194の値を下記のように更新する。
差分194=セット動作検出数192 − リセット動作検出数193
つまり、セット動作検出数192の現在値(更新値)からリセット動作検出数193の現在値を差し引いた値を、新たな差分194の値とする。
一方、ステップS104では、上記共通の処理に続いて更に、該当レコードのリセット動作検出数193の値を更新する(+1インクリメントする)。更に、セット動作検出数192の値と、更新後のリセット動作検出数193の値とを用いて、差分194の値を下記のように更新する。
差分194=セット動作検出数192 − リセット動作検出数193
つまり、セット動作検出数192の現在値からリセット動作検出数193の現在値(更新値)を差し引いた値を、新たな差分194の値とする。
上記ステップS103,S104の何れを実行した場合でも、処理実行後はステップS88へ移行する。
尚、経路計数部161は、上記図2(a)のような経路数も検出する。
複雑度演算部171は、上記経路計数記録部152によって検出・記録されたデータ(図21の検出数記録テーブル120や図22のアクション対応テーブル190や経路数など)や、係数入力部172により設定された各種複雑度係数などに基づいて、下記の複雑度計算式(計算式(4))によって処理対象チャートの複雑度を算出する。
Figure 2018018510
上記計算式(4)におけるセット動作過多の検出数は、アクション対応テーブル190において差分194の値が正の値となっているレコードの数である。リセット動作過多の検出数は、アクション対応テーブル190において差分194の値が負の値となっているレコードの数である。よって図22の例の場合、セット動作過多の検出数は‘1’となり、リセット動作過多の検出数も‘1’となる。
尚、図23は、係数入力部172による複雑度係数設定画面200の具体例である。
図示の複雑度係数設定画面200について、上記図17の複雑度係数設定画面130との相違についてのみ述べるならば、複雑度係数設定画面130の各種複雑度係数設定欄に加えて更に、図示のセット動作過多、リセット動作過多の各複雑度係数が任意に設定できる点である。
また、尚、上記計算式(4)によって、例えば、分岐の検出数、ステップ、トランジション、アクションの各検出数、アクションにおけるアクションクオリファイアの種別毎の各検出数、アクション処理の言語種別毎の各検出数、アクションのセット動作とリセット動作の対応関係の不一致に応じた値の全てを考慮した複雑度計算が実現できるが、この例に限らない。上記計算式(4)を用いて、これらの中の一部の検出数のみを考慮した複雑度計算も実現できる。これは、対象以外の複雑度係数を全て‘0’にすることで実現できる。
例えば、上記計算式(4)において、セット動作過多の複雑度係数とリセット動作過多の複雑度係数は‘0’以外の任意の値に設定し、これら以外の複雑度係数は全て‘0’に設定することで、計算式(4)を実質的にアクションのセット動作とリセット動作の対応関係の不一致に着目した複雑度を求める式とすることができる。
尚、上記計算式(3)、計算式(4)は、何れも、本例による複雑度計算式の一例である。
尚、以下、SFC(シーケンシャル・ファンクション・チャート)におけるアクション「DS」「SD」の違いについて、説明する。
・DS:DS(Delayed and Stored)では、ステップが活性になってから、予め設定された時間遅れてアクションの実行が開始される。この場合も設定された時間内(実行開始前)にステップが非活性になると、設定時間が経過して実行開始時刻となってもアクションは実行されない。ただし、アクションの実行開始後はステップが非活性になってもアクション実行を継続する。アクションの実行打ち切りはR(Reset) による。
・SD:SD(Stored and time Delayed) では、ステップが活性になってから、予め設定された時間遅れてアクションの実行が開始される。この場合は設定された時間内(実行開始前)にステップが非活性になっても設定時間が経過して実行開始時刻となるとアクションが実行される。アクションの実行打ち切りはR(Reset) による。
尚、アクションクオリファイア“S”も、アクションの実行打ち切りはR(Reset) による。
この様に、アクションクオリファイア“S”、“DS”、“SD”は、何れも、アクションの実行打ち切りにはR(Reset)が必要であり、それ故、上記ステップS102の判定を行って、処理対象アクションのアクションクオリファイア種別が“S”、“DS”、“SD”、“R”の何れかである場合には、検出数記録テーブル120への記録を行うようにしている。 上記アクションクオリファイア“S”、“DS”、“SD”は、セット動作に係わるアクションクオリファイアである。上記アクションクオリファイア“R” は、リセット動作に係わるアクションクオリファイアである。セット動作に対してはリセット動作が必要であり、任意のチャート中にセット動作があった場合、これとペアになるリセット動作が記述されていることが、基本的には必要となる。つまり、任意の“変数名/処理名”のセット動作を行うアクションがあった場合、これとペアとなるアクションとして、同じ“変数名/処理名”のアクションであってリセット動作を行うアクションが記述されていることが、基本的には必要となる。
これより、任意の“変数名/処理名”のセット動作を行うアクションがあるが、これとペアとなるアクションが記述されていない場合、セット動作過多とする。その逆に、任意の“変数名/処理名”のリセット動作を行うアクションがあるが、これとペアとなるアクションが記述されていない場合、リセット動作過多とする。これらは何れも記述ミスである可能性がある。
これに対して実施例3では上記検出数記録テーブル120を用いることで、セット動作過多またはリセット動作過多を判別することができる。更に、この判別結果に基づき、セット動作過多の数またはリセット動作過多の数も用いて、SFCプログラムの複雑度を算出するようにしてもよい(一例が上記計算式(4)であるが、この例に限らない)。
なお、以上説明した実施の形態1〜3は、これらの技術的思想の範囲内で、様々な変形が可能である。
10 SFCメトリクス測定装置
11 SFC格納部
12 経路計数記録部
13 複雑度計算部
14 複雑度表示部
21 経路計数部
22 内部経路記録部
23 経路数記録部
31 複雑度演算部
32 係数入力部
41 複雑度一覧表示部
42 複雑度上限入力部
51 SFCNo.
52 経路数
61 SFCコンポーネント種別
62 検出数
71 チャートNo.
72 複雑度
80 SFCメトリクス測定装置
81 SFC格納部
82 経路計数記録部
83 複雑度計算部
84 複雑度表示部
91 経路計数部
92 内部経路記録部
93 経路数記録部
101 複雑度演算部
102 係数入力部
111 複雑度一覧表示部
112 複雑度上限入力部
121 No.
122 SFCコンポーネント種別
123 検出数
130 複雑度係数設定画面
150 SFCメトリクス測定装置
151 SFC格納部
152 経路計数記録部
153 複雑度計算部
154 複雑度表示部
161 経路計数部
162 内部経路記録部
163 経路数記録部
171 複雑度演算部
172 係数入力部
181 複雑度一覧表示部
182 複雑度上限入力部
190 アクション対応テーブル
191 アクション定義内容
192 セット動作検出数
193 リセット動作検出数
194 差分

Claims (16)

  1. 任意のSFCプログラムの開始から終了までの経路の数を求め、又は、該SFCプログラムにおける種別毎の要素数を計数する計数手段と、
    該計数手段により求められた前記経路数又は前記種別毎の要素数に基づいて、前記SFCプログラムの複雑度を算出する複雑度計算手段と、
    を有することを特徴とするSFCメトリクス測定装置。
  2. 前記経路数に応じた任意の第1係数又は前記各種別に応じた任意の各種第2係数が、予め設定されており、
    前記複雑度計算手段は、前記経路数に対して前記第1係数を乗じた乗算値を求めて、又は、前記種別毎にその種別に係る前記要素数に該当する前記第2係数を乗じた乗算値を求めて、該乗算値に基づいて前記複雑度を算出することを特徴とする請求項1記載のSFCメトリクス測定装置。
  3. 前記第1係数又は前記各種第2係数の何れか一方を‘0’にすることで、前記複雑度を、前記経路数に応じた値、又は、前記種別毎の要素数に応じた値とすることを特徴とする請求項2記載のSFCメトリクス測定装置。
  4. 前記第1係数による乗算値と前記種別毎の前記第2係数による各乗算値の合計値を、前記複雑度とすることを特徴とする請求項2記載のSFCメトリクス測定装置。
  5. 前記種別には、選択分岐と並列分岐が含まれ、
    前記計数手段は、選択分岐の要素数と並列分岐の要素数をそれぞれ計数することを特徴とする請求項1〜4の何れかに記載のSFCメトリクス測定装置。
  6. 前記種別には、選択分岐と並列分岐が含まれ、
    前記計数手段は、前記SFCプログラムを前記開始から走査して各要素を検出し、前記選択分岐又は前記並列分岐を検出すると、該検出した選択分岐内の経路数を求める処理又は該検出した並列分岐内の経路数を求める処理を実行することを特徴とする請求項1〜4の何れかに記載のSFCメトリクス測定装置。
  7. 前記選択分岐内の経路数を求める処理は、該選択分岐内の分岐毎に、その分岐上に更に選択分岐又は並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数を求めて、全ての分岐の前記分岐経路数の総和を、該選択分岐内の経路数とすることを特徴とする請求項6記載のSFCメトリクス測定装置。
  8. 前記並列分岐内の経路数を求める処理は、該並列分岐内の分岐毎に、その分岐上に更に選択分岐又は並列分岐があるか否かに応じてその分岐に係わる経路数である分岐経路数を求めて、全ての分岐の前記分岐経路数の積を、該並列分岐内の経路数とすることを特徴とする請求項6又は7記載のSFCメトリクス測定装置。
  9. 前記計数手段は、経路数の初期値を1とした後、前記検出した選択分岐内の経路数を求める処理又は前記検出した並列分岐内の経路数を求める処理が実行される毎に、実行結果として得られる値を現在の前記経路数の値に乗じることで経路数の値を更新し、最終的な前記経路数の値を、前記任意のSFCプログラムの開始から終了までの経路の数とすることを特徴とする請求項6〜8の何れかに記載のSFCメトリクス測定装置。
  10. 前記算出された複雑度を表示する複雑度表示手段を有し、
    該複雑度表示手段は、予め設定された任意の上限値を越える複雑度に関しては、警告を示す表示も一緒に表示することを特徴とする請求項1〜3の何れかに記載のSFCメトリクス測定装置。
  11. 前記種別には、活性状態/非活性状態となるステップと、該ステップが活性状態のときの動作を表すアクションが含まれ、
    前記計数手段は、前記SFCプログラムにおける前記アクションを検出して該アクションの数を計数することを特徴とする請求項1〜4の何れかに記載のSFCメトリクス測定装置。
  12. 前記アクションには、アクションクオリファイア種別、又は、アクション言語種別があり、
    前記計数手段は、前記検出したアクションのアクションクオリファイア種別、又は、アクション言語種別を判別して、前記アクションの数の計数と共に、アクションクオリファイア種別に応じた又はアクション言語種別に応じた計数を行うことを特徴とする請求項11記載のSFCメトリクス測定装置。
  13. 前記アクションには、アクションクオリファイア種別があり、
    前記計数手段は、前記検出したアクションのアクションクオリファイア種別が、セット動作又はリセット動作に係わるアクションクオリファイア種別である場合には、該検出したアクションに基づいてセット動作過多又はリセット動作過多を判別することを特徴とする請求項11記載のSFCメトリクス測定装置。
  14. 前記複雑度計算手段は、前記セット動作過多の数又は前記リセット動作過多の数も用いて、前記SFCプログラムの複雑度を算出することを特徴とする請求項13記載のSFCメトリクス測定装置。
  15. 前記セット動作に係わるアクションクオリファイア種別は“S”、“DS”、“SD”であり、前記リセット動作に係わるアクションクオリファイア種別は“R”であることを特徴とする請求項13記載のSFCメトリクス測定装置。
  16. コンピュータにおけるSFCメトリクスの算出方法であって、
    記憶されている任意のSFCプログラムの開始から終了までの経路の数を計数し、又は、該SFCプログラムにおける種別毎の要素数を計数し、
    該計数した前記経路数又は前記種別毎の要素数に基づいて、前記SFCプログラムの複雑度を算出することを特徴とするSFCメトリクス算出方法。
JP2017094041A 2016-07-14 2017-05-10 Sfcメトリクス測定装置、sfcメトリクス算出方法 Pending JP2018018510A (ja)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
JP2016139593 2016-07-14
JP2016139593 2016-07-14

Publications (1)

Publication Number Publication Date
JP2018018510A true JP2018018510A (ja) 2018-02-01

Family

ID=61081499

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2017094041A Pending JP2018018510A (ja) 2016-07-14 2017-05-10 Sfcメトリクス測定装置、sfcメトリクス算出方法

Country Status (1)

Country Link
JP (1) JP2018018510A (ja)

Similar Documents

Publication Publication Date Title
JP5412510B2 (ja) 1個のソフトウェアの少なくとも一部を検証するためにテストケースを自動的に形成する方法
Wang et al. Interactive algorithms for improving incomplete linguistic preference relations based on consistency measures
US6671874B1 (en) Universal verification and validation system and method of computer-aided software quality assurance and testing
Badame et al. Refactoring meets spreadsheet formulas
Rahmandad et al. Modeling the rework cycle: capturing multiple defects per task
US20080178161A1 (en) System and method for determining execution path difference in program
Oliveira et al. RTTool: A tool for extracting relative thresholds for source code metrics
CN107798245B (zh) 一种基于组件依赖图的软件安全漏洞预测方法
US20220292229A1 (en) Material design apparatus, material design method, and material design program
US20190129397A1 (en) Causal relation model building system and method thereof
Arefeen et al. Continuous integration using GitLab
JP6310527B1 (ja) オブジェクト分析装置、オブジェクト分析方法、及びプログラム
US8375365B2 (en) Customization verification
CN110489131B (zh) 一种灰度用户选取方法及装置
Walworth et al. Early estimation of project performance: The application of a system dynamics rework model
US8166453B2 (en) Method and system for inconsistency resolution with cycle detection in a model-driven software environment
Tebes et al. Family of evaluation strategies: A practical case for comparing and adopting strengths
EP3754559A1 (en) Optimization system and control method for optimization system
JP2018018510A (ja) Sfcメトリクス測定装置、sfcメトリクス算出方法
CN111106953A (zh) 一种异常根因分析的方法及装置
CN116737580A (zh) 一种回归测试范围确定方法、装置、设备及存储介质
Oliva et al. A change impact analysis approach for workflow repository management
WO2016151710A1 (ja) 仕様構成装置および方法
CN115795479A (zh) 一种智能合约的漏洞检测方法、电子设备和存储介质
CN104268724A (zh) 一种业务流程测试方法及装置