(57)【要約】      （修正有）【課題】シミュレーション・システムにおいて、シミュレーションされる値の誤差の累積を防ぐ。【解決手段】論理プロセスに、入来した複数イベントの値から、未来の値を複数予測する予測モジュールが設けられる。予測モジュールは、過去の複数イベントの値から、未来の複数イベントの値を予測し、新たなイベントが入来するまでは、この予測したイベントの値に基づき先行投機する。新しく予測したイベントの複数の値と、前回予測したイベントの複数の値との間には、誤差が生じる。今回新しく予測したイベントの複数の値と、前回予測した複数のイベントの値との間の誤差の累積和をとり、その累積和が所定の閾値内に収まるイベントの数mを計算する。予測モジュールは、先行投機を、その許容誤差の範囲内の時刻n+mまでロールバックし、上記累積誤差を、ある先の時点n+2mまで分散させて調整する。これによって、誤差が累積することを防ぐことができる。【選択図】図８
2010086207.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより制御され、時刻と値をもつイベントの送受信により動作する複数の論理プロセスをもつシミュレーション・システムであって、
前記論理プロセスは、
入来する前記イベントの値を順次記録する第１の記録手段と、
前記イベントの入来に応答して、前記入来したイベントを含む、前記記録された複数のイベントの値に基づき、先行投機実行のための複数のイベントを予測するように計算する手段と、
前記イベントの入来に応答して予測された複数のイベントを、前回のイベントの入来に応答して予測された前の複数のイベントに関連する値と比較して、誤差をとり、その累積誤差が所定の閾値以内となる第１の時点を決定する手段と、
前記論理プロセスを、前記第１の時点までロールバックさせる手段と、
前記第１の時点より後の第２の時点に至るまでに、前記累積誤差が解消されるように、前記予測された複数のイベントの値を、前記累積誤差を分散して補正する補正手段と、
前記補正されたイベントの値を記録する第２の記録手段とを有する、
シミュレーション・システム。
【請求項２】
前記予測された前の複数のイベントに関連する値は、前記第２の記録手段に記録されている、１つ前の補正されたイベントの値である、請求項１のシミュレーション・システム。
【請求項３】
前記イベントの予測は、線形予測によって実行される、請求項１のシミュレーション・システム。
【請求項４】
前記イベントの予測は、前記イベントの値と時刻を予測する、請求項１のシミュレーション・システム。
【請求項５】
前記補正手段は、前記予測された複数のイベントの値と、前記１つ前の補正されたイベントの値の差を用いる、請求項２のシミュレーション・システム。
【請求項６】
前記前記論理プロセスは、ＥＣＵエミュレータ及び物理装置シミュレータから選ばれたものである、請求項１のシミュレーション・システム。
【請求項７】
コンピュータにより制御され、時刻と値をもつイベントの送受信により動作する複数の論理プロセスをもつシミュレーション方法であって、
前記論理プロセスに入来する前記イベントの値を順次記録するステップと、
前記イベントの入来に応答して、前記入来したイベントを含む、前記記録された複数のイベントの値に基づき、先行投機実行のための複数のイベントを予測するように計算するステップと、
前記イベントの入来に応答して予測された複数のイベントを、前回のイベントの入来に応答して予測された前の複数のイベントの値と比較して、誤差をとり、その累積誤差が所定の閾値以内である第１の時点を決定するステップと、
前記論理プロセスを、前記第１の時点までロールバックさせるステップと、
前記第１の時点より後の第２の時点に至るまでに、前記累積誤差が解消されるように、前記予測された複数のイベントの値を、前記累積誤差を分散して補正するステップと、
前記補正されたイベントの値を記録するステップを有する、
シミュレーション方法。
【請求項８】
前記イベントの予測は、線形予測によって実行される、請求項７のシミュレーション方法。
【請求項９】
前記イベントの予測は、前記イベントの値と時刻を予測する、請求項７のシミュレーション方法。
【請求項１０】
前記補正するステップは、前記予測された複数のイベントの値と、前記１つ前の補正されたイベントの値の差を用いる、請求項７のシミュレーション方法。
【請求項１１】
前記前記論理プロセスは、ＥＣＵエミュレータ及び物理装置シミュレータから選ばれたものである、請求項７のシミュレーション方法。
【請求項１２】
コンピュータにより制御され、時刻と値をもつイベントの送受信により動作する複数の論理プロセスをもつシミュレーション・プログラムであって、
前記コンピュータに、
前記論理プロセスに入来する前記イベントの値を順次記録するステップと、
前記イベントの入来に応答して、前記入来したイベントを含む、前記記録された複数のイベントの値に基づき、先行投機実行のための複数のイベントを予測するように計算するステップと、
前記イベントの入来に応答して予測された複数のイベントを、前回のイベントの入来に応答して予測された前の複数のイベントの値と比較して、誤差をとり、その累積誤差が所定の閾値以内である第１の時点を決定するステップと、
前記論理プロセスを、前記第１の時点までロールバックさせるステップと、
前記第１の時点より後の第２の時点に至るまでに、前記累積誤差が解消されるように、前記予測された複数のイベントの値を、前記累積誤差を分散して補正するステップと、
前記補正されたイベントの値を記録するステップを実行させる、
シミュレーション・プログラム。
【請求項１３】
前記イベントの予測は、線形予測によって実行される、請求項１２のシミュレーション・プログラム。
【請求項１４】
前記イベントの予測は、前記イベントの値と時刻を予測する、請求項１２のシミュレーション・プログラム。
【請求項１５】
前記補正するステップは、前記予測された複数のイベントの値と、前記１つ前の補正されたイベントの値の差を用いる、請求項１２のシミュレーション・プログラム。
【請求項１６】
前記前記論理プロセスは、ＥＣＵエミュレータ及び物理装置シミュレータから選ばれたものである、請求項１２のシミュレーション・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、自動車などに使用される電子制御ユニット（ＥＣＵ）やエンジンなどのシミュレートョンに関し、より詳しくは、ソフトウェア・ベースでのシミュレーションに関するものである。
【背景技術】
【０００２】
自動車は、その初期の時代の２０世紀初頭は、動力としてのエンジンと、ブレーキ、アクセル、ハンドル、トランスミッション、サスペンジョンを含む、機構部品からなっていたが、エンジンのプラグの点火、ヘッドライト以外は、電気的な仕組みはほとんど利用していなかった。
【０００３】
ところが、１９７０年代頃から、大気汚染、石油危機などに備えて、エンジンを効率的に制御する必要性が生じ、このためエンジンの制御に、ＥＣＵが使用されるようになってきた。ＥＣＵは、一般的に、センサからの入力信号を、例えばＡ／Ｄ変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部（マイクロコンピュータ）と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成される。
【０００４】
いまや、エンジンやトランスミッションなどの制御システム、Anti-lock Breaking System （ＡＢＳ）、Electronic Stability Control （ＥＳＣ）、パワーステアリングだけでなく、ワイパー制御やセキュリティ・モニタリング・システムなどに至るまで、最近の自動車では、機構部品だけでなく、エレクトロニクス部品やソフトウエアが重要な比率を占める。後者に関する開発費は全体の２５％とも４０％とも言われ、ハイブリッド型の自動車では７０％を占める。
【０００５】
電子制御は、ＥＣＵを複数、配置して行われる。ＥＣＵ間は車載ネットワーク、例えば、Controller Area Network （ＣＡＮ） で相互に接続される。また、制御の対象である、エンジンやトランスミッションなどには、それぞれのＥＣＵから直接ワイヤリングして接続する。
【０００６】
ＥＣＵは、小さなコンピュータであり、センサ入力などからの割り込みに応じて動作する。一方、エンジンなどは連続的に機械的動作を行っている。すなわち、コンピュータ系のディジタル・システムと、機械系の物理システムが、自動車という単一システムにおいて、並列に協調動作を行っている。当然、これを支えるソフトウエアは複雑さがますます増大しており、ＥＣＵ単体で動作を検証するだけでなく、複数を同時に検証する仕組みの実現が急務である。
【０００７】
ここで、ＥＣＵに信号を入力するセンサには、エンジンの温度などを計測する温度センサ、エンジンに吸入される圧力を推定するための圧力センサ、アクセスペダルの踏み量を測定するスロットル・ポジション・センサ、ステアリング舵角センサ、車高センサ、回転速度センサ、ノックセンサ、加速度センサ、流量センサ、酸素センサ、希薄空燃比センサなどがある。
【０００８】
一方、ＥＣＵの出力信号によって駆動されるアクチュエータには、電磁ソレノイド及びモータ等がある。ソレノイドは例えば、エンジンのインジェクタ、トランスミッションのシフト・コントロール、ブレーキのバルブ制御、ドアロックなどに使用される。
【０００９】
モータは、主としてサーボ機構として、エンジンのスタータ、エンジンのフューエル・コントロール、ブレーキの油圧ポンプ、舵角制御、ステアリング、ワイパ、パワーウインドウ、シートベルト、エアバックなどに使用される。
【００１０】
このようなテストにために従来行われている技法として、ＨＩＬＳ(Hardware In the Loop Simulation)がある。特に、自動車全体のＥＣＵをテストする環境は、フルビークルＨＩＬＳと呼ばれる。フルビークルＨＩＬＳにおいては、実験室内で、本物のＥＣＵが、エンジン、トランスミッション機構などをエミュレーションする専用のハードウェア装置に接続され、所定のシナリオに従って、テストが行われる。ＥＣＵからの出力は、監視用のコンピュータに入力され、さらにはディスプレイに表示されて、テスト担当者がディスプレイを眺めながら、異常動作がないかどうか、チェックする。
【００１１】
しかし、ＨＩＬＳは、専用のハードウェア装置を使い、それと本物のＥＣＵの間を物理的に配線しなくてはならないので、準備が大変である。また、別のＥＣＵに取り替えてのテストも、物理的に接続し直さなくてはならないので、手間がかかる。さらに、本物のＥＣＵを用いたテストであるため、テストに実時間を要する。従って、多くのシナリオをテストすると、膨大な時間がかかる。また、ＨＩＬＳのエミュレーション用のハードウェア装置は、一般に、非常に高価である。
【００１２】
そこで近年、高価なエミュレーション用ハードウェア装置を使うことなく、ソフトウェアで構成する手法が存在する。この手法は、ＳＩＬＳ(Software In the Loop Simulation)と呼ばれ、ＥＣＵに搭載されるマイクロコンピュータ、入出力回路、制御のシナリオなどを全て、ソフトウェア・シミュレータで構成する技法である。これによれば、ＥＣＵのハードウェアが存在しなくても、テストを実行可能である。
【００１３】
ここで、ＥＣＵエミュレータと、物理装置シミュレータ、特にエンジン・シミュレータとが協働する例について説明する。なお、以下、便宜上、ＥＣＵエミュレータとエンジン・シミュレータではなく、実際のＥＣＵとエンジンの間の動作として説明する。先ず、クランクシャフトの回転にあわせてピストンが上死点に達する３０度前のタイミングで、エンジンは、ＥＣＵに割り込みを引き起こす。その割り込みを受けたＥＣＵは、燃料噴射のタイミングを計算して、その時刻に噴射の指示を出す。それを受けたエンジンは、燃料を噴射して、引き続き、惰性で回転するクランクの動作を計算する。そして、ピストンが再び上死点の３０度前に達したら、エンジンは、ＥＣＵに割り込みを引き起して、ＥＣＵに知らせる。すると、ＥＣＵは、点火のタイミングを計算して、その時刻にエンジンに指示を出す。これに応じて、エンジンは、シリンダー内の燃料を爆発させて、新たな回転の動作を計算し始める。このような動作が繰り返し行われる。
【００１４】
このように、エンジンとＥＣＵが交互に動く動作は、クリティカル・パスとして捉えられる。従って、自動車の離散イベントを並列にシミュレーションする場合には、このようなクリティカル・パスの存在によって、計算性能の観点からみて、並列性を十分に発揮しえない。従って、マルチプロセッサ・システムのコンピュータを用いたフルビークルＨＩＬＳにおいて、複数のＥＣＵエミュレータにそれぞれ、個別のＣＰＵを割り当てたとしても、最悪の場合、１個のＣＰＵで、複数のＥＣＵエミュレータ及びエンジン・エミュレータをシリアルに計算する程度の性能しかでないことがある。
【００１５】
複数の論理プロセスを並列に矛盾なく動作させるための、もっとも簡単な方法は、全体の号令にあわせて各論理プロセスを動作させることである。しかし、この方法では、割り込みなどのイベントが発生しない時刻でもすべて同期処理を行う必要があるため、処理の負荷が大きく、また、処理が遅くなる。
【００１６】
複数の論理プロセスを非同期的に並列に動作させる、離散イベントのシミュレーションでは、プロセス間の通信は、タイム・スタンプの付いたイベントを、メッセージとして送受信することによって行われる。このとき、タイム・スタンプは、シミュレーション・システム全体で共通の時刻が記録される。このような時刻をシミュレーション時計と呼ぶことにすると、シミュレーション時計のどの時点で処理を行うかは、各論理プロセスで独立で、必ずしも一致する必要はない。但し、各論理プロセスが協働して処理を行う場合は、必ずタイム・スタンプの順序で行う必要がある。そのように処理を進める限り、全体をシリアルに処理する場合と同じように処理を進めることができる。
【００１７】
非同期処理の１つに、保守的同期(conservative synchronization)がある。この方法では、必ず、タイム・スタンプの古い順位のイベントを処理する。
【００１８】
保守的同期の例を説明すると、ある論理プロセスに、２つの上流プロセスからのキューがあり、その一方に、時間t1をもつイベントと、時間t2をもつイベントが届いているとする。時間t1の方が時間t2よりも古いとする。また、他方のキューには何も届いていないとする。すると、その論理プロセスは、時間t1をもつイベントから順に処理していけばよさそうなものだが、時間t1よりも古い時間をもつイベントが上流から、他方のキューに届く可能性があり、すなわち、時間t1が最古であることが保証されないため、処理を進めることができない。特に、論理プロセス間に送受信のループがある構成では、このような構成ではデッドロックを引き起こすことがある。
【００１９】
このような状況を回避するために、空メッセージ(null message)を利用した方法が知られている。この方法では、上流の論理プロセスが、ある時刻まではイベントを発生することがないことを示すために、その時刻をもつ空メッセージを、下流の論理プロセスに送る。そのような時刻は、タイム・スタンプ上の下位境界(lower bound on the timestamp:LBTS)と呼ばれる。このような空メッセージを受け取った下流の論理プロセスは、届いているイベントのタイムスタンプと、そのLBTSとを比較し、それより古いタイム・スタンプのイベントを確定とみなして処理することができる。
【００２０】
空メッセージを利用しない方法として、楽観的同期(optimistic synchronization)と呼ばれる手法が考え出された。この方法では、ある論理プロセスに、２つの上流プロセスからのキューがあり、時間t1をもつイベントと、時間t2をもつイベントが届いていて、時間t1の方が時間t2よりも古いとするとき、且つ他方のキューに何も届いていないときに、とりあえず時間t1をもつイベントを最も古いと仮定して処理を進める。その後で、時間t1よりも古い時刻をもつイベントが他方のキューに届いたら、先の時間t1のイベントを発端とする一連の処理を、遡及メッセージ(reverse message)を送ることによって順に取り消してから、新たに、時間t1よりも古い時刻をもつイベントを処理する。この方法では、論理プロセスから出力されるイベントは、一時的に必ずしもタイム・スタンプどおりではないが、ロールバックにより、最終的には、タイム・スタンプどおりになることが保証される。
【００２１】
このような方法で、デッドロックを回避しつつ、正しい順序でイベントが送り出されるようにすることができる。しかし、このような方法では、依然として処理の直列化は回避できず、よって処理はやはり、高速化できない。
【００２２】
特開平６−１６１９８７号公報は、ＥＣＵハードウェアを擬似的に実現して、ソフトウェアによる実機評価を可能ならしめることを目的とするものであって、マトリックス・スイッチを切り替えることによって、所望の機能のハードウェアをシミュレートすることを開示する。
【００２３】
特開平１１−１４５０７号公報は、車両全体のロジックを机上で検証できるようにすることを課題とするものであり、エンジン制御模擬装置（ＥＣＵ）と、車両制御模擬装置からなる車両シミュレーション装置を開示する。ＥＣＵは、エンジンモデルの制御パラメータを演算し、その演算結果を車両制御模擬装置に送信する。車両制御模擬装置は、ＥＣＵから送られてくる制御パラメータを用いて車両モデルの各部の状態量を演算してその演算結果をＥＣＵに返送する。車両モデルは、ドライバモデル、吸気系モデル、燃料系モデル、燃焼系モデル、エンジン温推定モデル、駆動系モデル、触媒モデル、Ａ／Ｆセンサモデル、リアＯ2 センサモデルから構成されている。ドライバモデルは、目標車速の変化パターンを入力する車速パターン入力手段を有する。
【００２４】
しかし、これらの文献には、論理プロセス間で同期をとる技術には言及はない。そこで、本願発明者らは、２００８年６月１８日に出願した特願２００８−１５８９９５号特許出願において、各ＥＣＵエミュレータを、投機的にエミュレートする技法を提示した。すなわち、その発明によれば、クリティカル・パスを作らずに、各論理プロセスをできるだけ並列に実行させるために、ＥＣＵエミュレータや各物理装置シミュレータなどの各論理プロセスにおいて、入力イベントが届いていない場合でも、入力を予測して処理が進められる。このような投機的実行により、他の論理プロセスの出力を待つことなく、先行して処理を行うことにより、処理の並列性が高められる。そうして、もし遅れて受信する実際の入力と、予測して投機実行したときの入力が一致していない場合には、投機実行が失敗だったとして、その前の時刻に状態が戻され、その実際の入力に基づき、処理が再実行される。
【００２５】
【特許文献１】特開平６−１６１９８７号公報
【特許文献２】特開平１１−１４５０７号公報
【特許文献３】特願２００８−１５８９９５号明細書
【発明の開示】
【発明が解決しようとする課題】
【００２６】
特願２００８−１５８９９５号明細書に記述された技法によれば、フルビークルＳＩＬＳで、動作の直列性に拘束されることなく、投機的に高速にシミュレーションを行うことが可能となった。
【００２７】
しかし、依然として、投機が失敗した場合は、新規入来イベントの時点までロールバックする必要があった。
【００２８】
従って、本発明の目的は、投機が失敗しても、新規入来イベントまでロールバックする必要のないシミュレーション技法を提供することにある。
【００２９】
本発明の他の目的は、新規入来イベントまでロールバックしない場合の誤差の累積を回避することができるシミュレーション技法を提供することにある。
【課題を解決するための手段】
【００３０】
本発明の実施のために、必須ではないが、好適にはマルチＣＰＵのワークステーションが用意される。また、各ＥＣＵのソフトウェア・エミュレータが用意される。一般的には、ＥＣＵのソフトウェア・エミュレータは、そのＥＣＵのメーカから入手可能である。
【００３１】
各ＥＣＵのソフトウェア・エミュレータは、好適には、マルチＣＰＵのワークステーション上で走るように、ワークステーションのオペレーティング・システムの所定のレイヤとインターフェースする。各ＥＣＵのソフトウェア・エミュレータには、好適には、マルチＣＰＵのうちの各々のＣＰＵが割り当てられ、以って、各ＣＰＵによって、各ＥＣＵエミュレータは独立に動作可能である。ＥＣＵの数よりもＣＰＵの数が少ない場合は、１つのＣＰＵに、複数のＥＣＵエミュレータが割り当てられる。いずれにしても、オペレーティング・システムは、各ＥＣＵエミュレータ毎に１つのプロセスを割り当て、以って、各ＥＣＵエミュレータは、固有の異なるクロックで動作しているように、エミュレーションを行うことができる。すなわち、各ＥＣＵエミュレータは、異種ＥＣＵであってよい。
【００３２】
各ＥＣＵエミュレータには、ワークステーションのメモリの一部が、内部処理用のプライベート・メモリとして割り当てられる。さらに、ＥＣＵエミュレータは、ワークステーションの共用メモリとして割り当てられた箇所にもアクセス可能であり、この共用メモリを介して、各ＥＣＵエミュレータは、互いにデータをやりとりしたり、同期したり、通信したりすることが可能である。あるいは、ＥＣＵエミュレータは、ＣＡＮ(controller area network)エミュレータで接続してもよい。
【００３３】
これらのＥＣＵエミュレータから入力を受け取る、エンジン・シミュレータ、トランスミッション・シミュレータなどの、物理装置シミュレータが用意され、やはりワークステーションの共用メモリ、またはＣＡＮ(controller area network)エミュレータで、ＥＣＵエミュレータと接続される。
【００３４】
ここで、ＥＣＵエミュレータと、物理装置シミュレータを、統一的に論理プロセスと呼ぶことにすると、本発明によれば、論理プロセスに、今までに入来した複数のイベントの値から、未来のイベントの値を複数予測する予測モジュールが設けられる。予測モジュールは、好適には線形予測の技法により、過去の複数のイベントの値から、未来の複数のイベントの値を予測し、次に新たなイベントが入来するまでは、この予測したイベントの値に基づき先行投機する。
【００３５】
次に新たなイベントが入来することに応答して、予測モジュールは、その新たなイベントと過去の入来イベントを併せて、未来の複数のイベントの値を予測し直す。すると、今回新しく予測したイベントの複数の値と、前回予測したイベントの複数の値との間には、誤差が生じる。そこで、予測モジュールは、今回新しく予測したイベントの複数の値と、前回予測した複数のイベントの値との間の誤差の累積和（累積誤差）をとり、その累積和が所定の閾値内に収まるイベントの数（ステップ数）を計算する。
【００３６】
そのようなステップ数をmとし、現在の時間に対応するステップをnとすると、予測モジュールは、好適には(n+m)まで先行投機をロールバックし、上記累積誤差を、好適にはステップn+2mに対応する時刻まで分散させて調整する。より具体的には例えば、今回新しく予測したイベントの複数の値から小分けにして差し引き、その差し引かれた差の和が、ステップ(n+m)から、例えばステップ(n+2m)までで、上記累積誤差と等しくなるようにする。
【００３７】
予測モジュールは、このように更新された予測したイベントの複数の値で、ステップ(n+m)から新たに先行投機するように、論理プロセスのローカル・スケジューラに指示する。
【発明の効果】
【００３８】
この発明によれば、フルビークルＳＩＬＳなどのシミュレーション・システムにおいて、新たな入来イベントに応答して、イベントの列を予測し直す予測モジュールを論理プロセスに設け、その予測し直しの誤差に応じて、入来イベントの時点まで戻らず途中までのロールバックで済むようにしたので、シミュレーション・システムの速度を向上させることができる。また、予測し直しの累積誤差は、その後の先行投機し直しの間に解消するようにしたので、誤差の蓄積が生じない、高い精度のシミュレーション・システムが得られる。
【発明を実施するための最良の形態】
【００３９】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００４０】
本発明を実現するための構成を説明する前に、その前提として、ＥＣＵについて説明する。ＥＣＵは、一般的に、センサからの入力信号を、例えばＡ／Ｄ変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部（マイクロコンピュータ）と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成されるものである。
【００４１】
この発明は、説明の便宜上、以下では、自動車のＥＣＵに関連して説明するが、それには限定されず、航空機、ロボットなどその他のＥＣＵをもつメカトロニクス機構全般に適用可能であることを理解されたい。
【００４２】
ＥＣＵは、周辺や環境状態、エンジンなどの駆動機構の状態、及び人間による指示操作の内容をセンサで検出して、信号として入力する。具体的には、水温センサ、吸気温センサ、過給圧センサ、ポンプ角センサ、クランク角センサ、車速センサ、アクセル位置センサ、Ａ／Ｔシフト・ポジション、スタータ・スイッチ、エアコンＥＣＵなどからの信号がある。
【００４３】
ＥＣＵは、これらの信号を入力して、電磁スピル弁、フュエル・カット・ソレノイド、タイミング・コントロール・バルブ、吸気絞りＶＳＶ、グロー・プラグ・リレー、タコメータ及びエアコン・リレーなどを駆動する信号を出力しする。
【００４４】
１つのＥＣＵが複数の異なる機構を制御するための駆動信号を出力するようにすることは不可能ではないが、例えば、エンジンとエアコンのように、応答性やその制御の厳密性が異なるものを単一のＥＣＵで制御することは合理的でなく、従って、一般的に自動車にＥＣＵは複数個設けられる。
【００４５】
図１は、ＥＣＵの典型的な制御である、フィードバック閉ループ系の例を示す図である。すなわち、図１において、ある目標の信号が、ＥＣＵであるコントローラ１０２に入力され、ＥＣＵは、目標の信号を内部処理することによって、駆動信号を出力し、制御対象モデルである、エンジンなどのプラント１０４を駆動し、プラント１０４の出力は、センサ１０６を介して、コントローラ１０２の入力にフィードバックされる。
【００４６】
ここで目標信号として与えられるのは、例えば、スロットル開度、アイドル・コントロール、ブレーキ力、シフト、スタータＯＮ・ＯＦＦ、バッテリ電圧、インジェクション通電時間、インジェクション通電回数、デポジット、ドウェル角、進角値、吸気完了フラグ、点火完了フラグ、大気圧、車両重量、転がり抵抗係数、道路勾配、粘着係数、吸気温、などのパラメータである。
【００４７】
また、センサ信号としてフィードバックされるのは、スロットル開度、吸気圧力、吸入空気量、シフト、エンジン回転数、車速、排気温、Ｏ２、冷却水温、空燃比、ノック、点火異常、などである。
【００４８】
ＥＣＵが制御する対象は、ニュートンの力学方程式で解かれる、機構系システムであったり、電気回路の応答方程式で解かれる、電気駆動回路であったり、それらの組み合わせであったりする。これらは、基本的に微分方程式であり、制御工学によれば、ラプラス変換によって応答関数に変換されて、記述することができる。
【００４９】
図２は、そのような応答関数による記述の例である。図２で破線２０２で囲った箇所が、図１のコントローラ１０２に対応し、破線２０４で囲った箇所が、図１の制御対象モデル１０４に対応し、センサ１０６が、ブロック２０６に対応する。なお、図２は、応答関数による表現の一例であって、特に本発明を限定する意図はないことを理解されたい。
【００５０】
さて、例えば、ＥＣＵが制御する対象が、ニュートンの力学方程式で解かれる、機構系システムであるとする。すると、ある時点のＥＣＵの制御出力は、その機構系システムの可動部分の位置及び速度という内部状態変数をもち、その時点の入力だけでは決まらない。そのことは、電気回路にもあてはまり、電気回路のキャパシタに残っている電荷の量や、コイルのインダクタンスによる磁力などの内部状態変数が、やはり存在する。
【００５１】
従って、ＥＣＵは、図３に示すように、入力ｕに対して、その内部状態ｘを勘案した値ｙを出力することになる。
【００５２】
さて、前述したＳＩＬＳのようなテストの目的で、自動車部品メーカーは、自社が提供する機器のＥＣＵのソフトウェア・エミュレータを提供する。すなわち、図２に示すような機能を、アセンブラまたはＣなどの言語が書かれたコードをアセンブリまたはコンパイルした実行可能プログラムにより、純粋にソフトウェア的に実現する。
【００５３】
本発明のこの実施例では、ＥＣＵのソフトウェア・エミュレータの内部状態を取り出して利用する。ソフトウェア・エミュレータによっては、内部状態が取り出し可能である場合と、そのままでは、内部状態が取り出し可能でない場合がある。
【００５４】
そこで、ＥＣＵのソフトウェア・エミュレータの内部状態がそのままでは、内部状態が取り出し可能でない場合、ソースコード解析ツールによって、次のような処理を行う。
【００５５】
もし、ＥＣＵのソフトウェア・エミュレータのソースコードが入手可能であるならそれをそのまま利用し、実行可能バイナリ・ファイルしかなければ、所定のツールで、逆アセンブルまたは逆コンパイルする。そうして、ＥＣＵのソフトウェア・エミュレータのソースコードに対して、データーフロー解析という技法を適用して、ソースコードを基本ブロックに分割する。基本ブロックとは、ソースコードを、複数の制御が合流するところ、または、制御が複数に分岐するところで分断した、各々の部分のことである。このような基本ブロックをノードとして、その分岐の制御の流れのリンクで接続すると、有向グラフ構造になる。これは特に、制御フローグラフとも呼ばれる。制御フローグラフは、始点ノードと終点ノードをもち、プログラムで実行され得るノードは全て、始点ノードからの有効エッジをもつ。基本ブロックのうち、exit()やreturnなどのステートメントを含む制御の末端ノードは全て、終点ノードへの有効エッジをもつ。
【００５６】
次に、制御フローグラフの始点ノードと終点ノードの可能な全てのパスに対して、Use/Def解析を行う。ここで、Useとは、ある変数が、別の変数に値をストアするために使用される場合をいう。典型的には、代入式の右辺である。Defとは、ある変数に、値がストアされる場合をいう。典型的には、代入式の左辺である。
【００５７】
この場合、個々のパス毎に、Defの前あるいは、DefなしでUseされている変数、すなわち未定義参照変数があるかどうかがチェックされ、もし未定義参照変数があると、その変数名は一旦保存される。
【００５８】
こうして、全てのパスがスキャンされた後に保存されている変数名を用いて、後述するように、ラッパ(wrapper)コードが生成される。
【００５９】
ところで、実行フローのスキャンと、Use/Def解析は、データーフロー解析という技法を用いることによって、より効率的に実行することができるので、以下、それについて説明する。
【００６０】
その第１ステップは、各基本ブロックにおけるdefリストの計算である。具体的にはプログラム全体で使用される変数のリストを１ビットで表現し、各基本ブロックごとに定義される変数を１されないものを０としたビットベクタで表現する。
【００６１】
その第２ステップは、プログラム全体の到達可能なdefリストの計算である。すなわち、各基本ブロックでは、複数の入力がある場合には論理積（ＡＮＤ）してから，自身への入力とする。自身からの出力は、その入力と、自身で定義したdefリストの論理和（ＯＲ）をとり、後続の基本ブロックに渡す。実行していく順番は、制御フローグラフ上での深さ優先順序が効率的である。
【００６２】
第３ステップは、クロージャ解析アルゴリズムにより、到達可能なdefリストのクロージャを求めることである。そして、上記第２ステップを、全ての基本ブロックの出力defリストが変化しなくなるまで、繰り返す。ここで、クロージャとは、環境と結び付けられた値のことである。
【００６３】
第４ステップは、未定義変数の使用の発見である。すなわち、各基本ブロックの入力defリストが０として表現された変数が、useとして使用されているものを検出する。
【００６４】
なお、データフロー解析のより詳しい説明については、Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman, "Compilers Principles, Technologies, and Tools", Addison-Wesley Publishing Company, 1986, p. 608-633などを参照されたい。
【００６５】
さて、例えば、元のＥＣＵシミュレーション・ソースコードが、関数 Func(x,y,z) であらわされるとする。また、未定義参照変数として、a, bが登録されていたとする。
【００６６】
すると、例えば、_Func(x,y,z,_a,_b)という関数が用意され、
_Func(x,y,z,_a,_b)
{
a = _a;
b = _b;
Func(x,y,z);
_a = a;
_b = b;
return;
}
【００６７】
_Func(x,y,z,_a,_b)
{
a = _a;
b = _b;
の部分のところを、入力用ラッパコードと呼び、
_a = a;
_b = b;
return;
}
の部分のところを、出力用ラッパコードと呼ぶ。
【００６８】
なお、 Func(x,y,z);  のところは、関数呼び出しではなく、インライン展開でもよい。このような関数_Func(x,y,z,_a,_b)を、_a,_bに適当な値を入れて呼び出すことにより、Func(x,y,z)の内部状態をセットすることができ、また、_Func(x,y,z,_a,_b)を呼び出した結果、_a,_bに、処理後の内部状態の値がセットされるので、必要に応じて、それらの値を別途保存するなど、利用可能である。このようにラッパコードが付されたソースコードは、実行可能プログラムを生成するために、コンパイルまたはアセンブルされる。
【００６９】
また、Ｃ＋＋など、特定の処理言語の仕様によっては、_Func(x,y,z,_a,_b)でなく、_Func(x,y,z,&_a,&_b)のように、参照演算子&をつけて関数に引数として与える必要があることもある。
【００７０】
こうして、内部状態あるいは、内部変数を取り出すことができるようになった後のＥＣＵのソフトウェア・エミュレータを図式的に、図４に示す。そこに示すように、ＥＣＵのソフトウェア・エミュレータ４０２は、内部ロジックfを示す部分と、内部状態または状態変数ｘとに好都合に分離される。
【００７１】
すると、内部ロジックfを用いて、出力y = f(t,x,u, ...)  と記述することができる。ここでtは、時間である。また、状態変数ｘに係るコードが分離されたことによって、任意の時点、すなわち典型的には出力がなされるタイミングで、状態変数ｘと、好ましくは入力uも、状態リポジトリ４０４として、ハードディスクドライブに書き出すことができる。
【００７２】
状態変数ｘに係るコードを分離した効果はこれだけではない。すなわち、矢印４０６で示すように、ソフトウェア・エミュレータ４０２には、任意の時点で、状態変数ｘをセットすることができる。これによって、状態リポジトリ４０４から入力と状態変数ｘを選んでセットすることにより、ＥＣＵのソフトウェア・エミュレータ４０２を、その状態変数ｘが状態リポジトリ４０４に書き出された任意の時点の状態に戻して、そこから計算をやり直させることができる。
【００７３】
以上説明したような処理は、ＥＣＵだけでなく、物理装置シミュレータも含む論理プロセス全般に適用することが可能である。従って、以下では、論理プロセスを、内部状態変数を取り出し可能で、且つ内部状態変数を所望の値にセット可能であるものとして扱う。
【００７４】
次に、図５を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図５において、ホスト・バス５０２には、複数のＣＰＵ０  ５０４ａ、ＣＰＵ１  ５０４ｂ、ＣＰＵ２  ５０４ｃ、ＣＰＵ３  ５０４ｄが接続されている。ホスト・バス５０２にはさらに、ＣＰＵ０  ５０４ａ、ＣＰＵ１  ５０４ｂ、ＣＰＵ２  ５０４ｃ、ＣＰＵ３  ５０４ｄの演算処理のためのメイン・メモリ５０６が接続されている。
【００７５】
一方、Ｉ／Ｏバス５０８には、キーボード５１０、マウス５１２、ディスプレイ５１４及びハードティスク・ドライブ５１６が接続されている。Ｉ／Ｏバス５０８は、Ｉ／Ｏブリッジ５１８を介して、ホスト・バス５０２に接続されている。キーボード５１０及びマウス５１２は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ５１４は、必要に応じて、後述する本発明に係るプログラムをＧＵＩで操作するためのメニューを表示するために使用される。
【００７６】
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘがある。その際、ＣＰＵ０  ５０４ａ、ＣＰＵ１  ５０４ｂ、ＣＰＵ２  ５０４ｃ、ＣＰＵ３  ５０４ｄは、例えば、インテル（Ｒ）Ｃｏｒｅ  ２  ＤＵＯであり、オペレーティング・システムは、Ｗｉｎｄｏｗｓ（商標）Ｓｅｒｖｅｒ  ２００３である。オペレーティング・システムは、ハードティスク・ドライブ５１６に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ５１６からメイン・メモリ５０６に読み込まれる。
【００７７】
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、ＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｘに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Ｗｉｎｄｏｗｓ（Ｒ）に限定されず、Ｌｉｎｕｘ（Ｒ）、Ｍａｃ  ＯＳ（Ｒ）など、任意のオペレーティング・システムを使用することができる。さらに、ＥＣＵエミュレータ・プログラム、物理装置シミュレータなどの論理プロセスを高速で動作させるために、ＰＯＷＥＲ（商標）６ベースで、オペレーティング・システムがＡＩＸ（商標）のＩＢＭ（Ｒ）Ｓｙｓｔｅｍ  Ｐなどのコンピュータ・システムを使用してもよい。
【００７８】
ハードディスク・ドライブ５１６にはさらに、ＥＣＵエミュレータ、物理装置シミュレータなどの複数の論理プロセス、及び、複数の論理プロセスを協働して動作させるためのプログラムが格納され、キーボード５１０及びマウス５１２によって起動操作可能である。
【００７９】
好適には、フルビークルＳＩＬＳを実現するために、１台の自動車で使われるすべてのＥＣＵのエミュレータ・プログラムが、ハードティスク・ドライブ５１６に保存されている。そのＥＣＵのエミュレータ・プログラムが、そのままでは内部の状態変数を取り出せないものてある場合は、上述したラッパコードを被せることにより、予め、状態変数をセット及び取り出し可能としておくものとする。
【００８０】
ハードティスク・ドライブ５１６にはさらに、後述するＥＣＵエミュレータ・プログラムのためのスケジューラ、エンジン、トランスミッション、ステアリング、ワイパなどの物理装置（プラント）シミュレータ・プログラム、全体のシステムの入力を同期させるためのグローバル・スケジューラ及び、登り坂道、高速道路、つづら折道などの様々な、テストのためのシナリオを格納したシナリオ・ジェネレータのプログラムも格納されている。
【００８１】
なお、ここでの「エミュレータ」と、「シミュレータ」の用語の使い分けであるが、もともとの、別のプロセッサで動くことを想定して書かれていたＥＣＵのコードを、ＣＰＵ０〜ＣＰＵ３などをターゲットとして動くようにすることを、エミュレーションと呼び、それを行うプログラムを、エミュレータと呼ぶ。一方、エンジンなどの物理的システムの動作を仮想計算するシステムを、シミュレータと呼ぶ。
【００８２】
次に、図６を参照して、本発明のシミュレーション・システムの機能論理ブロック図を説明する。図６において、共有メモリ６０２は、実際は、図５に示すメイン・メモリ５０６の一部であってよい。共有メモリ６０２には、ＥＣＵエミュレータ・プログラム６０４ａ、６０４ｂ、・・・６０４ｎと、グローバル・スケジューラ６０８と、物理装置シミュレータ・プログラム６０６ａ、・・・６０６ｍが論理的に結合されている。
【００８３】
グローバル・スケジューラ６０８は、ＥＣＵエミュレータ・プログラム６０４ａ、６０４ｂ、・・・６０４ｎ及び物理装置シミュレータ・プログラム６０６ａ、・・・６０６ｍの間のイベントのタイム・スタンプに基づき、それらのイベントの間の一貫性を維持するように動作する。グローバル・スケジューラ６０８のより詳しい動作は、後述する。
【００８４】
ＥＣＵのエミュレータ・プログラム６０４ａ、６０４ｂ、・・・６０４ｎは、それぞれ、エンジン、ブレーキ、トランスミッション、ステアリングなど、車の異なる部分の制御に対応するもので、それぞれが異なる速度のクロックで動作するので、対応するＥＣＵのエミュレータ・プログラムも、それに比例するクロック比で動作するものとする。
【００８５】
一例として、スレッドを作成いることにより、複数のＣＰＵに、ＥＣＵのエミュレータ・プログラムを割り当てるコードを、Ｃ言語を例にとって示す。
void* ecu_wrapper(void* parm)
{
...
/* define state_repository */
...
LOOP_BEGIN:
...
/* ECUのユニット処理を行う */
LOOP_END:
...
}
【００８６】
上記のようなコードを用意しておいて、
pthread_t  thread_id;
pthread_attr_t thread_attr;
pthread_attr_init(&thread_attr);
pthread_create(&thread_id, thread_attr, ecu_wrapper, NULL);
pthread_attr_destroy(&thread_attr);
とすると、オペレーティング・システムがスレッドを生成して、それをＥＣＵのエミュレータ・プログラムに割り当てる。物理的には、そのスレッドは、ＣＰＵ０〜ＣＰＵ３のどれかに割り当てられるが、それはオペレーティング・システムに任され、エミュレータ・プログラムにとっては、透過的である。
このような割り当て処理は、ＥＣＵエミュレータ・プログラム６０４ａ、６０４ｂ、・・・６０４ｎ各々に個別に行われる。
【００８７】
なお、図６に示した論理構成では、ＥＣＵエミュレータ・プログラム６０４ａ、６０４ｂ、・・・６０４ｎ、物理装置シミュレータ・プログラム６０６ａ、・・・６０６ｍ及びグローバル・スケジューラ６０８は、共有メモリ６０２を使用してデータを交換するが、代わりに、ＣＡＮ(controller area network)エミュレータを使用してもよい。
【００８８】
図示しないが、図６の構成には、登り坂道、高速道路、つづら折道などの様々な、テストのためのシナリオを格納したシナリオ・ジェネレータも接続される。
【００８９】
さて、ＥＣＵエミュレータ・プログラム６０４及び物理装置シミュレータ・プログラム６０６を総称して論理プロセスと称することは既に述べたが、本発明の処理は、論理プロセス全般に適用可能なので、以下では可能な限り、論理プロセスについての構成または処理として説明する。
【００９０】
図７は、論理プロセス７００内部の、より詳細な論理ブロック図を示す。論理モジュール７０２は、いわゆる論理プロセスの本来のロジックを含む本体である。
【００９１】
ローカル・スケジューラ７０４は、ロールバック表７０６に保存した内部状態変数を、論理モジュール７０２に書き戻すことにより、論理プロセス７００を所望の状態に戻す機能を持つ。ロールバック表７０６には、内部状態変数以外に、入力イベントの値、時間、出力イベントの値の履歴が記録される。ローカル・スケジューラ７０４は、ロールバック表７０６のエントリを探索して、論理モジュール７０２に、ロールバックの指示を出す。
【００９２】
ローカル・スケジューラ７０４には、共有メモリ６０２から、通信インターフェース・モジュール７０８を介して、イベント入力が提供される。一方、ローカル・スケジューラ７０４は、通信インターフェース・モジュール７０８に対して、イベント入力を出力する。
【００９３】
通信インターフェース・モジュール７０８は、共有メモリ６０２を介して、ＥＣＵエミュレータ６０４、物理装置シミュレータ６０６などの他の論理プロセスや、グローバル・スケジューラ６０８と通信する。その通信方法は、特定のメモリのアドレスに書いてシグナルするなどの方法である。このような共有メモリを介する方法以外にも、ＣＡＮエミュレータを使用する方法がある。
【００９４】
論理プロセス７００はさらに、予測モジュール７１０をもつ。予測モジュール７１０は、過去の複数の入来イベントを記録し、その記録された複数のイベントの値に基づき、線形予測などの手法で未来の複数のイベントを予測し、その予測された複数のイベントの列に基づき、論理モジュール７０２を先行投機実行させるように、ローカル・スケジューラ７０４に指示するコマンドを出す。
【００９５】
予測モジュール７１０は、本発明の中心的な特徴を担うので、図８を参照して、より詳細に説明する。
【００９６】
図８に示すように、予測モジュール７１０は、予測曲線の更新モジュール８０２と、ロールバックの計算モジュール８０４と、累積誤差の配分計算モジュール８０６と、予測の補正モジュール８０８を有する。予測モジュール７１０はさらに、入来イベントの観測値の記録領域８１０と、前予測曲線の記録領域８１２を有する。
【００９７】
観測値の記録領域８１０は、好適には、メイン・メモリ５０６内に確保された所定の領域であるが、保存的に読み書き可能な領域であるならこれに限定されず、例えば、ハードディスク・ドライブ５１５の所定の領域に確保された領域であってもよい。観測値の記録領域８１０には、ローカル・スケジューラ７０４を経由して入来するイベントの実測値と、そのイベントの時刻が順次記録される。
【００９８】
予測曲線の更新モジュール８０２は、記録領域８１０に記録された複数のイベントの実測値と、その時刻の値を用いて、好適には線形予測のアルゴリズムにより、複数のイベントの値と、その時刻とを予測する。
【００９９】
ロールバックの計算モジュール８０４は、モジュール８０２によって計算された複数のイベントの値に基づき、ロールバックすべきステップ数mを計算する。ロールバックの計算モジュール８０４は、下記に説明する前予測曲線の記録領域８１２からの値も参照する。ロールバックの計算モジュール８０４は、ローカル・スケジューラ７０４から先行（投機済み）時刻を受け取り、一方、ローカル・スケジューラ７０４に、ロールバックすべきステップ数を返す。
【０１００】
前予測曲線の記録領域８１２には、前回、予測曲線の更新モジュール８０２によって予測計算され、その後、予測の補正モジュール８０８によって補正を受けた結果の前予測曲線の値が保存される。
【０１０１】
累積誤差の配分計算モジュール８０６は、予測曲線の更新モジュール８０２から受け取った今回の予測曲線の値と、前予測曲線の記録領域８１２から受け取った前予測曲線の値と、ロールバックの計算モジュール８０４から受け取ったステップ数mの値とから、今回の予測曲線の各ステップに施すべき補正の値を計算する。
【０１０２】
予測の補正モジュール８０８は、モジュール８０６から供給された値を用いて、予測曲線の更新モジュール８０２によって予測された値を補正し、その値を、ローカル・スケジューラ７０４に送る。ローカル・スケジューラ７０４は、受け取った、補正された予測値を、その後のロールバック処理に使用する。
【０１０３】
予測の補正モジュール８０８によって補正された予測値は、次回の使用のために、前予測曲線の記録領域８１２に記録される。
【０１０４】
図９は、予測モジュール７１０のより詳細な処理を示すフローチャートである。ステップ９０２では、ローカル・スケジューラ７０４が、新たなイベント（観測値）を待つ。そこで、ローカル・スケジューラ７０４に新たなイベントが届き、そのイベントの時刻（ステップ数）をnとする。ローカル・スケジューラ７０４はその値を、予測曲線の更新モジュール８０２に送る。
【０１０５】
ステップ９０４では、予測曲線の更新モジュール８０２が、観測値の記録領域８１０から読み出した値と、ローカル・スケジューラ７０４から送られた、上記新たなイベントの値を使って、新しい予測曲線を計算する。
【０１０６】
このステップは、図１０のフローチャートを参照して、より詳細に説明する。この実施例では、現在の値に加えて過去のn-1個の値から、線形予測の理論に従う下記の式に基づき、x~'[n+1]の予測値を計算する。
【数１】
2010086207.tif 000003
ここで、係数wi ( i = 0,1,2,...,N-1 )を決定するために先ず、ステップ１００２で、下記のベクトルｘと、行列Ｈが計算される。具体的なNの数は、論理プロセスの動作の特性に依存するが、少なくとも3程度が望ましい。
【数２】
2010086207.tif 000004
なお、この式は、一般的なMについて書かれており、ここでは、Mは、Nより十分大きな値とする。
【０１０７】
こうして、ｗ = (ＨTＨ)-1ＨTｘにより、係数ｗが計算される。
ここで、ｗ =  [w0,w1,...,wN-1]Tである。
また、図１０のルーチンは、新たなイベント（観測値）が入来する度に呼ばれるので、その度毎に、係数wi ( i = 0,1,2,...,N-1 )は再計算されることも理解されたい。
【０１０８】
ステップ９０４に戻って、こうしてｗが求まると、数１の式で、nを増やすことにより、
x~'[n+1], x~'[n+2], x~'[n+3],... と、新しい予測の値を順次求めることができる。
【０１０９】
なお、線形予測により求めるx~'[n+1], x~'[n+2], x~'[n+3],... などの値は、一般的には、イベントの値であり、イベントは複数の値をパラメータとしてもつことがあるので、イベントの値は、ベクトル表記されることがある。そのような場合、ベクトルの異なる成分は互いに独立であるとみなして、個々の成分に、上記線形予測を適用することができる。
【０１１０】
また、個々のイベントには、時間が関連付けられており、その時間の予測計算にも線形予測を適用することができる。すると、結果の予測されたイベントも時間をもつことになるので、その予測された時間にイベントが入ってきたものとして、シミュレーションを先行投機実行することができる。
【０１１１】
ステップ９０６では、古い予測値x~[i] (i = n+1, n+2, ...)と、今回計算された新しい予測値x~'[i] (i = n+1, n+2, ...)との差が次の式により計算される。最初の式だけは、実測値x[n]が使われている。
e[n] = x~[n] - x[n]
e~[n+1] = x~[n+1] - x~'[n+1]
e~[n+2] = x~[n+2] - x~'[n+2]
e~[n+3] = x~[n+3] - x~'[n+3]
.....
これらの値は、累積誤差の配分計算モジュール８０６によって保持される。
【０１１２】
ステップ９０８では、ロールバックの計算モジュール８０４により、累積誤差の許容範囲(m)が下記の不等式により計算される。
【数３】
2010086207.tif 000005
ここで、Tcは、所定の閾値であり、この不等式を満たす最大の整数mが求めるmの値である。Tcが大きいほど、mの値も大きくなる。
【０１１３】
ステップ９１０では、ロールバックの計算モジュール８０４において、ステップ９０８で計算されたmの値でもって、n+mが計算され、ロールバックの計算モジュール８０４は、ローカル・スケジューラ７０４に、n+mのステップの時点までロールバックするように指示を出すコマンドを送る。
【０１１４】
なお、ステップ９０２の時刻（ステップ）nの時点で、先行投機は、n < n + 2m < nsのような時刻nsまで進んでいることに留意されたい。
従って、n < n + m < n + 2m < nsなので、nsからn+mのステップの時点までロールバックするとは、nsから、m以上のステップを戻ることを意味する。
【０１１５】
ステップ９１２では、予測の補正モジュール８０８で、新しく予測された値
x~'[n+m], x~'[n+m+1], x~'[n+m+2],... が、累積誤差の配分計算モジュール８０６によって保持されているe[n],e~[n+1],e~[n+2],e~[n+3]...を用いて、下記の式により補正される。
【０１１６】
x~''[n+m] = x~'[n+m] - e~[n+m-1]
x~''[n+m+1] = x~'[n+m+1] - e~[n+m-2]
x~''[n+m+2] = x~'[n+m+2] - e~[n+m-3]
....
....
x~''[n+2m-2] = x~'[n+2m-2] - e~[n+1]
x~''[n+2m-1] = x~'[n+2m-1] - e[n]
x~''[n+2m] = x~'[n+2m]
【０１１７】
このように補正された値x~''[n+m]、x~''[n+m+1]、x~''[n+m+2]、...、
x~''[n+2m-1]、x~''[n+2m]及び、続きの新しい予測x~'[n+2m+1], x~'[n+2m+2],
x~'[n+2m+3]..が、予測の補正モジュール８０８からローカル・スケジューラ７０４に送られ、ローカル・スケジューラ７０４は、ステップn+mから、これらの補正された値で順次、論理モジュール７０２を動作させるように制御する。
【０１１８】
補正された値x~''[n+m]、x~''[n+m+1]、x~''[n+m+2]、...、x~''[n+2m-1]、
x~''[n+2m]及び、続きの新しい予測x~'[n+2m+1], x~'[n+2m+2],x~'[n+2m+3]は、
前予測曲線の記録領域８１２にも記録される。
【０１１９】
図１１は、本発明による予測補正スキームを説明する図である。イベントがローカル・スケジューラ７０４にイベントx[n]が到来した時点で、先行投機は、ずっと先のnsまで進んでいたとする。
【０１２０】
このとき、...,x[n-2],x[n-1]から予測計算され補正されて既に予測の補正モジュール８０８によって先行投機されたイベントは、x~[n],x~[n+1],x~[n+2],...,x~[ns]であるが、イベントx[n]の到来に応答して、予測計算の更新モジュール８０２は、
改めて、...,x[n-2],x[n-1],x[n]に基づき新たな予測計算を行う。その結果の予測値は、x~'[n+1],x~'[n+2]...である。
【０１２１】
それでは、nまでロールバックして、x~'[n]から再実行するのは、ロールバックが大きすぎて、シミュレーション速度の低下になる。
【０１２２】
そこで、誤差がある閾値内であることを許容してロールバックを減らす。その結果が、n+mまでのロールバックであり、nまでのロールバックに比べて、mステップ先行していることが分かる。これは、シミュレーション速度の向上に有利である。
【０１２３】
ところが、上記誤差を残したままであると、この誤差が累積してしまう。そこで、n+mからn+2mまでの間でその誤差を解消してしまうように、数３で示した累積誤差Eを小出しで調整するべく、補正された値x~''[n+m]、...、x~''[n+2m]を計算して、先行投機実行する。これによって、誤差の累積が生じないようにしつつ、nまでロールバックしなくてよいので、シミュレーション速度を向上させることができる。
【０１２４】
尚、上記の例では、時刻n+mからそれぞれ、差分e~[n+m],...,e~[n+1],e[n]を適用したが、各ステップでの最大許容量Tが確定できるなら、EをTで割った整数部分をMとして、n+mからn+m+M-1までそれぞれTを差し引いて、時刻n+m+Mには、E-MTを差し引くと、最小の区間で誤差の配分を終えることができる。
【０１２５】
さて、図１２に示すように、グローバル・スケジューラ６０８は、論理プロセスＬＰ＃１〜ＬＰ＃Ｎ毎にキューＱ１〜Ｑｎをもつ。論理プロセスとは各々、図７に示すＥＣＵエミュレータ＃１〜＃ｎ、物理装置シミュレータ＃１〜＃ｍ、のどれかである。
【０１２６】
キューＱ１〜Ｑｎには、対応する論理プロセスＬＰ＃１〜ＬＰ＃Ｎから、随時にイベントが入来し、入来したイベントは、キューに一旦格納される。グローバル・スケジューラ６０８は、キューＱ１〜Ｑｎに格納されているイベントに基づき、確定イベントと、確定時間を出力する。
【０１２７】
図１３は、そのためのグローバル・スケジューラ６０８の処理を示すフローチャートである。ステップ１８０２で、グローバル・スケジューラ６０８は、どれかのキューＱ１〜Ｑｎ（図１２）に、新しいイベントが到来するのを待つ。
【０１２８】
ステップ１３０４では、空のキューにイベントが届いたかどうかが判断され、そうでなければ、処理は、ステップ１３０２に戻る。
【０１２９】
ステップ１３０４で、空のキューにイベントが届いたと判断されると、ステップ１３０６に行って、そこで、すべてのキューＱ１〜Ｑｎが少なくとも１つのイベントをもつかどうかが判断される。そうでなければ、やはり処理は、ステップ１８０２に戻る。
【０１３０】
ステップ１３０６で、すべてのキューＱ１〜Ｑｎが少なくとも１つのイベントをもつと判断されると、ステップ１３０８では、すべてのキューＱ１〜Ｑｎの中で、最も古いイベントが見出される。このことは、すべてのイベントには、タイム・スタンプがつけられていることにより可能である。
【０１３１】
ステップ１３１０では、見つけられた最も古いイベントが、確定イベントとされ、論理プロセスＬＰ＃１〜ＬＰ＃Ｎに通知される。
【０１３２】
ステップ１３１２では、確定イベントがキューから取り除かれる。そして、ステップ１８０２に戻り、グローバル・スケジューラ６０８は、次のイベントの到着を待つ。
【０１３３】
以上、自動車用の複数の論理プロセスをもつシミュレーション・システムに関連して、本発明の特定の実施例を説明してきたが、本発明はこのような特定の実施例に限定されず、飛行機用のシミュレーション・システムなど、一般的な電子機械制御系システムのシミュレーション・システムに適用可能であることを、この分野の当業者であるなら、理解するであろう。
【図面の簡単な説明】
【０１３４】
【図１】ＥＣＵの典型的な制御である、フィードバック閉ループ系の例を示す図である。
【図２】フィードバック閉ループ系の、応答関数による記述の例である。
【図３】ＥＣＵソフトウェア・エミュレータのクロック応答の時間推移を示す図である。
【図４】内部変数を取り出すことができるようになった後のＥＣＵのソフトウェア・エミュレータのブロック図である。
【図５】本発明を実施するために使用されるコンピュータのハードウェアのブロック図である。
【図６】本発明のシミュレーション・システムの機能論理ブロック図である。
【図７】論理プロセスの論理ブロック図である。
【図８】予測モジュールの詳細な論理ブロック図である。
【図９】予測モジュールの処理のフローチャートである。
【図１０】線形予測処理のフローチャートである。
【図１１】予測された投機ステップと、補正された投機ステップの関係を示す図である。
【図１２】グローバル・スケジューラのキューを示す図である。
【図１３】グローバル・スケジューラの処理のフローチャートである。
【符号の説明】
【０１３５】
６０４、６０６・・・論理プロセス
８１０・・・第１の記録手段
８０８・・・補正する手段
８１２・・・第２の記録手段
【図１】
2010086207.tif 000006
【図２】
2010086207.tif 000007
【図３】
2010086207.tif 000008
【図４】
2010086207.tif 000009
【図５】
2010086207.tif 000010
【図６】
2010086207.tif 000011
【図７】
2010086207.tif 000012
【図８】
2010086207.tif 000013
【図９】
2010086207.tif 000014
【図１０】
2010086207.tif 000015
【図１１】
2010086207.tif 000016
【図１２】
2010086207.tif 000017
【図１３】
2010086207.tif 000018