(57)【特許請求の範囲】
【請求項１】
ダイアグ対象の異常検出結果に基づき、当該ダイアグ対象に対応する異常時情報を記憶する自己診断機能を備え、
前記自己診断機能を実現するための自己診断プログラムを、前記ダイアグ対象毎に用いられて前記ダイアグ対象の異常を検出する処理を実行する異常検出オブジェクトと、前記ダイアグ対象に共通して用いられて前記異常検出オブジェクトによる異常検出結果に基づき前記異常時情報を記憶する処理を実行するオブジェクト群とで構成した車両用制御装置において、
同一のダイアグ対象の異常を検出する複数の手法が存在する場合には、当該複数の手法毎に前記異常検出オブジェクトを用意し、当該異常検出オブジェクトの少なくとも１つは、一度異常検出を行った後に所定の条件が満たされると、同一のダイアグ対象に係る他の異常検出オブジェクトにて異常検出がなされていない場合に限り、前記異常時情報を無効にするよう指示し、
一方、前記オブジェクト群は、前記異常検出オブジェクトから前記異常時情報の無効指示があると、前記異常時情報を無効にすること
を特徴とする自己診断機能を備えた車両用制御装置。
【請求項２】
請求項１に記載の車両用制御装置において、
前記異常時情報の無効指示を行う異常検出オブジェクトは、同一のダイアグ対象に係る異常検出オブジェクトの中で、相対的に異常を検出する可能性の高い手法にて異常検出を行うオブジェクトであること
を特徴とする自己診断機能を備えた車両用制御装置。
【請求項３】
請求項１又は２に記載の車両用制御装置において、
前記オブジェクト群は少なくとも、
前記異常検出オブジェクトによる異常検出結果に基づき実質的な異常であるか否かを判断する異常確定オブジェクトと、
該異常確定オブジェクトにて異常判断がなされると、前記異常時情報の記憶要求を行う異常時処理オブジェクトと、
該異常時処理オブジェクトによる前記異常時情報の記憶要求に従い、前記異常時情報を記憶する異常時情報記憶オブジェクトとを含むこと
を特徴とする自己診断機能を備えた車両用制御装置。
【請求項４】
請求項３に記載の車両用制御装置において、
前記異常時処理オブジェクトは、前記異常検出オブジェクトから前記異常時情報の無効指示があると、前記異常時情報の無効要求を行い、
前記異常時情報記憶オブジェクトは、前記異常時処理オブジェクトによる前記異常時情報の無効要求に従い、前記異常時情報を無効にすること
を特徴とする自己診断機能を備えた車両用制御装置。
【請求項５】
請求項１〜４のいずれかに記載の車両用制御装置の前記自己診断プログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、車両を制御する車両用制御装置の自己診断機能に関し、さらに、当該自己診断機能をオブジェクト指向プログラミングにて実現する技術に関する。
【０００２】
【従来の技術】
近年、高性能マイクロプロセッサの出現などエレクトロニクス技術の進歩を背景として、機械技術と電子技術とが結びついたメカトロニクス技術の進歩が著しい。メカトロニクスの進歩の一部として、自動車等の車両にも多くのコンピュータシステムが採用されてきている。このような車載用のコンピュータシステムは、省資源、省エネルギー、走行性能、安全性、快適性等を追求するものであり、車両内のエンジン・駆動系、走行・安全系、エンターテイメント系、及びその他の随所に搭載されている。
【０００３】
その中でも特に高い信頼性を要求される車両制御用のコンピュータシステムは、システム内の各部位の異常検出を的確に行わないと、走行上の不具合を引き起こす可能性があり、場合によっては走行不能となることもある。そのため、コンピュータシステムに自己診断機能を備えることにより、信頼性の向上が図られている。すなわち、コンピュータ部やセンサ類の動作状態を適当な周期で自動的にチェックし、故障時には、ユーザなどに故障を知らせるための警告灯（ＭＩＬ）を点灯したり、その故障内容が修理担当者などに分かるよう異常コード（ＤＴＣ）を記憶したりするダイアグノーシス（以下「ダイアグ」という。）処理を可能にしている。このダイアグ処理の対象は、クランク角センサ、カム角センサ、水温センサなどの各センサをはじめ、現在では約２００にもおよぶ。以下、ダイアグ処理の対象を「ダイアグ対象」と呼ぶ。
【０００４】
ところでこのダイアグ処理は、ただ単にダイアグ対象の作動状態を単発的にチェックして「正常」又は「異常」を判定するものではない。「正常」、「異常」にもレベルがあるからである。例えば、センサからの入力信号系の「異常」を例に挙げた場合、コネクタ等における一時的な接触不良も「異常」であるし、完全な断線も「異常」である。前者の場合は、その後良好な作動状態を維持することがあり、特に部品交換の必要性が認められないことがある。したがって、一度異常と判定された場合であっても、例えば４０暖機サイクルの間に全てのダイアグ対象について異常が検出されなかった場合には、それまでに記憶した異常コードを全て消去する車両用制御装置があった。
【０００５】
【発明が解決しようとする課題】
本発明は、ある限定された期間に上述したような一時的な異常が検出される可能性が高く、そのために記憶される異常コードによって生じる不都合に着目したものである。これについて説明する。
【０００６】
一時的な異常が検出される可能性の高い期間として、例えば工場における車両の組立期間や工場出荷直後の走行期間が挙げられる。車両の組立期間においては、動作確認のためにバッテリを仮固定するため、バッテリ接続関係の異常が検出されてしまう可能性が高い。また、工場出荷直後の走行期間には、エンジン等の稼働部分から微量の金属くずが出るため、この金属くずの影響によって異常が検出されてしまう可能性が高い。そして、これらの異常はどちらも、一時的なものであって本質的なものでない。しかしながら、従来の構成において異常コードの消去は、上述したように、全てのダイアグ対象について４０暖機サイクルの間異常検出がなされなかった場合にはじめて行われる。したがって、異常コードが消去されないうちにユーザが車両を修理工場などに持ち込んだ場合など、記憶された異常コードに基づき、本来は交換する必要のない部品が交換されてしまうという問題があった。
【０００７】
これを防止するためには、一度記憶された異常コードを、ダイアグ対象毎に、例えば２０暖機サイクルというような比較的早いタイミングで消去することが考えられる。ところが、あるダイアグ対象に対して複数の異常検出手法が存在することがあるため、そのダイアグ対象に対して記憶された異常コードを単純に消去できない。例えばあるダイアグ対象の異常検出手法に２つの手法Ａ，Ｂがある場合、手法Ａによる異常検出がなされないからと言って、異常コードを消去してしまうことはできない。手法Ｂによって異常検出がなされている可能性があるためである。したがって、同一のダイアグ対象に複数の異常検出手法が存在する場合には、それら複数の異常検出結果に基づき異常コードを消去する構成を必要とする。
【０００８】
そして、このような構成を採用するにあたっては、次に示す点における考慮がさらに必要になる。
それは、上述したダイアグ対象が、車種やグレードあるいはモデルチェンジのタイミングで変わるということである。そのため、再利用性を考慮したオブジェクト指向設計とすることが望ましい。つまり、ダイアグ対象に依存する処理とダイアグ対象に依存しない処理を別のオブジェクトが実行するようにして、ダイアグ対象に依存しない処理を実行するオブジェクトはそのまま再利用できるようにし、作成した自己診断プログラムを部分的に用いて新たな自己診断プログラムを作成できるようにするのである。
【０００９】
本発明は、自己診断プログラムの再利用性を確保しつつ、一時的な異常によって記憶された異常時情報をダイアグ対象毎に消去できるようにし、本来は交換する必要のない部品が交換されてしまうことを極力防止することを目的とする。
【００１０】
【課題を解決するための手段及び発明の効果】
上述した目的を達成するためになされた請求項１に記載の車両用制御装置は、ダイアグ対象の異常検出結果に基づき、当該ダイアグ対象に対応する異常時情報を記憶する自己診断機能を備えている。ここで異常時情報には、少なくとも異常内容を示す異常コードが含まれる。異常時情報としたのは、その他に、車速・エンジン回転数・水温・スロットル開度など異常時の車両状態を示すいわゆるフリーズデータを含める意図である。すなわち、ここでいう自己診断機能は、異常検出結果に基づき、これらの異常時情報を例えばスタンバイＲＡＭやＥＥＰＲＯＭに記憶するというものであり、これによって、修理工場などでスタンバイＲＡＭ又はＥＥＰＲＯＭの記憶内容を読み出せば異常箇所を特定できる。
【００１１】
本発明では、この自己診断機能が、自己診断プログラムの実行によって実現される。そして、この自己診断プログラムは、ダイアグ対象毎に処理を実行する異常検出オブジェクトと、ダイアグ対象に共通する処理を実行するオブジェクト群とから構成されている。異常検出オブジェクトは、ダイアグ対象毎に用意されて、ダイアグ対象の異常を検出する処理（異常検出処理）を実行する。一方、オブジェクト群は、異常検出オブジェクトによる異常検出結果に基づき、異常時情報を記憶する処理を実行する。
【００１２】
このような構成を前提とし、本発明では特に、同一のダイアグ対象の異常を検出する複数の手法が存在する場合には、当該複数の手法毎に異常検出オブジェクトを用意する。そして、それら異常検出オブジェクトの少なくとも１つは、一度異常検出を行った後に所定の条件が満たされると、同一のダイアグ対象に係る他の異常検出オブジェクトにて異常検出がなされていない場合に限り、異常時情報を無効にするよう指示する。ここで所定の条件が満たされた場合とは、例えば２０暖機サイクルといった所定回の暖機サイクルの間に異常検出がなされなかった場合や、例えば２０トリップ（イグニッションキーのオンからオフまでの期間が１トリップである。）といった所定回のトリップの間に異常検出がなされなかった場合等が考えられる。また、他の異常検出オブジェクトにて異常検出がなされたか否かは、異常検出オブジェクトの異常検出結果が例えばグローバル変数に代入されるような構成においてはそのグローバル変数を参照して判断する。また、異常検出結果が例えば異常検出オブジェクトの内部情報となっている場合には、該当する異常検出オブジェクトに異常検出結果を読み出すためのメッセージを送出し、これによって異常検出結果を参照して判断する。
【００１３】
そして、異常検出オブジェクトから異常時情報の無効指示があると、上述したオブジェクト群が異常時情報を無効にする。ここで「無効にする」としたのは、記憶された異常時情報を消去することだけでなく、記憶された異常時情報をマスク処理することが考えられるためである。マスク処理とは、例えば異常時情報に対するフラグを立てることによって、その異常時情報を読み出せない状態にすることをいう。この場合、記憶装置自体には異常時情報が残るため、修理工場などにおける通常操作では読み出せないが、特別な操作をすれば異常時情報を読み出して参照することができる。
【００１４】
本発明によれば、検出された異常が一時的なものであれば、ダイアグ対象毎に、例えば２０暖機サイクルといった比較的早いタイミングで、記憶された異常時情報が無効にされる。その結果、本来は交換する必要のない部品が交換されてしまうことを防止できる。
【００１５】
また、各異常検出手法毎に用意される複数の異常検出オブジェクトの少なくとも１つが、同一のダイアグ対象に係る他の異常検出オブジェクトにて異常検出がなされていない場合に限って異常時情報の無効指示を行う。したがって、ある異常検出手法にて異常検出がなされていないからと言って、他の手法にて異常検出がなされている場合に異常コードが無効にされることもない。
【００１６】
さらにまた、他の異常検出オブジェクトの異常検出結果を判断してオブジェクト群に異常時情報の無効指示を送出するのは、異常検出オブジェクトである。したがって、ダイアグ対象が変わった場合には、異常検出オブジェクトのみを変更すればよく、オブジェクト群は何等変更する必要がない。そのため、自己診断プログラムの再利用性を確保できる。
【００１７】
なお、異常時情報の無効指示を行う異常検出オブジェクトは、同一のダイアグ対象に係る異常検出オブジェクトの中で、異常を検出する可能性の相対的に高い手法にて異常検出を行うものとするとよい（請求項２）。例えば、異常を検出する可能性が最も高い異常検出オブジェクトが、他の異常検出オブジェクトの異常検出結果を参照して異常時情報の無効指示を行うという具合である。ただし、無効指示を行う異常検出オブジェクトは、異常を検出する可能性が相対的に高いものであればよく、一つには限られない。
【００１８】
異常を検出する可能性が相対的に高いオブジェクトで異常が検出されなかった場合、他のオブジェクトで異常が検出される可能性は少なく、全ての異常検出オブジェクトにおいて判断処理を実行しなくても十分である。本発明によれば、異常時情報を無効とするか否かの判断処理を一部の（例えば一つの）異常検出オブジェクトに挿入することになるため、処理プログラムが簡略化されるという面において、また、判断処理の実行回数が少なくなり処理負荷が軽減されるという面において有利である。
【００１９】
一方、オブジェクト群は、例えば請求項３に示すように構成することが考えられる。すなわち、少なくとも、異常確定オブジェクトと、異常時処理オブジェクトと、異常時情報記憶オブジェクトとを含むものとすることが考えられる。このとき各オブジェクトは、次のように動作する。
【００２０】
異常確定オブジェクトは、異常検出オブジェクトによる異常検出結果に基づき実質的な異常であるか否かを判断する。例えばバッテリが外れている場合には、バッテリが外れたことに起因して、たとえセンサ等のダイアグ対象自体が正常であっても、その異常が検出されることがあるからである。また、異常時処理オブジェクトは、異常確定オブジェクトにて異常判断がなされると、異常時情報の記憶要求を行う。すると、異常時情報記憶オブジェクトが、異常時処理オブジェクトによる異常時情報の記憶要求に従い、異常時情報を記憶する。
【００２１】
上述したように検出された異常が実質的なものであるか否かといった判断、例えばバッテリ外れによるものであるか否かの判断は、各ダイアグに共通する判断処理である。したがって、この判断処理を実行する異常確定オブジェクトを設けることによって全体のプログラム構成が簡単になり、さらなる再利用性を図ることができる。
【００２２】
また、異常時処理オブジェクトの要求に従い、異常時情報記憶オブジェクトが異常時情報を記憶する構成を採るのは、次のような理由による。
ダイアグ処理においては、異常時情報の記憶に限らず、異常発生をユーザに知らせるために警告灯の点灯／消灯処理を行うのが一般的である。このような構成を考えると、異常時情報の記憶や警告灯の点灯／消灯といった異常時処理を統括するオブジェクトを用意することが望ましい。プログラム構成が分かり易くなると共に拡張性が高くなるからである。そこで本発明では、異常時処理オブジェクトを設けた。このようにすれば、例えば警告灯の点灯／消灯を行う場合には、異常時処理オブジェクトが警告灯の点灯／消灯要求を所定のオブジェクトに出力し、その所定のオブジェクトが警告灯の点灯／消灯をすることで実現できる。
【００２３】
なお、このような構成を前提とすれば、異常検出オブジェクトから異常時情報の無効指示があると、異常時処理オブジェクトが、異常時情報の無効要求を行うことが考えられる。このとき、異常時情報記憶オブジェクトは、異常時処理オブジェクトによる異常時情報の無効要求に従い、異常時情報を無効にする（請求項４）。
【００２４】
ところで、このような車両用制御装置の備える自己診断プログラムは、例えば、フロッピーディスク、光磁気ディスク、ＣＤ−ＲＯＭ、ハードディスク等のコンピュータ読み取り可能な記録媒体に記録し、必要に応じてコンピュータシステムにロードして起動することにより用いることができる。この他、ＲＯＭやバックアップＲＡＭをコンピュータ読み取り可能な記録媒体として自己診断プログラムを記録しておき、このＲＯＭあるいはバックアップＲＡＭをコンピュータシステムに組み込んで用いてもよい。
【００２５】
【発明の実施の形態】
以下、本発明を具体化した一実施例を図面を参照して説明する。
図１は、エンジン制御システムの全体を示す構成図である。このエンジン制御システムは、エンジン１１及び、このエンジン１１を制御するエンジン制御ユニット１６を中心に構成されている。このエンジン制御ユニット１６が「車両用制御装置」に相当する。
【００２６】
エンジン１１には、エアクリーナからの吸入空気が吸気管１２を経て供給されている。この吸気管１２には、吸入空気量を測定するエアフローセンサ１３と、吸気温度を検出する吸気温センサ１４が配置され、さらに、アクセルペダルによって駆動されるスロットル弁１５が配置されている。
【００２７】
エンジン制御ユニット１６には、エンジン１１の状態を示す各種信号が入力される。この信号を列挙すれば、エアフローセンサ１３からの吸入空気量検出信号、スロットルセンサ１７からのスロットル弁１５の開度検出信号、排出ガス中に含まれる酸素濃度を検出する空燃比センサ１８からの信号、バッテリ１９からのバッテリ電圧信号、水温センサ２０からの検出信号、エンジン１１によって駆動されるディストリビュータ２１からの回転信号、さらに気筒判別信号等である。
【００２８】
また、エンジン制御ユニット１６では、これらの各種検出信号に基づいてエンジン１１の運転状態に対応した燃料噴射量等を演算し、エンジン１１の複数の気筒それぞれに設定されるインジェクタ２２ａ〜２２ｄに対して燃料噴射指令を出力し、また、イグナイタ２３に対して点火指令信号を出力して、エンジン１１の運転制御を実行する。
【００２９】
さらに、エンジン制御ユニット１６は、車両の各部位の診断も各センサ群からの検出信号に基づいて実行する。このため、エンジン制御ユニット１６に対しては、異常検出結果の出力のための診断モードを設定するテストスイッチ２４が配置され、さらに、そのテスト結果であるダイアグノーシスの結果表示等を行う警告灯２５が接続されている。
【００３０】
スイッチ２６はバッテリ１９をエンジン制御ユニット１６に対して接続するイグニッションスイッチであり、このイグニッションスイッチ２６に連動するようにしてスタータモータ２７を制御するスタータスイッチ２８が設けられている。
次に、エンジン制御ユニット１６について説明する。図２は、図１に示したエンジン制御ユニット１６の構成を示すブロック図である。エンジン制御ユニット１６は、コンピュータシステムを構成するＣＰＵ３１を備える。このＣＰＵ３１にはアナログ入力回路３２及びディジタル入力回路３３からのデータが入力され、アナログ入力回路３２からのアナログ入力データは、Ａ／Ｄ変換器３４でディジタルデータに変換されてＣＰＵ３１に入力される。
【００３１】
アナログ入力回路３２には、エアフローセンサ１３からの検出信号Ｕｓ、水温センサ２０からの検出信号Ｔｈｗ、吸気温センサ１４からの検出信号Ｔｈａ、及びバッテリ１９の電圧＋Ｂが入力される。一方、ディジタル入力回路３３には、ディストリビュータ２１からの気筒判別信号Ｇ１と回転角信号Ｎｅ、空燃比センサ１８からの酸素濃度に対応したリーン・リッチ信号Ｏｘ、スロットルセンサ１７からのスロットル弁１５が全閉であることを示すアイドル信号Ｉｄｌｅ、スタータスイッチ２８からのスタート信号ＳＴＡ、及びテストスイッチ２４からの診断モードを設定する信号Ｔが入力される。
【００３２】
Ａ／Ｄ変換器３４は、アナログ入力回路３２に入力される各種の検出信号をＣＰＵ３１からの指令に従い順次選択して読み取り、ディジタルデータに変換するマルチプレクサ機能を有する。
また、電源回路３５は、イグニッションスイッチ２６を経てバッテリ１９の電圧＋ＢをＣＰＵ３１に供給し、また、常時バックアップ用電源Ｂａｔｔを供給している。
【００３３】
ＣＰＵ３１からの出力データは、出力回路３６、３７及び３８に供給され、エンジン制御ユニット１６からの出力信号として取り出される。すなわち、出力回路３６からはイグナイタ２３に対して点火指令信号ＩＧｔを出力する。また、出力回路３７からは診断結果を表す信号Ｗを出力して警告灯２５を点灯制御する。出力回路３８からの出力信号τｑは、エンジン１１の運転状態に対応した燃料噴射量を指示するもので、インジェクタ２２ａ〜２２ｄに出力されて、これらインジェクタ２２ａ〜２２ｄの噴射量を変える。
【００３４】
さらにＣＰＵ（エンジン制御ユニット）３１内には、後述する自己診断プログラムを格納するメモリ３９が設けられている。このメモリ３９は、ＲＯＭ及び、イグニッションスイッチ２６がオフされているときにも電源供給されてデータを保持するスタンバイＲＡＭとで構成されている。自己診断プログラムは、ＲＯＭ内に格納されている。そして後述するように、スタンバイＲＡＭには、自己診断プログラムによって異常コードが記憶される。
【００３５】
本実施例は、メモリ３９のＲＯＭ内に格納された自己診断プログラムに特徴を有するものである。そこで次に、自己診断プログラムについて説明する。
図３は、自己診断プログラムの構造（アーキテクチャ）を概念的に示した説明図である。自己診断プログラムは、オブジェクト指向設計された複数のプログラムで構成される。既に知られるように、オブジェクト指向設計とは、従来のソフトウェアが処理（例えば、燃料噴射という処理）に着目したものに対し、モノを基本単位にモデル化し、そのモノの特性や振る舞い（動作）で処理を記述するものである。この基本単位を「オブジェクト」と称し、オブジェクト指向設計されたプログラムは、このオブジェクトを最小構成単位として記述される。プログラム全体としては、要求や応答といったやりとり（以下「メッセージ」という。）によりオブジェクト間を結合することで一連の処理が実行される。オブジェクトは、データ（属性）とデータに対するメソッド（手続き）とを備え、他のオブジェクトからのメッセージによってメソッドを実行する。なお、本明細書中では、「オブジェクトが・・・する。」というオブジェクトを主体とした表現を用いるが、実際には、ＣＰＵ３１が処理プログラムを実行することで実現されることはいうまでもない。
【００３６】
図３には、本実施例を説明するために必要なオブジェクトのみを示した。つまり、本実施例における自己診断プログラムは少なくとも、異常検出オブジェクト１００と、異常確定オブジェクト２００と、異常時処理オブジェクト３００と、異常コード記憶オブジェクト４００とを備えている。
【００３７】
異常検出オブジェクト１００は、エンジン制御ユニット１６に入力された各センサ群などの情報に基づき、自己診断の対象となるダイアグ対象の異常を検出する。この異常検出オブジェクト１００は、ダイアグ対象毎に用意されている。例えば図３には、異常検出オブジェクト１００の中の、水温センサ２０の異常を検出する水温センサ異常検出オブジェクト（以下「水温センサオブジェクト」という。）１１０、吸気温センサ１４の異常を検出する吸気温センサ異常検出オブジェクト（以下「吸気温センサオブジェクト」という。）１２０、及びスロットルセンサ１７の異常を検出するスロットルセンサ異常検出オブジェクト（以下「スロットルセンサオブジェクト」という。）１３０を示した。つまり、ここでは水温センサ２０、吸気温センサ１４、スロットルセンサ１７が「ダイアグ対象」に相当する。
【００３８】
そしてまた、同一のダイアグ対象に対し複数の異常検出手法があれば、当該複数の異常検出手法毎に、異常検出オブジェクト１００が用意される。例えば水温センサ２０の異常検出手法が３つあれば、図３に示すように、３つの水温センサオブジェクト１１０ａ，１１０ｂ，１１０ｃが用意される。以下、この３つの水温センサオブジェクト１１０ａ〜１１０ｃを、Ａ水温センサオブジェクト１１０ａ，Ｂ水温センサオブジェクト１１０ｂ，Ｃ水温センサオブジェクト１１０ｃと記述して区別する。
【００３９】
異常確定オブジェクト２００は、各異常検出オブジェクト１００にて検出された異常が実質的な異常であるか否かを判断する。例えばバッテリ１９が外れている場合には、バッテリ１９が外れたことに起因し、たとえダイアグ対象自体が正常であっても、その異常が検出されることがあるからである。
【００４０】
異常時処理オブジェクト３００は、異常時処理を実行する。異常時処理には、異常コードの記憶／マスク要求や警告灯の点灯／消灯要求が含まれる。
異常コード記憶オブジェクト４００は、ダイアグ対象に対応する異常コードをメモリ３９のスタンバイＲＡＭに記憶する。又は、一度メモリ３９に記憶した異常コードをマスクする。マスクとは、異常コードに対応するフラグを立てることによって、スタンバイＲＡＭに記憶された異常コードを通常操作では読み出せない状態にすることをいう。なお、本実施例では、煩雑になることを避ける意味で異常コードのみを記憶／マスクする構成としたが、異常コードだけでなく、異常判断がなされた時点における車速・エンジン回転数・水温・スロットル開度など車両状態を示すいわゆるフリーズデータをスタンバイＲＡＭに記憶／マスクするようにしてもよい。
【００４１】
上述したように各オブジェクト１００〜４００は、メッセージによって結合されて一連の処理を実行する。そこで次に、メッセージシーケンスチャート（以下「ＭＳＣ」という。）を参照して各オブジェクト１００〜４００の結合を説明する。
【００４２】
図４は、ダイアグ対象の異常検出から異常コードの記憶までを示すＭＳＣである。まず異常検出オブジェクト１００が異常検出処理を実行する（Ｓ１）。この異常検出処理にて、ダイアグ対象の異常が検出されると、異常フラグがセットされる。そこで、異常検出オブジェクト１００は、フラグ処理要求を異常確定オブジェクト２００に対して発行する。
【００４３】
異常確定オブジェクト２００は、このフラグ処理要求を受け取ると、異常確定処理を実行する（Ｓ２）。この異常確定処理にて実質的な異常であると判断されると、異常確定オブジェクト２００は、異常時処理オブジェクト３００に対して異常確定通知を行う。
【００４４】
すると、異常時処理オブジェクト３００は、異常時処理を実行する（Ｓ３）。この異常時処理では、異常コード記憶オブジェクト４００に対する異常コード記憶要求が発行される。なお、異常時処理では、警告灯の点灯要求も他のオブジェクト（不図示）に発行されるのが一般的であるが、実施例の説明に必要でないため警告灯の点灯要求については割愛する。
【００４５】
異常コード記憶要求を受け取ると、異常コード記憶オブジェクト４００は、異常コード記憶処理を実行する（Ｓ４）。これによって、異常と判断されたダイアグ対象に対応する異常コードがメモリ３９のスタンバイＲＡＭに記憶される。
また、本実施例では、一度異常コードが記憶された後の２０トリップの間に、そのダイアグ対象の異常が検出されない場合には、一時的な異常であるとして、メモリ３９のスタンバイＲＡＭに記憶した異常コードをダイアグ対象毎にマスクする。
【００４６】
図５は、異常コードのマスク処理を示すＭＳＣである。上述した異常検出処理（Ｓ１）では、異常が検出された後の２０トリップの間に異常検出がなされない場合、異常時処理オブジェクト３００に対してマスク処理要求が発行される。
異常時処理オブジェクト３００は、上述した異常時処理を実行して（Ｓ３）、このマスク処理要求に従い異常コードマスク要求を発行する。これによって、異常コード記憶オブジェクト４００が、異常コードマスク処理を実行する（Ｓ５）。その結果、ダイアグ対象に対応してメモリ３９のスタンバイＲＡＭに記憶された異常コードがマスクされることになる。
【００４７】
ただし、図３に示したように、ダイアグ対象である水温センサ２０に対しては、異常検出オブジェクト１００としてＡ〜Ｃの３つの水温センサオブジェクト１１０ａ〜１１０ｃが存在する。したがって、水温センサ２０に対応する異常コードが記憶された後、例えばＡ水温センサオブジェクト１１０ａが２０トリップの間に異常を検出しない場合であっても、Ｂ水温センサオブジェクト１１０ｂが異常を検出している場合も考えられる。そのため、Ａ水温センサオブジェクト１１０ａは、Ｂ，Ｃの水温センサオブジェクト１１０ｂ，１１０ｃの異常検出結果を参照してマスク処理要求を発行する必要がある。
【００４８】
本実施例では、同一のダイアグ対象に対して複数の異常検出オブジェクト１００が存在することを前提とし、上述したマスク処理要求について工夫した。
したがってこの点を含め、上述した異常検出処理（Ｓ１）、異常確定処理（Ｓ２）、異常コード記憶処理（Ｓ４）及び異常コードマスク処理（Ｓ５）の詳細について、図６〜図１４のフローチャートに基づき説明する。なお、異常検出処理（Ｓ１）については、Ａ〜Ｃの３つの水温センサオブジェクト１１０ａ〜１１０ｃのぞれぞれにおける異常検出処理を例に挙げて説明する。なお説明上、Ａ水温センサオブジェクト１１０ａの実行する異常検出処理を「Ａ異常検出処理」と記述し、同様に、Ｂ水温センサオブジェクト１１０ｂの実行する異常検出処理を「Ｂ異常検出処理」、Ｃ水温センサオブジェクト１１０ｃの実行する異常検出処理を「Ｃ異常検出処理」と記述して区別する。Ａ〜Ｃの異常検出処理は、いずれも水温センサ２０のレンジ外れによる異常を検出するものである。レンジ外れとは、規定通りの信号幅で信号が出力されない状況をいう。例えば０〜５Ｖの範囲で出力されるはずの信号Ｔｈｗが常に２Ｖで出力されたり、２〜３Ｖの範囲で出力されたりする場合が挙げられる。このように信号Ｔｈｗがある値に又はある範囲のものとなってしまうことを「信号値の固着」という。
【００４９】
図６及び図７は、Ａ水温センサオブジェクト１１０ａが実行するＡ異常検出処理を示すフローチャートである。Ａ異常検出処理は、信号値の低温側の固着を判断するものであり、暖機による水温上昇に基づき異常検出を行うものである。
まず最初のステップ（以下ステップを単に記号Ｓで示す。）１０００において、フラグ情報をレジスタへコピーする。ここでいうフラグ情報は、異常検出結果を示す異常フラグ（正常：「０」、異常「１」）及び異常が確定したことを示す異常判定フラグ（未確定：「０」、確定「１」）である。これらのフラグは、グローバル変数としてメモリ３９のスタンバイＲＡＭに用意される。この処理は、前回の処理にて確定したフラグ情報を、過去のフラグ情報として待避させるものである。
【００５０】
続くＳ１０１０では、エンジン始動時であるか否かを判断する。ここでエンジン始動時であると判断された場合（Ｓ１０１０：ＹＥＳ）、Ｓ１０２０にて初期化処理を実行し、その後、図７中のＳ１１１０へ移行する。Ｓ１０２０の初期化処理では、エンジン始動時の水温を始動時水温Ｔｓに代入し、暖機カウンタＤをリセットして「０」にし、さらにトリップフラグＦｔを「０」にセットする。一方、エンジン始動時でないと判断された場合（Ｓ１０１０：ＮＯ）、Ｓ１０３０へ移行する。
【００５１】
Ｓ１０３０では、暖機カウンタＤをインクリメントする。続くＳ１０４０では、水温Ｔがフィードバック水温Ｔ（Ｆ／Ｂ）よりも小さいか否かを判断する。このフィードバック水温Ｔ（Ｆ／Ｂ）は、エンジン１１のフィードバック制御を開始する条件となる水温である。ここでＴ＜Ｔ（Ｆ／Ｂ）である場合（Ｓ１０４０：ＹＥＳ）、Ｓ１０５０へ移行する。一方、Ｔ≧Ｔ（Ｆ／Ｂ）である場合（Ｓ１０４０：ＮＯ）、Ｓ１０７０へ移行する。
【００５２】
Ｓ１０５０では、暖機カウンタＤが暖機判定値Ｄｔｈよりも大きいか否かを判断する。この暖機判定値Ｄｔｈは、フィードバック制御に移行可能な程度に暖機されたか否かを判定するためのものであり、エンジンの始動時における水温である始動時水温Ｔｓに基づいて算出される。つまり、始動時水温Ｔｓが相対的に高い場合には小さく算出され、逆に始動時水温Ｔｓが相対的に低い場合には大きく算出される。始動時水温Ｔｓが高ければ暖機されるまでに時間がかかり、低ければ暖機されるまでに時間がかからないためである。ここでＤ＞Ｄｔｈである場合（Ｓ１０５０：ＹＥＳ）、すなわち、フィードバック水温Ｔ（Ｆ／Ｂ）よりも水温Ｔが低いにもかかわらず暖機されていると判断された場合には、水温を示す信号値が低温側に固着しているとして、Ｓ１０６０にて異常フラグＦＡを「１」にセットし、さらに正常判定カウンタＳを「０」にリセットして、図７中のＳ１１１０へ移行する。一方、Ｄ≦Ｄｔｈである場合（Ｓ１０５０：ＮＯ）、すなわち暖機が不十分である場合には、Ｓ１０６０の処理を実行せず、図７中のＳ１１１０へ移行する。
【００５３】
Ｓ１０４０で否定判断された場合に移行するＳ１０７０では、正常であるとして異常フラグＦＡを「０」にセットする。この場合、水温Ｔがフィードバック水温Ｔ（Ｆ／Ｂ）よりも大きくなっており、水温を示す信号値の低温側への固着がないためである。
【００５４】
続くＳ１０８０では、トリップフラグＦｔが「０」であるか否かを判断する。トリップフラグＦｔは、各トリップで既にＳ１０４０にて否定判断がなされたか否かを判断するためのものである。ここでＦｔ＝０である場合（Ｓ１０８０：ＹＥＳ）、正常判定カウンタＳをインクリメントし（Ｓ１０９０）、トリップフラグＦｔを「１」にセットして（Ｓ１１００）、図７中のＳ１１１０へ移行する。これによって、正常判定カウンタＳは、各トリップで一度だけインクリメントされることになる。一方、Ｆｔ≠０である場合（Ｓ１０８０：ＮＯ）、Ｓ１０９０及びＳ１１００の処理を実行せず、図７中のＳ１１１０へ移行する。
【００５５】
図７中のＳ１１１０では、異常確定オブジェクト２００に対してフラグ処理要求を発行する。続くＳ１１２０では、正常判定カウンタＳが「２０」以上となったか否かを判断する。ここでＳ≧２０である場合（Ｓ１１２０：ＹＥＳ）、すなわち２０トリップの間に異常検出がなされなかった場合には、Ｓ１１３０へ移行する。一方、Ｓ＜２０である場合（Ｓ１１２０：ＮＯ）、Ｓ１１３０及びＳ１１４０の処理を実行せず、本Ａ異常検出処理を終了する。
【００５６】
Ｓ１１３０では、異常フラグＦＢ，ＦＣが共に「０」であるか否かを判断する。異常フラグＦＢ，ＦＣはそれぞれ、後述するように、Ｂ水温センサオブジェクト１１０ｂ、Ｃ水温センサオブジェクト１１０ｃで異常が検出された時にセットされて「１」となるグローバル変数である。したがって、ここではグローバル変数ＦＢ，ＦＣを参照して判断する。ここでＦＢ＝０かつＦＣ＝０である場合（Ｓ１１３０：ＹＥＳ）、すなわちＢ及びＣの両方の水温センサオブジェクト１１０ｂ，１１０ｃにて異常検出がなされていない場合には、Ｓ１１４０にて異常時処理オブジェクト３００へマスク処理要求を発行し、その後、本Ａ異常検出処理を終了する。一方、ＦＢ＝１又はＦＣ＝１である場合（Ｓ１１３０：ＮＯ）、すなわちＢ又はＣの少なくともいずれか一方の水温センサオブジェクト１１０ｂ，１１０ｃで異常検出がなされている場合には、Ｓ１１４０の処理を実行せず、本Ａ異常検出処理を終了する。
【００５７】
続けて、図８のフローチャートに基づき、Ｂ水温センサオブジェクト１１０ｂの実行するＢ異常検出処理を説明する。このＢ異常検出処理は、加速運転による水温上昇に基づき異常検出を行うものである。
まず最初のＳ２０００において、フラグ情報をレジスタへコピーする。続くＳ２０１０では、エンジン始動時であるか否かを判断する。ここでエンジン始動時であると判断された場合（Ｓ２０１０：ＹＥＳ）、Ｓ２０２０にて初期化処理を実行し、その後、Ｓ２１００へ移行する。Ｓ２０２０の初期化処理では、最低水温ＴＬ、最高水温ＴＵ、最低車速ＳＬ、最高車速ＳＵをそれぞれエンジン始動時の水温・車速として初期化し、アイドルＯＦＦカウンタＩを「０」にリセットする。また、始動時水温Ｔｓにエンジン始動時の水温を代入し、加速モードカウンタＭＡを「０」にリセットする。一方、エンジン始動時でないと判断された場合（Ｓ２０１０：ＮＯ）、Ｓ２０３０へ移行する。
【００５８】
Ｓ２０３０では、演算の対象となる値を更新する演算対象値更新処理を実行する。この演算対象値更新処理は、図９に示す如くである。図９に示すように、まず処理が開始されると、最低車速ＳＬ・最高車速ＳＵを更新する。具体的には、最低車速ＳＬが現車速よりも大きければ、最低車速ＳＬに現車速を代入する。また、最高車速ＳＵが現車速よりも小さければ、最高車速ＳＵに現車速を代入する。続いてアイドル状態か否かを判断する（Ｓ２２１０）。アイドル状態とは、図１中のスロットル弁１５の全閉の状態をいう。したがってこの判断は、スロットルセンサ１７からのＩｄｌｅ信号に基づいてなされる。ここでアイドル状態でないと判断された場合（Ｓ２２１０：ＮＯ）、アイドルＯＦＦカウンタＩをインクリメントし（Ｓ２２２０）、Ｓ２２３０へ移行する。一方、アイドル状態であると判断された場合（Ｓ２２１０：ＹＥＳ）、Ｓ２２２０の処理を実行せず、Ｓ２２３０へ移行する。さらに、最低水温ＴＬ・最高水温ＴＵを更新する（Ｓ２２３０）。具体的には、最低水温ＴＬが現水温よりも高ければ、最低水温ＴＬに現水温を代入する。また、最高水温ＴＵが現水温よりも低ければ、最高水温ＴＵに現水温を代入する。
【００５９】
ここで図８のフローチャートの説明に戻る。Ｓ２０３０に続くＳ２０４０では、最高車速ＳＵと最低車速ＳＬとの差分（ＳＵ−ＳＬ）が加速判定値Ａｔｈ以上であるか否かを判断する。つまり、ある程度の加速運転がなされたか否かを判断するのである。ここで（ＳＵ−ＳＬ）≧Ａｔｈである場合（Ｓ２０４０：ＹＥＳ）、Ｓ２０５０にて加速モードカウンタＭＡをインクリメントし、さらに、現車速を代入することで最低車速ＳＬ・最高車速ＳＵをリセットして、その後、Ｓ２０６０へ移行する。一方（ＳＵ−ＳＬ）＜Ａｔｈである場合（Ｓ２０４０：ＮＯ）、Ｓ２０５０の処理を実行せず、Ｓ２０６０へ移行する。
【００６０】
Ｓ２０６０では、最高水温ＴＵと最低水温ＴＬとの差分（ＴＵ−ＴＬ）が水温偏差判定値Ｔｔｈ以上であるか否かを判断する。また、始動時水温Ｔｓが水温判定値ＴＨ以下であるか否かを判断する。つまり、ここでは一定の水温上昇があったか否かを判断する。ただし、始動時水温Ｔｓが低い場合には水温上昇率が低くなるため、その場合を考慮する。ここで（ＴＵ−ＴＬ）≧Ｔｔｈ、又は、Ｔｓ≦ＴＨである場合（Ｓ２０６０：ＹＥＳ）、正常であると判断し、異常フラグＦＢを「０」にセットして（Ｓ２０７０）、Ｓ２１００へ移行する。一方、（ＴＵ−ＴＬ）＜Ｔｔｈ、かつ、Ｔｓ＞ＴＨである場合（Ｓ２０６０：ＮＯ）、Ｓ２０８０へ移行する。
【００６１】
Ｓ２０８０では、加速モードカウンタＭＡが一定値Ｍｔｈ以上であるか否かを判断する。また、アイドルＯＦＦカウンタＩが一定値Ｉｔｈ以上であるか否かを判断する。前者は、ある程度の加速運転が一定回数以上なされたか否かを判断するものである。一方後者は、アイドルＯＦＦの状態が一定回数以上あったか否かを判断するものである。ここでＭＡ≧Ｍｔｈ、かつ、Ｉ≧Ｉｔｈである場合（Ｓ２０８０：ＹＥＳ）、すなわち、Ｓ２０６０にて（ＴＵ−ＴＬ）＜Ｔｔｈと判断されているにもかかわらず、一定回数の加速運転がなされておりアイドルＯＦＦの状態が一定回数以上あった場合には、異常であると判断し、Ｓ２０９０にて異常フラグＦＢを「１」にセットして、その後、Ｓ２１００へ移行する。一方、ＭＡ＜Ｍｔｈ、又は、Ｉ＜Ｉｔｈである場合（Ｓ２０８０：ＮＯ）、Ｓ２０９０の処理を実行せず、Ｓ２１００へ移行する。
【００６２】
Ｓ２１００では、異常確定オブジェクト２００に対してフラグ処理要求を発行する。その後、本Ｂ異常検出処理を終了する。
さらに続けて、図１０及び図１１のフローチャートに基づき、Ｃ水温センサオブジェクト１１０ｃの実行するＣ異常検出処理を説明する。このＣ異常検出処理は、上述したＢ異常検出処理と同様、加速運転による水温上昇に基づき異常検出を行うものである。ただし、この異常検出手法は、法規で定められたものであり、一定の加減速パターンで走行した場合の水温上昇に基づく。
【００６３】
まず最初のＳ３０００において、フラグ情報をレジスタへコピーする。続くＳ３０１０では、エンジン始動時であるか否かを判断する。ここでエンジン始動時であると判断された場合（Ｓ３０１０：ＹＥＳ）、Ｓ３０２０にて初期化処理を実行し、その後、図１１中のＳ３１００へ移行する。Ｓ３０２０の初期化処理では、パターン条件成立フラグＦｐを「０」にセットし、最低水温ＴＬ、最高水温ＴＵをそれぞれエンジン始動時の水温として初期化し、さらに、始動時水温Ｔｓにエンジン始動時の水温を代入する。一方、エンジン始動時でないと判断された場合（Ｓ３０１０：ＮＯ）、Ｓ３０３０へ移行する。
【００６４】
Ｓ３０３０では、パターン条件が成立したか否かを判断する。このパターンは法規によって定められており、加速走行→定常走行→第１の減速走行→定常走行→第２の減速走行といった一定の加減速パターンである。したがってここでは、走行パターンの軌跡がこの加減速パターンに一致したか否かを判断する。ここでパターン条件が成立したと判断された場合（Ｓ３０３０：ＹＥＳ）、Ｓ３０４０にてパターン条件成立フラグＦｐを「１」にセットし、その後、Ｓ３０５０へ移行する。一方、パターン条件が成立していないと判断された場合（Ｓ３０３０：ＮＯ）、Ｓ３０４０の処理を実行せず、Ｓ３０５０へ移行する。
【００６５】
Ｓ３０５０では、最低水温ＴＬ・最高水温ＴＵを更新する。この処理は、図９中のＳ２２３０と同様、最低水温ＴＬが現水温よりも高ければ最低水温ＴＬに現水温を代入し、一方、最高水温ＴＵが現水温よりも低ければ最高水温ＴＵに現水温を代入するものである。
【００６６】
続くＳ３０６０では、最高水温ＴＵと最低水温ＴＬとの差分（ＴＵ−ＴＬ）が水温偏差判定値Ｔｔｈ以上であるか否かを判断する。つまり、ここでは一定の水温上昇があったか否かを判断する。ここで（ＴＵ−ＴＬ）≧Ｔｔｈである場合（Ｓ３０６０：ＹＥＳ）、正常であると判断し、異常フラグＦＣを「０」にセットして（Ｓ３０７０）、その後、Ｓ３０８０へ移行する。一方、（ＴＵ−ＴＬ）＜Ｔｔｈである場合（Ｓ３０６０：ＮＯ）、Ｓ３０７０の処理を実行せず、Ｓ３０８０へ移行する。
【００６７】
Ｓ３０８０では、パターン条件成立フラグＦｐが「１」であるか否かを判断する。また、最高水温ＴＵと最低水温ＴＬとの差分（ＴＵ−ＴＬ）が水温偏差判定値Ｔｔｈよりも小さいか否かを判断する。ここでＦｐ＝１、かつ、（ＴＵ−ＴＬ）＜Ｔｔｈである場合（Ｓ３０８０：ＹＥＳ）、すなわち定められた加減速パターンで走行したにもかかわらず一定の水温上昇が見られない場合には、異常であるとして異常フラグＦＣを「１」にセットし（Ｓ３０９０）、図１１中のＳ３１００へ移行する。一方、Ｆｐ＝０、又は、（ＴＵ−ＴＬ）≧Ｔｔｈである場合（Ｓ３０８０：ＮＯ）、Ｓ３０９０の処理を実行せず、図１１中のＳ３１００へ移行する。
【００６８】
図１１中のＳ３１００では、最低水温ＴＬ・最高水温ＴＵを更新する。この処理は、上述した図１０中のＳ３０５０と同様の処理である。
続くＳ３１１０では、最高水温ＴＵと最低水温ＴＬとの差分（ＴＵ−ＴＬ）が第２の水温偏差判定値Ｔ２ｔｈ以上であるか否かを判断する。第２の水温偏差判定値Ｔ２ｔｈは、トリップを跨いでいる場合の水温上昇を判定するためのものである。ここで（ＴＵ−ＴＬ）＞Ｔ２ｔｈである場合（Ｓ３１１０：ＹＥＳ）、正常であるとして異常フラグＦＣを「０」にセットし、さらに現水温を代入することにより最低水温ＴＬ・最高水温ＴＵをリセットして（Ｓ３１２０）、その後、Ｓ３１３０へ移行する。一方、（ＴＵ−ＴＬ）≦Ｔ２ｔｈである場合（Ｓ３１１０：ＮＯ）、Ｓ３１２０の処理を実行せず、Ｓ３１３０へ移行する。
【００６９】
Ｓ３１３０では、異常確定オブジェクト２００に対し、フラグ処理要求を発行する。その後、本Ｃ異常検出処理を終了する。
次に、異常確定オブジェクト２００にて実行される異常確定処理（Ｓ２）を、図１２のフローチャートに基づいて説明する。
【００７０】
Ｓ４０００，Ｓ４０１０，Ｓ４０２０における低電圧１〜３は、フラグ情報であり、「０」又は「１」にセットされて、フラグ処理要求と共に異常検出オブジェクト１００から送出される。
例えば水温センサ２０の異常検出の場合、バッテリ１９の電圧＋Ｂが低下すると、水温センサ２０が正常であるにもかかわらず、水温センサ２０からの信号値は固着する。そこで水温センサオブジェクト１１０は、低電圧３を「１」にセットする。これによってバッテリ１９の電圧＋Ｂが低下して電圧Ｖ以下となっている場合には、Ｓ４０２０にて肯定判断され、異常判定フラグが「０」にセットされる（Ｓ４０３０）。つまり、実質的な異常ではないと判断されるのである。エンジンの回転信号を検出する回転センサ等はバッテリ１９の電圧＋Ｂに関係しないため、回転センサの異常を検出する異常検出オブジェクト１００は、低電圧３を「０」にセットして送出する。
【００７１】
このように各異常検出オブジェクト１００が低電圧１〜３というフラグ情報を送出するようにし、各異常検出オブジェクト１００の異常検出結果を共通の処理ステップ（Ｓ４０００〜Ｓ４０２０）で処理できるようにした。
すなわち、Ｓ４０００における判断処理では、イグニッションスイッチ２６からの信号ＩＧがオフで、かつ低電圧１が「１」にセットされている場合（Ｓ４０００：ＹＥＳ）、異常でないと判断してＳ４０３０へ移行させる。また、Ｓ４０１０における判断処理では、スタータスイッチ２８からの信号ＳＴＡがオンで、かつ低電圧２が「１」にセットされている場合（Ｓ４０１０：ＹＥＳ）、異常でないと判断してＳ４０３０へ移行させる。さらにまた、Ｓ４０２０における判断処理では、バッテリ１９の電圧＋Ｂが電圧Ｖ以下で、かつ低電圧３が「１」にセットされている場合（Ｓ４０１０：ＹＥＳ）、異常でないと判断してＳ４０３０へ移行させる。
【００７２】
Ｓ４０００〜Ｓ４０２０で全て否定判断された場合に移行するＳ４０４０では、フラグ情報が変化したか否かを判断する。これは異常検出オブジェクト１００にて待避させられた（図６中のＳ１０００，図８中のＳ２０００，図１０中のＳ３０００参照）過去のフラグ情報と比較して判断する。ここでフラグ情報が変化したと判断された場合（Ｓ４０４０：ＹＥＳ）、Ｓ４０５０にて異常判定フラグを「１」にセットし、Ｓ４０６０にて異常時処理オブジェクト３００に対する異常確定通知を行い、その後、本異常確定処理を終了する。一方、フラグ情報が変化していないと判断された場合（Ｓ４０４０：ＮＯ）、Ｓ４０５０及びＳ４０６０の処理を実行せず、本異常確定処理を終了する。
【００７３】
次に、異常コード記憶オブジェクト４００にて実行される異常コード記憶処理（Ｓ４）・異常コードマスク処理（Ｓ５）を、図１３及び図１４のフローチャートに基づいて説明する。
図１３に示す異常コード記憶処理では、最初にメモリ３９のスタンバイＲＡＭに空き領域があるか否かを判断する（Ｓ５０００）。ここで空き領域があると判断された場合（Ｓ５０００：ＹＥＳ）、Ｓ５０１０へ移行する。一方、空き領域がないと判断された場合（Ｓ５０００：ＮＯ）、以下の処理を実行せず、本異常コード記憶処理を終了する。
【００７４】
Ｓ５０１０では、記憶しようとする異常コードが既に記憶されているか否かを判断する。既に記憶されている場合（Ｓ５０１０：ＹＥＳ）、Ｓ５０２０の処理を実行せず、本異常コード記憶処理を終了する。一方、未だ記憶されていない場合（Ｓ５０１０：ＮＯ）、異常コードを小さい順にソートしてメモリ３９のスタンバイＲＡＭに記憶し（Ｓ５０２０）、その後、本異常コード記憶処理を終了する。
【００７５】
図１４に示す異常コードマスク処理では、最初にマスク対象となる異常コードが１６進表記で「００００」であるか否かを判断する。これは空き領域に「００００」が記憶されているために行う不具合の防止処理である。マスク対象が「００００」であれば（Ｓ６０００：ＹＥＳ）、以降の処理を実行せず、本異常コードマスク処理を終了する。一方、マスク対象が「００００」以外であれば（Ｓ６０００：ＮＯ）、Ｓ６０１０へ移行する。
【００７６】
Ｓ６０１０では、マスク対象となる異常コードが記憶されているか否かを判断する。ここでマスク対象となる異常コードが記憶されていなければ（Ｓ６０１０：ＮＯ）、Ｓ６０２０の処理を実行せず、本異常コードマスク処理を終了する。一方、マスク対象となる異常コードが記憶されていれば（Ｓ６０１０：ＹＥＳ）、Ｓ６０２０にてその異常コードをマスクする。すなわち、異常コードに対応するフラグを立て異常コードを読み出せない状態とする。その後、本異常コードマスク処理を終了する。
【００７７】
以上のように各オブジェクト１００〜４００を構成したことによる本実施例のエンジン制御ユニット１６の発揮する効果を次に述べる。
本実施例のエンジン制御ユニット１６では、異常検出オブジェクト１００が異常検出処理（Ｓ１）を実行することによって（図５参照）、一度異常検出を行った後に２０トリップの間異常検出がなされなかった場合には（図７中のＳ１１２０：ＹＥＳ）、異常時処理オブジェクト３００に対するマスク処理要求を発行する（Ｓ１１４０）。異常時処理オブジェクト３００は異常時処理（Ｓ３）を実行して異常コードマスク要求を発行し、これによって、異常コード記憶オブジェクト４００が異常コードマスク処理（Ｓ５）を実行する。この処理（Ｓ５）は、図１４に示したように、ダイアグ対象に対応する異常コードを検索し（Ｓ６０１０）、ダイアグ対象毎に異常コードをマスクするものである（Ｓ６０２０）。つまり、検出された異常が一時的なものであれば、ダイアグ対象毎に、２０トリップといった比較的早いタイミングで、記憶された異常コードがマスクされる。その結果、例えば修理工場などで異常コードが読み出され、本来は交換する必要のない部品が交換されてしまうことを防止できる。
【００７８】
また、水温センサオブジェクト１１０を例に挙げて上述したように、複数の異常検出手法に対応させてＡ〜Ｃの３つの水温センサオブジェクト１１０ａ，１１０ｂ，１１０ｃを設けた。そして３つのうちのＡ水温センサオブジェクト１１０ａがマスク処理要求を行うのであるが、このときＢ及びＣの両方の水温センサオブジェクト１１０ｂ，１１０ｃで異常検出がなされていない場合に限り（図７中のＳ１１３０：ＹＥＳ）、マスク処理要求を発行する（Ｓ１１４０）。したがって、Ａ水温センサオブジェクト１１０ａにて異常検出がなされていないからと言って、Ｂ又はＣの水温センサオブジェクト１１０ｂ，１１０ｃにて異常検出がなされている場合に異常コードがマスク処理されることはない。
【００７９】
さらにまた、異常検出オブジェクト１００がダイアグ対象に依存する異常検出処理を実行する構成とし、加えて、Ｂ及びＣの水温センサオブジェクト１１０ｂ，１１０ｃの異常検出結果を判断してマスク処理要求を発行するオブジェクトも、異常検出オブジェクト１００であるＡ水温センサオブジェクト１１０ａとした。したがって、ダイアグ対象が変わった場合には、異常検出オブジェクト１００のみを、つまりＡ〜Ｃの３つの水温センサオブジェクト１１０ａ〜１１０ｃ・吸気温センサオブジェクト１２０・スロットルセンサオブジェクト１３０等を変更すればよく、異常確定オブジェクト２００、異常時処理オブジェクト３００、異常コード記憶オブジェクト４００は何等変更する必要がない。そのため、自己診断プログラムの再利用性を確保できる。
【００８０】
なお、Ａ〜Ｃの３つの水温センサオブジェクト１１０ａ〜１１０ｃが相互に異常検出結果を参照してそれぞれがマスク処理要求を発行する構成も考えられるが、Ａ水温センサオブジェクト１１０ａがＢ及びＣの水温センサオブジェクト１１０ｂ，１１０ｃの異常検出結果を参照してマスク処理要求を発行すれば十分である。その理由は、Ｂ又はＣの異常検出処理と比較してＡ水温センサオブジェクト１１０ａの実行するＡ異常検出処理では異常が検出される可能性が相対的に高いからであり、Ａ異常検出処理において水温センサ２０の異常が検出されなかった場合、Ｂ又はＣの異常検出処理で異常が検出される可能性は少ないためである。本実施例では、マスク処理要求を発行するための処理（図６中のＳ１０６０，Ｓ１０８０，Ｓ１０９０，Ｓ１１００，図７中のＳ１１２０，Ｓ１１３０，Ｓ１１４０）をＡ水温センサオブジェクト１１０ａのみが有するため、自己診断プログラムをトータルで見た場合に、処理プログラムが簡略化されるという面において、また、判断処理が少なくなり処理負荷が軽減されるという面において有利である。
【００８１】
ところで、異常確定オブジェクト２００にて実行される各異常確定処理を異常検出オブジェクト１００が実行する構成とすることもできる。しかし、異常確定処理は、異常を検出する場合の共通の処理であるため、本実施例では、異常確定オブジェクト２００が実行するようにした。これによって、自己診断プログラムの構成が簡単になると共に、ダイアグ対象の変更によって異常検出オブジェクト１００を変更する場合、この共通の処理を作成／変更する必要がないため、さらなる再利用性を図ることができる。
【００８２】
また、本実施例では、異常時処理オブジェクト３００を設けた。この異常時処理オブジェクト３００は、異常コードの記憶／マスク要求だけでなく、警告灯２５の点灯／消灯要求も発行し（図３参照）、図示しないオブジェクトによって警告灯２５の点灯／消灯が行われる。このような異常時の処理を統括する異常時処理オブジェクト３００を備える構成としたため、本実施例では、自己診断プログラムの全体構成が分かり易くなると共に拡張性が高くなっている。
【００８３】
以上、本発明はこのような実施形態に何等限定されるものではなく、本発明の主旨を逸脱しない範囲において種々なる形態で実施し得る。
例えば上記実施例では、異常コードをマスクすることによって読み出せなくする構成であった。この場合、メモリ３９のスタンバイＲＡＭ内には異常コードが残っているため、修理工場などにおける通常操作では読み出せないが、特別な操作をすれば異常時情報を読み出して参照することができるという点で有利である。これに対して、メモリ３９のスタンバイＲＡＭに記憶された異常コードを消去してしまう構成とすることも当然できる。
【００８４】
また、上記実施例ではメモリ３９内のスタンバイＲＡＭに異常コードを記憶していたが、イグニッションスイッチがオフの状態となっても記憶内容が失われないメモリ装置であればよく、スタンバイＲＡＭには限られない。例えばＥＥＰＲＯＭに異常コードを記憶する構成としても差し支えない。
【図面の簡単な説明】
【図１】実施例のエンジン制御システムを示す構成図である。
【図２】実施例のエンジン制御ユニットの構成を示すブロック図である。
【図３】自己診断プログラムの構造を概念的に示した説明図である。
【図４】異常コードの記憶手順を示すＭＳＣである。
【図５】異常コードのマスク手順を示すＭＳＣである。
【図６】Ａ異常検出処理の前半部分を示すフローチャートである。
【図７】Ａ異常検出処理の後半部分を示すフローチャートである。
【図８】Ｂ異常検出処理を示すフローチャートである。
【図９】演算対象値更新処理を示すフローチャートである。
【図１０】Ｃ異常検出処理の前半部分を示すフローチャートである。
【図１１】Ｃ異常検出処理の後半部分を示すフローチャートである。
【図１２】異常確定処理を示すフローチャートである。
【図１３】異常コード記憶処理を示すフローチャートである。
【図１４】異常コードマスク処理を示すフローチャートである。
【符号の説明】
１１…エンジン
１２…吸気管
１３…エアフローセンサ
１４…吸気温センサ
１５…スロットル弁
１６…エンジン制御ユニット
１７…スロットルセンサ
１８…空燃比センサ
１９…バッテリ
２０…水温センサ
２１…ディストリビュータ
２２ａ，２２ｂ，２２ｃ，２２ｄ
…インジェクタ
２３…イグナイタ
２４…テストスイッチ
２５…警告灯
２６…イグニッションスイッチ
２７…スタータモータ
２８…スタータスイッチ
３２…アナログ入力回路
３３…ディジタル入力回路
３４…Ａ／Ｄ変換器
３５…電源回路
３６，３７，３８
…出力回路
３９…メモリ
１００…異常検出オブジェクト
１１０…水温センサオブジェクト
１１０ａ…Ａ水温センサオブジェクト
１１０ｂ…Ｂ水温センサオブジェクト
１１０ｃ…Ｃ水温センサオブジェクト
１２０…吸気温センサオブジェクト
１３０…スロットルセンサオブジェクト
２００…異常確定オブジェクト
３００…異常時処理オブジェクト
４００…異常コード記憶オブジェクト
【図１】
0004265071.tif 000002
【図２】
0004265071.tif 000003
【図３】
0004265071.tif 000004
【図４】
0004265071.tif 000005
【図５】
0004265071.tif 000006
【図６】
0004265071.tif 000007
【図７】
0004265071.tif 000008
【図８】
0004265071.tif 000009
【図９】
0004265071.tif 000010
【図１０】
0004265071.tif 000011
【図１１】
0004265071.tif 000012
【図１２】
0004265071.tif 000013
【図１３】
0004265071.tif 000014
【図１４】
0004265071.tif 000015