(57)【要約】  【課題】所定のプログラムに基づいて周期的に演算を行い、入力信号に応じた出力信号を生成するコンピュータを用いた演算において、入力信号の変化が出力信号に反映されるまでの遅れ周期を検出する演算遅れ周期検出方法を提供する。  【解決手段】プログラムのソースリストからタスク内のデータの順序とタスク内の関数の演算実行順序とを求め、データ順序の前後関係と演算実行順序の前後関係とで不一致となった数を求め、その不一致の数に１を加算した値を演算遅れ周期の数とする。【選択図】図１
2005165483.tif 000002
【特許請求の範囲】
【請求項１】
所定のプログラムに基づいて周期的に演算を行い、入力信号に応じた出力信号を生成するコンピュータを用いた演算において、入力信号の入力から出力信号の出力までの演算の遅れ周期を検出する演算遅れ周期検出方法であって、
前記プログラムのソースリストからタスク内のデータの順序を復元するデータ順序復元処理と、
前記プログラムのソースリストからタスク内の関数の演算順序を復元する演算順序復元処理と、
前記データ順序復元処理結果と前記演算順序復元処理結果との不一致情報を検出する不一致情報検出処理と、
前記不一致情報検出処理の結果に応じて演算における遅れ周期を検出する遅れ周期検出処理と、
を行う演算遅れ周期検出方法。
【請求項２】
前記不一致情報検出処理は、前記データ順序における前後関係と前記演算順序における前後関係とで不一致となった数を検出することを特徴とする請求項１に記載の演算遅れ周期検出方法。
【請求項３】
前記遅れ周期検出処理は、前記不一致情報検出処理で検出した不一致の数に１を加算した値を演算遅れ周期の数とすることを特徴とする請求項２に記載の演算遅れ周期検出方法。
【請求項４】
所定のプログラムに基づいて周期的に演算を行い、入力信号に応じた出力信号を生成するコンピュータを用いた演算において、入力信号の入力から出力信号の出力までの演算の遅れ周期を検出する演算遅れ周期検出装置であって、
前記プログラムのソースリストからタスク内のデータの順序を復元するデータ順序復元手段と、
前記プログラムのソースリストからタスク内の関数の演算順序を復元する演算順序復元手段と、
前記データ順序復元処理結果と前記演算順序復元処理結果との不一致情報を検出する不一致情報検出手段と、
前記不一致情報検出処理の結果に応じて演算における遅れ周期を検出する遅れ周期検出手段と、
を備えた演算遅れ周期検出装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コンピュータを用いた演算において、入力から出力までの演算における遅れ周期を検出する方法および装置に関する。
【背景技術】
【０００２】
外部からの信号を入力するセンサと、外部へ出力するアクチュエータと、該センサ入力に基づいて該アクチュエータへ出力する信号を所定の演算によって求めるコンピュータとを備えた電子制御装置において、前記演算が所定のプログラムに従って周期的に行われ、かつ、該プログラムが複数のモジュールによって構成される場合に、該プログラムを実行する各モジュールの処理時間を求める方法としては、機械語のコード数をカウントする手法や、インサーキットエミュレータ（ＩＣＥ）によって実測する手法が知られている。このような従来例としては、例えば特許文献１に開示された方法がある。
【０００３】
【特許文献１】特開２０００−２０３４７号公報
【発明の開示】
【発明が解決しようとする課題】
【０００４】
前記のごとき従来の方法においては、一連のモジュールの処理時間にのみ着目しており、入力信号が変化してから、その変化した入力信号の値が、実際に出力信号に反映されるまでの時間を計測していることにはならなかった。  
実際の電子制御装置においては、通常モジュールが１回演算されるだけで出力値が確定するわけではなく、複数回演算することで出力値が確定することが多い。たとえば、センサ値の変化量に応じてアクチュエータ出力値を求めるという仕様の場合、一定周期で起動されるモジュール（以下「タスク」という）でセンサ値を読み込み、前回読み込んだ値と今回読み込んだ値の差分を算出して変化量を求める、という構造をとることが多い。つまり、センサ値の変化量を複数周期にわたって読み込み、それに基づいてアクチュエータへの出力値を決定する。単純な変化量の場合には、例えば上記のように２周期にわたって読み込み、前回値と今回値との差を用いる。このタスクが例えば１０ｍｓｅｃ周期で起動される場合は、入力値が変化してから、その変化が出力に反映されるまでに２周期つまり２０ｍｓｅｃを要する。そして実際の制御においては、入力信号の変化が出力信号に反映されるまでの遅れ時間が問題となる場合がある。しかし、従来の方法では、このような演算の遅れ周期を検出することは出来なかった。  
本発明は、上記のごとき問題を解決するためになされたものであり、入力信号の変化が出力信号に反映されるまでの遅れ周期を検出する演算遅れ周期検出方法および装置を提供することを目的とする。
【課題を解決するための手段】
【０００５】
上記の目的を達成するため、本発明においては、プログラムのソースリストからタスク内のデータの順序とタスク内の関数の演算順序とを求め、それらの不一致情報を検出し、その不一致情報の結果に応じて演算における遅れ周期を検出するように構成している。
【発明の効果】
【０００６】
複数周期にわたって演算しなければ入力値の変化が出力値に反映されない場合においても、入力信号の変化が出力信号に反映されるまでの遅れ周期を算出することができる、という効果がある。
【発明を実施するための最良の形態】
【０００７】
まず、演算遅れ周期について説明する。  
センサやスイッチ等によるシステムへの入力信号、システムが制御する対象であるアクチュエータ等への出力信号、タスクを構成する２つの関数として第１の関数と第２の関数、および演算値を記憶するための変数Ａを設定した場合に、第１の関数は入力信号の値を参照し、変数Ａの値を求める関数とする。つまり第１の関数は、「変数Ａ：入力信号」という処理を行う。同様に、第２の関数は、変数Ａの値を読み込み、アクチュエータ等への出力信号を求めるための関数である。
【０００８】
このタスクは、一定周期に起動されるものとし、まず最初に第２の関数を実行し、次に第１の関数を実行する。  
時刻ｔで起動されるタスクは、まず最初に、第２の関数によって変数Ａの値からアクチュエータへの出力値（出力信号）を求める。その次に、第１の関数によって、入力信号の値を読み込み、変数Ａの値を計算し、演算結果を変数Ａの領域に書き込む。  
時刻ｔ＋１では、第２の関数は変数Ａの値を読み込み、アクチュエータへの出力値を求めるが、ここで読み込まれる変数Ａの値とは、すなわち、時刻ｔにおいて、第１の関数が演算した結果である。次に、第１の関数が入力信号の状態から変数Ａを求める。
【０００９】
上記の例によれば、時刻ｔにタスクが実行された時のアクチュエータへの出力信号は、時刻ｔ−１の入力信号の状態が反映されたものであり、時刻ｔにおける入力信号の状態を反映していない。  
上記のように、システムヘの入力の状態が変化してから、システムが出力する値が確定するのは、タスク１周期では反映されない場合があり、以下、これを演算遅れ周期という。上記の例では、入力信号の状態が出力信号に反映されるまでには、２周期が必要である。
【００１０】
従来の方法では、単にタスクにおける演算時間を測定するのみであったため、複数周期にわたって演算しなければ入力値の変化が出力値に反映されない場合において、入力値の変化が出力値に反映されるまでの周期（時間）を測定することは出来なかった。  
例えば上記の例において、タスク（すなわち第１の関数と第２の関数の処理）に２ｍｓｅｃを要すると仮定し、かつ、上記タスクが１０ｍｓｅｃ周期で起動されると仮定すると、従来の方法では、タスクが２ｍｓｅｃで処理を終了することは測定可能であったが、入力信号の変化が出力に反映されるには２周期を要するため、実際に入力状態の変化が出力に反映されるまでには、（２０＋２）ｍｓｅｃが必要である、ということは検出できなかった。実際の制御等においては、上記のような入力信号の変化が出力に反映されるまでの遅れ時間が制御成績に大きな影響を及ぼすことがあるので、上記のような演算遅れ周期を検出する必要がある。
【００１１】
（実施例）
図１は本発明の一実施例の機能ブロック図であり、コンピュータ内における演算処理をブロックで示したものである。  
図１において、３０１は解析対象であるプログラムモジュール、３０２はプログラムモジュールを読み込んで関数と変数のデータ読み書きの関連を解析するプログラムデータフロー解析部（プログラムのソースリストからタスク内のデータの順序を復元するデータ順序復元処理）、３０３はデータ読み書きの観点での順序テーブルを作成するデータ順序テーブル作成部、３０４はプログラムモジュールを解析し、演算順序の観点での順序テーブルつまり実行順序テーブルを作成するプログラムコントロールフロー解析部（プログラムのソースリストからタスク内の関数の演算順序を復元する演算順序復元処理）、３０５はデータ順序テーブルと実行順序テーブルとの差異を検出する差異検出部（データ順序復元処理結果と演算順序復元処理結果との不一致情報を検出する不一致情報検出処理）、３０６は差異検出部３０５で検出した差異の数から入力値が出力値に反映されるために必要な演算周期を算出する演算遅れ算出部（不一致情報検出処理の結果に応じて演算における遅れ周期を検出する遅れ周期検出処理）、３０７は演算遅れ周期を表示する表示部である。
【００１２】
図２は、図１の解析対象のプログラムモジュール３０１の一例を示す図である。図２において、関数Ｆｕｎｃ１は、変数Ｖ１の値を読み込み、所定の演算式によって変数Ｖ２の値を求め、演算結果を変数Ｖ２に格納する。  
関数Ｆｕｎｃ２は、変数Ｖ２の値を読み込み、所定の演算式によって変数Ｖ３の値を求め、演算結果を変数Ｖ３に格納する。  
関数Ｆｕｎｃ３は、変数Ｖ３の値を読み込み、所定の演算式によって変数Ｖ４の値を求め、演算結果を変数Ｖ４に格納する。  
関数Ｆｕｎｃ４は、変数Ｖ４の値を読み込み、所定の演算式によって変数Ｖ５の値を求め、演算結果を変数Ｖ５に格納する。  
タスクＴａｓｋ１は、Ｆｕｎｃ１、Ｆｕｎｃ３、Ｆｕｎｃ２、Ｆｕｎｃ４の順に関数を実行する。また、タスクＴａｓｋ１は、一定周期で起動されるものであるとする。
【００１３】
以下、図２に示したモジュール例を用いて、本実施例の動作を説明する。  
図３は、図１のプログラムデータフロー解析部３０２の演算内容を示すフローチャートである。  
まず、ステップＳ１では、解析対象となるプログラムモジュール（前記３０１）を読み込み、関数を抽出する。  
次にステップＳ２では、全関数の抽出が完了したか否かを判定し、全部の関数を抽出し終わっていれば、プログラムデータフロー解析部を終了する。終わっていなければ、ステップＳ３へ進む。この場合には、例えば図２の関数Ｆｕｎｃ１が抽出されたものとして説明する。  
ステップＳ３では、関数内で使用されている外部変数（グローバル変数）を抽出する。例えば関数Ｆｕｎｃ１では変数Ｖ１と変数Ｖ２が外部変数として使用されている。  
ステップＳ４では、ステップＳ３で抽出された外部変数が、該関数内でどのように使用されているかを抽出する。つまり関数内で読み出されている場合はＲ属性（Ｒｅａｄの意味）、関数内で書き込まれている場合はＷ属性（Ｗｒｉｔｅの意味）を、該外部変数に付与する。
【００１４】
図２の例では、関数Ｆｕｎｃ１の変数Ｖ１に対してはＲ属性、関数Ｆｕｎｃ１の変数Ｖ２に対してはＷ属性が付与される。これら一連の処理を、解析対象となるプログラムモジュール内のすべての関数について実行し、全ての関数について抽出が終了していれば、ステップＳ２の判断でプログラムデータフロー解析部を終了する。
【００１５】
図４は、上記で説明したプログラムデータフロー解析部の内部データの例を示す図である。図示のように、各関数について関数内で使用される外部変数とその属性を内部データとして管理する。
【００１６】
次に、図５は、図１のデータ順序テーブル作成部３０３の演算内容を示すフローチャートである。データ順序テーブル作成部３０３では、図３に示したプログラムデータフロー解析部３０２の結果を用いて、すべての外部変数について、データ順序テーブルを作成する。
【００１７】
まず、ステップＳ１１では、全ての外部関数についての処理が完了したか否かを判断し、完了している場合は、データ順序テーブル作成部の処理を終了する。完了していない場合はステップＳ１２へ行く。  
ステップＳ１２では、外部変数に関連付けられている関数を検索する。図４の例を用いると、例えば外部変数Ｖ２について処理を行っている場合は、外部変数Ｖ２と関連付けがされている関数は、Ｆｕｎｃ１とＦｕｎｃ２である。  
ステップＳ１３では、外部変数と関数の属性により、前後関係を決定する。Ｒ属性で関連付けられている場合は、変数→関数という順序とし、Ｗ属性で関連付けられている場合は、関数→変数という順序とする。図４の例では、外部変数Ｖ２は関数Ｆｕｎｃ１とはＷ属性で関連付けられているため、Ｆｕｎｃ１→Ｖ２という順序とする。また、外部変数Ｖ２は関数Ｆｕｎｃ２とはＲ属性で関連付けられているため、Ｖ２→Ｆｕｎｃ２という順序とする。  
上記ステップＳ１２、Ｓ１３の一連の処理を全ての外部変数について行い、全ての外部変数についての処理が終了すると、ステップＳ１１でデータ順序テーブル作成部の処理を終了する。
【００１８】
図６は、データ順序テーブルの一例を示す図である。図６においては、
「外部変数Ｖ１の前に関数は存在しない、後ろには関数Ｆｕｎｃ１がある」
「外部変数Ｖ２の前に関数Ｆｕｎｃ１があり、後ろに関数Ｆｕｎｃ２がある」
という順序関係を表している。
【００１９】
次に、図７は、図１のプログラムコントロールフロー解析部３０４の演算内容を示すフローチャートである。  
図７において、ステップＳ２１では、タスクを解析し、タスク内で実行される関数の演算実行順序を決定し、実行順序テーブルを作成する。  
図２の例では、タスクＴａｓｋ１で実行される関数は、Ｆｕｎｃ１、Ｆｕｎｃ２、Ｆｕｎｃ３、Ｆｕｎｃ４であり、それらの実行順序は、Ｆｕｎｃ１→Ｆｕｎｃ３→Ｆｕｎｃ２→Ｆｕｎｃ４である。
【００２０】
図８は、プログラムコントロールフロー解析部３０４によって作成される実行順序テーブルの一例を示す図である。図示のように、タスク内の関数の実行順序が、Ｆｕｎｃ１→Ｆｕｎｃ３→Ｆｕｎｃ２→Ｆｕｎｃ４であることを表している。
【００２１】
次に、図９は、差異検出部３０５の演算内容を示すフローチャートである。  
まず、ステップＳ３１では変数Ｒの値を初期化する。ここでは初期値としてゼロを代入する。  
ステップＳ３２では、データ順序テーブルに格納されている全ての外部関数についての処理が完了したか否かを判断し、完了している場合は、差異検出部の処理を終了する。完了していない場合はステップＳ３３へ行く。
【００２２】
ステップＳ３３では、データ順序テーブルの前後関係と、実行順序テーブルの前後関係の一致を調べる。  
例えば、デ一タ順序テーブルの外部変数Ｖ２について処理をしているとして説明すると、データ順序テーブル上では、前：Ｆｕｎｃ１、後：Ｆｕｎｃ２である。それに対して、実行順序テーブル上では、Ｆｕｎｃ１の実行順序は１番目、Ｆｕｎｃ２の実行順序は３番目である。すなわち、Ｆｕｎｃ１とＦｕｎｃ２の前後関係は、データ順序テーブルと実行順序テーブルとで一致していると判断する。  
同様にＶ３について処理をしているときは、データ順序テーブル上では、前：Ｆｕｎｃ２、後：Ｆｕｎｃ３であり、実行順序テーブル上では、Ｆｕｎｃ２は３番目、Ｆｕｎｃ３は２番目であるため、Ｆｕｎｃ２とＦｕｎｃ３の前後関係はデータ順序テーブルと実行順序テーブルで不一致であると判断する。
【００２３】
ステップＳ３４では、ステップＳ３３の判断が不一致の場合に変数Ｒをインクリメントする。したがって差異検出部３０５において、変数Ｒは、データ順序テーブルにおける関数の前後関係と実行順序テーブルにおける関数の前後関係とで不一致となった数を表している。  
上記ステップＳ３３、Ｓ３４の処理を全ての外部変数について行い、全ての外部変数についての処理が終了すると、ステップＳ３２で差異検出部の処理を終了する。
【００２４】
図１の演算遅れ算出部３０６では、差異検出部３０５で求めた前後関係不一致の数Ｒより、入力信号の変化が出力信号に反映されるまでに必要な演算周期の数を求める。前後関係不一致が１箇所も存在しない場合は、Ｒはゼロである。これは、１周期内で、入力信号の変化が出力信号に反映されることを表している。図２の例では、Ｒは１となる。これは、１箇所の演算の逆転が存在するため、入力の変化が出力に反映されるには、もう１周期が必要である、つまり２周期必要であるということを表している。すなわち、入力信号の変化が出力信号に反映されるまでに必要な演算周期は（Ｒ＋１）周期である。
【００２５】
上記のようにして求めた演算遅れ周期は、表示部３０７で表示される。コンピュータの場合には、例えば液晶表示装置やＣＲＴ表示装置のようなディスプレイ上に表示されることになる。
【図面の簡単な説明】
【００２６】
【図１】本発明の一実施例の機能ブロック図。
【図２】解析対象のプログラムモジュール３０１の一例を示す図。
【図３】プログラムデータフロー解析部３０２の演算内容を示すフローチャート。
【図４】プログラムデータフロー解析部３０２の内部データの例を示す図。
【図５】図１のデータ順序テーブル作成部３０３の演算内容を示すフローチャート。
【図６】データ順序テーブルの一例を示す図。
【図７】プログラムコントロールフロー解析部３０４の演算内容を示すフローチャート。
【図８】プログラムコントロールフロー解析部３０４によって作成される実行順序テーブルの一例を示す図。
【図９】差異検出部３０５の演算内容を示すフローチャート。
【符号の説明】
【００２７】
３０１…解析対象のブログラムモジュール
３０２…プログラムデータフロー解析部
３０３…データ順序テーブル作成部
３０４…プログラムコントロールフロー解析部
３０５…差異検出部
３０６…演算遅れ算出部
３０７…表示部
【図１】
2005165483.tif 000003
【図２】
2005165483.tif 000004
【図３】
2005165483.tif 000005
【図４】
2005165483.tif 000006
【図５】
2005165483.tif 000007
【図６】
2005165483.tif 000008
【図７】
2005165483.tif 000009
【図８】
2005165483.tif 000010
【図９】
2005165483.tif 000011