JP5500820B2 - シミュレーション方法、システム及びプログラム - Google Patents

シミュレーション方法、システム及びプログラム Download PDF

Info

Publication number
JP5500820B2
JP5500820B2 JP2008312264A JP2008312264A JP5500820B2 JP 5500820 B2 JP5500820 B2 JP 5500820B2 JP 2008312264 A JP2008312264 A JP 2008312264A JP 2008312264 A JP2008312264 A JP 2008312264A JP 5500820 B2 JP5500820 B2 JP 5500820B2
Authority
JP
Japan
Prior art keywords
time
simulator
discrete
variable
system simulator
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Expired - Fee Related
Application number
JP2008312264A
Other languages
English (en)
Other versions
JP2010134839A (ja
Inventor
昭 齊藤
周一 清水
秀昭 小松
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
International Business Machines Corp
Original Assignee
International Business Machines Corp
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by International Business Machines Corp filed Critical International Business Machines Corp
Priority to JP2008312264A priority Critical patent/JP5500820B2/ja
Publication of JP2010134839A publication Critical patent/JP2010134839A/ja
Application granted granted Critical
Publication of JP5500820B2 publication Critical patent/JP5500820B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Landscapes

  • Management, Administration, Business Operations System, And Electronic Commerce (AREA)

Description

本発明は、自動車などの物理システムのシミュレーションに関し、より詳しくは、ソフトウェア・ベースでのシミュレーション・システムに関するものである。
自動車は、その初期の時代の20世紀初頭は、動力としてのエンジンと、ブレーキ、アクセル、ハンドル、トランスミッション、サスペンジョンを含む、機構部品からなっていたが、エンジンのプラグの点火、ヘッドライト以外は、電気的な仕組みはほとんど利用していなかった。
ところが、1970年代頃から、大気汚染、石油危機などに備えて、エンジンを効率的に制御する必要性が生じ、このためエンジンの制御に、ECUが使用されるようになってきた。ECUは、一般的に、センサからの入力信号を、例えばA/D変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部(マイクロコンピュータ)と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成される。
いまや、エンジンやトランスミッションなどの制御システム、Anti-lock Breaking System (ABS)、Electronic Stability Control (ESC)、パワーステアリングだけでなく、ワイパー制御やセキュリティ・モニタリング・システムなどに至るまで、最近の自動車では、機構部品だけでなく、エレクトロニクス部品やソフトウエアが重要な比率を占める。後者に関する開発費は全体の25%とも40%とも言われ、ハイブリッド型の自動車では70%を占める。
電子制御は、ECUを複数、配置して行われる。ECU間は車載ネットワーク、例えば、Controller Area Network (CAN) で相互に接続される。また、制御の対象である、エンジンやトランスミッションなどには、それぞれのECUから直接ワイヤ接続する。
ECUは、小さなコンピュータであり、センサ入力などからの割り込みに応じて動作する。一方、エンジンなどは連続的に機械的動作を行っている。すなわち、コンピュータ系のディジタル・システムと、機械系の物理システムが、自動車という単一システムにおいて、並列に協調動作を行っている。当然、これを支えるソフトウエアは複雑さがますます増大しており、ECU単体で動作を検証するだけでなく、複数を同時に検証する仕組みの実現が要望されている。
ここで、ECUに信号を入力するセンサには、エンジンの温度などを計測する温度センサ、エンジンに吸入される圧力を推定するための圧力センサ、アクセスペダルの踏み量を測定するスロットル・ポジション・センサ、ステアリング舵角センサ、車高センサ、回転速度センサ、ノックセンサ、加速度センサ、流量センサ、酸素センサ、希薄空燃比センサなどがある。
一方、ECUの出力信号によって駆動されるアクチュエータには、電磁ソレノイド及びモータ等がある。ソレノイドは例えば、エンジンのインジェクタ、トランスミッションのシフト・コントロール、ブレーキのバルブ制御、ドアロックなどに使用される。
モータは、主としてサーボ機構として、エンジンのスタータ、エンジンのフューエル・コントロール、ブレーキの油圧ポンプ、舵角制御、ステアリング、ワイパ、パワーウインドウ、シートベルト、エアバックなどに使用される。
このようなテストにために従来行われている技法として、HILS(Hardware In the Loop Simulation)がある。特に、自動車全体のECUをテストする環境は、ホールビークルHILS(Whole Vehicle Hardware In the Loop Simulation)と呼ばれる。ホールビークルHILSにおいては、実験室内で、本物のECUが、エンジン、トランスミッション機構などをエミュレーションする専用のハードウェア装置に接続され、所定のシナリオに従って、テストが行われる。ECUからの出力は、監視用のコンピュータに入力され、さらにはディスプレイに表示されて、テスト担当者がディスプレイを眺めながら、異常動作がないかどうか、チェックする。
しかし、HILSは、専用のハードウェア装置を使い、それと本物のECUの間を物理的に配線しなくてはならないので、準備が大変である。また、別のECUに取り替えてのテストも、物理的に接続し直さなくてはならないので、手間がかかる。さらに、本物のECUを用いたテストであるため、テストに実時間を要する。従って、多くのシナリオをテストすると、膨大な時間がかかる。また、HILSのエミュレーション用のハードウェア装置は、一般に、非常に高価である。
そこで近年、高価なエミュレーション用ハードウェア装置を使うことなく、ソフトウェアで構成する手法が存在する。この手法は、SILS(Software In the Loop Simulation)と呼ばれ、ECUに搭載されるマイクロコンピュータ、入出力回路、制御のシナリオなどを全て、ソフトウェア・シミュレータで構成する技法である。これによれば、ECUのハードウェアが存在しなくても、テストを実行可能である。
ところで、自動車用シミュレーション・システムは、連続系シミュレータと、離散系シミュレータを有する。連続系シミュレータの例として、エンジンの機械系部分をシミュレートするシミュレータがある。離散イベント系シミュレータの例として、エンジン回転のパルスのタイミングで動作し、燃料噴射や点火のタイミングを制御するECUのシミュレータがある。
4WDのシミュレーションをする場合においては、連続系シミュレータの例として、各タイヤへのトルク配分から車の動作を繰り返し計算するシミュレータがあり、離散イベント系シミュレータの例として、10ミリ秒ごとの定期パルス信号で動作し、車のヨーレートなどのセンサ入力から各タイヤへのトルク配分を決定するECUをシミュレートするシミュレータがある。
シミュレーション・システムは、連続系シミュレータと、離散系シミュレータを、共有メモリ、CANエミュレータなどで接続し、相互に協働して動作させる。このとき、連続系シミュレータは、タイムスライス間隔で動作する。一方、離散系シミュレータは、パルス信号入力の変化をトリガにして割込み起動され、それに応答してトランザクション処理を実行して、連続系シミュレータに対して、出力を行う。この場合、一般的に、割込みが発生する時間間隔は、連続系シミュレータのタイムスライス間隔に比べて非常に大きい。
さらに、離散系シミュレータは、連続系シミュレータのタイムスライスとは非同期に、パルス信号入力以外に、I/Oポートを通じてデータの読み書きを行う。典型的には、センサからのデータを読み込み、更新する。
このように、連続系シミュレータと、離散系シミュレータは、動作タイミングが全く異なるので、別プロセスで動作しており、両者の通信は、例えば、連続系シミュレータのタイムスライス毎に行われる。しかし、このようなプロセス間通信は、一般的にコストが高く、離散系シミュレータの割込みは、タイムスライスよりも頻度が低いので、通信コストの浪費になる。
特開2001−290860号公報は、シミュレータ間の不要な同期処理をシミュレータで求め、その同期処理を削減することにより、シミュレーション速度の向上を図ったハードウエア/ソフトウエア協調シミュレータを提供することを目的とするものであって、CPUシミュレーション手段と周辺回路シミュレーション手段を同期させるシミュレーション協調手段と、シミュレーション協調手段での同期を抑制するかどうかを決定する判断手段を備え、判断手段に基づいて前記シミュレーション協調手段での同期を抑制することを開示する。
特開平8−227367号公報は、設計エラーが予期されるシステム動作を除く全てのシステム動作を無視する高速シミュレータを使用してデバッグ速度を増加させるデバッガを得ることを目的とするものであって、各シミュレータを相互接続するための、バスサイクルに対応する信号を提供するバスのバスシミュレータとシミュレーションに不必要なバスサイクルを省略する手段を備え、シミュレーションに無関係なCPUバスサイクルを省略し、または、周期的クロック信号を明示的にシミュレートしないでクロック信号のスケジュールのみを発生するようにすることを開示する。
特開2004−30228号公報は、CPUシミュレータと、1以上の周辺マクロシミュレータと、これらの同期実行を制御する同期実行制御処理部とを備え、周辺マクロシミュレータが、CPUシミュレータでのシミュレーションに基づいて端子に入力される信号が変化したときに当該端子信号に基づくシミュレーションを実行すし、さらに周辺マクロシミュレータは、入力された端子信号の変化を検出し、変化した端子信号を端子信号リスト22に登録し、登録された端子信号についてのみシミュレーションを実行するようにすることを開示する。
特開2006−65758号公報は、回路シミュレーション手法において、回路データから作成された第1離散時間モデルに応答関数を与えて第2離散時間モデルを生成し、クロックのエッジタイミングおよびこのタイミングでのクロック同期回路に入出力される信号の実効的信号値を、第2離散モデルを用いて計算し、これによってシミュレーションを実行することを開示する。
特開2001−290860号公報 特開平8−227367号公報 特開2004−30228号公報 特開2006−65758号公報
上記従来技術は、条件的にシミュレータを同期させたり、クロックのエッジタイミングを拾うなどの技法で、シミュレータ間の通信コストを図るものであるが、特に自動車用のSILSなどのに適用するには不十分である。というのは、自動車用のSILSでは、構成が複雑なため、シミュレーションに膨大な時間がかかる。そこで、シミュレータの速度を向上させるために、シミュレータは投機的に実行されるが、すると、投機失敗に応答して、ロールバックする必要が生じる。
連続系シミュレータの場合、任意のタイムスライスに戻って実行をやり直す(ロールバックする)ことができるが、離散系シミュレータの場合は、ロールバック可能な時点は離散系のシミュレータが状態のスナップショットを採ってある時点であり、今回のような割込みで起動されるプログラムを動かす場合に関しては、割込みハンドラが起動した時点でスナップショットを採ることが適当であるため、ロールバック可能な時点は割込みハンドラの起動した時点に限られる。そのため、正しくロールバックするためには、離散系シミュレータをロールバックした後に、実際に連続系シミュレータでロールバックする時点までパルス信号エッジを離散系シミュレータに入力する必要がある。しかし、その時点では、連続系シミュレータは既に先に進んでいるので、離散系シミュレータを正しくロールバックすることは、困難である。
従って、この発明の目的は、連続系シミュレータとで離散系シミュレータが協働してシミュレーションを行うシステムにおいて、離散系シミュレータが正しくロールバックできるようにする技法を提供することにある。
この発明によれば、連続系シミュレータから送出される連続パルスのエッジ(立上がりと、立下り)がエッジ信号へと変換されて、離散系シミュレータに送られる。そのエッジ出現時刻は、シミュレーション・システムによって、トランザクション(割込み)開始の候補として登録される。但し、この時点では、エッジ信号によって実際のトランザクションが開始されるかどうかは未定である。そうして、実際にトランザクションが開始したとき、その開示時刻は、ロールバック不要の時刻(確定時刻)の候補として、報告される。
また、割込みは非同期に行われる処理なので、トランザクションの開始と同様に、センサ変数へのアクセス及び更新の時刻と、変数名、値が記録される。ちなみに、シミュレーション・システムにおいて一般的に、センサ変数とは、共有メモリ上での大域変数である。
前述のように、連続系シミュレータでは、サンプリング時間の単位でロールバック処理が行われるが、離散系シミュレータでは、トランザクションの先頭に戻って、ロールバック処理を行う必要がある。すなわち、連続系シミュレータでは、確定時刻の前にロールバックすることはないが、離散系シミュレータでは、確定時刻からさらに遡って、トランザクションの先頭まで戻る必要がある。このため、本発明によれば、トランザクションの記録は、確定時刻を過ぎても、少なくとも一つは削除しないで保持される。逆に言うと、新しいトランザクションが開始されると、古いトランザクションの記録が、確定あるいは放棄されたとして、削除される。
連続系シミュレータがある時刻までロールバックするとき、離散系シミュレータは前述のように、さらに時刻を遡って、たとえば割込みハンドラを開始した時刻まで戻る必要がある。この時間差を補うために、本発明によれば,シミュレーション・システムは、記録していたエッジ出現時刻を用いて、離散系シミュレータへエッジ入力を再現することにより、離散系シミュレータが正しく割り込みハンドラ開始時刻からの実行を再現して連続系シミュレータがロールバックした時刻まで戻ることを保証する。
なお、本発明によれば、エッジ出現時刻に変更があったとき、または、アクセスした変数の値に変更があったとき、離散系シミュレータのロールバックが行われる。一方、センサ変数を出力した後に、離散系シミュレータによってセンサ変数が更新された場合は、シミュレーション・システムは、連続系シミュレータをロールバックさせる。
この発明によれば、連続系シミュレータとで離散系シミュレータが協働してシミュレーションを行うシステムにおいて、離散系シミュレータが正しくロールバックできるようにして、適切にシミュレーションを進行させることができる。
以下、図面を参照して、本発明の一実施例の構成及び処理を説明する。以下の記述では、特に断わらない限り、図面に亘って、同一の要素は同一の符号で参照されるものとする。なお、ここで説明する構成と処理は、一実施例として説明するものであり、本発明の技術的範囲をこの実施例に限定して解釈する意図はないことを理解されたい。
本発明を実現するための構成を説明する前に、その前提として、ECUについて説明する。ECUは、一般的に、センサからの入力信号を、例えばA/D変換する入力インターフェースと、決められた論理に従ってディジタル入力信号を処理する論理演算部(マイクロコンピュータ)と、その処理結果を、アクチュエータ作動信号に変換する出力インターフェースとから構成されるものである。
この発明は、説明の便宜上、以下では、自動車のECUに関連して説明するが、それには限定されず、航空機、ロボットなどその他のECUをもつメカトロニクス機構全般に適用可能であることを理解されたい。
ECUは、周辺や環境状態、エンジンなどの駆動機構の状態、及び人間による指示操作の内容をセンサで検出して、信号として入力する。具体的には、水温センサ、吸気温センサ、過給圧センサ、ポンプ角センサ、クランク角センサ、車速センサ、アクセル位置センサ、A/Tシフト・ポジション、スタータ・スイッチ、エアコンECUなどからの信号がある。
ECUは、これらの信号を入力して、電磁スピル弁、フュエル・カット・ソレノイド、タイミング・コントロール・バルブ、吸気絞りVSV、グロー・プラグ・リレー、タコメータ及びエアコン・リレーなどを駆動する信号を出力しする。
1つのECUが複数の異なる機構を制御するための駆動信号を出力するようにすることは不可能ではないが、例えば、エンジンとエアコンのように、応答性やその制御の厳密性が異なるものを単一のECUで制御することは合理的でなく、従って、一般的に自動車にECUは複数個設けられる。
図1は、ECUの典型的な制御である、フィードバック閉ループ系の例を示す図である。すなわち、図1において、ある目標の信号が、ECUであるコントローラ102に入力され、ECUは、目標の信号を内部処理することによって、駆動信号を出力し、制御対象モデルである、エンジンなどのプラント104を駆動し、プラント104の出力は、センサ106を介して、コントローラ102の入力にフィードバックされる。
ここで目標信号として与えられるのは、例えば、スロットル開度、アイドル・コントロール、ブレーキ力、シフト、スタータON・OFF、バッテリ電圧、インジェクション通電時間、インジェクション通電回数、デポジット、ドウェル角、進角値、吸気完了フラグ、点火完了フラグ、大気圧、車両重量、転がり抵抗係数、道路勾配、粘着係数、吸気温、などのパラメータである。
また、センサ信号としてフィードバックされるのは、スロットル開度、吸気圧力、吸入空気量、シフト、エンジン回転数、車速、排気温、O、冷却水温、空燃比、ノック、点火異常、などである。
ECUが制御する対象は、ニュートンの力学方程式で解かれる、機構系システムであったり、電気回路の応答方程式で解かれる、電気駆動回路であったり、それらの組み合わせであったりする。これらは、基本的に微分方程式であり、制御工学によれば、ラプラス変換によって応答関数に変換されて、記述することができる。
図2は、そのような応答関数による記述の例である。図2で破線202で囲った箇所が、図1のコントローラ102に対応し、破線204で囲った箇所が、図1の制御対象モデル104に対応し、センサ106が、ブロック206に対応する。なお、図2は、応答関数による表現の一例であって、特に本発明を限定する意図はないことを理解されたい。
さて、例えば、ECUが制御する対象が、ニュートンの力学方程式で解かれる、機構系システムであるとする。すると、ある時点のECUの制御出力は、その機構系システムの可動部分の位置及び速度という内部状態変数をもち、その時点の入力だけでは決まらない。そのことは、電気回路にもあてはまり、電気回路のキャパシタに残っている電荷の量や、コイルのインダクタンスによる磁力などの内部状態変数が、やはり存在する。
従って、ECUは、図3に示すように、入力uに対して、その内部状態xを勘案した値yを出力することになる。
さて、前述したSILSのようなテストの目的で、自動車部品メーカーは、自社が提供する機器のECUのソフトウェア・エミュレータを提供する。すなわち、図2に示すような機能を、アセンブラまたはCなどの言語が書かれたコードをアセンブリまたはコンパイルした実行可能プログラムにより、純粋にソフトウェア的に実現する。
本発明のこの実施例では、ECUのソフトウェア・エミュレータの内部状態を取り出して利用する。ソフトウェア・エミュレータによっては、内部状態が取り出し可能である場合と、そのままでは、内部状態が取り出し可能でない場合がある。
そこで、ECUのソフトウェア・エミュレータの内部状態がそのままでは、内部状態が取り出し可能でない場合、ソースコード解析ツールによって、次のような処理を行う。
もし、ECUのソフトウェア・エミュレータのソースコードが入手可能であるならそれをそのまま利用し、実行可能バイナリ・ファイルしかなければ、所定のツールで、逆アセンブルまたは逆コンパイルする。そうして、ECUのソフトウェア・エミュレータのソースコードに対して、データーフロー解析という技法を適用して、ソースコードを基本ブロックに分割する。基本ブロックとは、ソースコードを、複数の制御が合流するところ、または、制御が複数に分岐するところで分断した、各々の部分のことである。このような基本ブロックをノードとして、その分岐の制御の流れのリンクで接続すると、有向グラフ構造になる。これは特に、制御フローグラフとも呼ばれる。制御フローグラフは、始点ノードと終点ノードをもち、プログラムで実行され得るノードは全て、始点ノードからの有効エッジをもつ。基本ブロックのうち、exit()やreturnなどのステートメントを含む制御の末端ノードは全て、終点ノードへの有効エッジをもつ。
次に、制御フローグラフの始点ノードと終点ノードの可能な全てのパスに対して、Use/Def解析を行う。ここで、Useとは、ある変数が、別の変数に値をストアするために使用される場合をいう。典型的には、代入式の右辺である。Defとは、ある変数に、値がストアされる場合をいう。典型的には、代入式の左辺である。
この場合、個々のパス毎に、Defの前あるいは、DefなしでUseされている変数、すなわち未定義参照変数があるかどうかがチェックされ、もし未定義参照変数があると、その変数名は一旦保存される。
こうして、全てのパスがスキャンされた後に保存されている変数名を用いて、後述するように、ラッパ(wrapper)コードが生成される。
ところで、実行フローのスキャンと、Use/Def解析は、データーフロー解析という技法を用いることによって、より効率的に実行することができるので、以下、それについて説明する。
その第1ステップは、各基本ブロックにおけるdefリストの計算である。具体的にはプログラム全体で使用される変数のリストを1ビットで表現し、各基本ブロックごとに定義される変数を1されないものを0としたビットベクタで表現する。
その第2ステップは、プログラム全体の到達可能なdefリストの計算である。すなわち、各基本ブロックでは、複数の入力がある場合には論理積(AND)してから,自身への入力とする。自身からの出力は、その入力と、自身で定義したdefリストの論理和(OR)をとり、後続の基本ブロックに渡す。実行していく順番は、制御フローグラフ上での深さ優先順序が効率的である。
第3ステップは、クロージャ解析アルゴリズムにより、到達可能なdefリストのクロージャを求めることである。そして、上記第2ステップを、全ての基本ブロックの出力defリストが変化しなくなるまで、繰り返す。ここで、クロージャとは、環境と結び付けられた値のことである。
第4ステップは、未定義変数の使用の発見である。すなわち、各基本ブロックの入力defリストが0として表現された変数が、useとして使用されているものを検出する。
なお、データフロー解析のより詳しい説明については、Alfred V. Aho, Ravi Sethi, Jeffrey D. Ullman, "Compilers Principles, Technologies, and Tools", Addison-Wesley Publishing Company, 1986, p. 608-633などを参照されたい。
さて、例えば、元のECUシミュレーション・ソースコードが、関数 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に、処理後の内部状態の値がセットされるので、必要に応じて、それらの値を別途保存するなど、利用可能である。このようにラッパコードが付されたソースコードは、実行可能プログラムを生成するために、コンパイルまたはアセンブルされる。
また、C++など、特定の処理言語の仕様によっては、_Func(x,y,z,_a,_b)でなく、_Func(x,y,z,&_a,&_b)のように、参照演算子&をつけて関数に引数として与える必要があることもある。
こうして、内部状態あるいは、内部変数を取り出すことができるようになった後のECUのソフトウェア・エミュレータを図式的に、図4に示す。そこに示すように、ECUのソフトウェア・エミュレータ402は、内部ロジックfを示す部分と、内部状態または状態変数xとに好都合に分離される。
すると、内部ロジックfを用いて、出力y = f(t,x,u, ...) と記述することができる。ここでtは、時間である。また、状態変数xに係るコードが分離されたことによって、任意の時点、すなわち典型的には出力がなされるタイミングで、状態変数xと、好ましくは入力uも、状態リポジトリ404として、ハードディスクドライブに書き出すことができる。
状態変数xに係るコードを分離した効果はこれだけではない。すなわち、矢印406で示すように、ソフトウェア・エミュレータ402には、任意の時点で、状態変数xをセットすることができる。これによって、状態リポジトリ404から入力と状態変数xを選んでセットすることにより、ECUのソフトウェア・エミュレータ402を、その状態変数xが状態リポジトリ404に書き出された任意の時点の状態に戻して、そこから計算をやり直させることができる。
以上説明したような処理は、ECUだけでなく、物理装置シミュレータも含む論理プロセス全般に適用することが可能である。従って、以下では、論理プロセスを、内部状態変数を取り出し可能で、且つ内部状態変数を所望の値にセット可能であるものとして扱う。
次に、図5を参照して、本発明を実施するために使用されるコンピュータのハードウェアについて説明する。図5において、ホスト・バス502には、複数のCPU0 504a、CPU1 504b、CPU2 504c、CPU3 504dが接続されている。ホスト・バス502にはさらに、CPU0 504a、CPU1 504b、CPU2 504c、CPU3 504dの演算処理のためのメイン・メモリ506が接続されている。
一方、I/Oバス508には、キーボード510、マウス512、ディスプレイ514及びハードティスク・ドライブ516が接続されている。I/Oバス508は、I/Oブリッジ518を介して、ホスト・バス502に接続されている。キーボード510及びマウス512は、オペレータが、コマンドを打ち込んだり、メニューをクリックするなどして、操作するために使用される。ディスプレイ514は、必要に応じて、後述する本発明に係るプログラムをGUIで操作するためのメニューを表示するために使用される。
この目的のために使用される好適なコンピュータ・システムのハードウェアとして、IBM(R)System Xがある。その際、CPU0 504a、CPU1 504b、CPU2 504c、CPU3 504dは、例えば、インテル(R)Core 2 DUOであり、オペレーティング・システムは、Windows(商標)Server 2003である。オペレーティング・システムは、ハードティスク・ドライブ516に格納され、コンピュータ・システムの起動時に、ハードティスク・ドライブ516からメイン・メモリ506に読み込まれる。
なお、本発明を実施するために使用可能なコンピュータ・システムのハードウェアは、IBM(R)System Xに限定されず、本発明のシミュレーション・プログラムを走らせることができるものであれば、任意のコンピュータ・システムを使用することができる。オペレーティング・システムも、Windows(R)に限定されず、Linux(R)、Mac OS(R)など、任意のオペレーティング・システムを使用することができる。さらに、ECUエミュレータ・プログラム、物理装置シミュレータなどの論理プロセスを高速で動作させるために、POWER(商標)6ベースで、オペレーティング・システムがAIX(商標)のIBM(R)System Pなどのコンピュータ・システムを使用してもよい。
ハードディスク・ドライブ516にはさらに、ECUエミュレータ、物理装置シミュレータなどの複数の論理プロセス、及び、複数の論理プロセスを協働して動作させるためのプログラムが格納され、キーボード510及びマウス512によって起動操作可能である。
好適には、フルビークルSILSを実現するために、1台の自動車で使われるすべてのECUのエミュレータ・プログラムが、ハードティスク・ドライブ516に保存されている。そのECUのエミュレータ・プログラムが、そのままでは内部の状態変数を取り出せないものてある場合は、上述したラッパコードを被せることにより、予め、状態変数をセット及び取り出し可能としておくものとする。
ハードティスク・ドライブ516にはさらに、後述するECUエミュレータ・プログラムのためのスケジューラ、エンジン、トランスミッション、ステアリング、ワイパなどの物理装置(プラント)シミュレータ・プログラム、全体のシステムの時刻を管理するためのグローバル・タイム・マネジャ及び、登り坂道、高速道路、つづら折道などの様々な、テストのためのシナリオを格納したシナリオ・ジェネレータのプログラムも格納されている。
なお、ここでの「エミュレータ」と、「シミュレータ」の用語の使い分けであるが、もともとの、別のプロセッサで動くことを想定して書かれていたECUのコードを、CPU0〜CPU3などをターゲットとして動くようにすることを、エミュレーションと呼び、それを行うプログラムを、エミュレータと呼ぶ。一方、エンジンなどの物理的システムの動作を仮想計算するシステムを、シミュレータと呼ぶ。
次に、図6を参照して、本発明のシミュレーション・システムの機能論理ブロック図を説明する。図6において、共有メモリ602は、実際は、図5に示すメイン・メモリ506の一部であってよい。共有メモリ602には、ECUエミュレータ・プログラム604a、604b、・・・604nが、アダプタプロック606を介して接続されている。
アダプタプロック606は、本発明に従い、連続系シミュレータ(図6では、物理装置シミュレータ608)と、離散系シミュレータ(図6では、ECUエミュレータ604)の間で、履歴を記録して離散系シミュレータが正しくロールバックできるようにする機能を提供するものであり、その詳細は、図7以下を参照して後述する。
共有メモリ602にはさらに、物理装置シミュレータ・プログラム608a、・・・608mと、グローバル・タイム・マネジャ610が、論理的に結合されている。
グローバル・タイム・マネジャ610は、ECUエミュレータ・プログラム604a、604b、・・・604n及び物理装置シミュレータ・プログラム608a、・・・608mの間のイベントのタイム・スタンプに基づき、それらのイベントの間の一貫性を維持するように動作する。グローバル・タイム・マネジャ610のより詳しい動作は、後述する。
ECUのエミュレータ・プログラム604a、604b、・・・604nは、それぞれ、エンジン、ブレーキ、トランスミッション、ステアリングなど、車の異なる部分の制御に対応するもので、それぞれが異なる速度のクロックで動作するので、対応するECUのエミュレータ・プログラムも、それに比例するクロック比で動作するものとする。
一例として、スレッドを作成いることにより、複数のCPUに、ECUのエミュレータ・プログラムを割り当てるコードを、C言語を例にとって示す。
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);
とすると、オペレーティング・システムがスレッドを生成して、それをECUのエミュレータ・プログラムに割り当てる。物理的には、そのスレッドは、CPU0〜CPU3のどれかに割り当てられるが、それはオペレーティング・システムに任され、エミュレータ・プログラムにとっては、透過的である。
このような割り当て処理は、ECUエミュレータ・プログラム604a、604b、・・・604n各々に個別に行われる。
なお、図6に示した論理構成では、ECUエミュレータ・プログラム604a、604b、・・・604n、物理装置シミュレータ・プログラム606a、・・・606m、アダプタブロック606、及びグローバル・タイム・マネジャ610は、共有メモリ602を使用してデータを交換するが、代わりに、CAN(controller area network)エミュレータを使用してもよい。
図示しないが、図6の構成には、登り坂道、高速道路、つづら折道などの様々な、テストのためのシナリオを格納したシナリオ・ジェネレータも接続される。
なお、図6では、単一のアダプタブロック606が、複数のECUエミュレータ・プログラム604a、604b、・・・604nをカバーするように示されているが、これは一実施例にすぎず、ECUエミュレータ・プログラム毎にアダプタブロックを設けるようにしてもよい。
図7は、図6のアダプタブロック606の機能ブロックを示す図である。図7において、エッジ通知ブロック702は、連続系シミュレータ608からパルスを受け取る度に、パルス・テーブル704に、時刻及び、各入力テーブルでのパルス値を記録する。またパルスのエッジを検出する度に、エッジ・テーブル706に、時刻、入力ポート、エッジのタイプ(立上がりか、立下がりか)を記録し、ECUエミュレータ604のペリフェラル612に通知する。
ヒストリ・マネジャ708は、ペリフェラル612から割込み応答がある度毎に、割込み応答リスト710にその時刻を記録し、グローバル・タイム・マネジャ610に、タイム・スタンプとして通知する。一方、グローバル・タイム・マネジャ610から、確定時刻を受け取る。
割込み応答時間リスト710は、離散系シミュレータ(ごの場合、ECUエミュレータ604)からの割込み応答の時刻の履歴を保持する。ECUエミュレータ604は、そこに保持されている時刻にロールバックすることが可能である。
入力スケジューラ712は、各タイムスライスでアダプタブロック606に入力される変数の値を、入力変数テーブル714に書き込んだり、入力変数テーブル714のエントリと、読取り要求テーブル716のエントリを対比して、ロールバックが必要かどうかの判断をしたりする。
入力変数テーブル714は、アダプタブロック606に入力される変数の値の履歴を保持する。入力変数テーブル714には、各タイムスライス毎に入力があるが、値が変化した時の時刻と値を、エントリとしてもつ。変数が複数ある場合は、変数の数だけ、入力変数テーブルをもつ。この実施例では、入力変数テーブル714には、最終入力時間のフィールドも併せて保持されている。しかし、これは一実施例であって、最終入力時間のフィールドだけを独立に保持してもよい。
読取り要求テーブル716は、離散系シミュレータからの変数の読込要求の履歴を保持する。読取り要求テーブル716は、変数の読込要求の時刻、返答に使った値と、返答済みか否かのフラグをエントリとしてもつ。このとき、アダプタブロック606がまだ実行していない時刻での要求は未応答とし、返答済みフラグを、falseとする。変数が複数ある場合は、変数の数だけ、読取り要求テーブルをもつ。
変数アクセス・インターフェース718は、離散系シミュレータからの変数の読み書きイベントを処理する。読込みに関しては、入力変数テーブル714の値を参照し、読込みの履歴を、読取り要求テーブル716に記録する。書込みに関しては、出力変数テーブル720に値を記録し、必要に応じて出力スケジュール時間722を変更する。
出力スケジューラ724は、各タイムスライスで、アダプタブロック606から出力される変数の値を、出力変数テーブル720を参照して決めたり、出力スケジュール時間722を参照して、どの時刻からの出力が必要かを判断し、あるいは実際に出力する。
出力変数テーブル720は、離散系シミュレータからの変数の書込みの履歴を保持する。出力変数テーブル720は、変数の書込みの時刻と、その際の値をエントリとしてもつ。アダプタブロックは、出力変数テーブルをみて、毎タイムスライスでの変数の出力値を決める。変数が複数ある場合は、変数の数だけ、出力変数テーブルをもつ。
出力スケジュール時間722は、アダプタブロック606の次のタイムスライス実行時に変数を出力すべき最初の時刻を保持する。アダプタブロックは、変数出力処理時に、この時刻からそのタイムスライスでの時刻までの各タイムステップでの出力を行う。なお、パルス・テーブル704、エッジ・テーブル706、割込み応答時間リスト710、入力変数テーブル714、読取り要求テーブル716、出力スケジュール時間722のフィールド、及び出力変数テーブル720は、好適には、メイン・メモリ506の所定領域に確保されるが、ハードディスク・ドライブ516に確保するようにしてもよい。
図8は、本発明に係る処理の概要フローチャートを示す図である。先ず、ステップ802では、エッジ検出を含む、パルス入力の処理が行われる。この処理は、図9のフローチャートを参照して、後で詳細に説明する。
ステップ804では、変数入力の処理が行われる。この処理は、図10のフローチャートを参照して、後で詳細に説明する。
ステップ806では、離散系シミュレータのロールバックが必要かどうかが判断される。この判断は、実際は、ロールバックフラグがセットされているかどうかに基づき、行われる。ロールバックフラグについては、後で、図9及び図10のフローチャートに関連して説明される。
ステップ806で、ロールバックフラグがセットされているなら、ステップ808に進み、そこで、離散系シミュレータをロールバックさせる処理が行われる。この処理は、図13のフローチャートを参照して、後で詳細に説明する。
ステップ810では、変数出力の処理が行われる。この処理は、図11のフローチャートを参照して、後で詳細に説明する。
次に、図9を参照して、図8のステップ802に対応する、パルス入力の処理について、説明する。図9のステップ902で、アダプタブロック606が、今のタイムスライスtのパルス入力の値を取得する。
ステップ904では、パルス・テーブル704に既に、時刻tのエントリが存在するかどうかが判断される。もしそうなら、ステップ906に進み、そこで、そのエントリと今回の入力で、パルスの値が異なっているかどうかが判断される。
もし、そのエントリと今回の入力で、パルスの値が同じなら、特に何もしないで、パルス入力の処理が完了する。
もし、そのエントリと今回の入力で、パルスの値が異なっているなら、ステップ907でエッジ・テーブル706の時刻t以降のエントリを削除してから、ステップ908に進み、そこで、パルス・テーブル704に、時刻tのエントリが、今回の値で上書き記録される。そして、ステップ910で、ロールバックフラグがセットされる。
次に、ステップ912に進み、そこで、今回の値が、前タイムスライスのパルス値が異なるかどうかが判断される。もしそうなら、ステップ914で、エッジ・テーブル706に時刻tのエントリが記録される。
ステップ912の判断が否定的なら、処理は直ちに終了する。
ステップ904に戻って、パルス・テーブル704に、時刻tのエントリが存在しないなら、ステップ916に進み、パルス・テーブル704に、時刻tでの値が記録される。
次に、ステップ918に進み、そこで、今回の値が、前タイムスライスのパルス値が異なるかどうかが判断される。もしそうなら、ステップ920で、エッジ・テーブル706に時刻tのエントリが記録され、ステップ922で、ペリフェラル612にエッジ信号が入力され、処理は終了する。
ステップ918の判断が否定的なら、処理は直ちに終了する。
次に、図10を参照して、図8のステップ804に対応する、変数入力の処理について、説明する。図10のステップ1002で、入力スケジューラ712が、今のタイムスライスtのパルス入力の値を取得する。
ステップ1004で、入力スケジューラ712が、入力変数テーブル714で、時刻t以前で、最近のエントリを探す。
ステップ1006では、入力スケジューラ712が、そのエントリが入力変数テーブル714で末尾かどうか、判断する。もしそうなら、ステップ1008で、入力スケジューラ712が、最終入力時間をtにセットする。
ステップ1010では、入力スケジューラ712が、探したエントリの値が今回の値と異なるかどうか判断する。もしそうなら、ステップ1012で、今回の時刻と値が末尾のエントリとして、入力変数テーブル714に追加される。そして、ステップ1014に進む。
ステップ1010で、入力スケジューラ712が、探したエントリの値が今回の値と同一であると判断すると、処理は直ちにステップ1014に進む。
ステップ1014で、入力スケジューラ712が、読取り要求テーブル716に、時刻t以前で、返答フラグがfalseのエントリERがあるかどうかを判断し、もしそうでないなら、処理は直ちに終了する。
ステップ1014で、入力スケジューラ712が、読取り要求テーブル716に、時刻t以前で、返答フラグがfalseのエントリERがあると判断すると、ステップ1016に進み、入力スケジューラ712が、エントリERの時刻ter以前で最近のエントリを入力変数テーブル714で探す。
ステップ1018では、入力スケジューラ712が、その探したエントリの値Verを、読取り要求テーブル716のエントリERとして書き込む。
ステップ1020では、変数アクセス・インターフェース718が、エントリERに対応する読取り要求に対する返答メッセージをペリフェラルに、時刻ter、値Verで、入力し、処理は終わる。
ステップ1006に戻って、エントリが入力変数テーブル714で末尾でないと判断されたなら、入力スケジューラ712が、ステップ1022に進み、そのエントリの値が今回の値と異なるかどうかを判断する。もしそうなら、ステップ1024に進み、最終入力時間をtにし、ステップ1026で、入力変数テーブル714の時刻t以降のエントリが削除される。そして、ステップ1028で、今回の時刻と値で、入力変数テーブル714の末尾にエントリが追加される。
次にステップ1030に進み、そこで、入力スケジューラ712が、読取り要求テーブル716中で時刻t以降の返答フラグがtrueのエントリがあるかどうかをチェックする。そして、もしそうなら、ステップ1032で、ロールバックフラグをセットして、処理は終わる。そうでないなら、直ちに処理は終わる。
ステップ1022に戻って、そのエントリの値が今回の値と同じなら、直ちに処理は終わる。
次に、図11を参照して、図8のステップ810に対応する、変数出力の処理について、説明する。図11の処理は基本的に、出力スケジューラ724によって実行される。
ステップ1102では、出力スケジューラ724が、出力スケジュール時間tsが、今のタイムスライスの時間tよりも前かどうかを判断する。そして、もしそうなら、ステップ1104で、出力スケジューラ724は、出力変数テーブル720において、時刻tsからtまでの変数出力を行う。そうでないなら、ステップ1106で、出力スケジューラ724は、出力変数テーブル720において、時刻tでの変数出力を行う。
そして、ステップ1108で、出力スケジューラ724は、出力スケジュール時間722を次のタイムスライスの時刻にセットして、処理を終了する。
図12のフローチャートは、図11でのステップ1104またはステップ1106の出力処理を、より詳しく説明するものである。ステップ1202では、ある時刻toが与えられたとき、出力変数テーブル720で、出力変数テーブル720において、to以前で、最近のエントリが探される。
ステップ1204では、見つかったそのエントリが、時刻toでのエントリとして出力される。
次に、図13を参照して、図8のステップ808に対応する、ロールバック処理について、説明する。ステップ1302で、ヒストリ・マネジャ708が、割込み応答時間リスト710から、時刻t以前で、最新のロールバック可能時間を探す。ここでtとは、今のタイムスライスの時間である。
ステップ1304では、そのロールバック可能時間をtrbとする。
ステップ1306では、ヒストリ・マネジャ708が、そのtrbへのロールバック要求を、ペリフェラル612に送る。典型的に図4に示されるように、ECUエミュレータ604は、状態リポジトリに状態の履歴を保持しているので、このロールバック要求に応答して、状態を遡ることが可能である。
ステップ1308では、ヒストリ・マネジャ708が、パルス・テーブル704、エッジ・テーブル706、割込み応答時間リスト710、入力変数テーブル714、及び出力変数テーブル720の、時刻tより後のエントリを削除する要求を、変数アクセス・インターフェース718に送る。変数アクセス・インターフェース718は、この要求に応答して、実際にエントリ削除作業を行う。
ステップ1310では、エッジ・テーブル706に記録された時刻trbから時刻tまでのエッジを、エッジ通知モジュール702が、ペリフェラル612に入力する。
ステップ1302では、ヒストリ・マネジャ708が、グローバル・タイム・マネジャ610に、時刻を申告する。このとき、現在の確定時刻を申告値として使う。
次に、図14のフローチャートを参照して、ペリフェラル612から届くイベントの処理を説明する。この処理は、図8のフローチャートに示す処理とは別プロセスまたは別スレッドであるので、図8には含まれていない。
図14のステップ1402では、アダプタブロック606が、ペリフェラル612から届くイベントのうち、未処理のイベントがあるかどうかを判断する。未処理のイベントがなければ、ステップ1402で待機状態となる。
未処理のイベントがあると、次のステップ1404で、その未処理のイベントが、割込み応答(割込みハンドラの起動)通知イベントであるかどうかが判断される。
もし未処理のイベントが、割込み応答通知イベントであるなら、ステップ1406で、割込み応答時間リスト710に 今回のイベントの時刻tackのエントリがあるかどうかが判断される。もしそうなら、ステップ1402で待機状態となる。
ステップ1406で、割込み応答時間リスト710に 今回のイベントの時刻tackのエントリがないと判断されると、ステップ1408で、割込み応答時間リスト710の末尾に、イベントの時刻tackが記録される。
そこで、ステップ1410では、出力スケジュール時間(時刻ts)がtackより前かどうかが判断される。もしそうなら、ステップ1412で、申告値としてtsを使うことによりグローバル・タイム・マネジャ610に時刻の申告が行われ、そうでなければ、ステップ1414で、申告値としてtackを使うことによりグローバル・タイム・マネジャ610に時刻の申告が行われ、ステップ1402での待機に戻る。
ステップ1404に戻って、未処理のイベントが、割込み応答通知イベントでないなら、ステップ1416に進み、そこで、変数アクセス・インターフェース718によって、未処理のイベントが、変数の読込み要求イベントかどうかが判断される。もしそうなら、ステップ1418で、変数アクセス・インターフェース718が変数の読込み要求イベントの処理を行って、ステップ1402での待機に戻る。読込み要求イベントの処理については、図15のフローチャートを参照して後でより詳細に説明する。
ステップ1416で、変数アクセス・インターフェース718が、未処理のイベントが、変数の読込み要求イベントでないと判断すると、ステップ1420で変数アクセス・インターフェース718は、ステップ1420で、未処理のイベントが変数の書込みイベントであると認識し、ステップ1422で変数アクセス・インターフェース718が変数の書込み要求イベントの処理を行って、ステップ1402での待機に戻る。書込み要求イベントの処理については、図16のフローチャートを参照して後でより詳細に説明する。
次に、図15のフローチャートを参照して、変数アクセス・インターフェース718による変数の読込み要求イベントの処理を説明する。図15のステップ1502では、読取り要求パケットの時刻をtrqとする。
ステップ1504では、変数アクセス・インターフェース718が、読取り要求テーブル716に、時刻trqのエントリがあるかどうか判断し、もしそうなら、そのエントリの値をVrとする。
次に、ステップ1506で、変数アクセス・インターフェース718は、時刻trq、値Vrで、読取り要求に対する返答メッセージを、ペリフェラル612に入力し、変数の読込み要求イベントの処理を終わる。
このとき、時刻trqは、離散イベント系がロールバックして昔の時刻をやり直した状態であるが、当該エントリの返答フラグは必ずtrueであることに留意されたい。なぜなら、連続系でロールバックを起こした時刻tより後の読取り要求テーブル716のエントリは、ロールバック時に削除されているため、今回のtrqは時刻t以前であるから対応する値はロールバック時には返答可能であったはずだからである。
ステップ1504に戻って、読取り要求テーブル716に、時刻trqのエントリがないなら、ステップ1508に行って、変数アクセス・インターフェース718は、最終入力時間が読取り要求パケットの時刻trqより後かどうかを判断する。
もしそうなら、変数アクセス・インターフェース718は、入力変数テーブル714で、時刻trq以前で最近のエントリを探し、そのエントリの値をVrとする。
ステップ1512では、変数アクセス・インターフェース718は、読取り要求テーブル716の末尾に、時刻trq、値Vr、返答フラグtrueのエントリを記録する。
ステップ1514では、変数アクセス・インターフェース718は、読取り要求に対する返答メッセージを、時刻trq、値Vrでペリフェラル612に入力する。次に処理は、判断ステップ1518に進む。
ステップ1508の判断に戻って、最終入力時間が読取り要求パケットの時刻trqより後でないなら、変数アクセス・インターフェース718は、ステップ1516で読取り要求テーブル716の末尾に、時刻trq、返答フラグfalseのエントリを記録して、判断ステップ1518に進む。
判断ステップ1518では、出力スケジュール時間(時刻ts)がtrqより前かどうかが判断される。もしそうなら、ステップ1520で、申告値としてtsを使って、グローバル・タイム・マネジャ610に時刻が申告される。もしそうでなければ、ステップ1522で、申告値としてtrqを使って、グローバル・タイム・マネジャ610に時刻が申告され、変数の読込み要求イベントの処理が終わる。
次に、図16のフローチャートを参照して、変数アクセス・インターフェース718による変数の書込み込み要求イベントの処理を説明する。図16のステップ1602では、書込み要求パケットの時刻をtwqとする。
ステップ1604では、変数アクセス・インターフェース718は、出力変数テーブル714に要求パケットの時刻twqのエントリが存在するかどうかを判断する。もしそうなら、変数アクセス・インターフェース718は、変数の書込み要求イベントの処理を終わる。
なお、ステップ1604で、出力変数テーブル714に要求パケットの時刻twqのエントリが存在するということは、離散イベント系がロールバックして昔の時刻をやり直した状態であり、当該エントリの値は今回の書込み要求の値と同一であることを意味する。なぜなら連続系でロールバックを起こした時刻tより後の出力変数テーブル720のエントリはロールバック時に削除されているため、今回のtwqは時刻t以前であり、時刻t以前までは離散イベント系はロールバックする前に実行したのと同一の入力を受けるため、同一の動作をするはずであるからである。
ステップ1604で、出力変数テーブル714に要求パケットの時刻twqのエントリが存在しないなら、ステップ1606で、変数アクセス・インターフェース718は、出力変数テーブル720の末尾に、書込み要求パケットの時刻twqと値のエントリを記録する。
ステップ1608では、出力スケジュール時間(時刻ts)がtwqより前かどうかが判断される。もしそうなら、ステップ1610で、申告値としてtsを使って、グローバル・タイム・マネジャ610に時刻が申告される。もしそうでなければ、ステップ1612で、変数アクセス・インターフェース718が出力スケジュール時間をtwqにセットし、ステップ1614で、申告値としてtwqを使って、グローバル・タイム・マネジャ610に時刻が申告され、こうして、変数の書込み要求イベントの処理が終わる。
以上、本発明の構成を説明してきたが、本発明の構成の動作をより具体的に示すために、幾つかのシナリオに沿って説明する。
<シナリオ1>
シナリオ1は、連続系シミュレータからのパルス入力に応じた、離散系シミュレータへの割込みの起動シーケンスに関する。図17に、シナリオ1のタイミング・チャートを示す。図示されているように、連続系の3タイムスライス毎に、時間t0、t3、t6、t9、t12・・・と、ECUのペリフェラルに、エッジ通知がなされる。これは図式的な例であって、実際はもっと大きい間隔でエッジ通知がなされることに留意されたい。これは、エッジ通知モジュール702が、入力パルスのエッジをそのタイミングで検出しているからである。但し、全てのエッジ通知が離散系への割込みを引き起こす訳ではない。割込みを引き起こすイベントに応答してのみ、離散系への割込みが引き起こされる。
一方、離散系からは、連続系に対して、変数の読取り要求や、変数の書込み要求もなされる。図17で、変数A読取り要求や、変数Z書込み要求というのが、それに該当する。
以下、アダプタブロック606で使用されるテーブル及びフィールドについて説明する。
図18は、パルス・テーブル704のエントリの例を示す。パルス・テーブル704は、各タイムスライスで、アダプタブロック606に入力されるパルス信号の履歴を保持する。パルス・テーブル704は、図示されているように、時刻と、入力毎のパルス信号の値をエントリとしてもつ。複数のパルス信号が入力される場合、それぞれの値を書く。
図19は、エッジ・テーブル706のエントリの例を示す。エッジ・テーブル706は、アダプタブロック606に入力されるパルス信号のエッジ(立上り/立下り)の履歴を保持するためのものであって、時刻と、エッジの種類(立上りまたは立下りで、up/downで示されている)と、それが生じた入力ポートをエントリとしてもつ。
図20は、割込み応答時間リスト710のエントリの例を示す。割込み応答時間リスト710は、離散系シミュレータからの割込みの応答の時刻の履歴を保持し、その時刻に、離散系シミュレータは、ロールバック可能である。
図21は、変数Aの入力変数テーブル714のエントリの例を示す。入力変数テーブル714は、アダプタブロック606に入力される。毎タイムスライス毎に入力があるが、入力変数テーブル714は、値が変化したときの時刻と値を、エントリとしてもつ。入力変数テーブル714は、入力される変数の数だけ用意される。
図22は、アダプタブロック606の最終入力時間722のエントリの例を示す。最終入力時間722のフィールドには、各タイムスライスで変数の入力が行われる度に、その時刻が書き込まれる。この実施例では、入力変数テーブル714に関連したフィールドとして示されている。
図23は、変数Aの読取り要求テーブル716のエントリの例を示す。読取り要求テーブル716には、離散例シミュレータからの変数の読込み要求の履歴が保持される。読取り要求テーブル716は、変数の読込み要求の時刻、返答に使用された値、及び返答済みか否かのフラグをエントリとしてもつ。このとき、アダプタブロック606がまだ実行していない時刻での要求は、未返答として、返答済みフラグは、falseとされる。読取り要求テーブル716は、返答に使用される変数の数だけ用意される。
図24は、変数Zの出力変数テーブル720のエントリの例を示す。出力変数テーブル720は、離散系シミュレータからの変数の書込みの履歴を保持する。出力変数テーブル720は、変数の書込みの時刻と、その際の値をエントリとしてもつ。アダプタブロック606は、この表をみて、毎タイムスライスで変数の出力値を決める。出力変数テーブル720は、出力される変数の数だけ用意される。
図25は、アダプタブロック606の出力スケジュール時間722の変数Zのエントリの例を示す。出力スケジュール時間722は、アダプタブロック606の次のタイムスライス実行時に、変数を出力すべき最初の時刻を保持する。アダプタブロック606は、変数出力処理時に、この時刻からそのタイムスライスでの時刻までの各タイムステップでの出力を行う。通常は、出力処理時にはそのタイムスライスでの時刻が書込まれているはずだが、離散系シミュレータの実行が遅く、古い時刻での変数書込みがあった場合に、アダプタブロック606で既に実行した値がここに書き込まれていることがある。出力スケジュール時間722のフィールドは、出力される変数の数だけ用意される。
図26は、シナリオ1における、エッジ通知モジュール702、ヒストリ・マネジャ708、グローバル・タイム・マネジャ610、ECUペリフェラル612、ECUエミュレータ604、及び変数アクセス・インターフェース718の間の通知または応答の流れを、時間付きで示す図である。
エッジ通知モジュール702は、パルスを連続系シミュレータから受け取る度にパルス・テーブル704に時刻と、各入力ポートでのパルス値を記録する。エッジ通知モジュール702は、前のタイムスライスでの値と異なれば、エッジとみなす。エッジ通知モジュール702は、エッジを検出する度に、エッジ・テーブル706に、時刻、入力ポート、及びエッジの種類を記録し、ペリフェラル612に通知する。
ペリフェラル612は、エッジ通知モジュール702から通知がある度に、設定に基づいた動作をして、割込みが発生するのであれば、離散系シミュレータ(この場合、ECUエミュレータ604)に割込みを入力する。そして、離散系シミュレータから割込みがある度に、ヒストリ・マネジャ708にそのまま渡す。ペリフェラル612はまた、離散系シミュレータによって設定される。
離散系シミュレータは、割込み入力により割込みが起動されたタイミングで、時刻付の割込み応答を、ペリフェラル612に返す。
ヒストリ・マネジャ708は、ペリフェラル612から応答がある度に、割込み応答時間リスト710にその時刻を記録し、グローバル・タイム・マネジャ610に、その時刻をタイムスタンプとして通知する。但し、アダプタブロック606からの出力時刻である、出力スケジュール時間722の方が遅れていれば、出力スケジュール時間722の1つ前のタイムスライスの時刻を、グローバル・タイム・マネジャ610に通知する。一方、ヒストリ・マネジャ708は、グローバル・タイム・マネジャ610から確定時刻の報告を受けると、それを保持する。
シナリオ1では、離散系シミュレータが変数の値を読取る場合、ペリフェラル612に、変数名と時刻の情報をもつ読取り要求パケットを送信し、返答を待つ。
ペリフェラル612は、離散系シミュレータから読取り要求パケットを受け取ると、それを変数アクセス・インターフェース718にそのまま渡し、返答を待つ。変数アクセス・インターフェース718から、読取り要求パケットに対する返答が到着したら、ペリフェラル612は、それを、離散系シミュレータに渡す。
変数アクセス・インターフェース718は、ペリフェラル612から読取り要求パケットがあれば、図14のフローチャートに示す処理により、変数値を取得して値を返し、ヒストリ・マネジャ708に読取り要求パケットの時刻を、タイムスタンプとして通知する。
離散系シミュレータが変数の値を書込む場合、ペリフェラル612に、変数名と時刻と値の情報をもつ書込み要求パケットを送信し、返答を待つ。
ペリフェラル612は、離散系シミュレータから書込み要求パケットを受け取ると、それを変数アクセス・インターフェース718にそのまま渡す。
変数アクセス・インターフェース718は、ペリフェラル612から書込み要求パケットがあれば、図14のフローチャートに示す処理により、変数値を書込む手続きを行い、ヒストリ・マネジャ708に書込み要求パケットの時刻を、タイムスタンプとして通知する。
ヒストリ・マネジャ708は、変数アクセス・インターフェース718からタイムスタンプの通知が到着すると、グローバル・タイム・マネジャ610にタイムスタンプとして通知する。但し、アダプタブロック606からの出力時刻である、出力スケジュール時間722の方が遅れていれば、出力スケジュール時間722の1つ前のタイムスライスの時刻を、グローバル・タイム・マネジャ610に通知する。
<シナリオ2>
シナリオ2は、連続系シミュレータへのパルス入力がロールバックしたため、離散系シミュレータにトランザクションのやり直しを指示するというものである。図27に、シナリオ2のタイミング・チャートを示す。図27において、t9まで実行した時点で、t8までのパルスが到着したとする。すると、アダプタブロック606は、t8以前で一番近いロールバック可能な時点t2(これは、割込み応答時間リスト710から分かる)まで戻るように離散系シミュレータに指示し、エッジの通知を、エッジ・テーブル706を参照して、t1からt8までやり直すようにする。
図28は、シナリオ2における、エッジ通知モジュール702、ヒストリ・マネジャ708、グローバル・タイム・マネジャ610、ECUペリフェラル612、ECUエミュレータ604、及び変数アクセス・インターフェース718の間の通知または応答の流れを、時間付きで示す図である。
エッジ通知モジュール702は、古い時刻のパルス入力があり、その値がパルス・テーブル704に記録された値と異なる場合、パルス・テーブル704とエッジ・テーブル706の、そのパルス入力の古い時刻以降を削除し、ヒストリ・マネジャ708に、そのパルス入力の時刻付のロールバック要求を出す。そして、ヒストリ・マネジャ708からロールバックの通知を待ち、ロールバック可能時刻から今回のパルス入力までのエッジを、エッジ・テーブル706を参照して、ペリフェラル612に通知する。
ヒストリ・マネジャ708は、エッジ通知モジュール702からロールバック要求を受け取ると、割込み通知時間リスト706から、そのパルス入力時刻以前で一番近いロールバック可能時刻を探し、その時刻へのロールバック要求をペリフェラル612に出す。その時刻以降の割込み通知時間リスト706のエントリは削除する。さらに、探した時刻を、グローバル・タイム・マネジャ610に、確定時刻として通知する。そして、エッジ通知モジュール702に、ロールバック可能時間を渡す。さらに、変数アクセス・インターフェース718に、パルス入力時刻とロールバック可能時間を引数として、エントリ削除要求を出す。
ペリフェラル612は、ヒストリ・マネジャ708からロールバック要求を受け取ると、離散系シミュレータにそのまま渡す。
離散系シミュレータは、ペリフェラル612からロールバック要求を受け取ると、記載された時刻にロールバックする。
変数アクセス・インターフェース718は、エントリ削除要求を受け取ると、入力変数テーブル714と出力変数テーブル720のパルス入力時刻以降のエントリを削除し、また、読取り要求テーブル716における、ロールバック可能時間以降のエントリを削除する。さらに、変数アクセス・インターフェース718は、最終入力時間と、出力スケジュール時間722を、パルス入力時刻にセットする。
図29は、シナリオ2における、パルス・テーブル、エッジ・テーブル及び割込み応答時間リストの変化を示す図である。すなわち、連続系シミュレータがt9まで実行した後、t8のパルスが到着して、その値が0であった。これは、パルス・テーブルにおけるt8の値とは異なるので、ロールバックが必要である、と判断される。そこで、割込み応答時間リストで、t8から一番近いロールバック可能時刻を調べると、t2である。そこで、アダプタブロック606は、このt2まで戻るように離散系シミュレータに指示し、t2以降t8までのエッジを再入力する。
図30は、シナリオ2における、変数Zの出力変数テーブル、出力スケジュール時間、変数Aの入力変数テーブル、変数Aの読取り要求テーブル、最終入力時間の変化を示す図である。ここでは、入力変数テーブルと出力変数テーブルが、t8以降のエントリを削除され、読取り要求テーブルはt2以降のエントリを削除され、最終入力時間と出力スケジュール時間がt8にセットされることが示されている。
<シナリオ3>
シナリオ3は、連続系シミュレータへの変数入力がロールバックしたため、離散系シミュレータにトランザクションのやり直しを指示するというものである。図31に、シナリオ3のタイミング・チャートを示す。図31において、t9まで実行した時点で、t5の入力が到着したとする。このとき、パルスの値は以前に受け取ったt5の値と同じだが、変数Aの値がt5で変化した。離散系シミュレータはt6で変数Aの値を参照しているので、t6に一番近いロールバック可能な時点であるt2まで戻るように、アダプタブロック606が、離散系シミュレータに指示し、エッジの通知を、エッジ・テーブル706を参照して、t3からt5までやり直すようにする。
図32は、シナリオ3における、エッジ通知モジュール702、ヒストリ・マネジャ708、グローバル・タイム・マネジャ610、ECUペリフェラル612、ECUエミュレータ604、及び変数アクセス・インターフェース718の間の通知または応答の流れを、時間付きで示す図である。
入力スケジューラ712は、古い入力があり、その値が入力変数テーブル714に記録された値と矛盾し、且つ読取り要求テーブル716に今回の入力の時刻以降のエントリが合った場合、ヒストリ・マネジャ708に、その変数入力の時刻付けのロールバック要求を出す。
エッジ通知モジュール702は、ヒストリ・マネジャ708からのロールバックの通知があれば、ロールバック可能時刻から今回の入力時刻までのエッジをエッジ・テーブル706を参照して、ペリフェラル612へ入力する。そうして、パルス・テーブル704と、エッジ・テーブル706の今回の入力時刻以降のエントリを削除する。
ヒストリ・マネジャ708は、入力スケジューラ712からロールバック要求を受け取ると、割込み応答時間リスト710において、そのパルス入力時刻以前で一番近いロールバック可能時刻を探し、その時刻へのロールバック要求をペリフェラル612に渡す。その時刻以降の割込み応答時間リスト710のエントリは削除する。そうして、ヒストリ・マネジャ708は、グローバル・タイム・マネジャ610にタイムスタンプとして確定時刻を通知し、さらに、エッジ通知モジュール702に、ロールバック可能時刻を渡す。ヒストリ・マネジャ708はさらに、変数アクセス・インターフェース718へ、パルス入力時刻とロールバック可能時刻を引数として、エントリ削除要求を渡す。
ペリフェラル612は、ヒストリ・マネジャ708からロールバック要求を受け取ると、離散系シミュレータにそのまま渡す。
離散系シミュレータは、ペリフェラル612からロールバック要求を受け取ると、記載された時刻にロールバックする。
変数アクセス・インターフェース718は、ヒストリ・マネジャ708からエントリ削除要求を受け取ると、入力変数テーブル714と出力変数テーブル720については、パルス入力時刻以後のエントリを削除する。読取り要求テーブルについては、ロールバック可能時刻以後のエントリを削除する。最終入力時間と、出力スケジュール時間については、パルス入力時刻にセットする。
<シナリオ4>
シナリオ4は、離散系シミュレータが遅く、連続系シミュレータの出力をやり直して後段のブロックにロールバックさせる必要が生じるケースである。連続系シミュレータへの変数入力がロールバックしたため、離散系シミュレータにトランザクションのやり直しを指示するというものである。図33に、シナリオ4のタイミング・チャートを示す。
また、図34は、図33におけるシーケンスでの、出力変数テーブルと、出力スケジュール時間の変化を示すものである。
図34(a)は、連続系でt9まで出力が終わった時点での状態の変数Zの出力変数テーブルと、出力スケジュール時間とをそれぞれ示す。
図34(b)は、連続系がt10を実行する前に変数Zの書込み要求が到着したとする。この書込み要求パケットは、変数名=Z、時刻=t7、値=700.0である。
すると、連続系でt10を実行する際の出力スケジュール時間がt7なので、出力スケジューラ724によって、t7からt10までの出力が行われ、その出力が終わると、出力スケジュール時間は、次のタイムスライスであるt11にセットされる。
以上、自動車用の複数のシミュレーション・システムに関連して、本発明の特定の実施例を説明してきたが、本発明はこのような特定の実施例に限定されず、飛行機用のシミュレーション・システムなど、一般的な電子機械制御系システムのシミュレーション・システムに適用可能であることを、この分野の当業者であるなら、理解するであろう。
ECUの典型的な制御である、フィードバック閉ループ系の例を示す図である。 フィードバック閉ループ系の、応答関数による記述の例である。 ECUソフトウェア・エミュレータのクロック応答の時間推移を示す図である。 内部変数を取り出すことができるようになった後のECUのソフトウェア・エミュレータのブロック図である。 本発明を実施するために使用されるコンピュータのハードウェアのブロック図である。 シミュレーション・システム全体の機能論理ブロック図である。 アダプタブロックの詳細な機能論理ブロック図である。 タイムスライス毎の処理のフローチャートを示す図である。 パルス入力の処理のフローチャートを示す図である。 変数入力の処理のフローチャートを示す図である。 変数出力の処理のフローチャートを示す図である。 時間t0での変数出力の処理のフローチャートを示す図である。 離散系シミュレータをロールバックさせるフローチャートを示す図である。 ペリフェラルから届くイベントの処理のフローチャートを示す図である。 変数の読取り要求イベントの処理のフローチャートを示す図である。 変数の書込み要求イベントの処理のフローチャートを示す図である。 シナリオ1のタイミングチャートを示す図である。 パルス・テーブルを示す図である。 エッジ・テーブルを示す図である。 割込み応答時間リストを示す図である。 入力変数テーブルを示す図である。 アダプタブロックの最終入力時間を示す図である。 読取り要求テーブルを示す図である。 出力変数テーブルを示す図である。 出力スケジュール時間を示す図である。 シナリオ1における、機能ブロック間のデータのやり取りを示す図である。 シナリオ2のタイミングチャートを示す図である。 シナリオ2における、機能ブロック間のデータのやり取りを示す図である。 パルス・テーブル、エッジ・テーブル及び割込み応答時間リストの変化を示す図である。 入力変数テーブルと出力変数テーブルの変化を示す図である。 シナリオ3のタイミングチャートを示す図である。 シナリオ3における、機能ブロック間のデータのやり取りを示す図である。 シナリオ4のタイミングチャートを示す図である。 シナリオ4における、出力変数テーブルと、出力スケジュール時間の変化を示す図である。
符号の説明
604・・・離散系シミュレータ
606・・・アダプタブロック
608・・・連続系シミュレータ
706・・・エッジ保存手段

