(57)【要約】      （修正有）【課題】コンピュータによるシミュレーション・システムにおいて、大域変数の値の読書きを、投機的に行い、且つロールバック可能にする。【解決手段】論理プロセス（ＬＰｎ）が使用する大域変数毎に、大域変数への値の書込みは、その書込み時間と書込み値を書込みテーブル１０１２に書き込むことで行い、また、大域変数の値の読取りは、その書込みテーブルからの値の読取りと、そのときの時間と読取った値を、読取りテーブル１０１４に書込むことで行う。大域変数に書込みがあったことに応答して、シミュレーション・システムは、各論理プロセスの読取りテーブルのエントリに対して、書込みテーブルのエントリを比較し、無効なエントリが読取りテーブルに見つかると、その読取りテーブルに関連する論理プロセスに、ダウト・メッセージが出され、ダウト・メッセージを受け取った論理プロセスは、必要なロールバック処理を行う。【選択図】図１６
2010055249.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータに基づく、シミュレーション・システムにおいて、
値を、前記コンピュータによって読書き可能なメモリと、
前記メモリ内に設けられた、少なくとも１つの大域変数の領域と、
前記大域変数から値を読取る、時間付きの読取りイベント、または、前記大域変数に値を書き込む、時間付きの書込みイベントを発生する複数の論理プロセスと、
前記メモリ内に設けられた、時間及び値を含む複数のエントリをもつ書込みテーブルと、
前記大域変数毎に、前記メモリ内に各論理プロセス毎に設けられ、時間及び値を含む複数のエントリをもつ読取りテーブルと、
前記論理プロセスが、前記書込みイベントを発生することに応答して、前記大域変数における書込みテーブルに、前記書込みイベントの時間と値のエントリを格納する手段と、
前記論理プロセスが、前記読取りイベントを発生することに応答して、前記大域変数における、前記論理プロセスの前記する読取りテーブルに、前記読取りイベントの時間と値のエントリを格納する手段と、
前記論理プロセスが、前記書込みイベントを発生することに応答して、前記大域変数における、各論理プロセス毎の前記読取りテーブルのエントリを、前記大域変数における前記書込みテーブルのエントリと比較することにより、有効かどうかを判定する手段と、
前記読取りテーブルが有効でないと判定された論理プロセスに、メッセージを送る手段と、
前記メッセージを受領した前記論理プロセスにおいて、ロールバック処理を行う手段とを有する、
シミュレーション・システム。
【請求項２】
前記書込みテーブルは前記大域変数毎に設けられ、前記読取りテーブルは、前記大域変数毎に且つ前記各論理プロセス毎に設けられている、請求項１のシミュレーション・システム。
【請求項３】
前記有効かどうかを判定する手段は、前記書込みイベントに応答して前記書込みテーブルに書込まれたエントリに対して、時間的に直前と直後のエントリの時間範囲にあって、時間が後で値が異なるエントリを前記読取りテーブルがもつことに応答して、前記読取りテーブルが無効と判定する、請求項１のシミュレーション・システム。
【請求項４】
前記読取りテーブルの、前記時間が後で値が異なるエントリをキャンセルして、前記読取りテーブルに、前記書込みテーブルに書込まれたエントリの値をもつエントリを書き込む手段をさらに有する、請求項３のシミュレーション・システム。
【請求項５】
前記論理プロセスが、物理装置シミュレータまたはＥＣＵエミュレータである、請求項１のシミュレーション・システム。
【請求項６】
複数の前記論理プロセスからの前記書込みイベントを受け取って、前記書込みテーブルに書込みを行い、その完了に応答して順次前記書込みイベントを処理するグローバル・スケジューラをさらに有する、請求項１のシミュレーション・システム。
【請求項７】
コンピュータに基づく、シミュレーション方法において、
前記コンピュータのメモリ内に、少なくとも１つの大域変数の領域を確保するステップと、
前記大域変数から値を読取る、時間付きの読取りイベント、または、前記大域変数に値を書き込む、時間付きの書込みイベントを発生する複数の論理プロセスを実行するステップと、
前記コンピュータのメモリ内に、時間及び値を含む複数のエントリをもつ書込みテーブルを確保するステップと、
前記コンピュータのメモリ内に、時間及び値を含む複数のエントリをもつ読取りテーブルを、確保するステップと、
前記論理プロセスが、前記書込みイベントを発生することに応答して、前記大域変数における書込みテーブルに、前記書込みイベントの時間と値のエントリを格納するステップと、
前記論理プロセスが、前記読取りイベントを発生することに応答して、前記大域変数における、前記論理プロセスの前記する読取りテーブルに、前記読取りイベントの時間と値のエントリを格納するステップと、
前記論理プロセスが、前記書込みイベントを発生することに応答して、前記大域変数における、各論理プロセス毎の前記読取りテーブルのエントリを、前記大域変数における前記書込みテーブルのエントリと比較することにより、有効かどうかを判定するステップと、
前記読取りテーブルが有効でないと判定された論理プロセスに、メッセージを送るステップと、
前記メッセージを受領した前記論理プロセスにおいて、ロールバック処理を行うステップとを有する、
シミュレーション方法。
【請求項８】
前記書込みテーブルは前記大域変数毎に設けられ、前記読取りテーブルは、前記大域変数毎に且つ前記各論理プロセス毎に設けられている、請求項７のシミュレーション方法。
【請求項９】
前記有効かどうかを判定するステップは、前記書込みイベントに応答して前記書込みテーブルに書込まれたエントリに対して、時間的に直前と直後のエントリの時間範囲にあって、時間が後で値が異なるエントリを前記読取りテーブルがもつことに応答して、前記読取りテーブルが無効と判定する、請求項７のシミュレーション方法。
【請求項１０】
前記読取りテーブルの、前記時間が後で値が異なるエントリをキャンセルして、前記読取りテーブルに、前記書込みテーブルに書込まれたエントリの値をもつエントリを書き込む手段をさらに有する、請求項９のシミュレーション方法。
【請求項１１】
前記論理プロセスが、物理装置シミュレータまたはＥＣＵエミュレータである、請求項７のシミュレーション方法。
【請求項１２】
コンピュータ上で実行される、シミュレーション・プログラムであって、
前記コンピュータに、
前記コンピュータのメモリ内に、少なくとも１つの大域変数の領域を確保するステップと、
前記大域変数から値を読取る、時間付きの読取りイベント、または、前記大域変数に値を書き込む、時間付きの書込みイベントを発生する複数の論理プロセスを実行するステップと、
前記コンピュータのメモリ内に、時間及び値を含む複数のエントリをもつ書込みテーブルを確保するステップと、
前記コンピュータのメモリ内に、時間及び値を含む複数のエントリをもつ読取りテーブルを、確保するステップと、
前記論理プロセスが、前記書込みイベントを発生することに応答して、前記大域変数における書込みテーブルに、前記書込みイベントの時間と値のエントリを格納するステップと、
前記論理プロセスが、前記読取りイベントを発生することに応答して、前記大域変数における、前記論理プロセスの前記する読取りテーブルに、前記読取りイベントの時間と値のエントリを格納するステップと、
前記論理プロセスが、前記書込みイベントを発生することに応答して、前記大域変数における、各論理プロセス毎の前記読取りテーブルのエントリを、前記大域変数における前記書込みテーブルのエントリと比較することにより、有効かどうかを判定するステップと、
前記読取りテーブルが有効でないと判定された論理プロセスに、メッセージを送るステップと、
前記メッセージを受領した前記論理プロセスにおいて、ロールバック処理を行うステップと実行させる、
シミュレーション・プログラム。
【請求項１３】
前記書込みテーブルは前記大域変数毎に設けられ、前記読取りテーブルは、前記大域変数毎に且つ前記各論理プロセス毎に設けられている、請求項１２のシミュレーション・プログラム。
【請求項１４】
前記有効かどうかを判定するステップは、前記書込みイベントに応答して前記書込みテーブルに書込まれたエントリに対して、時間的に直前と直後のエントリの時間範囲にあって、時間が後で値が異なるエントリを前記読取りテーブルがもつことに応答して、前記読取りテーブルが無効と判定する、請求項１２のシミュレーション・プログラム。
【請求項１５】
前記読取りテーブルの、前記時間が後で値が異なるエントリをキャンセルして、前記読取りテーブルに、前記書込みテーブルに書込まれたエントリの値をもつエントリを書き込むステップをさらに有する、請求項１４のシミュレーション・プログラム。
【請求項１６】
前記論理プロセスが、物理装置シミュレータまたはＥＣＵエミュレータである、請求項１２のシミュレーション・プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、自動車などの物理システムのシミュレーションに関し、より詳しくは、ソフトウェア・ベースでのシミュレーション・システムに関するものである。
【背景技術】
【０００２】
自動車は、その初期の時代の２０世紀初頭は、動力としてのエンジンと、ブレーキ、アクセル、ハンドル、トランスミッション、サスペンジョンを含む、機構部品からなっていたが、エンジンのプラグの点火、ヘッドライト以外は、電気的な仕組みはほとんど利用していなかった。
【０００３】
ところが、１９７０年代頃から、大気汚染、石油危機などに備えて、エンジンを効率的に制御する必要性が生じ、このためエンジンの制御に、ＥＣＵが使用されるようになってきた。ＥＣＵは、一般的に、センサからの入力信号を、例えばＡ／Ｄ変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部（マイクロコンピュータ）と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成される。
【０００４】
いまや、エンジンやトランスミッションなどの制御システム、Anti-lock Breaking System （ＡＢＳ）、Electronic Stability Control （ＥＳＣ）、パワーステアリングだけでなく、ワイパー制御やセキュリティ・モニタリング・システムなどに至るまで、最近の自動車では、機構部品だけでなく、エレクトロニクス部品やソフトウエアが重要な比率を占める。後者に関する開発費は全体の２５％とも４０％とも言われ、ハイブリッド型の自動車では７０％を占める。
【０００５】
電子制御は、ＥＣＵを複数、配置して行われる。ＥＣＵ間は車載ネットワーク、例えば、Controller Area Network （ＣＡＮ） で相互に接続される。また、制御の対象である、エンジンやトランスミッションなどには、それぞれのＥＣＵから直接ワイヤリングして接続する。
【０００６】
ＥＣＵは、小さなコンピュータであり、センサ入力などからの割り込みに応じて動作する。一方、エンジンなどは連続的に機械的動作を行っている。すなわち、コンピュータ系のディジタル・システムと、機械系の物理システムが、自動車という単一システムにおいて、並列に協調動作を行っている。当然、これを支えるソフトウエアは複雑さがますます増大しており、ＥＣＵ単体で動作を検証するだけでなく、複数を同時に検証する仕組みの実現が急務である。
【０００７】
ここで、ＥＣＵに信号を入力するセンサには、エンジンの温度などを計測する温度センサ、エンジンに吸入される圧力を推定するための圧力センサ、アクセスペダルの踏み量を測定するスロットル・ポジション・センサ、ステアリング舵角センサ、車高センサ、回転速度センサ、ノックセンサ、加速度センサ、流量センサ、酸素センサ、希薄空燃比センサなどがある。
【０００８】
一方、ＥＣＵの出力信号によって駆動されるアクチュエータには、電磁ソレノイド及びモータ等がある。ソレノイドは例えば、エンジンのインジェクタ、トランスミッションのシフト・コントロール、ブレーキのバルブ制御、ドアロックなどに使用される。
【０００９】
モータは、主としてサーボ機構として、エンジンのスタータ、エンジンのフューエル・コントロール、ブレーキの油圧ポンプ、舵角制御、ステアリング、ワイパ、パワーウインドウ、シートベルト、エアバックなどに使用される。
【００１０】
このようなテストにために従来行われている技法として、ＨＩＬＳ(Hardware In the Loop Simulation)がある。特に、自動車全体のＥＣＵをテストする環境は、ホールビークルＨＩＬＳ(Whole Vehicle Hardware In the Loop Simulation)と呼ばれる。ホールビークルＨＩＬＳにおいては、実験室内で、本物のＥＣＵが、エンジン、トランスミッション機構などをエミュレーションする専用のハードウェア装置に接続され、所定のシナリオに従って、テストが行われる。ＥＣＵからの出力は、監視用のコンピュータに入力され、さらにはディスプレイに表示されて、テスト担当者がディスプレイを眺めながら、異常動作がないかどうか、チェックする。
【００１１】
しかし、ＨＩＬＳは、専用のハードウェア装置を使い、それと本物のＥＣＵの間を物理的に配線しなくてはならないので、準備が大変である。また、別のＥＣＵに取り替えてのテストも、物理的に接続し直さなくてはならないので、手間がかかる。さらに、本物のＥＣＵを用いたテストであるため、テストに実時間を要する。従って、多くのシナリオをテストすると、膨大な時間がかかる。また、ＨＩＬＳのエミュレーション用のハードウェア装置は、一般に、非常に高価である。
【００１２】
そこで近年、高価なエミュレーション用ハードウェア装置を使うことなく、ソフトウェアで構成する手法が存在する。この手法は、ＳＩＬＳ(Software In the Loop Simulation)と呼ばれ、ＥＣＵに搭載されるマイクロコンピュータ、入出力回路、制御のシナリオなどを全て、ソフトウェア・シミュレータで構成する技法である。これによれば、ＥＣＵのハードウェアが存在しなくても、テストを実行可能である。
【００１３】
ところで、自動車用電子システムでは、上述のように、温度センサ、圧力センサ、変位センサ、角速度センサ、回転数センサ、加速度センサ、流量センサなどの多くのセンサが使用されている。例えば、ある温度センサは、エンジン冷却水温度を検出し、その検出信号は、所定のＥＣＵに入力される。このような処理を、自動車用ＳＩＬＳでシミュレーションしようとすると、温度センサの挙動をソフトウェア的にエミュレートするのではなく、１つの温度センサは、１つの共有メモリの区画として実現されるのが一般的である。
【００１４】
すると、温度センサが、エンジン冷却水温度を検出し、その検出信号が、所定のＥＣＵによって読み取られる、という処理は、ＳＩＬＳでは、エンジン・シミュレータが、共有メモリの所定の区画に、温度検出値としての数値を書込み、その区画に書かれた値を、ＥＣＵエミュレータが読取る、という処理としてシミュレートされる。
【００１５】
そこで一般化して、シミュレーション・システムの構成要素としてのエンジン・シミュレータやＥＣＵエミュレータを論理プロセス（ＬＰ）と呼ぶことにすると、センサとしての共有メモリの区画には、異なるタイミングで、異なる論理プロセスが値を読み書きする、という状況がありえる。
【００１６】
また、そこには内在的な順序が想定されていることを理解されたい。例えば、上記の例では、エンジン・シミュレータが、共有メモリの所定の区画に、温度検出値を書き込み、それから、ＥＣＵエミュレータが温度検出値を読取る、という順序が維持される必要があり、ＥＣＵエミュレータが温度検出値を読取るのが先で、エンジン・シミュレータが、温度検出値を書き込むのが後だと、ＥＣＵエミュレータが読み取った値は最新ではなく、正しくない、ということになる。
【００１７】
一方で、各論理プロセスは、実際の自動車用電子システムをシミュレートすることによって、異なるクロック・レートで動作するようになされている。例えば、エンジン・シミュレータは、エンジンの回転をシミュレートするため、相対的に低い速度で動作する。一方、ＥＣＵエミュレータは、相対的に高い速度で動作する。
【００１８】
このような論理プロセス間の動作速度の違いを前提として、上述した処理の順序を保証しようとすると、相対的に速い論理プロセスが、相対的に遅い論理プロセスの処理の完了を待つ、ということになる。すると、折角高速で且つマルチコアのコンピュータ・ハードウェアを使用しても、一番遅い論理プロセスに足並みを揃えなくてはならないので、シミュレーション・システム全体の処理速度をあまり向上させることができない、という問題が生じる。
【００１９】
特開平１１−１４５０７号公報に開示されている技術は、車両全体のロジックを机上で検証できるようにすることを課題とするものであり、エンジン制御模擬装置（ＥＣＵ）と、車両制御模擬装置からなる車両シミュレーション装置を開示する。ＥＣＵは、エンジンモデルの制御パラメータを演算し、その演算結果を車両制御模擬装置に送信する。車両制御模擬装置は、ＥＣＵから送られてくる制御パラメータを用いて車両モデルの各部の状態量を演算してその演算結果をＥＣＵに返送する。車両モデルは、ドライバモデル、吸気系モデル、燃料系モデル、燃焼系モデル、エンジン温推定モデル、駆動系モデル、触媒モデル、Ａ／Ｆセンサモデル、リアＯ2 センサモデルから構成されている。ドライバモデルは、目標車速の変化パターンを入力する車速パターン入力手段を有する。ここに開示されている技術は、ＳＩＬＳとしての背景技術であるが、センサのシミュレーションには、特に言及するものではない。
【００２０】
特開平１１−８５５４４号公報に開示されている技術は、複数のトランザクションプログラムから同一の資源の同時更新を試みるトランザクション処理機構を持った計算機システムの実行効率を向上させることを課題とするものであり、共有資源の更新を試みるトランザクションプログラムが、他のトランザクションプログラムにより共有資源７０が更新中の場合、複製トランザクションプログラムを作成し、複製もとのトランザクションプログラムは排他ウェイトし、複製されたトランザクションプログラムが処理を継続するようにすることを開示する。ここに開示されている技術は、同一の資源に複数のプロセスがアクセスすることに関連するが、処理の順序や、プロセスの動作速度の違いに対処する技術を示唆するものではない。
【００２１】
【特許文献１】特開平１１−１４５０７号公報
【特許文献２】特開平１１−８５５４４号公報
【発明の開示】
【発明が解決しようとする課題】
【００２２】
この発明の目的は、共有メモリ領域に、異なる速度の論理プロセスがデータの読み書きを行うようなホールビークルＳＩＬＳのようなシミュレーション・システムにおいて、シミュレーションの速度を向上することにある。
【課題を解決するための手段】
【００２３】
本発明の実施のために、必須ではないが、好適にはマルチＣＰＵのワークステーションが用意される。また、各ＥＣＵのソフトウェア・エミュレータが用意される。一般的には、ＥＣＵのソフトウェア・エミュレータは、そのＥＣＵのメーカから入手可能である。
【００２４】
各ＥＣＵのソフトウェア・エミュレータは、好適には、マルチＣＰＵのワークステーション上で走るように、ワークステーションのオペレーティング・システムの所定のレイヤとインターフェースする。各ＥＣＵのソフトウェア・エミュレータには、好適には、マルチＣＰＵのうちの各々のＣＰＵが割り当てられ、以って、各ＣＰＵによって、各ＥＣＵエミュレータは独立に動作可能である。ＥＣＵの数よりもＣＰＵの数が少ない場合は、１つのＣＰＵに、複数のＥＣＵエミュレータが割り当てられる。いずれにしても、オペレーティング・システムは、各ＥＣＵエミュレータ毎に１つのプロセスを割り当て、以って、各ＥＣＵエミュレータは、固有の異なるクロックで動作しているように、エミュレーションを行うことができる。すなわち、各ＥＣＵエミュレータは、異種ＥＣＵであってよい。
【００２５】
各ＥＣＵエミュレータには、ワークステーションのメモリの一部が、内部処理用のプライベート・メモリとして割り当てられる。さらに、ＥＣＵエミュレータは、ワークステーションの共用メモリとして割り当てられた箇所にもアクセス可能であり、この共用メモリを介して、各ＥＣＵエミュレータは、互いにデータをやりとりしたり、同期したり、通信したりすることが可能である。あるいは、ＥＣＵエミュレータは、ＣＡＮ(controller area network)エミュレータで接続してもよい。
【００２６】
これらのＥＣＵエミュレータから入力を受け取る、エンジン・シミュレータ、トランスミッション・シミュレータなどの、物理装置シミュレータが用意され、やはりワークステーションの共用メモリ、またはＣＡＮ(controller area network)エミュレータで、ＥＣＵエミュレータと接続される。
【００２７】
このようなシミュレーション・システムにおいて、センサの値を保持するために、共有メモリに、好適にはセンサの数だけ、領域が確保される。コンピュータ・システムとしてみると、センサの１つの領域は、シミュレーション・システム全体に対する大域変数(global variable)と見なすことができる。
【００２８】
本発明の特徴によれば、その大域変数毎に、書込みテーブルと、読取りテーブルが、好適には共有メモリ内に確保される。基本的に、書込みテーブルは、大域変数毎に１つであるが、読取りテーブルは、大域変数毎に、シミュレーション・システムの論理プロセスの数だけ用意される。
【００２９】
本発明のシミュレーション・システムの前提として、個々のイベントに、シミュレーション全体で１つの統一された時間が付与される。しかし、前述のように、個々の論理プロセスで動作速度が異なり得るので、全く同じ時間で、個々の論理プロセスの足並みが揃うとは限らない。
【００３０】
さて、ある大域変数に、第１の論理プロセスによって書込みが行われると、その書いた時間と値が、その大域変数の書込みテーブルに書込まれる。一方、その大域変数の値を、第２の論理プロセスが読取ると、その読取った時間と値が、その大域変数の、第２の論理プロセス用に確保された読取りテーブルに書込まれる。ここで、読み取られる値とは、書込みテーブルで、読取り側の論理プロセスが指定した時間もしくはそれより前で、かつ、最も近い時間を持つエントリの値である。
【００３１】
こうして、その大域変数に、さまざまな論理プロセスが読み書きを行うと、書込みテーブルと、読取りテーブルのエントリは、次第に増加する。
【００３２】
本発明の更なる特徴によれば、論理プロセスの大域変数への書込み動作に応答して、シミュレーション・システムが、その大域変数の書込みテーブルと、各論理プロセス毎の読取りテーブルとの間で、整合性のチェックを行う。
【００３３】
すなわち、読取りテーブルの最新のエントリは、書込みテーブルのエントリを読取った結果であるから、書込みテーブルの最新のエントリよりも後の時間をもつはずである。
【００３４】
ところが、さまざまな論理プロセスの動作速度の違いから、書込みテーブルに対して、その最新のエントリよりも前の時間をもつエントリが書き込まれることがある。
【００３５】
そこで、整合性のチェックは、先ほど書込みテーブルに書込まれたエントリの時間の前後のエントリと読取りテーブルのエントリを比較して、これらのエントリよりも後の時間をもち、且つ先ほど書込みテーブルに書込まれたエントリとは異なる値をもつエントリが、読取りテーブルにあるかどうかをチェックするものである。
【００３６】
もしそのようなエントリが読取りテーブルにあると判断されると、読取りテーブルには、書込みテーブルに書込まれたエントリとは矛盾するエントリが存在することになるので、シミュレーション・システムは、そのような矛盾するエントリをもつ読取りテーブルに関連付けられた論理プロセスに、所定のメッセージ（例えば、ダウト・メッセージとも称する）を送る。ダウト・メッセージには好適には、先ほど書込みテーブルに書込まれたエントリの書込み時間と値が含まれる。
【００３７】
すると、ダウト・メッセージを受け取った論理プロセスは、そこに含まれている時間と値を、前に受け取った時間及び値と比較して、ロールバックが必要かどうか判断する。ここでいう判断とは、例えば、値は違っていたけれどもその差が許容範囲に含まれているので、ロールバックをしないというような判断である。
【００３８】
本発明の別の側面によれば、論理プロセス全体の調整を司るグローバル・スケジューラが設けられ、グローバル・スケジューラには、論理プロセス毎に、同期テーブルが設けられる。大域変数に書き込もうとする論理プロセスは、グローバル・スケジューラに一旦、書込み要求メッセージを送る。それを受けて、グローバル・スケジューラは、書込み要求メッセージで指定された大域変数に対応する共有メモリにおける、書込みテーブルにエントリを書き込む。グローバル・スケジューラは、そのような書込み動作の完了を確認してから、別の論理プロセスからの書込み要求メッセージを受け付ける。グローバル・スケジューラは、書込み動作の完了を確認すると、全ての論理プロセスの同期テーブルに完了時間のエントリ、もしくは、その論理プロセスがこの大域変数に書込みをしない旨のフラグが埋まると、それらのエントリのうち一番古い時間が、当該大域変数のコミット時間となり、コミット時間は共有メモリに参照可能にセットされる。同期テーブルの、コミット時間より古いエントリは、適当なタイミングで消去される。
【００３９】
このように、グローバル・スケジューラを介在させると、グローバル・スケジューラは、書き込みの完了を待って次の論理プロセスからの書き込みを処理するので、複数の論理プロセスからの、相次いでの書込みアクセスがあっても、競合が回避される。
【００４０】
一方、もしシミュレーション・システムにおいて、一度に１つの論理プロセスだけが書込みアクセスを行うような制御が行われるなら、グローバル・スケジューラを介した論理プロセスの書込みアクセスは不要で、論理プロセスは直接、書込みテーブルに書込み処理を行うことができる。
【発明の効果】
【００４１】
この発明によれば、複数の論理プロセスをもつ、ホールビークルＳＩＬＳようなシミュレーション・システムにおいて、低速の論理プロセスに足並みを揃えることなく、高速の論理プロセスのペースで大域変数に値を書込み、矛盾が生じたときだけ、そのことをチェックして関連の論理プロセスでロールバックすることを可能ならしめるので、シミュレーション・システムの論理一貫性を維持しつつ、シミュレーションを高速化することができる。
【発明を実施するための最良の形態】
【００４２】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００４３】
本発明を実現するための構成を説明する前に、その前提として、ＥＣＵについて説明する。ＥＣＵは、一般的に、センサからの入力信号を、例えばＡ／Ｄ変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部（マイクロコンピュータ）と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成されるものである。
【００４４】
この発明は、説明の便宜上、以下では、自動車のＥＣＵに関連して説明するが、それには限定されず、航空機、ロボットなどその他のＥＣＵをもつメカトロニクス機構全般に適用可能であることを理解されたい。
【００４５】
ＥＣＵは、周辺や環境状態、エンジンなどの駆動機構の状態、及び人間による指示操作の内容をセンサで検出して、信号として入力する。具体的には、水温センサ、吸気温センサ、過給圧センサ、ポンプ角センサ、クランク角センサ、車速センサ、アクセル位置センサ、Ａ／Ｔシフト・ポジション、スタータ・スイッチ、エアコンＥＣＵなどからの信号がある。
【００４６】
ＥＣＵは、これらの信号を入力して、電磁スピル弁、フュエル・カット・ソレノイド、タイミング・コントロール・バルブ、吸気絞りＶＳＶ、グロー・プラグ・リレー、タコメータ及びエアコン・リレーなどを駆動する信号を出力しする。
【００４７】
１つのＥＣＵが複数の異なる機構を制御するための駆動信号を出力するようにすることは不可能ではないが、例えば、エンジンとエアコンのように、応答性やその制御の厳密性が異なるものを単一のＥＣＵで制御することは合理的でなく、従って、一般的に自動車にＥＣＵは複数個設けられる。
【００４８】
図１は、ＥＣＵの典型的な制御である、フィードバック閉ループ系の例を示す図である。すなわち、図１において、ある目標の信号が、ＥＣＵであるコントローラ１０２に入力され、ＥＣＵは、目標の信号を内部処理することによって、駆動信号を出力し、制御対象モデルである、エンジンなどのプラント１０４を駆動し、プラント１０４の出力は、センサ１０６を介して、コントローラ１０２の入力にフィードバックされる。
【００４９】
ここで目標信号として与えられるのは、例えば、スロットル開度、アイドル・コントロール、ブレーキ力、シフト、スタータＯＮ・ＯＦＦ、バッテリ電圧、インジェクション通電時間、インジェクション通電回数、デポジット、ドウェル角、進角値、吸気完了フラグ、点火完了フラグ、大気圧、車両重量、転がり抵抗係数、道路勾配、粘着係数、吸気温、などのパラメータである。
【００５０】
また、センサ信号としてフィードバックされるのは、スロットル開度、吸気圧力、吸入空気量、シフト、エンジン回転数、車速、排気温、Ｏ２、冷却水温、空燃比、ノック、点火異常、などである。
【００５１】
ＥＣＵが制御する対象は、ニュートンの力学方程式で解かれる、機構系システムであったり、電気回路の応答方程式で解かれる、電気駆動回路であったり、それらの組み合わせであったりする。これらは、基本的に微分方程式であり、制御工学によれば、ラプラス変換によって応答関数に変換されて、記述することができる。
【００５２】
図２は、そのような応答関数による記述の例である。図２で破線２０２で囲った箇所が、図１のコントローラ１０２に対応し、破線２０４で囲った箇所が、図１の制御対象モデル１０４に対応し、センサ１０６が、ブロック２０６に対応する。なお、図２は、応答関数による表現の一例であって、特に本発明を限定する意図はないことを理解されたい。
【００５３】
さて、例えば、ＥＣＵが制御する対象が、ニュートンの力学方程式で解かれる、機構系システムであるとする。すると、ある時点のＥＣＵの制御出力は、その機構系システムの可動部分の位置及び速度という内部状態変数をもち、その時点の入力だけでは決まらない。そのことは、電気回路にもあてはまり、電気回路のキャパシタに残っている電荷の量や、コイルのインダクタンスによる磁力などの内部状態変数が、やはり存在する。
【００５４】
従って、ＥＣＵは、図３に示すように、入力ｕに対して、その内部状態ｘを勘案した値ｙを出力することになる。
【００５５】
さて、前述したＳＩＬＳのようなテストの目的で、自動車部品メーカーは、自社が提供する機器のＥＣＵのソフトウェア・エミュレータを提供する。すなわち、図２に示すような機能を、アセンブラまたはＣなどの言語が書かれたコードをアセンブリまたはコンパイルした実行可能プログラムにより、純粋にソフトウェア的に実現する。
【００５６】
本発明のこの実施例では、ＥＣＵのソフトウェア・エミュレータの内部状態を取り出して利用する。ソフトウェア・エミュレータによっては、内部状態が取り出し可能である場合と、そのままでは、内部状態が取り出し可能でない場合がある。
【００５７】
そこで、ＥＣＵのソフトウェア・エミュレータの内部状態がそのままでは、内部状態が取り出し可能でない場合、ソースコード解析ツールによって、次のような処理を行う。
【００５８】
もし、ＥＣＵのソフトウェア・エミュレータのソースコードが入手可能であるならそれをそのまま利用し、実行可能バイナリ・ファイルしかなければ、所定のツールで、逆アセンブルまたは逆コンパイルする。そうして、ＥＣＵのソフトウェア・エミュレータのソースコードに対して、データーフロー解析という技法を適用して、ソースコードを基本ブロックに分割する。基本ブロックとは、ソースコードを、複数の制御が合流するところ、または、制御が複数に分岐するところで分断した、各々の部分のことである。このような基本ブロックをノードとして、その分岐の制御の流れのリンクで接続すると、有向グラフ構造になる。これは特に、制御フローグラフとも呼ばれる。制御フローグラフは、始点ノードと終点ノードをもち、プログラムで実行され得るノードは全て、始点ノードからの有効エッジをもつ。基本ブロックのうち、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)エミュレータを使用してもよい。
【００９１】
図示しないが、図６の構成には、登り坂道、高速道路、つづら折道などの様々な、テストのためのシナリオを格納したシナリオ・ジェネレータも接続される。
【００９２】
図７は、図６に示したシミュレーション・システムにおいて、センサ７０２に、物理装置シミュレータ６０６ａ、６０６ｂ、６０６ｉと、ＥＣＵエミュレータ６０４ａ、６０４ｂ、６０４ｊが、値の書込み、あるいは読取り処理を行う様子を図式的に示す。
【００９３】
前述のように、センサ７０２は実は、図６の共有メモリ６０２、すなわち、図５のメイン・メモリ５０６の一区画の領域である。図６に示したシミュレーション・システムにとって、１つの大域変数(global variable)である、とも言える。図示するように、例えば、物理装置シミュレータ６０６ａがセンサ７０２としてのメモリ領域に書込み、それからＥＣＵエミュレータ６０４ａが、書かれた値を読取る、などの処理が行われる。
【００９４】
この際、当然であるが、読み書きの順序は重要である。すなわち、物理装置シミュレータ６０６ａがセンサ７０２としてのメモリ領域に書込んだ後に、ＥＣＵエミュレータ６０４ａが、書かれた値を読取るのと、物理装置シミュレータ６０６ａがセンサ７０２としてのメモリ領域に書込む前に、ＥＣＵエミュレータ６０４ａが、書かれた値を読取るのとでは、ＥＣＵエミュレータ６０４ａが読取る値は、全く異なる。
【００９５】
なお、物理装置シミュレータやＥＣＵエミュレータなどの論理プロセスは、センサ７０２としてのメモリ領域に、単に値を書込むだけ、あるいは、単にそこから値を読取るだけ、という処理以外に、センサ７０２としてのメモリ領域から値ｘを読取って、直ちにｘ＋Δｘを、そのメモリ領域に書き込む、という値更新処理もありえる。
【００９６】
図８は、論理プロセスＡ、Ｂ及びＣによる読書き動作を示すタイミングチャートの例である。図８（Ａ）を参照すると、論理プロセスＡが、時間t1で、所定の大域変数に10という値を書込む。さらに論理プロセスＡは、時間t3で、その大域変数に15という値を書込む。
【００９７】
一方、論理プロセスＣは、Δt間隔で周期的に、その大域変数から値を読取る。論理プロセスＢは、この時点では、何もしない。
【００９８】
図８（Ｂ）には、その様子を図式的に示す。すなわち、論理プロセスＡが、センサ（大域変数）に値を書込み、論理プロセスＣが、センサ（大域変数）から値を読取る。
【００９９】
尚このとき、例えば、時間t1で、論理プロセスＡが所定の大域変数に10という値を書込むとは、その書込みイベントに、時間t1が関連付けられる、ということを意味する。この時間は、単一の論理プロセス内では一貫性があるが、前述のように論理プロセスは、異なる速度で動作することがあるので、異なる論理プロセス間では、仮にti < tjだとしても、シミュレーション・システム内で、時間tiをもつ第１の論理プロセスのイベントが、時間tjをもつ第２の論理プロセスのイベントよりも、先に生起するとは限らない。
【０１００】
図８の処理では、時間の経過に沿って、一貫性を保って、論理プロセス間で値の読み書きが行われているので、矛盾は生じない。
【０１０１】
ところが、図９に示すように、論理プロセスＡが時間t3をもつイベントで、値15を大域変数に書込み、論理プロセスＣがその値15を大域変数から読取った時点で、論理プロセスＢが、時間t2 <  t3をもつイベントで、値5を、大域変数に書き込むとする。これにより、大域変数の値は、時間t2以降、5となる。
【０１０２】
すると、論理プロセスＡは、自己の時間t3をもつイベントで値15を書いたことが、単なる書込みであるなら、論理プロセスＡ自体は、その論理プロセスＢの書込みによって影響は受けないが、自己の時間t3をもつイベントで値15を書いたことが、もし大域変数の値を読取って、それに基づき書込み値を決定する変更書込みであるなら、その論理プロセスＢの書込みによって最早有効ではなくなるので、キャンセルされなくてはならない。
【０１０３】
同様に、論理プロセスＣの、Δtでの周期的な大域変数の値の読取り動作も、時間t2以降、最早有効ではなくなるので、キャンセルされなくてはならない。
【０１０４】
図９（Ｂ）には、その様子を図式的に示す。すなわち、論理プロセスＡが、センサ（大域変数）に値を書込み、論理プロセスＢも、センサ（大域変数）に値を書込み、論理プロセスＣが、センサ（大域変数）から値を読取る。このとき、論理プロセスＡの書込みが、変更書込みであるなら、点線矢印で示すように、書込み処理も付随している。
【０１０５】
本発明は、ある論理プロセスの書込み処理によって、別の論理プロセスの読取り、あるいは書込み処理が無効になったかどうかをシミュレーション・システムが判断し、もし無効になったのなら、処理が無効化された論理プロセスに通知して、その論理プロセスが、必要に応じて、ロールバックなどの、処理の一貫性を取り戻す対処する処理を行うことを可能ならしめる。
【０１０６】
図１０は、図６に示したシミュレーション・システムの機能論理ブロック図を、特に本発明の機能に関連する箇所にフォーカスして示した機能論理ブロック図である。図１０において、ＬＰ１、ＬＰ２、・・ＬＰｋは、論理プロセスであり、具体的には、図６に示したＥＣＵエミュレータ６０４ａ、６０４ｂ、・・・６０４ｎ、物理装置シミュレータ６０６ａ、６０６ｂ、・・・６０６ｍのどれかである。
【０１０７】
図示されているように、論理プロセスＬＰ１、ＬＰ２、・・ＬＰｋと、グローバル・スケジューラ６０８とは、ＣＡＮエミュレータまたは共有メモリ１００２を介して、互いに接続されている。これは、基本的には、図６で、共有メモリ６０２として示されているものと同じである。
【０１０８】
グローバル・スケジューラ６０８の基本的機能は、論理プロセスＬＰ１、ＬＰ２、・・ＬＰｋから時間付きのイベントを受領し、そのうちのもっとも古い時間をもつイベントをもって確定時間を判断し、全論理プロセスに通知することである。
【０１０９】
そこで、グローバル・スケジューラ６０８のメッセージ（イベントとも言う）を受領する機能を利用して、この実施例では、各大域変数毎に、各論理プロセスＬＰ１、ＬＰ２、・・ＬＰｋ毎の同期テーブル１００４ａ、１００４ｂ、・・・１００４ｋが設けられている。便宜上、大域変数１のための同期テーブルの領域をメモリ領域１００６ａで示し、大域変数２のための同期テーブルの領域をメモリ領域１００６ｂで示し、シミュレーション・システムでセンサとして使用される全ての大域変数の各々に、メモリ区画１００６ａ、１００６ｂ・・１００６ｑが用意され、その各々に、各論理プロセスＬＰ１、ＬＰ２、・・ＬＰｋ毎の同期テーブルが存在することを理解されたい。
【０１１０】
このようなメモリ区画１００６ａ、１００６ｂ・・１００６ｑは、グローバル・スケジューラ６０８だけがアクセスできるプライベート・メモリ領域として、メイン・メモリ５０６内に確保されている。
【０１１１】
同期テーブルの役割は、グローバル・スケジューラ６０８に対して、所定の大域変数に対する書込みイベントが、ある論理プロセスから届いたとき、グローバル・スケジューラ６０８が、その実際の書込み動作の完了を確認して、その完了時間を、その所定の大域変数における、その論理プロセスに対応する同期テーブルに書込む。
【０１１２】
同期テーブルがどのように利用されるかは、後述の具体的な動作例を参照することにより、より一層明らかになるであろう。
【０１１３】
本発明の更なる特徴によれば、論理プロセスＬＰ１、ＬＰ２、・・ＬＰｋ及びグローバル・スケジューラ６０８がアクセス可能な、共有メモリ領域１００８が、メイン・メモリ５０６内に確保されている。共有メモリ領域１００８には、シミュレーション・システムでセンサとして使用される全ての大域変数の各々に、メモリ区画１０１０ａ、１０１０ｂ・・１０１０ｑが用意されている。その大域変数毎の各メモリ区画には、書込みテーブル１０１２、読取りテーブル１０１４ａ、１０１４ｂ、・・・１０１４ｋ、及びコミット時間格納領域１０１６が設けられている。読取りテーブル１０１４ａ、１０１４ｂ、・・・１０１４ｋは、その各々が、論理プロセスＬＰ１、ＬＰ２、・・ＬＰｋに対応している。
【０１１４】
すなわち、書込みテーブル１０１２は、好適な実施例では、大域変数につき１つであり、読取りテーブルも、好適な実施例では、大域変数毎に、論理プロセスの数だけ用意される。また、コミット時間格納領域１０１６は、大域変数につき１つである。なお、このような構成は、一実施例に過ぎず、シミュレーション・システム全体で単一の書込みテーブルにすることもできる。この場合、例えば、書込みテーブルに大域変数を指定する欄を設ければよい。コミット時間格納領域の欄も同様である。
【０１１５】
書込みテーブル１０１２は、時間と、値と、書込みを行った論理プロセス（ＬＰ）を示すフィールドをもち、グローバル・スケジューラ６０８は、論理プロセスから、大域変数、時間及び値を指定する書込みイベントを受け取ると、その時間と値で、その大域変数に関連する書込みテーブル１０１２に値を書き込む。その書込みが完了すると、グローバル・スケジューラ６０８は、その完了時間を、その大域変数における、その論理プロセスの同期テーブルに書込む。
【０１１６】
コミット時間格納領域１０１６には、すべての同期テーブルに完了時間のエントリが入れられたとき、そのうちの最も古い時間が格納される。
【０１１７】
一方、論理プロセスの読取り動作は、グローバル・スケジューラ６０８を介することなく、論理プロセスが直接、共有メモリ領域１００８の、値を読取るべき大域変数の書込みテーブル１０１２にアクセスすることにより、行われる。すなわちその際、論理プロセスは、書込みテーブル１０１２の一番新しい時間のエントリにアクセスして、その値を読取る。そうして、読取ったエントリの時間と値を、その大域変数における、その論理プロセス用の読取りテーブルに書込む。
【０１１８】
このようにして格納される書込みテーブルと読取りテーブルのエントリは、論理プロセスが読取った値の一貫性チェックに使用されるが、そのチェック動作は、後述のフローチャート及び具体的な動作例を参照することにより、後で詳細に説明される。
【０１１９】
次に、図１１以下のフローチャートを参照し、且つ図１０に示した書込みテーブル及び読取りテーブルも適宜参照しながら、本発明の実施例に係る処理を説明する。なお、図１１から図１４までと、図２１のフローチャートで示す処理のプログラムは、ハードディスク・ドライブ５１６に保存され、シミュレーション・システムの起動時に、メイン・メモリ５０６にロードされて、動作する。このようなプログラムは、Ｃ、Ｃ＋＋、Ｓｙｓｔｅｍ  Ｃ、ＭＡＴＬＡＢ／Ｓｉｍｕｌｉｎｋなどのコンピュータ言語やツールで書かれたものである。
【０１２０】
図１１は、論理プロセスによる読取り動作を示すフローチャートである。このフローチャートにおいて、ステップ１１０２で、論理プロセス（ＬＰ）が、値を読もうとする大域変数の書込みテーブルの１０１２（図１０を参照）の最新の時間をもつエントリの値を読取る。続いて、その論理プロセスは、ステップ１１０４で、その大域変数に関連して、その論理プロセス用に設けられた読取りテーブル１０１４に、その論理プロセスが指定した時刻に対応する時刻と、読取った値とを書き込む。
【０１２１】
図１２は、論理プロセスによる書込み動作を示すフローチャートである。ステップ１２０２では、論理プロセスが、グローバル・スケジューラ６０８に、書込みメッセージ（書込みイベントとも言う）を送る。書込みメッセージには、書き込む大域変数の指定と、時間と、書き込む値の情報が含まれている。このように、グローバル・スケジューラ６０８が、書込みメッセージを論理プロセスから一旦受け取ると、グローバル・スケジューラ６０８はそれらのメッセージを一旦キュー（図示しない）に入れ、順次処理するので、書込みテーブルへのアクセス競合が回避される。
【０１２２】
ステップ１２０４では、グローバル・スケジューラ６０８が、書込みメッセージに含まれている値を使用して、その大域変数の書込みテーブル１０１２に、値と、時間と、書込みする論理プロセスのＩＤからなるエントリを挿入する。その書込みが完了したことに応答して、グローバル・スケジューラ６０８は、その完了時間を、その大域変数における、その論理プロセスの同期テーブル１００４に、書き込む。通常、書込みテーブル１０１２への書込みと、その完了に応答して同期テーブル１００４に完了時間か書き込まれるまでには、若干の遅延があるので、同期テーブル１００４に書き込まれる値は、書込みテーブル１０１２に書かれる時間よりも少し後になる。
【０１２３】
ステップ１２０６では、その大域変数における、読取りテーブル１０１４と書込みテーブル１０１２との一貫性がチェックされ、その結果、ステップ１２０８で有効と判断されるか否かによって、異なる処理が行われる。
【０１２４】
図１３は、ステップ１２０６とステップ１２０８の詳細を示すフローチャートである。ステップ１３０２では、その大域変数における、書込みテーブルの値の列を、{Vw(t1), Vw(t2), ... , Vw(tm)}とする。t1,t2, ..., tmは、書込みテーブルに書かれている時間である。
【０１２５】
ステップ１３０４では、先ほど書かれた値を、Vw(tk)とする。k ∈ {1,2,..., m}であってすなわち、Vw(tk)は、{Vw(t1), Vw(t2), ... , Vw(tm)}のうちのどれかである。
【０１２６】
ステップ１３０６では、その大域変数における、書込みを行った論理プロセスの読取りテーブル１０１４（図１０では、論理プロセス毎に、読取りテーブル１０１４ａ、１０１４ｂ・・・のように示されているが、ここでは総称的に、読取りテーブル１０１４と示す）の値の列を、{Vr(s1), Vr(s2), ... , Vr(sn)}とする。s1,s2, ..., snは、読取りテーブル１０１４に書かれている時間である。
【０１２７】
ステップ１３０８では、Vr(si) = Vr(s1), Vr(s2), ... , Vr(sn)として、i = 1, 2, ... .nでループを廻す。
【０１２８】
ステップ１３１０では、si >= tk-1且つsi < tk+1かどうかが判断される。この判断はすなわち、siという時間が、先ほど書込みテーブルに書かれた時間の前後の時間の範囲に入っているかどうかの判断である。もしそうでないなら、処理は、ステップ１３０８に戻って、次のiに進む。なお、もしtk-1に該当するエントリがない場合は、tk-1 = 0と想定し、tk+1に該当するエントリがない場合は、tk+1を仮想的に∞であるような非常に大きい時間と想定する。
【０１２９】
ステップ１３１０での判断が肯定的であると、ステップ１３１２に進み、そこで、tk > siかどうかが判断される。tk > siであるということは、先ほど書込みテーブルに書かれた時間tkが、siという時間よりも大きいという意味なので、Vr(si)が、書込みテーブルにおけるVw(tk)よりも１つ前のエントリの値であるVw(tk-1)と等しいかどうかという判断が、ステップ１３１４で行われる。その結果、等しいと判断されると、ステップ１３１８で、ループを完了したかどうかが判断される。ループを完了したなら、書込みテーブルと読取りテーブルは矛盾がない、すなわち、有効と判断される。ループがまだ完了していないなら、ステップ１３０８に戻って、次のsiに進む。Vr(si)が、Vw(tk-1)と等しくないと、読取りテーブルには、書込みテーブルと一貫性のないエントリが含まれているということになり、ステップ１３２０に行って、読取りテーブルが無効である、という判断となる。
【０１３０】
ステップ１３１２に戻って、tk > siでないと、先ほど書込みテーブルに書かれた時間tkが、siという時間よりも小さいか等しいという意味なので、Vr(si)が、書込みテーブルにおけるVw(tk)と等しいかどうかという判断が、ステップ１３１６で行われる。その結果、等しいと判断されると、ステップ１３１８に行って、ループを完了したかどうかが判断される。ループを完了したなら、書込みテーブルと読取りテーブルは矛盾がない、すなわち、有効と判断される。ループがまだ完了していないなら、ステップ１３０８に戻って、次のsiに進む。Vr(si)が、Vw(tk)と等しくないと、読取りテーブルには、書込みテーブルと一貫性のないエントリが含まれているということになり、ステップ１３２０に行って、読取りテーブルが無効である、という判断となる。
【０１３１】
ステップ１３１０が否定的なままだと、ステップ１３０８のループが単に終端に達して、ステップ１３１８に至り、読取りテーブルは有効ということになる。
【０１３２】
図１２のフローチャートに戻って、図１３のフローチャートにおける無効１３２０あるいは有効１３１８が、ステップ１２０８の判断となる。
【０１３３】
なお、ステップ１２０６とステップ１２０８は、単一の書込みテーブル１０１２と、複数の読取りテーブル１０１４ａ、１０１４ｂ・・・１０１４ｋの各々とで順次実行されることを理解されたい。従って、ステップ１２０８では、複数の論理プロセスの読取りテーブルが無効と判断される、ということがあり得る。
【０１３４】
そこで、複数の論理プロセスの読取りテーブルの全てが有効であるなら、ステップ１２０８の判断が肯定的となって、図１２のフローチャートで示す処理は、完了する。
【０１３５】
ステップ１２０８で、読取りテーブルが無効と判断された論理プロセスが１つでもあると、ステップ１２１０で、グローバル・スケジューラ６０８が、読取りテーブルが無効と判断された論理プロセスに、ダウト(doubt)メッセージを送る。ダウト・メッセージは、ステップ１２０６でのチェックのもととなった書込みメッセージの、大域変数と、時間と、値の情報を含む。
【０１３６】
ステップ１２１２で、ダウト・メッセージを受け取った論理プロセスは、それに従い、対応する読取りテーブルのエントリを変更する。ここでいう読取りテーブルのエントリの変更とは、図１４のフローチャートに示すように、ステップ１４０２で論理プロセスがダウト・メッセージを受け取ると、ステップ１４０４で、ダウト・メッセージに含まれる大域変数の指定に対応する読取りテーブルにおいて、ダウト・メッセージに含まれる時間よりも後の時間をもつエントリを消去するか無効化し、ステップ１４０６で、ダウト・メッセージに含まれる時間と値のエントリを、読取りテーブルに書き込むことである。そうして、ステップ１４０８では、必要に応じて、ロールバック処理が行われる。すなわち、図４に示すように、論理プロセスが、内部状態と入力のヒストリを状態リポジトリ４０４に保存していると、更新された読取りテーブルのエントリに基づき、状態リポジトリ４０４を検索して、その状態に論理プロセスを戻して、そこから再開することができる。
【０１３７】
図１２に戻って、ステップ１２１４では、論理プロセスが、書込みをロールバックするかどうかを判断する。書込みロールバックが必要な処理は、図１７以下を参照して、後で説明する。
【０１３８】
そして、ステップ１２１６で、書込みロールバックが必要と判断されると、ステップ１２１８で、論理プロセスは、グローバル・スケジューラ６０８に、書込みキャンセルのメッセージを送る。このことも、図１７以下を参照して、後で説明する。
【０１３９】
ステップ１２１６で、書込みロールバックは不要と判断されると、処理は終了する。
【０１４０】
これも後で詳しく説明するが、ステップ１２２０に示すように、書込みキャンセルが生じると、それによって指定されたエントリを書込みテーブルから除去した後、改めて、ステップ１２０６で、書込みテーブルと読取りテーブルの一貫性がチェックされる。この場合は、書込みキャンセルの後書込みテーブルに残った時間の最も新しいエントリと読取りテーブルとの一貫性をチェックすれば十分である。
【０１４１】
次に、図１５と図１６を参照して、書込み処理による、読取りテーブルの無効化と変更処理の例を説明する。これらの図には、論理プロセスＬＰ１、ＬＰ２・・、ＬＰｎ、グローバル・スケジューラ６０８、及び書込みテーブル１０１２と読取りデーブル１０１４を含む共有メモリ領域１００８が示されている。
【０１４２】
ここでは、説明の便宜上、大域変数は、変数１だけのメモリ区画を図示する。また、同期テーブル１００４も、論理プロセスＬＰ１、ＬＰ２及びＬＰ３の対応するもののみ、表示する。
【０１４３】
なお、図１５及び図１６において、ＬＰ３の同期テーブル１００４ｃが、アクセス不可となっているのは、ＬＰ３は、この変数１にアクセスしないと分かっているので、予めその旨フラグを立てておくという意味である。というのは、この実施例では、コミット時間の領域１０１６に格納される時間は、全てのＬＰの同期テーブルに完了時間が埋まった段階でそのうちの最も古い時間によって決定されるが、もしＬＰ３の同期テーブル１００４ｃをアクセス不可として認識しておかないと、そこの完了時間が埋まらないため、コミット時間が確定できなくなるからである。
【０１４４】
さて、図１５で、ＬＰ１が、変数１に対して時間10で100という値を書き込むメッセージを、グローバル・スケジューラ６０８に送る。すると、そのメッセージを以って、グローバル・スケジューラ６０８は、時間10で100という値を、書込みテーブル１０１２に書き込む。それから少し遅れて12という時間で、グローバル・スケジューラ６０８は、書込み完了を確認し、それによって、ＬＰ１の同期テーブル１００４ａに、12という数字を格納する。
【０１４５】
そこで、時間15で、ＬＰｎが変数１の値を読みに来る。値を読むことは、変数１の書込みテーブル１０１２を読みに来ることである。その時点では、100という値が入ったエントリだけがあるので、ＬＰｎは、その値を読取って、その値を使った処理を行う。一方、ＬＰｎは、読取りの記録として、時間15で、読取った値の100を、ＬＰｎ用の読取りテーブル１０１４に書き込む。なお、シミュレーション・システムでは、各ＬＰでシミュレーション時間が異なることがあるので、上述のように、あるＬＰによる時間10での書込みの後に、時間15での、別のＬＰによる読取りが、その時間順序で起こるとは限らず、その逆の順序でも起こりえるということを理解されたい。
【０１４６】
次に、ＬＰ１が、変数１に対して時間20で50という値を書き込むメッセージを、グローバル・スケジューラ６０８に送る。すると、そのメッセージを以って、グローバル・スケジューラ６０８は、時間20で50という値を、書込みテーブル１０１２に書き込む。それから少し遅れて12という時間で、グローバル・スケジューラ６０８は、書込み完了を確認し、それによって、ＬＰ１の同期テーブル１００４ａに、22という数字を格納する。
【０１４７】
ここで、図１２のフローチャートに戻って参照すると、このような書込み処理に応答して、ステップ１２０６で示す書込みテーブルと読取りテーブルの一貫性チェックが行われる。しかし、この場合、書込みテーブル１０１２に先ほど書かれたエントリの時間は20で、読取りテーブルのエントリの時間15よりも大きい。このことは、図１３のフローチャートで、ステップ１３１０が決して肯定的にならないので、ループは、ステップ１３１８に抜けて、一貫性はＯＫであることになる。
【０１４８】
さらにＬＰ１が、変数１に対して時間30で10という値を書き込むメッセージを、グローバル・スケジューラ６０８に送って書込み処理を行う場合も同様であるので、詳細な処理の説明は省略する。
【０１４９】
ここで再び、図１２のフローチャートのステップ１２０６で示す書込みテーブルと読取りテーブルの一貫性チェックに着目する。今回書込みテーブル１０１２に追加されたエントリは、時間が11で値が110である。まず、時間が11ということで、読取りテーブルのエントリの時間15で以って、10 <= 15 < 20が成立し、このことは、図１３のフローチャートのステップ１３１０の判断を肯定的にする。次に、11 < 15なので、ステップ１３１６の判断に行く。そこで、今回書込みテーブル１０１２に追加されたエントリの値である110と、読取りテーブル１０１４の時間15のエントリの値100が比較され、一致しないので、ステップ１３２０に行き、結局、ステップ１２０８が有効でない、という判断になる。そこで、ステップ１２１０に示すように、グローバル・スケジューラ６０８が、変数１で、時間11で、値110というダウト・メッセージを、ＬＰｎに送る。
【０１５０】
ＬＰｎでは、このダウト・メッセージを受領すると、そこにある時間15で値100という読取りテーブル１０１４のエントリをキャンセルする。なぜなら、その時間15は、ダウト・メッセージに含まれている時間11よりも後で、そのエントリの値が異なっているからである。
【０１５１】
そうして、キャンセルした最も古い時間15をそのまま使って、ダウト・メッセージに含まれている値110でもって、読取りテーブル１０１４に、時間15で値110のエントリを書き込む。論理プロセスＬＰｎは、この更新された読取り値で以って、必要なロールバック処理を行う。ＬＰ２の処理が完了すると ＬＰ２が完了メッセージを、グローバル・スケジューラに送ってくる。これによって、ＬＰ２の完了時刻として 13が埋まる。
【０１５２】
なお、このような書込みや読取り処理を行うと、同期テーブル、書込みテーブル、及び読取りテーブルのエントリは増えてくる。この実施例では、同期テーブルのエントリは、書込みが行われたタイミングで、コミット時間よりと同等かより古い時間のエントリを削除するように、グローバル・スケジューラ６０８が動作を行う。
【０１５３】
書込みテーブル、及び読取りテーブルの場合は、この実施例では、特定サイズでメモリ区画を区切り、エントリが増えてきて、そのメモリ区画の終端に達したら、メモリ位置を指し示すインデックスを最初の位置に戻して、引き続きデータを書き込んでいくという方法で、エントリが増え続けるのを防いでいる。ただ、書込みテーブル、及び読取りテーブルの場合も、あるタイミングで、コミット時間と同等かより古いものを削除するようにしてもよい。
【０１５４】
図１７（１）は、書込みキャンセル動作の例を説明するための図である。ここでは、論理プロセスＡと、論理プロセスＢを考える。図１７で先ず、ある大域変数に、あるタイミングで、論理プロセスＡが値10を書き込むとする。その後のあるタイミングで、論理プロセスＢが、その大域変数を読む。値は、10である。そこで論理プロセスＢは、内部のロジックにより、その大域変数が0より大きいなら20を書き込み、そうでないなら、なにもしないとする。すると、このロジックにより、論理プロセスＢは、値20を大域変数に書込む。
【０１５５】
ところが、図１７（２）のように、論理プロセスＡが、値10の書込みをキャンセルして、値-10をその大域変数に書込むと、論理プロセスＢが読取る大域変数も、-10となる。そこで論理プロセスＢは、その大域変数が0より大きいなら20を書き込み、そうでないなら、なにもしないというロジックを再び適用するが、すると、大域変数の値は0より小さいのだから、論理プロセスＢは何もしない、というオプションしか取りえない。しかし、論理プロセスＢには、前の書込み値が正しくないことは認識している。これを解消するために、論理プロセスＢが、グローバル・スケジューラ６０８に、書込みテーブルに既に書込んだエントリの取り消しを行うメッセージを出すことができるようにする。
【０１５６】
図１８、図１９及び図２０は、書込みの取り消し動作の例を説明する図である。図１８において、論理プロセスＬＰ１が、グローバル・スケジューラ６０８に、時間10で値100の書込みメッセージを送る。これによって、グローバル・スケジューラ６０８によって、書込みテーブル１０１２に対応するエントリが書かれる。次に時間20で、論理プロセスＬＰ２が、書込みテーブル１０１２の値を読取って、読取りテーブル１０１４に読取った時間と値のエントリを書込む。すなわち、図１８で前面に表示されている読取りテーブル１０１４は、ＬＰ２の読取りテーブルである。次にＬＰ２が、グローバル・スケジューラ６０８に、時間30で値50の書込みメッセージを送る。これによって、グローバル・スケジューラ６０８によって、書込みテーブル１０１２に対応するエントリが書かれる。ここで留意すべきなのは、この書込む50という値は、時間20で読取った値100に依存している、ということである。従って、時間20で読取った値が100と異なれば、時間30で書く値も、50とは異なるということがありえる。
【０１５７】
次に、図１９において、ＬＰ１が、グローバル・スケジューラ６０８に、時間15で値110の書込みメッセージを送る。これによって、グローバル・スケジューラ６０８によって、書込みテーブル１０１２に対応するエントリが書かれる。すると、読取りテーブル１０１４の時間20で値100のエントリと、書込みテーブル１０１２のエントリとを比較すると、読取りテーブル１０１４の時間20で値100のエントリは、時間的に書込みテーブル１０１２の時間10のエントリと時間30の間にあって、時間15のエントリよりも時間が後なので、図１３のフローチャートのステップ１３１６の比較が行われ、そこでの判断がＮｏなので、読取りテーブル１０１４の時間20で値100のエントリは、無効と判別される。
【０１５８】
こうして、図１６に関連して説明したのと同様の仕組みで、ＬＰ２は、読取りテーブル１０１４をロールバックする。その様子は、図１９の読取りテーブル１０１４に示すとおりである。
【０１５９】
しかし、ロールバックによって、読取りテーブル１０１４の時間20で値100のエントリが無効になってしまうと、その読取り内容に依存していた書込みテーブル１０１２における時間30で値50のエントリは最早無効である、ということを、ＬＰ２は論理的に認識することができる。これに従い、ＬＰ２は、グローバル・スケジューラ６０８に、書込みテーブル１０１２における時間30で値50のエントリをキャンセルするメッセージを送る。それに応答して、グローバル・スケジューラ６０８は、書込みテーブル１０１２における時間30で値50のエントリをキャンセルする。その様子が、図２０に示されている。この処理は、図１２のフローチャートのステップ１２２０に至る。こうして、ステップ１２０６での書込みテーブル１０１２と読取りテーブル１０１４の一貫性チェックが行われる。この場合、キャンセルされたエントリを除く、書込みテーブル１０１２の最も新しい時間のエントリと、読取りテーブル１０１４のエントリとの間で、一貫性チェックを行えば十分である。
【０１６０】
ところで、もし書込みテーブルに対して、複数の論理プロセスが同時にアクセスすることがないような排他的な仕組みをシミュレーション・システムが用意しているなら、グローバル・スケジューラ６０８を介することなく、直接論理プロセスが、書込みテーブルと読取りテーブルにアクセスしてよい。よって、これは別の実施例である。以下、この場合の処理について説明する。
【０１６１】
図２１は、その場合の書込み処理をフローチャートを示す。なお、読取り処理は、図１１のフローチャートで既に示したとおりである。図２１において、ステップ２１０２では、論理プロセスが直接、書込みテーブルに、時間と値をもつエントリを書込む。
【０１６２】
ステップ２１０４では、その大域変数における、読取りテーブル１０１４と書込みテーブル１０１２との一貫性がチェックされ、その結果、ステップ１２０６で有効と判断されるか否かによって、異なる処理が行われる。ステップ１２０６で有効と判断されると、処理は完了する。
【０１６３】
ステップ２１０４とステップ２１０６は、より詳細には、図１３のフローチャートで示した処理であるが、既に詳細に説明したので、ここでは説明を省略する。
【０１６４】
こうして、ステップ２１０６で、書込みテーブルと読取りテーブルの間に一貫性がなく有効でないと判断されると、ステップ２１０８で、その読取りテーブルが書込みテーブルとの一貫性がないと判断された論理プロセスに、ダウト・メッセージを送る。
【０１６５】
ダウト・メッセージを受け取った論理プロセスは、ステップ２１１０で、ダウト・メッセージに含まれる内容に従い、読取りテーブルのエントリを変更する。ここでいう読取りテーブルのエントリの変更とは、図１４のフローチャートに示すように、ステップ１４０２で論理プロセスがダウト・メッセージを受け取ると、ステップ１４０４で、ダウト・メッセージに含まれる大域変数の指定に対応する読取りテーブルにおいて、ダウト・メッセージに含まれる時間よりも後の時間をもつエントリを消去するか無効化し、ステップ１４０６で、ダウト・メッセージに含まれる時間と値のエントリを、読取りテーブルに書き込むことである。その後、必要に応じてその他のロールバック処理を行う。こうして、処理は完了する。
【０１６６】
次に、図２２と図２３を参照して、この別の実施例の処理について説明する。これらの図において、グローバル・スケジューラ６０８は、表示されているが、処理には関与しない。
【０１６７】
図２２において、ＬＰ１が、時間10で値100のエントリを、変数１の書込みテーブル１０１２に書き込む。次に、時間12、17、25でそれぞれ、ＬＰ２が書込みテーブル１０１２のエントリの値を読取り、ＬＰ２の読取りテーブル１０１４に、時間と値をエントリとして順次書込んでいく。
【０１６８】
その後、図２３に示すように、ＬＰ２がステップ２１０２に従い、時間20で値50のエントリを、変数１の書込みテーブル１０１２に書き込む。すると、その書込みエントリで以って、ステップ２１０４に従い書込みテーブルと読取りテーブルとの一貫性のチェックが行われると、読取りテーブル１０１４における時間25のエントリのところで、10 <= 25 < ∞で且つ、20 < 25なので、図１３のステップで、ステップ１３１６の判断に行き、そこで書込みテーブルの時間20のエントリと、読取りテーブル１０１４の時間25のエントリとが比較されて、その値が一致しないので、読取りテーブル１０１４のエントリは無効と判断される。この判断に応答して、ＬＰ１が、ＬＰ２に、時間20で値50の書込みに関するダウト・メッセージを送る。これに応答して、ＬＰ２は、その読取りテーブル１０１４において、時間25のエントリを無効にし、時間25で値50のエントリを書込む。
【０１６９】
尚、上記実施例では、１つの大域変数毎に１つの書込みテーブルが用意されたが、本発明は、このような構成に限定されることなく、書込みテーブルに大域変数を示す欄を入れることによって、シミュレーション・システムで単一の書込みテーブルを設けるようにしてもよい。
【０１７０】
同様に、上記実施例では、１つの大域変数につき、論理プロセス毎に１つの読取りテーブルを用意したが、本発明はやはり、このような構成に限定されることなく、読取りテーブルに大域変数と論理プロセスを示す欄を入れることによって、シミュレーション・システムで単一の読取りテーブルを使用するようにすることも可能である。
【０１７１】
以上、自動車用の複数のシミュレーション・システムに関連して、本発明の特定の実施例を説明してきたが、本発明はこのような特定の実施例に限定されず、飛行機用のシミュレーション・システムなど、一般的な電子機械制御系システムのシミュレーション・システムに適用可能であることを、この分野の当業者であるなら、理解するであろう。
【図面の簡単な説明】
【０１７２】
【図１】ＥＣＵの典型的な制御である、フィードバック閉ループ系の例を示す図である。
【図２】フィードバック閉ループ系の、応答関数による記述の例である。
【図３】ＥＣＵソフトウェア・エミュレータのクロック応答の時間推移を示す図である。
【図４】内部変数を取り出すことができるようになった後のＥＣＵのソフトウェア・エミュレータのブロック図である。
【図５】本発明を実施するために使用されるコンピュータのハードウェアのブロック図である。
【図６】本発明のシミュレーション・システムの機能論理ブロック図である。
【図７】センサに対して、物理装置シミュレータ及びＥＣＵエミュレータが読み書きすることを示す図である。
【図８】論理プロセスによる、大域変数に対する値の読み書きを示すタイミング・チャートを示す図である。
【図９】論理プロセスによる、大域変数に対する値の読み書きを示すタイミング・チャートを示す図である。
【図１０】本発明の一実施例の同期テーブル、書込みテーブル及び読取りテーブルの構成を示す図である。
【図１１】読取り動作のフローチャートを示す図である。
【図１２】書込み動作のフローチャートを示す図である。
【図１３】読取りテーブルの書込みテーブルとの一貫性を調べるための処理のフローチャートを示す図である。
【図１４】ロールバック処理のフローチャートを示す図である。
【図１５】同期テーブル、書込みテーブル及び読取りテーブルのエントリと、読書き動作の対応を示す図である。
【図１６】同期テーブル、書込みテーブル及び読取りテーブルのエントリと、読書き動作の対応を示す図である。
【図１７】書込みキャンセル動作を説明するためのタイミング・チャートである。
【図１８】同期テーブル、書込みテーブル及び読取りテーブルのエントリと、読書き動作の対応を示す図である。
【図１９】同期テーブル、書込みテーブル及び読取りテーブルのエントリと、読書き動作の対応を示す図である。
【図２０】同期テーブル、書込みテーブル及び読取りテーブルのエントリと、読書き動作の対応を示す図である。
【図２１】別の実施例に係る書込み動作のフローチャートを示す図である。
【図２２】書込みテーブル及び読取りテーブルのエントリと、読書き動作の対応を示す図である。
【図２３】書込みテーブル及び読取りテーブルのエントリと、読書き動作の対応を示す図である。
【符号の説明】
【０１７３】
ＬＰ１、ＬＰ２・・・、ＬＰｎ        論理プロセス
５０６、１００８                    メモリ
１０１２                            書込みテーブル
１０１４                            読取りテーブル
６０４ａ、６０４ｂ・・・、６０４ｎ  ＥＣＵエミュレータ
６０６ａ、６０６ｂ・・・、６０６ｍ  物理装置シミュレータ
６０８                              グローバル・スケジューラ
【図１】
2010055249.tif 000003
【図２】
2010055249.tif 000004
【図３】
2010055249.tif 000005
【図４】
2010055249.tif 000006
【図５】
2010055249.tif 000007
【図６】
2010055249.tif 000008
【図７】
2010055249.tif 000009
【図８】
2010055249.tif 000010
【図９】
2010055249.tif 000011
【図１０】
2010055249.tif 000012
【図１１】
2010055249.tif 000013
【図１２】
2010055249.tif 000014
【図１３】
2010055249.tif 000015
【図１４】
2010055249.tif 000016
【図１５】
2010055249.tif 000017
【図１６】
2010055249.tif 000018
【図１７】
2010055249.tif 000019
【図１８】
2010055249.tif 000020
【図１９】
2010055249.tif 000021
【図２０】
2010055249.tif 000022
【図２１】
2010055249.tif 000023
【図２２】
2010055249.tif 000024
【図２３】
2010055249.tif 000025