(57)【特許請求の範囲】
【請求項１】
車両に搭載される電子制御装置（１１）であって、
複数の診断項目毎に設けられ、前記診断項目が正常か異常かの判断を行うように構成された複数の診断部（２１）と、
発生したイベントを表すイベント情報を複数記憶可能なイベント記憶部（２７）と、
前記診断部の何れかが前記診断項目について異常と判断したというイベントである異常イベントが発生すると、前記イベント情報として、前記異常イベントの発生及び異常と判断された診断項目を少なくとも表す異常イベント情報を、前記イベント記憶部に記憶し、また、前記診断部の何れかが前記診断項目について正常と判断したというイベントである正常イベントが発生すると、前記イベント情報として、前記正常イベントの発生及び正常と判断された診断項目を少なくとも表す正常イベント情報を、前記イベント記憶部に記憶し、更に、前記イベント記憶部に記憶された各イベント情報に対応する処理を実施すると共に、実施した処理に対応するイベント情報は前記イベント記憶部から消去するように構成されたイベント処理部（２３）と、を備え、
前記異常イベント情報に対応する処理（Ｓ２１０〜Ｓ２４０）には、少なくとも車両状態を表すデータをメモリ（１８）に記憶する処理（Ｓ２４０）が含まれ、
前記イベント処理部は、
前記イベント記憶部に記憶された複数のイベント情報のうちの１つの前記異常イベント情報を、着目情報とした場合に、その着目情報に対応する処理を、当該着目情報より先に前記イベント記憶部に記憶された前記正常イベント情報に対応する処理よりも、優先して実施するように構成されている、
電子制御装置。
【請求項２】
請求項１に記載の電子制御装置であって、
前記異常イベント情報に対応する処理には、当該異常イベント情報が表す診断項目についての判断結果を、異常を示す値に設定する処理（Ｓ２３０）が含まれ、
前記正常イベント情報に対応する処理（Ｓ１１０〜Ｓ１３０）には、当該正常イベント情報が表す診断項目についての診断結果を、正常を示す値に設定する処理（Ｓ１３０）が含まれ、
前記イベント処理部は、
前記着目情報に対応する処理を、前記着目情報より先に前記イベント記憶部に記憶された前記正常イベント情報のうち、前記着目情報とは異なる診断項目についての正常イベント情報である他正常情報に対応する処理に対してだけ、優先して実施するように構成されている、
電子制御装置。
【請求項３】
請求項２に記載の電子制御装置であって、
前記イベント処理部は、
前記イベント記憶部に、前記着目情報より先に記憶された前記正常イベント情報として、前記他正常情報と、前記着目情報と同じ診断項目についての前記正常イベント情報である同正常情報とが、記憶されている場合には、前記同正常情報に対応する処理と、前記着目情報に対応する処理とを、この順に、且つ、前記他正常情報に対応する処理よりも優先して、実施するように構成されている、
電子制御装置。
【請求項４】
請求項１ないし請求項３の何れか１項に記載の電子制御装置であって、
前記イベント処理部は、
特定の処理を要求するイベントである特定イベントが発生すると、その特定イベントが発生したことを示す特定イベント情報も、前記イベント記憶部に記憶するように構成され、
更に、前記イベント処理部は、
前記特定イベント情報より後に前記イベント記憶部に記憶された前記異常イベント情報及び前記正常イベント情報のそれぞれに対応する処理は、前記特定イベント情報に対応する処理である前記特定の処理より先に実施しないように構成されている、
電子制御装置。
【請求項５】
請求項４に記載の電子制御装置であって、
前記特定の処理は、
前記特定イベントの発生後に発生した前記異常イベント及び前記正常イベントのそれぞれに対応する処理が、当該特定の処理よりも先に実施されると、不都合が生じる処理である、
電子制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、車両に搭載される電子制御装置に関する。
【背景技術】
【０００２】
車両に搭載される電子制御装置に関して、例えば特許文献１には、診断機能により故障を検出すると、車両状態を表すデータをメモリに記憶することが記載されている。この車両状態を表すデータは、フリーズ・フレーム・データ（以下、ＦＦＤ）と呼ばれ、故障原因の特定などに使用される。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００２−１４８３９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
車両に搭載される電子制御装置においては、複数の診断項目毎に診断部が設けられる。そして、診断部の何れかが診断項目について異常と判断したというイベント（以下、異常イベント）が発生すると、イベント情報として、異常イベントの発生及び異常と判断された診断項目を表すイベント情報が、キューに記憶される。また、診断部の何れかが診断項目について正常と判断したというイベント（以下、正常イベント）が発生すると、イベント情報として、正常イベントの発生及び正常と判断された診断項目を表す正常イベント情報が、キューに記憶される。
【０００５】
キューに記憶された各イベント情報は、記憶された順に読み出される。そして、キューから異常イベント情報が読み出された場合には、その異常イベント情報に対応した処理が行われ、キューから正常イベント情報が読み出された場合には、その正常イベント情報に対応した処理が行われる。異常イベント情報に対応した処理とは、その異常イベント情報が表す異常イベントに対して定められた処理であり、詳しくは、その異常イベントが発生した場合に実行することが定められた処理である。同様に、正常イベント情報に対応した処理とは、その正常イベント情報が表す正常イベントに対して定められた処理であり、詳しくは、その正常イベントが発生した場合に実行することが定められた処理である。また、キューから読み出されたイベント情報は、キューから消去される。
【０００６】
よって、異常イベントが発生すると、その異常イベントに対して定められた処理が行われ、正常イベントが発生すると、その正常イベントに対して定められた処理が行われることとなる。そして、異常イベントに対して定められた処理、すなわち、異常イベント情報に対応する処理には、ＦＦＤをメモリに記憶する処理が含まれる。
【０００７】
ところで、キューにおいて、異常イベント情報の前に、複数の正常イベント情報が記憶されていたとすると、複数の正常イベント情報に対応する各処理を実施するのに時間がかかるため、異常イベント情報に対応する処理の開始が大幅に遅れてしまう。
【０００８】
つまり、異常イベントが発生してから、その異常イベントに対して定められた処理が開始されるまでの遅れ時間が大きくなる。このことは、異常イベントが発生してからＦＦＤのメモリへの記憶が実施されるまでの遅れ時間が大きくなってしまい、期待されるＦＦＤをメモリに記憶することができなくなる、ということを意味する。期待されるＦＦＤとは、異常イベントが発生したときのＦＦＤである。
【０００９】
そこで、本発明は、車載電子制御装置において、異常イベントの発生時からＦＦＤを記憶するまでの遅れ時間を短縮することを目的としている。
【課題を解決するための手段】
【００１０】
本発明の電子制御装置は、車両に搭載される電子制御装置（１１）である。そして、本発明の電子制御装置は、複数の診断部（２１）と、イベント記憶部（２７）と、イベント処理部（２３）と、を備える。
【００１１】
複数の各診断部は、複数の診断項目毎に設けられ、当該診断部に割り当てられた診断項目が正常か異常かの判断を行う。
イベント記憶部は、発生したイベントを表すイベント情報が複数記憶可能な記憶部である。
【００１２】
イベント処理部は、診断部の何れかが診断項目について異常と判断したというイベントである異常イベントが発生すると、イベント情報として、異常イベントの発生及び異常と判断された診断項目を少なくとも表す異常イベント情報を、イベント記憶部に記憶する。また、イベント処理部は、診断部の何れかが診断項目について正常と判断したというイベントである正常イベントが発生すると、イベント情報として、正常イベントの発生及び正常と判断された診断項目を少なくとも表す正常イベント情報を、イベント記憶部に記憶する。更に、イベント処理部は、イベント記憶部に記憶された各イベント情報に対応する処理を実施すると共に、実施した処理に対応するイベント情報はイベント記憶部から消去する。
【００１３】
異常イベント情報に対応する処理（Ｓ２１０〜Ｓ２４０）には、少なくとも車両状態を表すデータ（すなわち、ＦＦＤ）をメモリ（１８）に記憶する処理（Ｓ２４０）が含まれる。
【００１４】
そして、イベント処理部は、イベント記憶部に記憶された複数のイベント情報のうちの１つの異常イベント情報を、着目情報とした場合に、その着目情報に対応する処理を、当該着目情報より先にイベント記憶部に記憶された正常イベント情報に対応する処理よりも、優先して実施する。優先して実施するとは、先に実施する、ということである。
【００１５】
このような電子制御装置によれば、イベント記憶部に、正常イベント情報が記憶され、その後で異常イベント情報が記憶された場合に、後で記憶された異常イベント情報に対応する処理が、先に記憶された正常イベント情報に対応する処理よりも優先して実施される。このため、異常イベントの発生時からＦＦＤをメモリに記憶するまでの遅れ時間を短縮することができる。
【００１６】
なお、この欄及び特許請求の範囲に記載した括弧内の符号は、一つの態様として後述する実施形態に記載の具体的手段との対応関係を示すものであって、本発明の技術的範囲を限定するものではない。
【図面の簡単な説明】
【００１７】
【図１】ＥＣＵの構成を示すブロック図である。
【図２】第１実施形態のキューイング処理を表すフローチャートである。
【図３】正常イベント処理を表すフローチャートである。
【図４】異常イベント処理を表すフローチャートである。
【図５】クリア要求イベント処理を表すフローチャートである。
【図６】ＯＣ更新イベント処理を表すフローチャートである。
【図７】課題の一例を説明する説明図である。
【図８】第１実施形態のデキュー処理を表すフローチャートである。
【図９】第１実施形態のデキュー処理の作用例を説明する説明図である。
【図１０】第２実施形態のキューイング処理を表すフローチャートである。
【図１１】第２実施形態のデキュー処理を表すフローチャートである。
【図１２】第２実施形態のキューイング処理の作用例を説明する説明図である。
【発明を実施するための形態】
【００１８】
以下、図面を参照しながら、発明を実施するための形態を説明する。
［１．第１実施形態］
［１−１．構成の説明］
図１に示す本実施形態のＥＣＵ１１は、車両に搭載される電子制御装置であり、車両における制御対象（例えば、エンジン）を制御する。なお、ＥＣＵは、「Electronic Control Unit」の略である。
【００１９】
図１に示すように、ＥＣＵ１１は、マイクロコンピュータ（以下、マイコン）１３を備える。マイコン１３は、ＣＰＵ１５と、ＲＯＭ１６と、ＲＡＭ１７と、フラッシュメモリ１８と、を備える。フラッシュメモリ１８は、記憶内容の書き換えが可能な不揮発性のメモリである。ＣＰＵ１５は、例えばＲＯＭ１６に格納されているプログラムを実行する。ＲＡＭ１７には、ＣＰＵ１５による演算結果などが記憶される。フラッシュメモリ１８には、ＦＦＤなど、ＥＣＵ１１への電源供給が停止されても記憶しておくべきデータが記憶される。
【００２０】
ＥＣＵ１１の各種機能は、ＣＰＵ１５が非遷移的実体的記録媒体に格納されたプログラムを実行することにより実現される。この例では、ＲＯＭ１６が、プログラムを格納した非遷移的実体的記録媒体に該当する。また、このプログラムの実行により、プログラムに対応する方法が実行される。なお、ＥＣＵ１１を構成するマイコンの数は１つでも複数でも良い。
【００２１】
ＥＣＵ１１は、ＣＰＵ１５がプログラムを実行することで実現される機能の構成として、複数の診断部２１と、イベント処理部２３と、を備える。そして、イベント処理部２３は、キューイング部２５と、デキュー部２６と、を備える。診断部２１とイベント処理部２３を実現する手法は、ソフトウェアに限るものではなく、それらの一部又は全部を、論理回路やアナログ回路等を組み合わせたハードウェアを用いて実現しても良い。
【００２２】
更に、ＥＣＵ１１は、発生したイベントを表すイベント情報を複数記憶可能なキュー２７も備える。キュー２７は、例えば、ＲＡＭ１７又はフラッシュメモリ１８における所定の記憶領域によって構成されており、イベント情報が格納される複数の記憶位置を備える。なお、格納とは、記憶と同じ意味である。また、キュー２７としての専用のメモリを設けても良い。
【００２３】
そして、ＥＣＵ１１には、エンジンの状態を含む車両状態を検出するためのセンサ３１や、エンジンを制御するためのアクチュエータ３２が接続されている。なお、図１において、センサ３１とアクチュエータ３２は、１つずつ図示されているが、それらは複数存在しても良い。例えば、センサ３１としては、車両の走行速度（すなわち、車速）を検出する車速センサや、エンジンの冷却水温を検出する水温センサや、エンジンのクランク角及び回転数を検出するためのクランクセンサ等がある。また、アクチュエータ３２としては、エンジンに燃料を噴射するインジェクタや、インジェクタに燃料を供給するポンプ等がある。
【００２４】
［１−２．診断部の説明］
複数の各診断部２１は、複数の診断項目毎に設けられている。そして、各診断部２１は、当該診断部２１に割り当てられた診断項目が正常か異常かの判断を行う。
【００２５】
例えば、水温センサという診断項目について設けられた診断部２１、すなわち、水温センサについての診断部２１は、水温センサの出力値が正常範囲内であると判断した場合に、水温センサが正常であると判断する。また、水温センサについての診断部２１は、水温センサの出力値が正常範囲内ではないと判断した場合に、水温センサが異常であると判断する。また例えば、特定の演算処理という診断項目について設けられた診断部２１、すなわち、特定の演算処理についての診断部２１は、特定の演算処理による演算結果が期待値と一致していると判断した場合に、特定の演算処理が正常であると判断する。また、特定の演算処理についての診断部２１は、特定の演算処理による演算結果が期待値と一致していないと判断した場合に、特定の演算処理が異常であると判断する。
【００２６】
一方、マイコン１３のオペレーティングシステムとしては、リアルタイムオペレーティングシステムが採用されており、マイコン１３においては、優先度が複数段階に設定された様々なタスクが実行される。そして、各診断部２１は、当該診断部２１の診断項目が関連している制御機能を実現するタスクと同じ優先順位のタスクによって実現される。
【００２７】
［１−３．イベント処理部の説明］
〈キューイング部の説明〉
イベント処理部２３のキューイング部２５は、所定のイベントが発生する毎に、図２のキューイング処理を行う。図２に示すように、キューイング部２５は、キューイング処理では、Ｓ１００にて、発生したイベントを表すイベント情報を、キュー２７に、最後尾の情報として格納し、その後、当該キューイング処理を終了する。このため、イベント情報は、キュー２７の先頭からイベントの発生順に記憶される。
【００２８】
また、キュー２７にイベント情報を記憶することのトリガとなる所定のイベントとしては、異常イベントと、正常イベントと、クリア要求イベントと、ＯＣ更新イベントとの、４種類がある。なお、「ＯＣ」は、オペレーションサイクルの略である。オペレーションサイクルは、ＥＣＵ１１の１回の動作期間を意味する。
【００２９】
異常イベントは、診断部２１の何れかが診断項目について異常と判断したというイベントである。
正常イベントは、診断部２１の何れかが診断項目について正常と判断したというイベントである。
【００３０】
クリア要求イベントは、ＥＣＵ１１に対して、診断関連情報をクリアさせるためのクリア要求信号が入力されたというイベントである。クリア要求信号は、例えば、ＥＣＵ１１に通信線を介して入力される。
【００３１】
ＯＣ更新イベントは、後述するＯＣ正常検出フラグとＯＣ異常検出フラグをリセットする条件が成立したというイベントである。なお、ＯＣ正常検出フラグとＯＣ異常検出フラグは、診断関連情報の一部である。そして、ＯＣ正常検出フラグとＯＣ異常検出フラグは、ＥＣＵ１１の１回の動作期間において、診断部２１が機能したか否かを確認するためのフラグであり、診断部２１毎（すなわち、診断項目毎）に用意されている。また、ＯＣ更新イベントは、例えば車両のイグニッションスイッチがオンされて、ＥＣＵ１１が起動すると発生する。
【００３２】
キューイング部２５は、異常イベントが発生すると、イベント情報として、異常イベントの発生及び異常と判断された診断項目を少なくとも表す異常イベント情報を、キュー２７に記憶する。また、キューイング部２５は、正常イベントが発生すると、イベント情報として、正常イベントの発生及び正常と判断された診断項目を少なくとも表す正常イベント情報を、キュー２７に記憶する。つまり、異常イベント情報と正常イベント情報は、診断項目毎に用意されている。
【００３３】
また、キューイング部２５は、クリア要求イベントが発生すると、イベント情報として、クリア要求イベントの発生を表すクリア要求イベント情報を、キュー２７に記憶する。そして、キューイング部２５は、ＯＣ更新イベントが発生すると、イベント情報として、ＯＣ更新イベントの発生を表すＯＣ更新イベント情報を、キュー２７に記憶する。
【００３４】
〈デキュー部の説明〉
イベント処理部２３のデキュー部２６は、基本的には、キュー２７の先頭から順にイベント情報を読み出す。そして、デキュー部２６は、キュー２７から読み出したイベント情報に対応する処理を実施すると共に、実施した処理に対応するイベント情報はキュー２７から消去する。正常イベント情報に対応する処理のことを、正常イベント処理ともいい、異常イベント情報に対応する処理のことを、異常イベント処理ともいう。同様に、クリア要求イベント情報に対応する処理のことを、クリア要求イベント処理ともいい、ＯＣ更新イベント情報に対応する処理のことを、ＯＣ更新イベント処理ともいう。
【００３５】
《正常イベント処理の説明》
デキュー部２６は、キュー２７から正常イベント情報を読み出すと、その読み出した正常イベント情報に対応する処理としての正常イベント処理を行う。なお、前述したように、正常イベント及び正常イベント情報は診断項目毎に存在するため、正常イベント処理も診断項目毎に用意されている。また、キュー２７から読み出された正常イベント情報が表す診断項目のことを、対象診断項目という。
【００３６】
図３に示すように、デキュー部２６は、正常イベント処理を開始すると、Ｓ１１０にて、対象診断項目についてのクリア後正常検出フラグをセットし、Ｓ１２０にて、対象診断項目についてのＯＣ正常検出フラグをセットする。そして、Ｓ１３０にて、対象診断項目についての診断結果を、「正常」を示す値に設定する処理を行い、その後、当該正常イベント処理を終了する。
【００３７】
なお、クリア後正常検出フラグ、ＯＣ正常検出フラグ、及び診断結果は、診断項目毎に用意されている。クリア後正常検出フラグは、前述のクリア要求イベントが発生してから、診断部２１が診断項目について正常と判断したか否かを確認するためのフラグである。ＯＣ正常検出フラグは、ＥＣＵ１１の１回の動作期間において、診断部２１が診断項目について正常と判断したか否かを確認するためのフラグである。診断結果は、「正常」、「異常」、「未診断」のうちの何れかを示す値に設定されるステータスデータである。
【００３８】
《異常イベント処理の説明》
デキュー部２６は、キュー２７から異常イベント情報を読み出すと、その読み出した異常イベント情報に対応する処理としての異常イベント処理を行う。なお、前述したように、異常イベント及び異常イベント情報は診断項目毎に存在するため、異常イベント処理も診断項目毎に用意されている。また、キュー２７から読み出された異常イベント情報が表す診断項目のことも、対象診断項目という。
【００３９】
図４に示すように、デキュー部２６は、異常イベント処理を開始すると、Ｓ２１０にて、対象診断項目についてのクリア後異常検出フラグをセットし、Ｓ２２０にて、対象診断項目についてのＯＣ異常検出フラグをセットする。そして、Ｓ２３０にて、対象診断項目についての診断結果を、「異常」を示す値に設定する処理を行い、次のＳ２４０にて、ＦＦＤをメモリに記憶する処理を行った後、当該異常イベント処理を終了する。
【００４０】
なお、Ｓ２４０でメモリに記憶するＦＦＤの数や種類は、診断項目毎に定められている。ＦＦＤとしては、例えば、エンジンの冷却水温、エンジン回転数、エンジン負荷、スロットル開度、車速、燃料圧力、吸気温度、インテークマニホールド負圧、吸入空気量、空燃比フィードバック状況、燃料補正量、点火時期、二次空気状態、などのデータがある。また、ＦＦＤとしては、故障原因を特定するために用いられるデータであれば、車両のどのような状態を表すデータであっても良い。また、ＦＦＤの記憶先のメモリは、フラッシュメモリ１８であるが、例えば、Ｓ２４０ではＦＦＤをＲＡＭ１７に記憶し、特定のタイミングで、ＲＡＭ１７からフラッシュメモリ１８にＦＦＤをコピーするようになっていても良い。また、クリア後異常検出フラグ及びＯＣ異常検出フラグも、診断項目毎に用意されている。クリア後異常検出フラグは、前述のクリア要求イベントが発生してから、診断部２１が診断項目について異常と判断したか否かを確認するためのフラグである。ＯＣ異常検出フラグは、ＥＣＵ１１の１回の動作期間において、診断部２１が診断項目について異常と判断したか否かを確認するためのフラグである。
【００４１】
《クリア要求イベント処理の説明》
デキュー部２６は、キュー２７からクリア要求イベント情報を読み出すと、その読み出したクリア要求イベント情報に対応する処理としてのクリア要求イベント処理を行う。
【００４２】
図５に示すように、デキュー部２６は、クリア要求イベント処理を開始すると、Ｓ３１０にて、全ての診断項目についてのクリア後正常検出フラグをリセットし、Ｓ３２０にて、全ての診断項目についてのクリア後異常検出フラグをリセットする。
【００４３】
更に、デキュー部２６は、Ｓ３３０にて、全ての診断項目についてのＯＣ正常検出フラグをリセットし、Ｓ３４０にて、全ての診断項目についてのＯＣ異常検出フラグをリセットする。
【００４４】
そして、デキュー部２６は、Ｓ３５０にて、全ての診断項目についての診断結果を、「未診断」を示す値に設定し、Ｓ３６０にて、異常イベント処理のＳ２４０でメモリに記憶されたＦＦＤを消去した後、当該クリア要求イベント処理を終了する。
【００４５】
クリア要求イベント処理には、Ｓ３１０，Ｓ３２０の処理が含まれている。よって、クリア要求イベント処理が行われた後、何れかの診断項目についての正常イベント処理又は異常イベント処理が行われたならば、その診断項目についてのクリア後正常検出フラグ又はクリア後異常検出フラグがリセットの値（例えば０）からセットの値（例えば１）に切り替わる。このため、各診断項目についてのクリア後正常検出フラグ及びクリア後異常検出フラグを参照することにより、クリア要求イベントの発生後に各診断項目の診断部２１がどのような判断をしたのかを、確認することができる。
【００４６】
《ＯＣ更新イベント処理の説明》
デキュー部２６は、キュー２７からＯＣ更新イベント情報を読み出すと、その読み出したＯＣ更新イベント情報に対応する処理としてのＯＣ更新イベント処理を行う。
【００４７】
図６に示すように、デキュー部２６は、ＯＣ更新イベント処理を開始すると、Ｓ４１０にて、全ての診断項目についてのＯＣ正常検出フラグをリセットし、Ｓ４２０にて、全ての診断項目についてのＯＣ異常検出フラグをリセットする。そして、その後、当該ＯＣ更新イベント処理を終了する。
【００４８】
よって、ＯＣ更新イベント処理が行われた後、何れかの診断項目についての正常イベント処理又は異常イベント処理が行われたならば、その診断項目についてのＯＣ正常検出フラグ又はＯＣ異常検出フラグがリセットの値からセットの値に切り替わる。このため、各診断項目についてのＯＣ正常検出フラグ及びＯＣ異常検出フラグを参照することにより、ＯＣ更新イベントの発生後に各診断項目の診断部２１がどのような判断をしたのかを、確認することができる。
【００４９】
なお、前述の各フラグ及び診断結果とＦＦＤが、故障関連情報に該当する。また、前述の各フラグ及び診断結果は、図３〜図６の各処理により、ＲＡＭ１７において更新され、例えばＥＣＵ１１が動作を停止する直前に、ＲＡＭ１７からフラッシュメモリ１８にコピーされる。そして、各フラグ及び診断結果は、ＥＣＵ１１の起動時に、フラッシュメモリ１８からＲＡＭ１７にコピーされて復元される。一方、各フラグ及び診断結果は、図３〜図６の各処理により、フラッシュメモリ１８において更新されるようになっていても良い。
【００５０】
［１−４．課題の説明］
図７に例示するように、時刻ｔ１〜ｔ８のそれぞれで正常イベントＩ１〜Ｉ８が発生し、時刻ｔ９で異常イベントＩ９が発生したとする。
【００５１】
図７では、優先度が異なる３種類のタスクが例示されており、「低優先タスク→中優先タスク→高優先タスク」の順に優先度が高い。そして、正常イベントＩ１〜Ｉ３，Ｉ８と異常イベントＩ９を発生させた診断部２１は、中優先タスクによって実現され、正常イベントＩ４〜Ｉ７を発生させた診断部２１は、高優先タスクによって実現されている。なお、前述したように、診断部２１を実現するタスクは、その診断部２１の診断項目が関連する制御機能を実現するタスクと同じ優先順位のタスクである。
【００５２】
一方、キュー２７に格納されるイベント情報に対応する処理は、エンジンの制御機能と比較すると優先度が低いため、その処理を実行するデキュー部２６は、低優先タスクで実現されている。よって、デキュー部２６は、低優先タスクよりも優先度が高いタスクの処理が行われていない期間において動作する。
【００５３】
このため、デキュー部２６は、キュー２７に多数のイベント情報が記憶された状態において、動作する可能性が高い。図７の例では、キュー２７に、各イベントＩ１〜Ｉ９を表すイベント情報ｉ１〜ｉ９が、当該キュー２７の先頭から、イベントＩ１〜Ｉ９の発生順に記憶され、この状態で、デキュー部２６が動作する。なお、ｎが１〜９の何れかであるとすると、イベント情報ｉｎは、イベントＩｎを表すイベント情報である。
【００５４】
ここで仮に、デキュー部２６が、ただ単にキュー２７の先頭から順にイベント情報を読み出すようになっていたとする。
この場合、デキュー部２６は、図７の例では、正常イベント情報ｉ１〜ｉ８のそれぞれに対応する正常イベント処理を行ってから、異常イベント情報ｉ９に対応する異常イベント処理を行うこととなる。
【００５５】
すると、異常イベントＩ９が発生してから、その異常イベントＩ９に対応する異常イベント処理が開始されるまでの遅れ時間が、大きくなってしまう。よって、異常イベントＩ９が発生してから、異常イベント処理でＦＦＤの記憶を実施するまでの遅れ時間が大きくなってしまい、その結果、期待されるＦＦＤ、すなわち、異常イベントＩ９が発生したときのＦＦＤを、メモリに記憶することができなくなる。ＦＦＤは故障原因の解析に使用されるため、異常の発生時から大きくずれたタイミングでのＦＦＤでは、正しい解析結果を得ることができなくなる。
【００５６】
［１−５．課題を解決するための処理］
上記課題を解決するため、デキュー部２６は、図８に示すデキュー処理を行う。
図８に示すように、デキュー部２６は、デキュー処理を開始すると、まずＳ５１０にて、キュー２７内が空か否かを判定する。そして、デキュー部２６は、キュー２７内が空であると判定した場合、すなわち、キュー２７にイベント情報が格納されていない場合には、そのまま当該デキュー処理を終了する。
【００５７】
また、デキュー部２６は、Ｓ５１０にて、キュー２７内が空ではないと判定した場合には、Ｓ５２０に進む。そして、デキュー部２６は、Ｓ５２０では、キュー２７内を、先頭から、下記の探索対象情報の何れかに最初にヒットするまで探索する。
【００５８】
Ｓ５２０で探索する探索対象情報は、異常イベント情報と、追い越し不可イベント情報と、最後尾の情報との、何れかである。追い越し不可イベント情報は、キュー２７から読み出す順序が、当該イベント情報より後に記憶されたイベント情報に追い越されてはいけないイベント情報であり、本実施形態では、クリア要求イベント情報とＯＣ更新イベント情報との２つである。
【００５９】
デキュー部２６は、次のＳ５３０にて、Ｓ５２０での探索により異常イベント情報にヒットしたか否か、すなわち、Ｓ５２０での探索により最初にヒットした探索対象情報が異常イベント情報であるか否かを判定する。そして、異常イベント情報にヒットしなかった場合には、Ｓ５４０に進む。
【００６０】
デキュー部２６は、Ｓ５４０では、キュー２７の先頭のイベント情報を読み出して、その読み出したイベント情報に対応する処理を実施する。この場合、キュー２７から読み出される先頭のイベント情報は、異常イベント情報以外であり、正常イベント情報と、クリア要求イベント情報と、ＯＣ更新イベント情報との、何れかである。このため、Ｓ５４０において、イベント情報に対応する処理としては、正常イベント処理と、クリア要求イベント処理と、ＯＣ更新イベント処理との、何れかが実施されることなる。
【００６１】
また、デキュー部２６は、キュー２７から読み出したイベント情報は、キュー２７から消去し、キュー２７内の各イベント情報を先頭側へ詰める。このことは、後述するＳ５６０，Ｓ５７０においても同様である。
【００６２】
一方、デキュー部２６は、Ｓ５３０にて、Ｓ５２０での探索により異常イベント情報にヒットしたと判定した場合には、Ｓ５５０に進む。
デキュー部２６は、Ｓ５５０では、キュー２７において、Ｓ５２０での探索によりヒットした異常イベント情報よりも前に格納され、且つ、その異常イベント情報と同じ診断項目を表す正常イベント情報（以下、前同項目正常イベント情報）があるか否かを判定する。なお、Ｓ５２０での探索によりヒットした異常イベント情報は、着目情報に相当し、前同項目正常イベント情報は、同正常情報に相当する。
【００６３】
デキュー部２６は、Ｓ５５０にて、前同項目正常イベント情報がないと判定した場合には、Ｓ５６０に進む。そして、デキュー部２６は、Ｓ５６０では、Ｓ５２０での探索によりヒットした異常イベント情報をキュー２７から読み出して、その読み出した異常イベント情報に対応する処理（すなわち、異常イベント処理）を実施する。
【００６４】
また、デキュー部２６は、Ｓ５５０にて、前同項目正常イベント情報があると判定した場合には、Ｓ５７０に進む。そして、デキュー部２６は、Ｓ５７０では、Ｓ５５０で「ある」と判定した前同項目正常イベント情報をキュー２７から読み出して、その読み出した前同項目正常イベント情報に対応する処理（すなわち、正常イベント処理）を実施する。
【００６５】
デキュー部２６は、Ｓ５４０，Ｓ５６０，Ｓ５７０の何れかでイベント情報に対応する処理を実施した後、Ｓ５８０に進む。
そして、デキュー部２６は、Ｓ５８０では、Ｓ５１０と同様に、キュー２７内が空か否かを判定し、キュー２７内が空ではないと判定した場合には、Ｓ５２０に戻る。また、デキュー部２６は、Ｓ５８０にて、キュー２７内が空であると判定した場合には、当該デキュー処理を終了する。
【００６６】
［１−６．デキュー処理の作用例］
図８のデキュー処理が行われることによる作用例について、図９を用い説明する。
図９において、矢印Ｐ１の行に示すように、キュー２７に１７個のイベント情報が記憶されているとする。
【００６７】
図９においては、左側がキュー２７の先頭である。小文字のアルファベットであるａ〜ｇは、診断項目がそれぞれ異なる正常イベント情報であり、大文字のアルファベットであるＢ，Ｅ，Ｆ，Ｈは、診断項目がそれぞれ異なる異常イベント情報である。そして、同じアルファベットの小文字と大文字は、同じ診断項目についての正常イベント情報と異常イベント情報であることを意味する。例えば、ｂとＢは、同じ診断項目についての正常イベント情報と異常イベント情報である。また、１と２は、追い越し不可イベント情報である。例えば、１がＯＣ更新イベント情報で、２がクリア要求イベント情報である。なお、ＯＣ更新イベント情報は、前述したようにＥＣＵ１１が起動すると発生するが、図９では、説明の便宜上、キュー２７には、正常イベント情報ａ，ｂ，ｃの後にＯＣ更新イベント情報１が記憶されている。
【００６８】
この例の場合、キュー２７からは、矢印Ｐ０の列における上から下に示す順に、イベント情報が読み出され、キュー２７内のイベント情報は、矢印Ｐ１〜Ｐ１７の各行に示すように遷移していく。以下では、矢印Ｐ１〜Ｐ１７の各行を、Ｐ１行〜Ｐ１７行という。
【００６９】
具体的には、キュー２７内のイベント情報がＰ１行に示すようになっている場合に、図８のデキュー処理が開始されると、キュー２７の先頭から追い越し不可イベント情報１までに異常イベント情報がないため、Ｓ５２０の検索では、追い越し不可イベント情報１にヒットする。このため、Ｓ５３０でＮＯと判定され、Ｓ５４０にて、キュー２７から先頭の正常イベント情報ａが読み出されて、その正常イベント情報ａに対応する処理が実施される。
【００７０】
そして、キュー２７内のイベント情報はＰ２行に示すようになり、この状態で、Ｓ５２０の検索が行われても、再び追い越し不可イベント情報１にヒットする。このため、Ｓ５３０でＮＯと判定され、Ｓ５４０にて、キュー２７から先頭の正常イベント情報ｂが読み出されて、その正常イベント情報ｂに対応する処理が実施される。
【００７１】
そして、キュー２７内のイベント情報はＰ３行に示すようになる。その後も、同様に、キュー２７から先頭の正常イベント情報ｃが読み出されて、その正常イベント情報ｃに対応する処理が実施され、次に、キュー２７から先頭の追い越し不可イベント情報１が読み出されて、その追い越し不可イベント情報１に対応する処理が実施される。そして、キュー２７内のイベント情報はＰ５行に示すようになる。
【００７２】
つまり、キュー２７内のイベント情報がＰ１行に示すようになっている場合、キュー２７に記憶されている追い越し不可イベント情報のうち、最も先に記憶された追い越し不可イベント情報１より前に、異常イベント情報はない。このため、キュー２７の先頭から追い越し不可イベント情報１まで、各イベント情報が１つずつ読み出され、その読み出された各イベント情報に対応する処理が実施される。
【００７３】
キュー２７内のイベント情報がＰ５行に示すようになると、キュー２７の先頭から追い越し不可イベント情報２までに、最初の異常イベント情報として、異常イベント情報Ｂがあるため、Ｓ５２０の検索では、異常イベント情報Ｂにヒットする。そして、Ｓ５３０でＹＥＳと判定されると共に、Ｓ５５０でＮＯと判定され、Ｓ５６０にて、キュー２７から異常イベント情報Ｂが読み出されて、その異常イベント情報Ｂに対応する処理が実施される。すると、キュー２７内のイベント情報はＰ６行に示すようになる。
【００７４】
つまり、キュー２７内のイベント情報がＰ５行に示すようになっている場合、キュー２７の先頭から最初の異常イベント情報Ｂより前に、正常イベント情報ｄ，ｅがある。そして、その正常イベント情報ｄ，ｅは、異常イベント情報Ｂとは異なる診断項目についての正常イベント情報であり、他正常情報に相当する。このため、Ｓ５５０でＮＯと判定され、Ｓ５６０にて、異常イベント情報Ｂが、その異常イベント情報Ｂより前にある正常イベント情報ｄ，ｅよりも優先して（すなわち、先に）読み出される。よって、異常イベント情報Ｂに対応する処理は、当該異常イベント情報Ｂより先にキュー２７に記憶された正常イベント情報ｄ，ｅに対応する処理よりも、優先して実施される。
【００７５】
また、キュー２７内のイベント情報がＰ６行に示すようになると、キュー２７の先頭から追い越し不可イベント情報２までに、最初の異常イベント情報として、異常イベント情報Ｆがあり、しかも、その異常イベント情報Ｆよりも前に、正常イベント情報ｆがある。よって、Ｓ５２０の検索では、異常イベント情報Ｆにヒットし、Ｓ５３０でＹＥＳと判定され、Ｓ５５０でもＹＥＳと判定される。この場合の前同項目正常イベント情報は、異常イベント情報Ｆより前の正常イベント情報ｆである。このため、Ｓ５７０にて、キュー２７から正常イベント情報ｆが読み出されて、その正常イベント情報ｆに対応する処理が実施される。すると、キュー２７内のイベント情報はＰ７行に示すようになる。
【００７６】
そして、キュー２７内のイベント情報がＰ７行に示すようになると、Ｓ５２０の検索では、異常イベント情報Ｆにヒットし、Ｓ５３０でＹＥＳと判定される。また、この時点のキュー２７において、異常イベント情報Ｆの前には正常イベント情報ｆがないため、Ｓ５５０ではＮＯと判定される。よって、Ｓ５６０にて、キュー２７から異常イベント情報Ｆが読み出されて、その異常イベント情報Ｆに対応する処理が実施される。すると、キュー２７内のイベント情報はＰ８行に示すようになる。
【００７７】
つまり、キュー２７内のイベント情報がＰ６行に示すようになっている場合、キュー２７の先頭から最初の異常イベント情報Ｆより前に、正常イベント情報ｄ，ｅ，ｆ，ｇがある。そして、正常イベント情報ｄ，ｅ，ｇは、異常イベント情報Ｆとは異なる診断項目についての正常イベント情報であって、他正常情報に相当し、正常イベント情報ｆは、異常イベント情報Ｆと同じ診断項目についての正常イベント情報であって、同正常情報に相当する。この場合、異常イベント情報Ｆよりも先に、キュー２７から正常イベント情報ｆが読み出されて、その正常イベント情報ｆに対応する処理が実施され、その次に、キュー２７から異常イベント情報Ｆが読み出されて、その異常イベント情報Ｆに対応する処理が実施される。このため、正常イベント情報ｆに対応する処理と、異常イベント情報Ｆに対応する処理とが、この順に、且つ、他の診断項目についての正常イベント情報ｄ，ｅ，ｇに対応する処理よりも優先して、実施される。
【００７８】
キュー２７内のイベント情報がＰ８行に示すようになると、Ｐ５行からＰ６行への遷移と同様に、キュー２７から異常イベント情報Ｈが読み出されて、その異常イベント情報Ｈに対応する処理が実施される。そして、キュー２７内のイベント情報はＰ９行に示すようになる。つまり、異常イベント情報Ｈに対応する処理は、当該異常イベント情報Ｈより先にキュー２７に記憶された正常イベント情報ｄ，ｅ，ｇ，ｅに対応する処理よりも、優先して実施される。
【００７９】
キュー２７内のイベント情報がＰ９行に示すようになると、キュー２７の先頭から追い越し不可イベント情報２までに、最初の異常イベント情報として、異常イベント情報Ｅがあり、しかも、その異常イベント情報Ｅよりも前に、２つの正常イベント情報ｅがある。よって、Ｐ６行からＰ７行，Ｐ８行への遷移と同様に、異常イベント情報Ｅよりも先に、キュー２７から２つの正常イベント情報ｅのそれぞれが読み出されて、その各正常イベント情報ｅに対応する処理が順次実施される。その次に、キュー２７から異常イベント情報Ｅが読み出されて、その異常イベント情報Ｅに対応する処理が実施される。そして、キュー２７内のイベント情報はＰ１２行に示すようになる。
【００８０】
キュー２７内のイベント情報がＰ１２行に示すようになると、Ｐ１行からＰ５行への遷移と同様に、キュー２７内のイベント情報が、「ｄ→ｇ→２」の順に読み出され、その読み出された各イベント情報に対応する処理が順次実施される。そして、キュー２７内のイベント情報はＰ１５行に示すようになる。
【００８１】
キュー２７内のイベント情報がＰ１５行に示すようになると、Ｐ５行からＰ６行への遷移と同様に、キュー２７から異常イベント情報Ｂが読み出されて、その異常イベント情報Ｂに対応する処理が実施される。そして、キュー２７内のイベント情報はＰ１６行に示すようになる。
【００８２】
キュー２７内のイベント情報がＰ１６行に示すようになると、キュー２７内には異常イベント情報と追い越し不可イベント情報とがなくなるため、Ｓ５２０の検索では、最後尾の情報にヒットする。よって、Ｓ５３０でＮＯと判定され、Ｓ５４０にて、キュー２７から先頭の正常イベント情報ｄが読み出されて、その正常イベント情報ｄに対応する処理が実施される。
【００８３】
そして、キュー２７内のイベント情報はＰ１７行に示すようになり、この場合も、Ｓ５２０の検索では、最後尾の情報にヒットする。よって、Ｓ５３０でＮＯと判定され、Ｓ５４０にて、キュー２７から先頭の正常イベント情報ｂが読み出されて、その正常イベント情報ｂに対応する処理が実施される。そして、キュー２７は空になる。
【００８４】
なお、キュー２７内のイベント情報がＰ１５行に示すようになっている場合、異常イベント情報Ｂの後に正常イベント情報ｂがある。この場合、正常イベント情報ｂの読み出し順は変更されず、キュー２７内のイベント情報は「Ｂ→ｄ→ｂ」の順に読み出されることとなる。
【００８５】
［１−７．効果］
以上詳述した第１実施形態によれば、以下の効果が得られる。
（１ａ）イベント処理部２３のデキュー部２６は、キュー２７に記憶された複数のイベント情報のうちの１つの異常イベント情報を、着目情報とすると、その着目情報に対応する処理を、当該着目情報より先にキュー２７に記憶された正常イベント情報に対応する処理よりも、優先して実施する。例えば、キュー２７内のイベント情報が図９のＰ５行に示すようになっている場合、キュー２７の先頭から最初の異常イベント情報Ｂに対応する処理は、異常イベント情報Ｂより先に記憶された正常イベント情報ｄ，ｅに対応する処理よりも、先に実施される。
【００８６】
よって、キュー２７に、正常イベント情報が記憶され、その後で異常イベント情報が記憶された場合に、後で記憶された異常イベント情報に対応する処理が、先に記憶された正常イベント情報に対応する処理よりも優先して実施される。このため、異常イベントの発生時から、その異常イベントに対応する異常イベント処理によってＦＦＤをメモリに記憶するまでの遅れ時間を、短縮することができる。よって、期待されるＦＦＤが記憶される可能性を高くすることができる。
【００８７】
（１ｂ）イベント処理部２３のデキュー部２６は、前記着目情報に対応する処理を、その着目情報より先にキュー２７に記憶された正常イベント情報のうち、着目情報とは異なる診断項目についての正常イベント情報に対応する処理に対してだけ、優先して実施する。このことは、Ｓ５５０の判定によって実現されている。例えば、キュー２７内のイベント情報が図９のＰ６行に示すようになっている場合、異常イベント情報Ｆに対応する処理は、その異常イベント情報Ｆより先に記憶されている正常イベント情報ｄ，ｅ，ｇに対応する処理よりは優先して実施される。しかし、異常イベント情報Ｆに対応する処理は、その異常イベント情報Ｆより先に記憶されている正常イベント情報ｆに対応する処理より、先に実施されることはない。
【００８８】
よって、同じ診断項目についての正常イベントと異常イベントが、「正常イベント→異常イベント」の順に発生した場合に、その同じ診断項目についての正常イベント処理と異常イベント処理とを、イベントが発生した順に実施することができる。
【００８９】
正常イベント処理には、診断項目についての診断結果を、「正常」を示す値に設定するＳ１３０の処理が含まれ、異常イベント処理には、診断項目についての判断結果を、「異常」を示す値に設定するＳ２３０の処理が含まれる。このため、同じ診断項目についての正常イベントと異常イベントが「正常イベント→異常イベント」の順に発生した場合に、その診断項目についての異常イベント処理を正常イベント処理よりも先に実施したとすると、最新の診断結果の値が本来の値にならない。つまり、最新の診断結果は、本来ならば「異常」を示す値になっているべきなのに、「正常」を示す値になってしまう。一方、本実施形態によれば、このような処理順逆転による不都合を防止することができる。
【００９０】
（１ｃ）イベント処理部２３のデキュー部２６は、キュー２７内に、前記着目情報より先に記憶された正常イベント情報として、着目情報と同じ診断項目についての正常イベント情報（すなわち、前同項目正常イベント情報）があるか否かを判定する。そして、前同項目正常イベント情報があれば、その前同項目正常イベント情報に対応する処理を、着目情報に対応する処理の前に実施し、その次に、着目情報に対応する処理を実施する。このことは、Ｓ５３０，Ｓ５５０，Ｓ５６０，Ｓ５７０の処理によって実現されている。
【００９１】
このため、キュー２７内に、着目情報より先に記憶された正常イベント情報として、着目情報とは異なる診断項目についての正常イベント情報と、着目情報と同じ診断項目についての正常イベント情報とがある場合に、下記の動作が実現される。
【００９２】
すなわち、着目情報と同じ診断項目についての正常イベント情報に対応する処理と、着目情報に対応する処理とが、この順に、且つ、他の診断項目についての正常イベント情報に対応する処理よりも優先して、実施される。例えば、前述したように、キュー２７内のイベント情報が図９のＰ６行に示すようになっている場合、正常イベント情報ｆに対応する処理と、異常イベント情報Ｆに対応する処理とが、この順に、且つ、他の診断項目についての正常イベント情報ｄ，ｅ，ｇに対応する処理よりも優先して、実施される。また例えば、キュー２７内のイベント情報が図９のＰ９行に示すようになっている場合、２つの各正常イベント情報ｅに対応する２つの処理と、異常イベント情報Ｅに対応する処理とが、この順に、且つ、他の診断項目についての正常イベント情報ｄ，ｇに対応する処理よりも優先して、実施される。
【００９３】
よって、上記（１ｂ）の効果を奏しつつ、上記（１ａ）の効果を高めることができる。
（１ｄ）イベント処理部２３のキューイング部２５は、正常イベント情報及び異常イベント情報だけでなく、クリア要求イベントが発生するとクリア要求イベント情報をキュー２７に記憶し、ＯＣ更新イベントが発生するとＯＣ更新イベント情報をキュー２７に記憶する。
【００９４】
そして、クリア要求イベント情報とＯＣ更新イベント情報は、追い越し不可イベント情報になっている。このため、イベント処理部２３のデキュー部２６は、追い越し不可イベント情報より後にキュー２７に記憶されたイベント情報は、その追い越し不可イベント情報より先に読み出さないようになっている。つまり、デキュー部２６は、追い越し不可イベント情報より後にキュー２７に記憶された異常イベント情報及び正常イベント情報のそれぞれに対応する処理は、追い越し不可イベント情報に対応する処理より先に実施しない。このことは、Ｓ５２０で探索する探索対象情報として、追い越し不可イベント情報が含まれていることにより実現されている。
【００９５】
よって、本実施形態によれば、クリア要求イベントの発生後に発生した異常イベント又は正常イベントに対応する異常イベント処理又は正常イベント処理が、クリア要求イベント処理より先に実施される、という処理順逆転が防止される。
【００９６】
このような処理順逆転が生じると、「各診断項目についてのクリア後正常検出フラグ及びクリア後異常検出フラグを参照しても、クリア要求イベントの発生後に各診断部２１がどのような判断をしたのかを、正しく確認することができなくなる」という不都合が生じる。一方、本実施形態によれば、このような処理順逆転による不都合を防止することができる。
【００９７】
同様に、本実施形態によれば、ＯＣ更新イベントの発生後に発生した異常イベント又は正常イベントに対応する異常イベント処理又は正常イベント処理が、ＯＣ更新イベント処理より先に実施される、という処理順逆転が防止される。
【００９８】
このような処理順逆転が生じると、「各診断項目についてのＯＣ正常検出フラグ及びＯＣ異常検出フラグを参照しても、ＯＣ更新イベントの発生後に各診断部２１がどのような判断をしたのかを、正しく確認することができなくなる」という不都合が生じる。一方、本実施形態によれば、このような処理順逆転による不都合を防止することができる。
【００９９】
なお、クリア要求イベント処理又はＯＣ更新イベント処理は、特定の処理に相当し、クリア要求イベント又はＯＣ更新イベントは、特定イベントに相当する。そして、クリア要求イベント情報又はＯＣ更新イベント情報、すなわち追い越し不可イベント情報は、特定イベント情報に相当する。また、クリア要求イベント処理は、当該クリア要求イベント処理を要求するイベントの発生後に発生した異常イベント及び正常イベントのそれぞれに対応する処理が、当該クリア要求イベント処理よりも先に実施されると、不都合が生じる処理である。同様に、ＯＣ更新イベント処理は、当該ＯＣ更新イベント処理を要求するイベントの発生後に発生した異常イベント及び正常イベントのそれぞれに対応する処理が、当該ＯＣ更新イベント処理よりも先に実施されると、不都合が生じる処理である。また、キュー２７は、イベント記憶部に相当する。
【０１００】
［２．第２実施形態］
第２実施形態は、基本的な構成は第１実施形態と同様であるため、共通する構成については説明を省略し、相違点を中心に説明する。なお、第１実施形態と同じ符号は、同一の構成を示すものであって、先行する説明を参照する。
【０１０１】
［２−１．第１実施形態との相違点］
第１実施形態のイベント処理部２３は、イベント情報を、イベントの発生順と同じ並び順でキュー２７に記憶し、キュー２７からは、キュー２７におけるイベント情報の並び順とは異なる順に、イベント情報を読み出すようになっていた。
【０１０２】
一方、第２実施形態のイベント処理部２３は、イベント情報を、イベントの発生順とは異なる並び順でキュー２７に記憶し、キュー２７からは、先頭から順にイベント情報を読み出すようになっている。
【０１０３】
このため、第２実施形態において、キューイング部２５は、図２のキューイング処理に代えて、図１０のキューイング処理を行う。そして、デキュー部２６は、図８のデキュー処理に代えて、図１１のデキュー処理を行う。
【０１０４】
〈キューイング処理〉
図１０に示すように、キューイング部２５は、異常イベント、正常イベント、クリア要求イベント、及びＯＣ更新イベントの何れかが発生して、キューイング処理を開始すると、Ｓ６１０にて、発生イベントが異常イベントであるか否かを判定する。発生イベントとは、発生したイベントのことである。キューイング部２５は、発生イベントが異常イベントではないと判定した場合には、Ｓ６２０進み、図２のＳ１００と同様に、発生イベントを表すイベント情報を、キュー２７に、最後尾の情報として格納する。そして、その後、当該キューイング処理を終了する。
【０１０５】
また、キューイング部２５は、Ｓ６１０にて、発生イベントが異常イベントであると判定した場合には、Ｓ６３０進む。
キューイング部２５は、Ｓ６３０では、キュー２７内を、最後尾から、下記の探索対象情報の何れかに最初にヒットするまで探索する。このＳ６３０で探索する探索対象情報は、異常イベント情報と、追い越し不可イベント情報と、先頭の情報との、何れかである。
【０１０６】
デキュー部２６は、次のＳ６４０では、キュー２７において、Ｓ６３０での探索によりヒットした探索対象情報よりも後ろに格納され、且つ、格納対象の異常イベント情報と同じ診断項目を表す正常イベント情報（以下、同項目正常イベント情報）があるか否かを判定する。なお、格納対象の異常イベント情報は、今回発生した異常イベントを表す異常イベント情報である。また、同項目正常イベント情報は、格納対象の異常イベント情報にとって、第１実施形態における前同項目正常イベント情報と同じ意味を持つ正常イベント情報であり、同正常情報に相当する。
【０１０７】
デキュー部２６は、Ｓ６４０にて、同項目正常イベント情報がないと判定した場合には、Ｓ６５０に進み、格納対象の異常イベント情報をキュー２７に格納する処理を行う。
具体的には、格納対象の異常イベント情報を、Ｓ６３０での探索によりヒットした探索対象情報の直後位置に格納すると共に、ヒットした探索対象情報よりも後ろの位置に格納されていた他のイベント情報を、格納対象の異常イベント情報の後ろにずらす。
【０１０８】
そして、デキュー部２６は、Ｓ６５０の処理を行った後、当該キューイング処理を終了する。
また、デキュー部２６は、Ｓ６４０にて、同項目正常イベント情報があると判定した場合には、Ｓ６６０に進み、同項目正常イベント情報と格納対象の異常イベント情報とを、この順にキュー２７に格納する処理を行う。
【０１０９】
具体的には、同項目正常イベント情報と、格納対象の異常イベント情報とを、この順にして、Ｓ６３０での探索によりヒットした探索対象情報の直後位置に格納する。そして、ヒットした探索対象情報よりも後ろの位置に格納されていた他のイベント情報を、格納対象の異常イベント情報の後ろにずらす。
【０１１０】
そして、デキュー部２６は、Ｓ６６０の処理を行った後、当該キューイング処理を終了する。
〈デキュー処理〉
図１１に示すように、デキュー部２６は、デキュー処理を開始すると、まずＳ７１０にて、キュー２７内が空か否かを判定し、キュー２７内が空であると判定した場合には、そのまま当該デキュー処理を終了する。
【０１１１】
また、デキュー部２６は、Ｓ７１０にて、キュー２７内が空ではないと判定した場合には、Ｓ７２０に進む。
デキュー部２６は、Ｓ７２０では、図８のＳ５４０と同様に、キュー２７の先頭のイベント情報を読み出して、その読み出したイベント情報に対応する処理を実施し、その後、Ｓ７３０に進む。なお、本第２実施形態においても、デキュー部２６は、キュー２７から読み出したイベント情報を、キュー２７から消去し、キュー２７内の各イベント情報を先頭側へ詰める。
【０１１２】
デキュー部２６は、Ｓ７３０では、キュー２７内が空か否かを判定し、キュー２７内が空ではないと判定した場合には、Ｓ７２０に戻る。また、デキュー部２６は、Ｓ７３０にて、キュー２７内が空であると判定した場合には、当該デキュー処理を終了する。
【０１１３】
よって、キュー２７からは、先頭から順にイベント情報が読み出される。そして、読み出された各イベント情報に対応する処理が順次実施される。
［２−２．キューイング処理の作用例］
図１０のキューイング処理が行われることによる作用例について、図１２を用い説明する。
【０１１４】
図１２における「ａ〜ｇ」及び「Ｂ，Ｅ，Ｆ，Ｈ」と「１，２」の意味は、図９と同じである。図１２では、右端の列における上から下に示す順にイベントが発生して、その発生したイベントを表すイベント情報をキュー２７に記憶していった場合に、キュー２７におけるイベント情報の格納状態が、矢印Ｑ１〜Ｑ１８の各行のように遷移することを表している。そして、矢印Ｑ１〜Ｑ１８の各行では、左側がキュー２７の先頭である。イベント情報がキュー２７に記憶される時間的な順番は、イベントの発生順と同じであるが、キュー２７におけるイベント情報の格納位置は、イベントの発生順とは異なる。以下では、矢印Ｑ１〜Ｑ１８の各行を、Ｑ１行〜Ｑ１８行という。
【０１１５】
Ｑ１行〜Ｑ６行に示すように、発生イベントが異常イベント以外であれば、発生イベントを表す各イベント情報が、Ｓ６２０の処理により、キュー２７に順次格納されていく。
そして、キュー２７内のイベント情報がＱ６行に示すようになっている状態で、異常イベントが発生し、キュー２７に異常イベント情報Ｂを記憶する場合、Ｓ６３０の検索では、追い越し不可イベント情報１にヒットし、Ｓ６４０ではＮＯと判定される。よって、Ｓ６５０の処理が行われることにより、異常イベント情報Ｂは、追い越し不可イベント情報１の直後位置に格納される。そして、追い越し不可イベント情報１の後ろに格納されていた正常イベント情報ｄは、異常イベント情報Ｂの後ろにずらされる。この結果、キュー２７内のイベント情報は、Ｑ７行に示すようになる。
【０１１６】
その後に発生した正常イベントを表す正常イベント情報ｆ，ｅのそれぞれは、Ｓ６２０の処理により、キュー２７に、最後尾の情報として順次格納されていく。よって、キュー２７内のイベント情報は、Ｑ８行，Ｑ９行に示すようになる。
【０１１７】
そして、キュー２７内のイベント情報がＱ９行に示すようになっている状態で、異常イベントが発生し、キュー２７に異常イベント情報Ｆを記憶する場合、Ｓ６３０の検索では、異常イベント情報Ｂにヒットする。更に、そのヒットした異常イベント情報Ｂの後ろに、同項目正常イベント情報としての正常イベント情報ｆが格納されているため、Ｓ６４０ではＹＥＳと判定される。よって、Ｓ６６０の処理が行われることにより、同項目正常イベント情報としての正常イベント情報ｆは、異常イベント情報Ｂの直後位置に移動され、その正常イベント情報ｆの直後位置に異常イベント情報Ｆが格納される。そして、異常イベント情報Ｂの後ろに格納されていた正常イベント情報ｄ，ｅは、異常イベント情報Ｆの後ろにずらされる。この結果、キュー２７内のイベント情報は、Ｑ１０行に示すようになる。
【０１１８】
そして、キュー２７内のイベント情報がＱ１０行に示すようになっている状態で、異常イベントが発生し、キュー２７に異常イベント情報Ｈを記憶する場合、Ｓ６３０の検索では、異常イベント情報Ｆにヒットし、Ｓ６４０ではＮＯと判定される。よって、Ｓ６５０の処理が行われることにより、異常イベント情報Ｈは、異常イベント情報Ｆの直後位置に格納される。そして、異常イベント情報Ｆの後ろに格納されていた正常イベント情報ｄ，ｅは、異常イベント情報Ｈの後ろにずらされる。この結果、キュー２７内のイベント情報は、Ｑ１１行に示すようになる。
【０１１９】
その後に発生した正常イベントを表す正常イベント情報ｇ，ｅのそれぞれは、Ｓ６２０の処理により、キュー２７に、最後尾の情報として順次格納されていく。よって、キュー２７内のイベント情報は、Ｑ１２行，Ｑ１３行に示すようになる。
【０１２０】
そして、キュー２７内のイベント情報がＱ１３行に示すようになっている状態で、異常イベントが発生し、キュー２７に異常イベント情報Ｅを記憶する場合、Ｓ６３０の検索では、異常イベント情報Ｈにヒットする。更に、そのヒットした異常イベント情報Ｈの後ろに、同項目正常イベント情報としての正常イベント情報ｅが２つ格納されているため、Ｓ６４０ではＹＥＳと判定される。よって、Ｓ６６０の処理が行われることにより、２つの正常イベント情報ｅは、異常イベント情報Ｈの直後位置に移動され、その正常イベント情報ｅの直後位置に異常イベント情報Ｅが格納される。そして、異常イベント情報Ｈの後ろに格納されていた他の正常イベント情報ｄ，ｇは、異常イベント情報Ｅの後ろにずらされる。この結果、キュー２７内のイベント情報は、Ｑ１４行に示すようになる。
【０１２１】
その後の説明は省略するが、キュー２７におけるイベント情報の格納状態は、Ｑ１５行〜Ｑ１８行に示すように遷移する。
そして、デキュー部２６により、キュー２７の先頭から順にイベント情報が読み出され、その読み出された各イベント情報に対応する処理が順次実施される。
【０１２２】
［２−３．効果］
以上詳述した第２実施形態では、第１実施形態で実施したイベント情報の読み出し順の並び替えを、イベント情報のキュー２７への格納時に実施している。そして、このような第２実施形態によっても、前述した第１実施形態の効果（１ａ）〜（１ｄ）と同様の効果が得られる。
【０１２３】
［他の実施形態１］
上記各実施形態において、追い越し不可イベント情報が存在しないようになっていても良い。この場合、図８のＳ５２０と図１０のＳ６３０で探索する探索対象情報から、追い越し不可イベント情報を除外すれば良い。
【０１２４】
［他の実施形態２］
上記各実施形態において、異常イベント情報に対応する異常イベント処理を、その異常イベント情報と同じ診断項目についての正常イベント処理に対しても、優先して実施するように構成しても良い。その場合、第１実施形態であれば、図８のデキュー処理からＳ５５０，Ｓ５７０を削除すれば良く、第２実施形態であれば、図１０のキューイング処理からＳ６４０，Ｓ６６０を削除すれば良い。
【０１２５】
［他の実施形態３］
例えば第１実施形態において、図８のＳ５５０でＹＥＳと判定した場合にＳ５４０へ進むように変形しても良い。このように変形すると、例えばキュー２７内のイベント情報が図９のＰ６行に示すようになっている場合、キュー２７から「ｄ→ｅ→ｆ→Ｆ」の順にイベント情報が読み出される。つまり、異常イベント情報Ｆは、同じ診断項目についての正常イベント情報ｆより後に記憶された正常イベント情報ｇよりは、優先して読み出される。また、こうした変形は、第２実施形態についても同様に適用しても良い。
【０１２６】
［他の実施形態４］
マイコン１３が、リアルタイムオペレーティングシステムを使用せずに、各診断部２１としての処理、すなわち各診断項目についての診断処理を、一定時間毎の周期タスクによって実施するようになっていても良い。ここでは、第１実施形態の図２，図８の各処理を転用するとして説明する。
【０１２７】
周期タスクにおいて、複数の診断処理が順番に実施されるとすると、各診断処理の直後毎に、イベント有無判定処理が設けられる。そのイベント有無判定処理は、「直前の診断処理で正常又は異常と判断されたか否かを判定し、正常又は異常と判定されたなら、正常イベント又は異常イベントが発生したとして、図２のキューイング処理を起動する」というような処理である。また、周期タスク内には、クリア要求イベント又はＯＣ更新イベントの発生を検知して図２のキューイング処理を起動する処理、も含まれて良い。そして、例えば周期タスクの最後にて、図８のデキュー処理が実施される。
【０１２８】
但し、１回の周期タスクにおいて、想定数よりも多くのイベントが発生した場合、各イベントに対応する処理を、次回の周期タスク開始時までに実施し終えることができなくなる可能性がある。
【０１２９】
このため、周期タスク内のデキュー処理では、Ｓ５８０にてキュー２７内が空であると判定しても、キュー２７から読み出したイベント情報の数が所定数に達した場合には、当該デキュー処理を終了するように構成すれば良い。この場合、キュー２７に残ったイベント情報は、次回の周期タスクにおいて読み出されることとなる。一方、異常イベント情報は、正常イベント情報よりも優先して読み出されるため、異常イベント情報に対応する処理が次回の周期タスクに持ち越されることが防止される。よって、異常イベントの発生時からＦＦＤをメモリに記憶するまでの遅れ時間を、短縮することができる。また、もちろん、図２，図８の各処理に代えて、図１０，図１１の各処理を転用しても良い。
【０１３０】
以上、本発明を実施するための形態について説明したが、本発明は上述の実施形態に限定されることなく、種々変形して実施することができる。
例えば、制御対象は、トランスミッションなど、エンジン以外でも良い。また、上記実施形態における１つの構成要素が有する複数の機能を、複数の構成要素によって実現したり、１つの構成要素が有する１つの機能を、複数の構成要素によって実現したりしても良い。また、複数の構成要素が有する複数の機能を、１つの構成要素によって実現したり、複数の構成要素によって実現される１つの機能を、１つの構成要素によって実現したりしても良い。また、上記実施形態の構成の一部を省略しても良い。また、上記実施形態の構成の少なくとも一部を、他の上記実施形態の構成に対して付加又は置換しても良い。なお、特許請求の範囲に記載した文言のみによって特定される技術思想に含まれるあらゆる態様が本発明の実施形態である。また、上述したＥＣＵ１１の他、当該ＥＣＵ１１を構成要素とするシステム、当該ＥＣＵ１１としてコンピュータを機能させるためのプログラム、このプログラムを記録した半導体メモリ等の非遷移的実態的記録媒体、ＦＦＤの記憶方法など、種々の形態で本発明を実現することもできる。
【符号の説明】
【０１３１】
１１…ＥＣＵ、１８…フラッシュメモリ、２１…診断部、２３…イベント処理部、２７…キュー
【図１】
0006561903.tif 000002
【図２】
0006561903.tif 000003
【図３】
0006561903.tif 000004
【図４】
0006561903.tif 000005
【図５】
0006561903.tif 000006
【図６】
0006561903.tif 000007
【図７】
0006561903.tif 000008
【図８】
0006561903.tif 000009
【図９】
0006561903.tif 000010
【図１０】
0006561903.tif 000011
【図１１】
0006561903.tif 000012
【図１２】
0006561903.tif 000013