Claims (15)

  1. コンピュータによって実装される、シミュレーション・システムにおいて、
    連続系シミュレータと、
    離散系シミュレータと、
    前記連続系シミュレータから前記離散系シミュレータに送られるパルスのエッジ信号の情報を時間付きで保存するエッジ保存手段と、
    前記離散系シミュレータのイベントの発生時間を、ロールバック可能時間として保存する手段と、
    前記連続系シミュレータのロールバック動作に応答して、該ロールバックの発生時間より前の前記離散系シミュレータの前記ロールバック可能時間を検索する検索手段と、
    前記検索手段によって見出された前記ロールバック可能時間に対応する前記エッジ信号を、前記エッジ保存手段から読み出して、前記離散系シミュレータに送る手段を有する、 シミュレーション・システム。
  2. 前記離散系シミュレータのイベントが、割込みである、請求項1のシミュレーション・システム。
  3. 前記イベントの発生時間が、前記離散系シミュレータからの割込みに対する返答時間である、請求項2のシミュレーション・システム。
  4. 前記エッジ保存手段が、時間と、入力ポートと、エッジのタイプの情報を含む、請求項1のシミュレーション・システム。
  5. 前記シミュレーション・システムが自動車のシミュレーション・システムであり、前記連続系シミュレータがエンジン・シミュレータであり、前記離散系シミュレータが、該エンジン・シミュレータを制御するためのECUエミュレータである、請求項1のシミュレーション・システム。
  6. 連続系シミュレータと、離散系シミュレータを有するシステムを、コンピュータの制御により動作させるシミュレーション方法であって、
    前記連続系シミュレータから前記離散系シミュレータに送られるパルスのエッジ信号の情報を時間付きで保存するエッジ保存ステップと、
    前記離散系シミュレータのイベントの発生時間を、ロールバック可能時間として保存するステップと、
    前記連続系シミュレータのロールバック動作に応答して、該ロールバックの発生時間より前の前記離散系シミュレータの前記ロールバック可能時間を検索する検索ステップと、
    前記検索ステップによって見出された前記ロールバック可能時間に対応する前記エッジ信号を、前記エッジ保存ステップによって保存された情報から読み出して、前記離散系シミュレータに送るステップを有する、
    シミュレーション方法。
  7. 前記離散系シミュレータのイベントが、割込みである、請求項6のシミュレーション方法。
  8. 前記イベントの発生時間が、前記離散系シミュレータからの割込みに対する返答時間である、請求項7のシミュレーション方法。
  9. 前記エッジ保存ステップが、時間と、入力ポートと、エッジのタイプの情報を保存するステップを含む、請求項6のシミュレーション方法。
  10. 前記システムが自動車のシミュレーション・システムであり、前記連続系シミュレータがエンジン・シミュレータであり、前記離散系シミュレータが、該エンジン・シミュレータを制御するためのECUエミュレータである、請求項6のシミュレーション方法。
  11. 連続系シミュレータと、離散系シミュレータを有するシステムを、コンピュータの制御により動作させるシミュレーション・プログラムであって、
    前記コンピュータをして、
    前記連続系シミュレータから前記離散系シミュレータに送られるパルスのエッジ信号の情報を時間付きで保存するエッジ保存ステップと、
    前記離散系シミュレータのイベントの発生時間を、ロールバック可能時間として保存するステップと、
    前記連続系シミュレータのロールバック動作に応答して、該ロールバックの発生時間より前の前記離散系シミュレータの前記ロールバック可能時間を検索する検索ステップと、
    前記検索ステップによって見出された前記ロールバック可能時間に対応する前記エッジ信号を、前記エッジ保存ステップによって保存された情報から読み出して、前記離散系シミュレータに送るステップを実行させる、
    シミュレーション・プログラム。
  12. 前記離散系シミュレータのイベントが、割込みである、請求項11のシミュレーション・プログラム。
  13. 前記イベントの発生時間が、前記離散系シミュレータからの割込みに対する返答時間である、請求項12のシミュレーション・プログラム。
  14. 前記エッジ保存ステップが、時間と、入力ポートと、エッジのタイプの情報を保存するステップを含む、請求項11のシミュレーション・プログラム。
  15. 前記システムが自動車のシミュレーション・システムであり、前記連続系シミュレータがエンジン・シミュレータであり、前記離散系シミュレータが、該エンジン・シミュレータを制御するためのECUエミュレータである、請求項11のシミュレーション・プログラム。
