(57)【要約】      （修正有）【課題】離散系シミュレータが正しくロールバックできるようにする技法を提供する。【解決手段】コンピュータによって実装される、シミュレーション・システムにおいて、連続系シミュレータと、離散系シミュレータと、前記連続系シミュレータから前記離散系シミュレータに送られるパルスのエッジ信号の情報を時間付きで保存するエッジ保存手段と、前記離散系シミュレータのイベントの発生時間を、ロールバック可能時間として保存する手段と、前記連続系シミュレータのロールバック動作に応答して、該ロールバックの発生時間より前の前記離散系シミュレータの前記ロールバック可能時間を検索する検索手段と、前記検索手段によって見出された前記ロールバック可能時間に対応する前記エッジ信号を、前記エッジ保存手段から読み出して、前記離散系シミュレータに送る手段を有する、シミュレーション・システム。【選択図】図７
2010134839.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)と呼ばれ、ＥＣＵに搭載されるマイクロコンピュータ、入出力回路、制御のシナリオなどを全て、ソフトウェア・シミュレータで構成する技法である。これによれば、ＥＣＵのハードウェアが存在しなくても、テストを実行可能である。
【００１３】
ところで、自動車用シミュレーション・システムは、連続系シミュレータと、離散系シミュレータを有する。連続系シミュレータの例として、エンジンの機械系部分をシミュレートするシミュレータがある。離散イベント系シミュレータの例として、エンジン回転のパルスのタイミングで動作し、燃料噴射や点火のタイミングを制御するＥＣＵのシミュレータがある。
【００１４】
４ＷＤのシミュレーションをする場合においては、連続系シミュレータの例として、各タイヤへのトルク配分から車の動作を繰り返し計算するシミュレータがあり、離散イベント系シミュレータの例として、10ミリ秒ごとの定期パルス信号で動作し、車のヨーレートなどのセンサ入力から各タイヤへのトルク配分を決定するＥＣＵをシミュレートするシミュレータがある。
【００１５】
シミュレーション・システムは、連続系シミュレータと、離散系シミュレータを、共有メモリ、ＣＡＮエミュレータなどで接続し、相互に協働して動作させる。このとき、連続系シミュレータは、タイムスライス間隔で動作する。一方、離散系シミュレータは、パルス信号入力の変化をトリガにして割込み起動され、それに応答してトランザクション処理を実行して、連続系シミュレータに対して、出力を行う。この場合、一般的に、割込みが発生する時間間隔は、連続系シミュレータのタイムスライス間隔に比べて非常に大きい。
【００１６】
さらに、離散系シミュレータは、連続系シミュレータのタイムスライスとは非同期に、パルス信号入力以外に、Ｉ／Ｏポートを通じてデータの読み書きを行う。典型的には、センサからのデータを読み込み、更新する。
【００１７】
このように、連続系シミュレータと、離散系シミュレータは、動作タイミングが全く異なるので、別プロセスで動作しており、両者の通信は、例えば、連続系シミュレータのタイムスライス毎に行われる。しかし、このようなプロセス間通信は、一般的にコストが高く、離散系シミュレータの割込みは、タイムスライスよりも頻度が低いので、通信コストの浪費になる。
【００１８】
特開２００１−２９０８６０号公報は、シミュレータ間の不要な同期処理をシミュレータで求め、その同期処理を削減することにより、シミュレーション速度の向上を図ったハードウエア／ソフトウエア協調シミュレータを提供することを目的とするものであって、ＣＰＵシミュレーション手段と周辺回路シミュレーション手段を同期させるシミュレーション協調手段と、シミュレーション協調手段での同期を抑制するかどうかを決定する判断手段を備え、判断手段に基づいて前記シミュレーション協調手段での同期を抑制することを開示する。
【００１９】
特開平８−２２７３６７号公報は、設計エラーが予期されるシステム動作を除く全てのシステム動作を無視する高速シミュレータを使用してデバッグ速度を増加させるデバッガを得ることを目的とするものであって、各シミュレータを相互接続するための、バスサイクルに対応する信号を提供するバスのバスシミュレータとシミュレーションに不必要なバスサイクルを省略する手段を備え、シミュレーションに無関係なＣＰＵバスサイクルを省略し、または、周期的クロック信号を明示的にシミュレートしないでクロック信号のスケジュールのみを発生するようにすることを開示する。
【００２０】
特開２００４−３０２２８号公報は、ＣＰＵシミュレータと、１以上の周辺マクロシミュレータと、これらの同期実行を制御する同期実行制御処理部とを備え、周辺マクロシミュレータが、ＣＰＵシミュレータでのシミュレーションに基づいて端子に入力される信号が変化したときに当該端子信号に基づくシミュレーションを実行すし、さらに周辺マクロシミュレータは、入力された端子信号の変化を検出し、変化した端子信号を端子信号リスト２２に登録し、登録された端子信号についてのみシミュレーションを実行するようにすることを開示する。
【００２１】
特開２００６−６５７５８号公報は、回路シミュレーション手法において、回路データから作成された第１離散時間モデルに応答関数を与えて第２離散時間モデルを生成し、クロックのエッジタイミングおよびこのタイミングでのクロック同期回路に入出力される信号の実効的信号値を、第２離散モデルを用いて計算し、これによってシミュレーションを実行することを開示する。
【００２２】
【特許文献１】特開２００１−２９０８６０号公報
【特許文献２】特開平８−２２７３６７号公報
【特許文献３】特開２００４−３０２２８号公報
【特許文献４】特開２００６−６５７５８号公報
【発明の開示】
【発明が解決しようとする課題】
【００２３】
上記従来技術は、条件的にシミュレータを同期させたり、クロックのエッジタイミングを拾うなどの技法で、シミュレータ間の通信コストを図るものであるが、特に自動車用のＳＩＬＳなどのに適用するには不十分である。というのは、自動車用のＳＩＬＳでは、構成が複雑なため、シミュレーションに膨大な時間がかかる。そこで、シミュレータの速度を向上させるために、シミュレータは投機的に実行されるが、すると、投機失敗に応答して、ロールバックする必要が生じる。
【００２４】
連続系シミュレータの場合、任意のタイムスライスに戻って実行をやり直す（ロールバックする）ことができるが、離散系シミュレータの場合は、ロールバック可能な時点は離散系のシミュレータが状態のスナップショットを採ってある時点であり、今回のような割込みで起動されるプログラムを動かす場合に関しては、割込みハンドラが起動した時点でスナップショットを採ることが適当であるため、ロールバック可能な時点は割込みハンドラの起動した時点に限られる。そのため、正しくロールバックするためには、離散系シミュレータをロールバックした後に、実際に連続系シミュレータでロールバックする時点までパルス信号エッジを離散系シミュレータに入力する必要がある。しかし、その時点では、連続系シミュレータは既に先に進んでいるので、離散系シミュレータを正しくロールバックすることは、困難である。
【００２５】
従って、この発明の目的は、連続系シミュレータとで離散系シミュレータが協働してシミュレーションを行うシステムにおいて、離散系シミュレータが正しくロールバックできるようにする技法を提供することにある。
【課題を解決するための手段】
【００２６】
この発明によれば、連続系シミュレータから送出される連続パルスのエッジ（立上がりと、立下り）がエッジ信号へと変換されて、離散系シミュレータに送られる。そのエッジ出現時刻は、シミュレーション・システムによって、トランザクション（割込み）開始の候補として登録される。但し、この時点では、エッジ信号によって実際のトランザクションが開始されるかどうかは未定である。そうして、実際にトランザクションが開始したとき、その開示時刻は、ロールバック不要の時刻（確定時刻）の候補として、報告される。
【００２７】
また、割込みは非同期に行われる処理なので、トランザクションの開始と同様に、センサ変数へのアクセス及び更新の時刻と、変数名、値が記録される。ちなみに、シミュレーション・システムにおいて一般的に、センサ変数とは、共有メモリ上での大域変数である。
【００２８】
前述のように、連続系シミュレータでは、サンプリング時間の単位でロールバック処理が行われるが、離散系シミュレータでは、トランザクションの先頭に戻って、ロールバック処理を行う必要がある。すなわち、連続系シミュレータでは、確定時刻の前にロールバックすることはないが、離散系シミュレータでは、確定時刻からさらに遡って、トランザクションの先頭まで戻る必要がある。このため、本発明によれば、トランザクションの記録は、確定時刻を過ぎても、少なくとも一つは削除しないで保持される。逆に言うと、新しいトランザクションが開始されると、古いトランザクションの記録が、確定あるいは放棄されたとして、削除される。
【００２９】
連続系シミュレータがある時刻までロールバックするとき、離散系シミュレータは前述のように、さらに時刻を遡って、たとえば割込みハンドラを開始した時刻まで戻る必要がある。この時間差を補うために、本発明によれば，シミュレーション・システムは、記録していたエッジ出現時刻を用いて、離散系シミュレータへエッジ入力を再現することにより、離散系シミュレータが正しく割り込みハンドラ開始時刻からの実行を再現して連続系シミュレータがロールバックした時刻まで戻ることを保証する。
【００３０】
なお、本発明によれば、エッジ出現時刻に変更があったとき、または、アクセスした変数の値に変更があったとき、離散系シミュレータのロールバックが行われる。一方、センサ変数を出力した後に、離散系シミュレータによってセンサ変数が更新された場合は、シミュレーション・システムは、連続系シミュレータをロールバックさせる。
【発明の効果】
【００３１】
この発明によれば、連続系シミュレータとで離散系シミュレータが協働してシミュレーションを行うシステムにおいて、離散系シミュレータが正しくロールバックできるようにして、適切にシミュレーションを進行させることができる。
【発明を実施するための最良の形態】
【００３２】
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
【００３３】
本発明を実現するための構成を説明する前に、その前提として、ＥＣＵについて説明する。ＥＣＵは、一般的に、センサからの入力信号を、例えばＡ／Ｄ変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部（マイクロコンピュータ）と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成されるものである。
【００３４】
この発明は、説明の便宜上、以下では、自動車のＥＣＵに関連して説明するが、それには限定されず、航空機、ロボットなどその他のＥＣＵをもつメカトロニクス機構全般に適用可能であることを理解されたい。
【００３５】
ＥＣＵは、周辺や環境状態、エンジンなどの駆動機構の状態、及び人間による指示操作の内容をセンサで検出して、信号として入力する。具体的には、水温センサ、吸気温センサ、過給圧センサ、ポンプ角センサ、クランク角センサ、車速センサ、アクセル位置センサ、Ａ／Ｔシフト・ポジション、スタータ・スイッチ、エアコンＥＣＵなどからの信号がある。
【００３６】
ＥＣＵは、これらの信号を入力して、電磁スピル弁、フュエル・カット・ソレノイド、タイミング・コントロール・バルブ、吸気絞りＶＳＶ、グロー・プラグ・リレー、タコメータ及びエアコン・リレーなどを駆動する信号を出力しする。
【００３７】
１つのＥＣＵが複数の異なる機構を制御するための駆動信号を出力するようにすることは不可能ではないが、例えば、エンジンとエアコンのように、応答性やその制御の厳密性が異なるものを単一のＥＣＵで制御することは合理的でなく、従って、一般的に自動車にＥＣＵは複数個設けられる。
【００３８】
図１は、ＥＣＵの典型的な制御である、フィードバック閉ループ系の例を示す図である。すなわち、図１において、ある目標の信号が、ＥＣＵであるコントローラ１０２に入力され、ＥＣＵは、目標の信号を内部処理することによって、駆動信号を出力し、制御対象モデルである、エンジンなどのプラント１０４を駆動し、プラント１０４の出力は、センサ１０６を介して、コントローラ１０２の入力にフィードバックされる。
【００３９】
ここで目標信号として与えられるのは、例えば、スロットル開度、アイドル・コントロール、ブレーキ力、シフト、スタータＯＮ・ＯＦＦ、バッテリ電圧、インジェクション通電時間、インジェクション通電回数、デポジット、ドウェル角、進角値、吸気完了フラグ、点火完了フラグ、大気圧、車両重量、転がり抵抗係数、道路勾配、粘着係数、吸気温、などのパラメータである。
【００４０】
また、センサ信号としてフィードバックされるのは、スロットル開度、吸気圧力、吸入空気量、シフト、エンジン回転数、車速、排気温、Ｏ２、冷却水温、空燃比、ノック、点火異常、などである。
【００４１】
ＥＣＵが制御する対象は、ニュートンの力学方程式で解かれる、機構系システムであったり、電気回路の応答方程式で解かれる、電気駆動回路であったり、それらの組み合わせであったりする。これらは、基本的に微分方程式であり、制御工学によれば、ラプラス変換によって応答関数に変換されて、記述することができる。
【００４２】
図２は、そのような応答関数による記述の例である。図２で破線２０２で囲った箇所が、図１のコントローラ１０２に対応し、破線２０４で囲った箇所が、図１の制御対象モデル１０４に対応し、センサ１０６が、ブロック２０６に対応する。なお、図２は、応答関数による表現の一例であって、特に本発明を限定する意図はないことを理解されたい。
【００４３】
さて、例えば、ＥＣＵが制御する対象が、ニュートンの力学方程式で解かれる、機構系システムであるとする。すると、ある時点のＥＣＵの制御出力は、その機構系システムの可動部分の位置及び速度という内部状態変数をもち、その時点の入力だけでは決まらない。そのことは、電気回路にもあてはまり、電気回路のキャパシタに残っている電荷の量や、コイルのインダクタンスによる磁力などの内部状態変数が、やはり存在する。
【００４４】
従って、ＥＣＵは、図３に示すように、入力ｕに対して、その内部状態ｘを勘案した値ｙを出力することになる。
【００４５】
さて、前述したＳＩＬＳのようなテストの目的で、自動車部品メーカーは、自社が提供する機器のＥＣＵのソフトウェア・エミュレータを提供する。すなわち、図２に示すような機能を、アセンブラまたはＣなどの言語が書かれたコードをアセンブリまたはコンパイルした実行可能プログラムにより、純粋にソフトウェア的に実現する。
【００４６】
本発明のこの実施例では、ＥＣＵのソフトウェア・エミュレータの内部状態を取り出して利用する。ソフトウェア・エミュレータによっては、内部状態が取り出し可能である場合と、そのままでは、内部状態が取り出し可能でない場合がある。
【００４７】
そこで、ＥＣＵのソフトウェア・エミュレータの内部状態がそのままでは、内部状態が取り出し可能でない場合、ソースコード解析ツールによって、次のような処理を行う。
【００４８】
もし、ＥＣＵのソフトウェア・エミュレータのソースコードが入手可能であるならそれをそのまま利用し、実行可能バイナリ・ファイルしかなければ、所定のツールで、逆アセンブルまたは逆コンパイルする。そうして、ＥＣＵのソフトウェア・エミュレータのソースコードに対して、データーフロー解析という技法を適用して、ソースコードを基本ブロックに分割する。基本ブロックとは、ソースコードを、複数の制御が合流するところ、または、制御が複数に分岐するところで分断した、各々の部分のことである。このような基本ブロックをノードとして、その分岐の制御の流れのリンクで接続すると、有向グラフ構造になる。これは特に、制御フローグラフとも呼ばれる。制御フローグラフは、始点ノードと終点ノードをもち、プログラムで実行され得るノードは全て、始点ノードからの有効エッジをもつ。基本ブロックのうち、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)エミュレータを使用してもよい。
【００８３】
図示しないが、図６の構成には、登り坂道、高速道路、つづら折道などの様々な、テストのためのシナリオを格納したシナリオ・ジェネレータも接続される。
【００８４】
なお、図６では、単一のアダプタブロック６０６が、複数のＥＣＵエミュレータ・プログラム６０４ａ、６０４ｂ、・・・６０４ｎをカバーするように示されているが、これは一実施例にすぎず、ＥＣＵエミュレータ・プログラム毎にアダプタブロックを設けるようにしてもよい。
【００８５】
図７は、図６のアダプタブロック６０６の機能ブロックを示す図である。図７において、エッジ通知ブロック７０２は、連続系シミュレータ６０８からパルスを受け取る度に、パルス・テーブル７０４に、時刻及び、各入力テーブルでのパルス値を記録する。またパルスのエッジを検出する度に、エッジ・テーブル７０６に、時刻、入力ポート、エッジのタイプ（立上がりか、立下がりか）を記録し、ＥＣＵエミュレータ６０４のペリフェラル６１２に通知する。
【００８６】
ヒストリ・マネジャ７０８は、ペリフェラル６１２から割込み応答がある度毎に、割込み応答リスト７１０にその時刻を記録し、グローバル・タイム・マネジャ６１０に、タイム・スタンプとして通知する。一方、グローバル・タイム・マネジャ６１０から、確定時刻を受け取る。
【００８７】
割込み応答時間リスト７１０は、離散系シミュレータ（ごの場合、ＥＣＵエミュレータ６０４）からの割込み応答の時刻の履歴を保持する。ＥＣＵエミュレータ６０４は、そこに保持されている時刻にロールバックすることが可能である。
【００８８】
入力スケジューラ７１２は、各タイムスライスでアダプタブロック６０６に入力される変数の値を、入力変数テーブル７１４に書き込んだり、入力変数テーブル７１４のエントリと、読取り要求テーブル７１６のエントリを対比して、ロールバックが必要かどうかの判断をしたりする。
【００８９】
入力変数テーブル７１４は、アダプタブロック６０６に入力される変数の値の履歴を保持する。入力変数テーブル７１４には、各タイムスライス毎に入力があるが、値が変化した時の時刻と値を、エントリとしてもつ。変数が複数ある場合は、変数の数だけ、入力変数テーブルをもつ。この実施例では、入力変数テーブル７１４には、最終入力時間のフィールドも併せて保持されている。しかし、これは一実施例であって、最終入力時間のフィールドだけを独立に保持してもよい。
【００９０】
読取り要求テーブル７１６は、離散系シミュレータからの変数の読込要求の履歴を保持する。読取り要求テーブル７１６は、変数の読込要求の時刻、返答に使った値と、返答済みか否かのフラグをエントリとしてもつ。このとき、アダプタブロック６０６がまだ実行していない時刻での要求は未応答とし、返答済みフラグを、falseとする。変数が複数ある場合は、変数の数だけ、読取り要求テーブルをもつ。
【００９１】
変数アクセス・インターフェース７１８は、離散系シミュレータからの変数の読み書きイベントを処理する。読込みに関しては、入力変数テーブル７１４の値を参照し、読込みの履歴を、読取り要求テーブル７１６に記録する。書込みに関しては、出力変数テーブル７２０に値を記録し、必要に応じて出力スケジュール時間７２２を変更する。
【００９２】
出力スケジューラ７２４は、各タイムスライスで、アダプタブロック６０６から出力される変数の値を、出力変数テーブル７２０を参照して決めたり、出力スケジュール時間７２２を参照して、どの時刻からの出力が必要かを判断し、あるいは実際に出力する。
【００９３】
出力変数テーブル７２０は、離散系シミュレータからの変数の書込みの履歴を保持する。出力変数テーブル７２０は、変数の書込みの時刻と、その際の値をエントリとしてもつ。アダプタブロックは、出力変数テーブルをみて、毎タイムスライスでの変数の出力値を決める。変数が複数ある場合は、変数の数だけ、出力変数テーブルをもつ。
【００９４】
出力スケジュール時間７２２は、アダプタブロック６０６の次のタイムスライス実行時に変数を出力すべき最初の時刻を保持する。アダプタブロックは、変数出力処理時に、この時刻からそのタイムスライスでの時刻までの各タイムステップでの出力を行う。なお、パルス・テーブル７０４、エッジ・テーブル７０６、割込み応答時間リスト７１０、入力変数テーブル７１４、読取り要求テーブル７１６、出力スケジュール時間７２２のフィールド、及び出力変数テーブル７２０は、好適には、メイン・メモリ５０６の所定領域に確保されるが、ハードディスク・ドライブ５１６に確保するようにしてもよい。
【００９５】
図８は、本発明に係る処理の概要フローチャートを示す図である。先ず、ステップ８０２では、エッジ検出を含む、パルス入力の処理が行われる。この処理は、図９のフローチャートを参照して、後で詳細に説明する。
【００９６】
ステップ８０４では、変数入力の処理が行われる。この処理は、図１０のフローチャートを参照して、後で詳細に説明する。
【００９７】
ステップ８０６では、離散系シミュレータのロールバックが必要かどうかが判断される。この判断は、実際は、ロールバックフラグがセットされているかどうかに基づき、行われる。ロールバックフラグについては、後で、図９及び図１０のフローチャートに関連して説明される。
【００９８】
ステップ８０６で、ロールバックフラグがセットされているなら、ステップ８０８に進み、そこで、離散系シミュレータをロールバックさせる処理が行われる。この処理は、図１３のフローチャートを参照して、後で詳細に説明する。
【００９９】
ステップ８１０では、変数出力の処理が行われる。この処理は、図１１のフローチャートを参照して、後で詳細に説明する。
【０１００】
次に、図９を参照して、図８のステップ８０２に対応する、パルス入力の処理について、説明する。図９のステップ９０２で、アダプタブロック６０６が、今のタイムスライスtのパルス入力の値を取得する。
【０１０１】
ステップ９０４では、パルス・テーブル７０４に既に、時刻tのエントリが存在するかどうかが判断される。もしそうなら、ステップ９０６に進み、そこで、そのエントリと今回の入力で、パルスの値が異なっているかどうかが判断される。
【０１０２】
もし、そのエントリと今回の入力で、パルスの値が同じなら、特に何もしないで、パルス入力の処理が完了する。
【０１０３】
もし、そのエントリと今回の入力で、パルスの値が異なっているなら、ステップ９０７でエッジ・テーブル７０６の時刻t以降のエントリを削除してから、ステップ９０８に進み、そこで、パルス・テーブル７０４に、時刻tのエントリが、今回の値で上書き記録される。そして、ステップ９１０で、ロールバックフラグがセットされる。
【０１０４】
次に、ステップ９１２に進み、そこで、今回の値が、前タイムスライスのパルス値が異なるかどうかが判断される。もしそうなら、ステップ９１４で、エッジ・テーブル７０６に時刻tのエントリが記録される。
【０１０５】
ステップ９１２の判断が否定的なら、処理は直ちに終了する。
【０１０６】
ステップ９０４に戻って、パルス・テーブル７０４に、時刻tのエントリが存在しないなら、ステップ９１６に進み、パルス・テーブル７０４に、時刻tでの値が記録される。
【０１０７】
次に、ステップ９１８に進み、そこで、今回の値が、前タイムスライスのパルス値が異なるかどうかが判断される。もしそうなら、ステップ９２０で、エッジ・テーブル７０６に時刻tのエントリが記録され、ステップ９２２で、ペリフェラル６１２にエッジ信号が入力され、処理は終了する。
【０１０８】
ステップ９１８の判断が否定的なら、処理は直ちに終了する。
【０１０９】
次に、図１０を参照して、図８のステップ８０４に対応する、変数入力の処理について、説明する。図１０のステップ１００２で、入力スケジューラ７１２が、今のタイムスライスtのパルス入力の値を取得する。
【０１１０】
ステップ１００４で、入力スケジューラ７１２が、入力変数テーブル７１４で、時刻t以前で、最近のエントリを探す。
【０１１１】
ステップ１００６では、入力スケジューラ７１２が、そのエントリが入力変数テーブル７１４で末尾かどうか、判断する。もしそうなら、ステップ１００８で、入力スケジューラ７１２が、最終入力時間をtにセットする。
【０１１２】
ステップ１０１０では、入力スケジューラ７１２が、探したエントリの値が今回の値と異なるかどうか判断する。もしそうなら、ステップ１０１２で、今回の時刻と値が末尾のエントリとして、入力変数テーブル７１４に追加される。そして、ステップ１０１４に進む。
【０１１３】
ステップ１０１０で、入力スケジューラ７１２が、探したエントリの値が今回の値と同一であると判断すると、処理は直ちにステップ１０１４に進む。
【０１１４】
ステップ１０１４で、入力スケジューラ７１２が、読取り要求テーブル７１６に、時刻t以前で、返答フラグがfalseのエントリERがあるかどうかを判断し、もしそうでないなら、処理は直ちに終了する。
【０１１５】
ステップ１０１４で、入力スケジューラ７１２が、読取り要求テーブル７１６に、時刻t以前で、返答フラグがfalseのエントリERがあると判断すると、ステップ１０１６に進み、入力スケジューラ７１２が、エントリERの時刻ter以前で最近のエントリを入力変数テーブル７１４で探す。
【０１１６】
ステップ１０１８では、入力スケジューラ７１２が、その探したエントリの値Verを、読取り要求テーブル７１６のエントリERとして書き込む。
【０１１７】
ステップ１０２０では、変数アクセス・インターフェース７１８が、エントリERに対応する読取り要求に対する返答メッセージをペリフェラルに、時刻ter、値Verで、入力し、処理は終わる。
【０１１８】
ステップ１００６に戻って、エントリが入力変数テーブル７１４で末尾でないと判断されたなら、入力スケジューラ７１２が、ステップ１０２２に進み、そのエントリの値が今回の値と異なるかどうかを判断する。もしそうなら、ステップ１０２４に進み、最終入力時間をtにし、ステップ１０２６で、入力変数テーブル７１４の時刻t以降のエントリが削除される。そして、ステップ１０２８で、今回の時刻と値で、入力変数テーブル７１４の末尾にエントリが追加される。
【０１１９】
次にステップ１０３０に進み、そこで、入力スケジューラ７１２が、読取り要求テーブル７１６中で時刻t以降の返答フラグがtrueのエントリがあるかどうかをチェックする。そして、もしそうなら、ステップ１０３２で、ロールバックフラグをセットして、処理は終わる。そうでないなら、直ちに処理は終わる。
【０１２０】
ステップ１０２２に戻って、そのエントリの値が今回の値と同じなら、直ちに処理は終わる。
【０１２１】
次に、図１１を参照して、図８のステップ８１０に対応する、変数出力の処理について、説明する。図１１の処理は基本的に、出力スケジューラ７２４によって実行される。
【０１２２】
ステップ１１０２では、出力スケジューラ７２４が、出力スケジュール時間tsが、今のタイムスライスの時間tよりも前かどうかを判断する。そして、もしそうなら、ステップ１１０４で、出力スケジューラ７２４は、出力変数テーブル７２０において、時刻tsからtまでの変数出力を行う。そうでないなら、ステップ１１０６で、出力スケジューラ７２４は、出力変数テーブル７２０において、時刻tでの変数出力を行う。
【０１２３】
そして、ステップ１１０８で、出力スケジューラ７２４は、出力スケジュール時間７２２を次のタイムスライスの時刻にセットして、処理を終了する。
【０１２４】
図１２のフローチャートは、図１１でのステップ１１０４またはステップ１１０６の出力処理を、より詳しく説明するものである。ステップ１２０２では、ある時刻toが与えられたとき、出力変数テーブル７２０で、出力変数テーブル７２０において、to以前で、最近のエントリが探される。
【０１２５】
ステップ１２０４では、見つかったそのエントリが、時刻toでのエントリとして出力される。
【０１２６】
次に、図１３を参照して、図８のステップ８０８に対応する、ロールバック処理について、説明する。ステップ１３０２で、ヒストリ・マネジャ７０８が、割込み応答時間リスト７１０から、時刻t以前で、最新のロールバック可能時間を探す。ここでtとは、今のタイムスライスの時間である。
【０１２７】
ステップ１３０４では、そのロールバック可能時間をtrbとする。
【０１２８】
ステップ１３０６では、ヒストリ・マネジャ７０８が、そのtrbへのロールバック要求を、ペリフェラル６１２に送る。典型的に図４に示されるように、ＥＣＵエミュレータ６０４は、状態リポジトリに状態の履歴を保持しているので、このロールバック要求に応答して、状態を遡ることが可能である。
【０１２９】
ステップ１３０８では、ヒストリ・マネジャ７０８が、パルス・テーブル７０４、エッジ・テーブル７０６、割込み応答時間リスト７１０、入力変数テーブル７１４、及び出力変数テーブル７２０の、時刻tより後のエントリを削除する要求を、変数アクセス・インターフェース７１８に送る。変数アクセス・インターフェース７１８は、この要求に応答して、実際にエントリ削除作業を行う。
【０１３０】
ステップ１３１０では、エッジ・テーブル７０６に記録された時刻trbから時刻tまでのエッジを、エッジ通知モジュール７０２が、ペリフェラル６１２に入力する。
【０１３１】
ステップ１３０２では、ヒストリ・マネジャ７０８が、グローバル・タイム・マネジャ６１０に、時刻を申告する。このとき、現在の確定時刻を申告値として使う。
【０１３２】
次に、図１４のフローチャートを参照して、ペリフェラル６１２から届くイベントの処理を説明する。この処理は、図８のフローチャートに示す処理とは別プロセスまたは別スレッドであるので、図８には含まれていない。
【０１３３】
図１４のステップ１４０２では、アダプタブロック６０６が、ペリフェラル６１２から届くイベントのうち、未処理のイベントがあるかどうかを判断する。未処理のイベントがなければ、ステップ１４０２で待機状態となる。
【０１３４】
未処理のイベントがあると、次のステップ１４０４で、その未処理のイベントが、割込み応答（割込みハンドラの起動）通知イベントであるかどうかが判断される。
【０１３５】
もし未処理のイベントが、割込み応答通知イベントであるなら、ステップ１４０６で、割込み応答時間リスト７１０に  今回のイベントの時刻tackのエントリがあるかどうかが判断される。もしそうなら、ステップ１４０２で待機状態となる。
【０１３６】
ステップ１４０６で、割込み応答時間リスト７１０に  今回のイベントの時刻tackのエントリがないと判断されると、ステップ１４０８で、割込み応答時間リスト７１０の末尾に、イベントの時刻tackが記録される。
【０１３７】
そこで、ステップ１４１０では、出力スケジュール時間(時刻ts)がtackより前かどうかが判断される。もしそうなら、ステップ１４１２で、申告値としてtsを使うことによりグローバル・タイム・マネジャ６１０に時刻の申告が行われ、そうでなければ、ステップ１４１４で、申告値としてtackを使うことによりグローバル・タイム・マネジャ６１０に時刻の申告が行われ、ステップ１４０２での待機に戻る。
【０１３８】
ステップ１４０４に戻って、未処理のイベントが、割込み応答通知イベントでないなら、ステップ１４１６に進み、そこで、変数アクセス・インターフェース７１８によって、未処理のイベントが、変数の読込み要求イベントかどうかが判断される。もしそうなら、ステップ１４１８で、変数アクセス・インターフェース７１８が変数の読込み要求イベントの処理を行って、ステップ１４０２での待機に戻る。読込み要求イベントの処理については、図１５のフローチャートを参照して後でより詳細に説明する。
【０１３９】
ステップ１４１６で、変数アクセス・インターフェース７１８が、未処理のイベントが、変数の読込み要求イベントでないと判断すると、ステップ１４２０で変数アクセス・インターフェース７１８は、ステップ１４２０で、未処理のイベントが変数の書込みイベントであると認識し、ステップ１４２２で変数アクセス・インターフェース７１８が変数の書込み要求イベントの処理を行って、ステップ１４０２での待機に戻る。書込み要求イベントの処理については、図１６のフローチャートを参照して後でより詳細に説明する。
【０１４０】
次に、図１５のフローチャートを参照して、変数アクセス・インターフェース７１８による変数の読込み要求イベントの処理を説明する。図１５のステップ１５０２では、読取り要求パケットの時刻をtrqとする。
【０１４１】
ステップ１５０４では、変数アクセス・インターフェース７１８が、読取り要求テーブル７１６に、時刻trqのエントリがあるかどうか判断し、もしそうなら、そのエントリの値をVrとする。
【０１４２】
次に、ステップ１５０６で、変数アクセス・インターフェース７１８は、時刻trq、値Vrで、読取り要求に対する返答メッセージを、ペリフェラル６１２に入力し、変数の読込み要求イベントの処理を終わる。
【０１４３】
このとき、時刻trqは、離散イベント系がロールバックして昔の時刻をやり直した状態であるが、当該エントリの返答フラグは必ずtrueであることに留意されたい。なぜなら、連続系でロールバックを起こした時刻tより後の読取り要求テーブル７１６のエントリは、ロールバック時に削除されているため、今回のtrqは時刻t以前であるから対応する値はロールバック時には返答可能であったはずだからである。
【０１４４】
ステップ１５０４に戻って、読取り要求テーブル７１６に、時刻trqのエントリがないなら、ステップ１５０８に行って、変数アクセス・インターフェース７１８は、最終入力時間が読取り要求パケットの時刻trqより後かどうかを判断する。
【０１４５】
もしそうなら、変数アクセス・インターフェース７１８は、入力変数テーブル７１４で、時刻trq以前で最近のエントリを探し、そのエントリの値をVrとする。
【０１４６】
ステップ１５１２では、変数アクセス・インターフェース７１８は、読取り要求テーブル７１６の末尾に、時刻trq、値Vr、返答フラグtrueのエントリを記録する。
【０１４７】
ステップ１５１４では、変数アクセス・インターフェース７１８は、読取り要求に対する返答メッセージを、時刻trq、値Vrでペリフェラル６１２に入力する。次に処理は、判断ステップ１５１８に進む。
【０１４８】
ステップ１５０８の判断に戻って、最終入力時間が読取り要求パケットの時刻trqより後でないなら、変数アクセス・インターフェース７１８は、ステップ１５１６で読取り要求テーブル７１６の末尾に、時刻trq、返答フラグfalseのエントリを記録して、判断ステップ１５１８に進む。
【０１４９】
判断ステップ１５１８では、出力スケジュール時間（時刻ts)がtrqより前かどうかが判断される。もしそうなら、ステップ１５２０で、申告値としてtsを使って、グローバル・タイム・マネジャ６１０に時刻が申告される。もしそうでなければ、ステップ１５２２で、申告値としてtrqを使って、グローバル・タイム・マネジャ６１０に時刻が申告され、変数の読込み要求イベントの処理が終わる。
【０１５０】
次に、図１６のフローチャートを参照して、変数アクセス・インターフェース７１８による変数の書込み込み要求イベントの処理を説明する。図１６のステップ１６０２では、書込み要求パケットの時刻をtwqとする。
【０１５１】
ステップ１６０４では、変数アクセス・インターフェース７１８は、出力変数テーブル７１４に要求パケットの時刻twqのエントリが存在するかどうかを判断する。もしそうなら、変数アクセス・インターフェース７１８は、変数の書込み要求イベントの処理を終わる。
【０１５２】
なお、ステップ１６０４で、出力変数テーブル７１４に要求パケットの時刻twqのエントリが存在するということは、離散イベント系がロールバックして昔の時刻をやり直した状態であり、当該エントリの値は今回の書込み要求の値と同一であることを意味する。なぜなら連続系でロールバックを起こした時刻tより後の出力変数テーブル７２０のエントリはロールバック時に削除されているため、今回のtwqは時刻t以前であり、時刻t以前までは離散イベント系はロールバックする前に実行したのと同一の入力を受けるため、同一の動作をするはずであるからである。
【０１５３】
ステップ１６０４で、出力変数テーブル７１４に要求パケットの時刻twqのエントリが存在しないなら、ステップ１６０６で、変数アクセス・インターフェース７１８は、出力変数テーブル７２０の末尾に、書込み要求パケットの時刻twqと値のエントリを記録する。
【０１５４】
ステップ１６０８では、出力スケジュール時間（時刻ts)がtwqより前かどうかが判断される。もしそうなら、ステップ１６１０で、申告値としてtsを使って、グローバル・タイム・マネジャ６１０に時刻が申告される。もしそうでなければ、ステップ１６１２で、変数アクセス・インターフェース７１８が出力スケジュール時間をtwqにセットし、ステップ１６１４で、申告値としてtwqを使って、グローバル・タイム・マネジャ６１０に時刻が申告され、こうして、変数の書込み要求イベントの処理が終わる。
【０１５５】
以上、本発明の構成を説明してきたが、本発明の構成の動作をより具体的に示すために、幾つかのシナリオに沿って説明する。
【０１５６】
＜シナリオ１＞
シナリオ１は、連続系シミュレータからのパルス入力に応じた、離散系シミュレータへの割込みの起動シーケンスに関する。図１７に、シナリオ１のタイミング・チャートを示す。図示されているように、連続系の３タイムスライス毎に、時間t0、t3、t6、t9、t12・・・と、ＥＣＵのペリフェラルに、エッジ通知がなされる。これは図式的な例であって、実際はもっと大きい間隔でエッジ通知がなされることに留意されたい。これは、エッジ通知モジュール７０２が、入力パルスのエッジをそのタイミングで検出しているからである。但し、全てのエッジ通知が離散系への割込みを引き起こす訳ではない。割込みを引き起こすイベントに応答してのみ、離散系への割込みが引き起こされる。
【０１５７】
一方、離散系からは、連続系に対して、変数の読取り要求や、変数の書込み要求もなされる。図１７で、変数Ａ読取り要求や、変数Ｚ書込み要求というのが、それに該当する。
【０１５８】
以下、アダプタブロック６０６で使用されるテーブル及びフィールドについて説明する。
【０１５９】
図１８は、パルス・テーブル７０４のエントリの例を示す。パルス・テーブル７０４は、各タイムスライスで、アダプタブロック６０６に入力されるパルス信号の履歴を保持する。パルス・テーブル７０４は、図示されているように、時刻と、入力毎のパルス信号の値をエントリとしてもつ。複数のパルス信号が入力される場合、それぞれの値を書く。
【０１６０】
図１９は、エッジ・テーブル７０６のエントリの例を示す。エッジ・テーブル７０６は、アダプタブロック６０６に入力されるパルス信号のエッジ（立上り／立下り）の履歴を保持するためのものであって、時刻と、エッジの種類（立上りまたは立下りで、up/downで示されている）と、それが生じた入力ポートをエントリとしてもつ。
【０１６１】
図２０は、割込み応答時間リスト７１０のエントリの例を示す。割込み応答時間リスト７１０は、離散系シミュレータからの割込みの応答の時刻の履歴を保持し、その時刻に、離散系シミュレータは、ロールバック可能である。
【０１６２】
図２１は、変数Ａの入力変数テーブル７１４のエントリの例を示す。入力変数テーブル７１４は、アダプタブロック６０６に入力される。毎タイムスライス毎に入力があるが、入力変数テーブル７１４は、値が変化したときの時刻と値を、エントリとしてもつ。入力変数テーブル７１４は、入力される変数の数だけ用意される。
【０１６３】
図２２は、アダプタブロック６０６の最終入力時間７２２のエントリの例を示す。最終入力時間７２２のフィールドには、各タイムスライスで変数の入力が行われる度に、その時刻が書き込まれる。この実施例では、入力変数テーブル７１４に関連したフィールドとして示されている。
【０１６４】
図２３は、変数Ａの読取り要求テーブル７１６のエントリの例を示す。読取り要求テーブル７１６には、離散例シミュレータからの変数の読込み要求の履歴が保持される。読取り要求テーブル７１６は、変数の読込み要求の時刻、返答に使用された値、及び返答済みか否かのフラグをエントリとしてもつ。このとき、アダプタブロック６０６がまだ実行していない時刻での要求は、未返答として、返答済みフラグは、falseとされる。読取り要求テーブル７１６は、返答に使用される変数の数だけ用意される。
【０１６５】
図２４は、変数Ｚの出力変数テーブル７２０のエントリの例を示す。出力変数テーブル７２０は、離散系シミュレータからの変数の書込みの履歴を保持する。出力変数テーブル７２０は、変数の書込みの時刻と、その際の値をエントリとしてもつ。アダプタブロック６０６は、この表をみて、毎タイムスライスで変数の出力値を決める。出力変数テーブル７２０は、出力される変数の数だけ用意される。
【０１６６】
図２５は、アダプタブロック６０６の出力スケジュール時間７２２の変数Ｚのエントリの例を示す。出力スケジュール時間７２２は、アダプタブロック６０６の次のタイムスライス実行時に、変数を出力すべき最初の時刻を保持する。アダプタブロック６０６は、変数出力処理時に、この時刻からそのタイムスライスでの時刻までの各タイムステップでの出力を行う。通常は、出力処理時にはそのタイムスライスでの時刻が書込まれているはずだが、離散系シミュレータの実行が遅く、古い時刻での変数書込みがあった場合に、アダプタブロック６０６で既に実行した値がここに書き込まれていることがある。出力スケジュール時間７２２のフィールドは、出力される変数の数だけ用意される。
【０１６７】
図２６は、シナリオ１における、エッジ通知モジュール７０２、ヒストリ・マネジャ７０８、グローバル・タイム・マネジャ６１０、ＥＣＵペリフェラル６１２、ＥＣＵエミュレータ６０４、及び変数アクセス・インターフェース７１８の間の通知または応答の流れを、時間付きで示す図である。
【０１６８】
エッジ通知モジュール７０２は、パルスを連続系シミュレータから受け取る度にパルス・テーブル７０４に時刻と、各入力ポートでのパルス値を記録する。エッジ通知モジュール７０２は、前のタイムスライスでの値と異なれば、エッジとみなす。エッジ通知モジュール７０２は、エッジを検出する度に、エッジ・テーブル７０６に、時刻、入力ポート、及びエッジの種類を記録し、ペリフェラル６１２に通知する。
【０１６９】
ペリフェラル６１２は、エッジ通知モジュール７０２から通知がある度に、設定に基づいた動作をして、割込みが発生するのであれば、離散系シミュレータ（この場合、ＥＣＵエミュレータ６０４）に割込みを入力する。そして、離散系シミュレータから割込みがある度に、ヒストリ・マネジャ７０８にそのまま渡す。ペリフェラル６１２はまた、離散系シミュレータによって設定される。
【０１７０】
離散系シミュレータは、割込み入力により割込みが起動されたタイミングで、時刻付の割込み応答を、ペリフェラル６１２に返す。
【０１７１】
ヒストリ・マネジャ７０８は、ペリフェラル６１２から応答がある度に、割込み応答時間リスト７１０にその時刻を記録し、グローバル・タイム・マネジャ６１０に、その時刻をタイムスタンプとして通知する。但し、アダプタブロック６０６からの出力時刻である、出力スケジュール時間７２２の方が遅れていれば、出力スケジュール時間７２２の１つ前のタイムスライスの時刻を、グローバル・タイム・マネジャ６１０に通知する。一方、ヒストリ・マネジャ７０８は、グローバル・タイム・マネジャ６１０から確定時刻の報告を受けると、それを保持する。
【０１７２】
シナリオ１では、離散系シミュレータが変数の値を読取る場合、ペリフェラル６１２に、変数名と時刻の情報をもつ読取り要求パケットを送信し、返答を待つ。
【０１７３】
ペリフェラル６１２は、離散系シミュレータから読取り要求パケットを受け取ると、それを変数アクセス・インターフェース７１８にそのまま渡し、返答を待つ。変数アクセス・インターフェース７１８から、読取り要求パケットに対する返答が到着したら、ペリフェラル６１２は、それを、離散系シミュレータに渡す。
【０１７４】
変数アクセス・インターフェース７１８は、ペリフェラル６１２から読取り要求パケットがあれば、図１４のフローチャートに示す処理により、変数値を取得して値を返し、ヒストリ・マネジャ７０８に読取り要求パケットの時刻を、タイムスタンプとして通知する。
【０１７５】
離散系シミュレータが変数の値を書込む場合、ペリフェラル６１２に、変数名と時刻と値の情報をもつ書込み要求パケットを送信し、返答を待つ。
【０１７６】
ペリフェラル６１２は、離散系シミュレータから書込み要求パケットを受け取ると、それを変数アクセス・インターフェース７１８にそのまま渡す。
【０１７７】
変数アクセス・インターフェース７１８は、ペリフェラル６１２から書込み要求パケットがあれば、図１４のフローチャートに示す処理により、変数値を書込む手続きを行い、ヒストリ・マネジャ７０８に書込み要求パケットの時刻を、タイムスタンプとして通知する。
【０１７８】
ヒストリ・マネジャ７０８は、変数アクセス・インターフェース７１８からタイムスタンプの通知が到着すると、グローバル・タイム・マネジャ６１０にタイムスタンプとして通知する。但し、アダプタブロック６０６からの出力時刻である、出力スケジュール時間７２２の方が遅れていれば、出力スケジュール時間７２２の１つ前のタイムスライスの時刻を、グローバル・タイム・マネジャ６１０に通知する。
【０１７９】
＜シナリオ２＞
シナリオ２は、連続系シミュレータへのパルス入力がロールバックしたため、離散系シミュレータにトランザクションのやり直しを指示するというものである。図２７に、シナリオ２のタイミング・チャートを示す。図２７において、t9まで実行した時点で、t8までのパルスが到着したとする。すると、アダプタブロック６０６は、t8以前で一番近いロールバック可能な時点t2（これは、割込み応答時間リスト７１０から分かる）まで戻るように離散系シミュレータに指示し、エッジの通知を、エッジ・テーブル７０６を参照して、t1からt8までやり直すようにする。
【０１８０】
図２８は、シナリオ２における、エッジ通知モジュール７０２、ヒストリ・マネジャ７０８、グローバル・タイム・マネジャ６１０、ＥＣＵペリフェラル６１２、ＥＣＵエミュレータ６０４、及び変数アクセス・インターフェース７１８の間の通知または応答の流れを、時間付きで示す図である。
【０１８１】
エッジ通知モジュール７０２は、古い時刻のパルス入力があり、その値がパルス・テーブル７０４に記録された値と異なる場合、パルス・テーブル７０４とエッジ・テーブル７０６の、そのパルス入力の古い時刻以降を削除し、ヒストリ・マネジャ７０８に、そのパルス入力の時刻付のロールバック要求を出す。そして、ヒストリ・マネジャ７０８からロールバックの通知を待ち、ロールバック可能時刻から今回のパルス入力までのエッジを、エッジ・テーブル７０６を参照して、ペリフェラル６１２に通知する。
【０１８２】
ヒストリ・マネジャ７０８は、エッジ通知モジュール７０２からロールバック要求を受け取ると、割込み通知時間リスト７０６から、そのパルス入力時刻以前で一番近いロールバック可能時刻を探し、その時刻へのロールバック要求をペリフェラル６１２に出す。その時刻以降の割込み通知時間リスト７０６のエントリは削除する。さらに、探した時刻を、グローバル・タイム・マネジャ６１０に、確定時刻として通知する。そして、エッジ通知モジュール７０２に、ロールバック可能時間を渡す。さらに、変数アクセス・インターフェース７１８に、パルス入力時刻とロールバック可能時間を引数として、エントリ削除要求を出す。
【０１８３】
ペリフェラル６１２は、ヒストリ・マネジャ７０８からロールバック要求を受け取ると、離散系シミュレータにそのまま渡す。
【０１８４】
離散系シミュレータは、ペリフェラル６１２からロールバック要求を受け取ると、記載された時刻にロールバックする。
【０１８５】
変数アクセス・インターフェース７１８は、エントリ削除要求を受け取ると、入力変数テーブル７１４と出力変数テーブル７２０のパルス入力時刻以降のエントリを削除し、また、読取り要求テーブル７１６における、ロールバック可能時間以降のエントリを削除する。さらに、変数アクセス・インターフェース７１８は、最終入力時間と、出力スケジュール時間７２２を、パルス入力時刻にセットする。
【０１８６】
図２９は、シナリオ２における、パルス・テーブル、エッジ・テーブル及び割込み応答時間リストの変化を示す図である。すなわち、連続系シミュレータがt9まで実行した後、t8のパルスが到着して、その値が0であった。これは、パルス・テーブルにおけるt8の値とは異なるので、ロールバックが必要である、と判断される。そこで、割込み応答時間リストで、t8から一番近いロールバック可能時刻を調べると、t2である。そこで、アダプタブロック６０６は、このt2まで戻るように離散系シミュレータに指示し、t2以降t8までのエッジを再入力する。
【０１８７】
図３０は、シナリオ２における、変数Ｚの出力変数テーブル、出力スケジュール時間、変数Ａの入力変数テーブル、変数Ａの読取り要求テーブル、最終入力時間の変化を示す図である。ここでは、入力変数テーブルと出力変数テーブルが、t8以降のエントリを削除され、読取り要求テーブルはt2以降のエントリを削除され、最終入力時間と出力スケジュール時間がt8にセットされることが示されている。
【０１８８】
＜シナリオ３＞
シナリオ３は、連続系シミュレータへの変数入力がロールバックしたため、離散系シミュレータにトランザクションのやり直しを指示するというものである。図３１に、シナリオ３のタイミング・チャートを示す。図３１において、t9まで実行した時点で、t5の入力が到着したとする。このとき、パルスの値は以前に受け取ったt5の値と同じだが、変数Ａの値がt5で変化した。離散系シミュレータはt6で変数Ａの値を参照しているので、t6に一番近いロールバック可能な時点であるt2まで戻るように、アダプタブロック６０６が、離散系シミュレータに指示し、エッジの通知を、エッジ・テーブル７０６を参照して、t3からt5までやり直すようにする。
【０１８９】
図３２は、シナリオ３における、エッジ通知モジュール７０２、ヒストリ・マネジャ７０８、グローバル・タイム・マネジャ６１０、ＥＣＵペリフェラル６１２、ＥＣＵエミュレータ６０４、及び変数アクセス・インターフェース７１８の間の通知または応答の流れを、時間付きで示す図である。
【０１９０】
入力スケジューラ７１２は、古い入力があり、その値が入力変数テーブル７１４に記録された値と矛盾し、且つ読取り要求テーブル７１６に今回の入力の時刻以降のエントリが合った場合、ヒストリ・マネジャ７０８に、その変数入力の時刻付けのロールバック要求を出す。
【０１９１】
エッジ通知モジュール７０２は、ヒストリ・マネジャ７０８からのロールバックの通知があれば、ロールバック可能時刻から今回の入力時刻までのエッジをエッジ・テーブル７０６を参照して、ペリフェラル６１２へ入力する。そうして、パルス・テーブル７０４と、エッジ・テーブル７０６の今回の入力時刻以降のエントリを削除する。
【０１９２】
ヒストリ・マネジャ７０８は、入力スケジューラ７１２からロールバック要求を受け取ると、割込み応答時間リスト７１０において、そのパルス入力時刻以前で一番近いロールバック可能時刻を探し、その時刻へのロールバック要求をペリフェラル６１２に渡す。その時刻以降の割込み応答時間リスト７１０のエントリは削除する。そうして、ヒストリ・マネジャ７０８は、グローバル・タイム・マネジャ６１０にタイムスタンプとして確定時刻を通知し、さらに、エッジ通知モジュール７０２に、ロールバック可能時刻を渡す。ヒストリ・マネジャ７０８はさらに、変数アクセス・インターフェース７１８へ、パルス入力時刻とロールバック可能時刻を引数として、エントリ削除要求を渡す。
【０１９３】
ペリフェラル６１２は、ヒストリ・マネジャ７０８からロールバック要求を受け取ると、離散系シミュレータにそのまま渡す。
【０１９４】
離散系シミュレータは、ペリフェラル６１２からロールバック要求を受け取ると、記載された時刻にロールバックする。
【０１９５】
変数アクセス・インターフェース７１８は、ヒストリ・マネジャ７０８からエントリ削除要求を受け取ると、入力変数テーブル７１４と出力変数テーブル７２０については、パルス入力時刻以後のエントリを削除する。読取り要求テーブルについては、ロールバック可能時刻以後のエントリを削除する。最終入力時間と、出力スケジュール時間については、パルス入力時刻にセットする。
【０１９６】
＜シナリオ４＞
シナリオ４は、離散系シミュレータが遅く、連続系シミュレータの出力をやり直して後段のブロックにロールバックさせる必要が生じるケースである。連続系シミュレータへの変数入力がロールバックしたため、離散系シミュレータにトランザクションのやり直しを指示するというものである。図３３に、シナリオ４のタイミング・チャートを示す。
【０１９７】
また、図３４は、図３３におけるシーケンスでの、出力変数テーブルと、出力スケジュール時間の変化を示すものである。
【０１９８】
図３４(a)は、連続系でt9まで出力が終わった時点での状態の変数Ｚの出力変数テーブルと、出力スケジュール時間とをそれぞれ示す。
【０１９９】
図３４(b)は、連続系がt10を実行する前に変数Ｚの書込み要求が到着したとする。この書込み要求パケットは、変数名=Z、時刻=t7、値=700.0である。
【０２００】
すると、連続系でt10を実行する際の出力スケジュール時間がt7なので、出力スケジューラ７２４によって、t7からt10までの出力が行われ、その出力が終わると、出力スケジュール時間は、次のタイムスライスであるt11にセットされる。
【０２０１】
以上、自動車用の複数のシミュレーション・システムに関連して、本発明の特定の実施例を説明してきたが、本発明はこのような特定の実施例に限定されず、飛行機用のシミュレーション・システムなど、一般的な電子機械制御系システムのシミュレーション・システムに適用可能であることを、この分野の当業者であるなら、理解するであろう。
【図面の簡単な説明】
【０２０２】
【図１】ＥＣＵの典型的な制御である、フィードバック閉ループ系の例を示す図である。
【図２】フィードバック閉ループ系の、応答関数による記述の例である。
【図３】ＥＣＵソフトウェア・エミュレータのクロック応答の時間推移を示す図である。
【図４】内部変数を取り出すことができるようになった後のＥＣＵのソフトウェア・エミュレータのブロック図である。
【図５】本発明を実施するために使用されるコンピュータのハードウェアのブロック図である。
【図６】シミュレーション・システム全体の機能論理ブロック図である。
【図７】アダプタブロックの詳細な機能論理ブロック図である。
【図８】タイムスライス毎の処理のフローチャートを示す図である。
【図９】パルス入力の処理のフローチャートを示す図である。
【図１０】変数入力の処理のフローチャートを示す図である。
【図１１】変数出力の処理のフローチャートを示す図である。
【図１２】時間t0での変数出力の処理のフローチャートを示す図である。
【図１３】離散系シミュレータをロールバックさせるフローチャートを示す図である。
【図１４】ペリフェラルから届くイベントの処理のフローチャートを示す図である。
【図１５】変数の読取り要求イベントの処理のフローチャートを示す図である。
【図１６】変数の書込み要求イベントの処理のフローチャートを示す図である。
【図１７】シナリオ１のタイミングチャートを示す図である。
【図１８】パルス・テーブルを示す図である。
【図１９】エッジ・テーブルを示す図である。
【図２０】割込み応答時間リストを示す図である。
【図２１】入力変数テーブルを示す図である。
【図２２】アダプタブロックの最終入力時間を示す図である。
【図２３】読取り要求テーブルを示す図である。
【図２４】出力変数テーブルを示す図である。
【図２５】出力スケジュール時間を示す図である。
【図２６】シナリオ１における、機能ブロック間のデータのやり取りを示す図である。
【図２７】シナリオ２のタイミングチャートを示す図である。
【図２８】シナリオ２における、機能ブロック間のデータのやり取りを示す図である。
【図２９】パルス・テーブル、エッジ・テーブル及び割込み応答時間リストの変化を示す図である。
【図３０】入力変数テーブルと出力変数テーブルの変化を示す図である。
【図３１】シナリオ３のタイミングチャートを示す図である。
【図３２】シナリオ３における、機能ブロック間のデータのやり取りを示す図である。
【図３３】シナリオ４のタイミングチャートを示す図である。
【図３４】シナリオ４における、出力変数テーブルと、出力スケジュール時間の変化を示す図である。
【符号の説明】
【０２０３】
６０４・・・離散系シミュレータ
６０６・・・アダプタブロック
６０８・・・連続系シミュレータ
７０６・・・エッジ保存手段
【図１】
2010134839.tif 000003
【図２】
2010134839.tif 000004
【図３】
2010134839.tif 000005
【図４】
2010134839.tif 000006
【図５】
2010134839.tif 000007
【図６】
2010134839.tif 000008
【図７】
2010134839.tif 000009
【図８】
2010134839.tif 000010
【図９】
2010134839.tif 000011
【図１０】
2010134839.tif 000012
【図１１】
2010134839.tif 000013
【図１２】
2010134839.tif 000014
【図１３】
2010134839.tif 000015
【図１４】
2010134839.tif 000016
【図１５】
2010134839.tif 000017
【図１６】
2010134839.tif 000018
【図１７】
2010134839.tif 000019
【図１８】
2010134839.tif 000020
【図１９】
2010134839.tif 000021
【図２０】
2010134839.tif 000022
【図２１】
2010134839.tif 000023
【図２２】
2010134839.tif 000024
【図２３】
2010134839.tif 000025
【図２４】
2010134839.tif 000026
【図２５】
2010134839.tif 000027
【図２６】
2010134839.tif 000028
【図２７】
2010134839.tif 000029
【図２８】
2010134839.tif 000030
【図２９】
2010134839.tif 000031
【図３０】
2010134839.tif 000032
【図３１】
2010134839.tif 000033
【図３２】
2010134839.tif 000034
【図３３】
2010134839.tif 000035
【図３４】
2010134839.tif 000036