JP2008312264A 2008-12-08 2008-12-08 シミュレーション方法、システム及びプログラム Expired - Fee Related JP5500820B2 (ja)

Priority Applications (1)

Application Number Priority Date Filing Date Title
JP2008312264A JP5500820B2 (ja) 2008-12-08 2008-12-08 シミュレーション方法、システム及びプログラム

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
JP2008312264A JP5500820B2 (ja) 2008-12-08 2008-12-08 シミュレーション方法、システム及びプログラム

Publications (2)

Publication Number Publication Date
JP2010134839A JP2010134839A (ja) 2010-06-17
JP5500820B2 true JP5500820B2 (ja) 2014-05-21

Family

ID=42346053

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2008312264A Expired - Fee Related JP5500820B2 (ja) 2008-12-08 2008-12-08 シミュレーション方法、システム及びプログラム

Country Status (1)

Country Link
JP (1) JP5500820B2 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP6051546B2 (ja) * 2012-03-15 2016-12-27 オムロン株式会社 情報処理装置、シミュレーション方法、およびプログラム

Family Cites Families (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP4906286B2 (ja) * 2005-08-17 2012-03-28 富士通テン株式会社 ソフトウェア開発環境システム
JP4413209B2 (ja) * 2006-07-21 2010-02-10 富士通テン株式会社 シミュレーション装置
WO2008047555A1 (fr) * 2006-09-27 2008-04-24 Fujitsu Ten Limited Dispositif de simulation, modèle de simulation et dispositif de formation de modèle de simulation

Also Published As

Publication number Publication date
JP2010134839A (ja) 2010-06-17

Similar Documents

Publication Publication Date Title
JP5153465B2 (ja) シミュレーション方法、システム及びプログラム
JP5179249B2 (ja) 制御装置シミュレーション方法、システム及びプログラム
JP5065344B2 (ja) シミュレーション方法、システム及びプログラム
JP5295355B2 (ja) シミュレーション方法、システム及びプログラム
JP5224957B2 (ja) シミュレーション方法、システム及びプログラム
JP5379862B2 (ja) シミュレーション方法、システム及びプログラム
JP5186290B2 (ja) シミュレーション方法、システム及びプログラム
WO2013099438A1 (ja) 協調シミュレーション用計算機システム、組込みシステムの検証方法及びプログラム
JP4852629B2 (ja) シミュレーション・システム、方法及びプログラム
JP5460010B2 (ja) シミュレーション方法、システム及びプログラム
JP5500820B2 (ja) シミュレーション方法、システム及びプログラム
Atlee et al. State-based model checking of event-driven system requirements
Lee et al. Towards a seamless development process for automotive engine-control system
JP5186307B2 (ja) シミュレーション方法、システム及びプログラム
EP4036780A1 (en) Electronic control unit timing emulation
Resmerita et al. Verification of embedded control systems by simulation and program execution control
Ishikawa et al. CPU model-based hardware/software co-design for real-time embedded control systems
CN111108471A (zh) 用于确保机动车辆的多核处理器的数据的稳定性的方法
Depoyster et al. Rapid prototyping of chassis control systems
Tsuzuki et al. [Industrial Paper] Performance Measurement and Finding Challenges in Using FMUs to Perform Scenario-Based Testing in a Cloud Environment
Ishikawa et al. CPU model-based mechatronics/hardware/software co-design technology for real-time embedded control systems
Desarkar et al. Case study of design of an Engine Control Unit
Boussemart et al. Non-Intrusive System-Level Fault Tolerance for an Electronic Throttle Controller
JP2011238297A (ja) 自動車用制御装置のソフトウエア作成方法

Legal Events

Date Code Title Description
A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20111021

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20130827

A521 Written amendment

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20131125

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20140225

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140311

R150 Certificate of patent or registration of utility model

Ref document number: 5500820

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees