燃焼室内に燃料を直接噴射する筒内用燃料噴射弁と、吸気通路に燃料を噴射する吸気通路用燃料噴射弁とを備え、噴き分け率の異なる複数の噴射状態のうちの1つの噴射状態に選択的に切り替えることが可能な内燃機関の失火異常検出装置であって、失火が発生した際の前記内燃機関の運転状態と噴射状態とを記憶し、前記複数の噴射状態ごとに異常時運転状態を求めるとともに、所定の期間内で失火が発生した際の前記複数の噴射状態の中から所定の条件に基づいて異常時噴射状態を決定し、その決定した異常時噴射状態での前記異常時運転状態を記憶することを特徴とする内燃機関の失火異常検出装置。請求項1記載の内燃機関の失火異常検出装置において、前記所定の期間内で発生した各噴射状態ごとの失火の回数に基づいて異常時噴射状態を決定することを特徴とする内燃機関の失火異常検出装置。請求項1または2記載の内燃機関の失火異常検出装置において、前記決定した異常時噴射状態と同一の噴射状態であり、かつ、前記記憶した異常時運転状態と類似運転状態であるときに、正常復帰判定を行うことを特徴とする内燃機関の失火異常検出装置。請求項3記載の内燃機関の失火異常検出装置において、前記類似運転状態とは、前記記憶した異常時運転状態と同一の機関運転状態、または、当該異常時運転状態に対して予め設定された所定範囲内にある機関運転状態であることを特徴とする内燃機関の失火異常検出装置。請求項1~4のいずれか1つに記載の内燃機関の失火異常検出装置において、前記機関運転状態とは、機関回転数、機関負荷率、暖機状態であり、前記噴射状態とは、筒内用燃料噴射弁のみによって燃料を噴射する噴射状態、吸気通路用燃料噴射弁のみによって燃料を噴射する噴射状態、筒内用燃料噴射弁及び吸気通路用燃料噴射弁によって燃料を噴射する噴射状態であることを特徴とする内燃機関の失火異常検出装置。ところで、上記した失火異常検出方法では、失火カウンタのカウント数が所定値以上となったときに、単に、機関運転状態及び噴射状態を記憶しているのみであるため、その記憶した噴射状態と実際に失火が発生した機関運転状態とが乖離する場合がある。例えば、失火が発生した機関運転状態が筒内噴射状態であるのにも関わらず、その失火が発生した噴射状態がデュアル噴射状態であると記憶する場合がある。こうした状況になると、正常復帰判定を適正に行えなくなる場合がある。本発明はそのような実情を考慮してなされたもので、筒内に向けて燃料を噴射する筒内噴射用インジェクタと、吸気通路内に向けて燃料を噴射する吸気通路噴射用インジェクタとを備えた内燃機関であって、失火が発生したときの噴射状態に合わせて異常時運転状態を記憶することが可能な失火検出装置を備えた内燃機関を提供することを目的とする。本発明は、燃焼室内に燃料を直接噴射する筒内用燃料噴射弁と、吸気通路に燃料を噴射する吸気通路用燃料噴射弁とを備え、噴き分け率の異なる複数の噴射状態のうちの1つの噴射状態に選択的に切り替えることが可能な内燃機関の失火異常検出装置を前提としている。そして、このような失火異常検出装置において、失火が発生した際の前記内燃機関の運転状態と噴射状態とを記憶し、前記複数の噴射状態ごとに異常時運転状態を求めるとともに、所定の期間内で失火が発生した際の複数の噴射状態の中から所定の条件に基づいて異常時噴射状態を決定し、その決定した異常時噴射状態での前記異常時運転状態を記憶することを技術的特徴としている。より具体的には、前記処理にて決定した異常時噴射状態と、この異常時噴射状態における異常時運転状態とを対応づけて記憶することを特徴としている。本発明において、前記処理により決定した異常時噴射状態と同一の噴射状態であり、かつ、前記処理により記憶した異常時運転状態と類似運転状態であるときに、正常復帰判定を行うようにする。なお、類似運転状態とは、前記処理により記憶した異常時運転状態と同一の機関運転状態、または、当該異常時運転状態に対して予め設定された所定範囲内にある機関運転状態のことである。本発明によれば、失火が発生したときの噴射状態に合わせて異常時運転状態を記憶することができるので、失火異常検出の後に、正常復帰判定を実施するにあたり、その正常復帰判定を適正に行うことができる。ここで、本発明において、噴き分け率の異なる複数の噴射状態としては、例えば、筒内用燃料噴射弁のみによって燃料を噴射する噴射状態DI噴射、吸気通路用燃料噴射弁のみによって燃料を噴射する噴射状態PFI噴射、筒内用燃料噴射弁及び吸気通路用燃料噴射弁によって燃料を噴射する噴射状態DUAL噴射を挙げることができる。本発明において、上記した異常時噴射状態を決定する際の具体的な手法としては、所定の期間失火異常の検出期間:図8参照内で発生する、各噴射状態ごとの失火の回数具体的には、各噴射状態ごとの失火カウンタのカウント値に基づいて決定するという方法を挙げることができる。この場合、例えば、所定の期間内おいて失火回数が最も多い噴射状態を異常時噴射状態と決定するようにしてもよい。また、例えば、噴き分け率が異なる複数の噴射状態が、DUAL噴射、DI噴射、PFI噴射の3つの形態である場合、DUAL噴射での失火回数が所定の判定値以上である場合は、DUAL噴射を異常時噴射状態DUAL異常と決定する。一方、DUAL噴射での失火回数が判定値未満である場合は、DI噴射での失火回数とPFI噴射での失火回数とを比較し、DI噴射での失火回数の方が多い場合はDI噴射を異常噴射状態DI異常と決定し、PFI噴射での失火回数の方が多い場合にはPFI噴射を異常時噴射状態PFI異常と決定するようにしてもよい。本発明によれば、失火が発生したときの噴射状態に合わせて異常時運転状態を記憶することができるので、失火異常検出の後に、正常復帰判定を実施するにあたり、その正常復帰判定を適正に行うことができる。以下、本発明の実施形態を図面に基づいて説明する。-エンジン-図1は本発明を適用するエンジンの概略構成を示す図である。なお、図1にはエンジンの1気筒の構成のみを示している。この例のエンジン1は、車両に搭載される4気筒第1気筒1~第4気筒4のガソリンエンジンであって、その各気筒を構成するシリンダブロック1a内には上下方向に往復動するピストン1cが設けられている。ピストン1cはコネクティングロッド16を介してクランクシャフト15に連結されており、ピストン1cの往復運動がコネクティングロッド16によってクランクシャフト15の回転へと変換される。クランクシャフト15にはシグナルロータ17が取り付けられている。シグナルロータ17の外周面には複数の歯突起17aが等角度この例では、例えば10°CAクランク過度ごとに設けられている。また、シグナルロータ17は、歯17aの2枚分が欠落した欠歯部17bを有している。シグナルロータ17の側方近傍には、クランク角を検出するクランクポジションセンサエンジン回転数センサ201が配置されている。クランクポジションセンサ201は、例えば電磁ピックアップであって、クランクシャフト15が回転する際にシグナルロータ17の歯17aに対応するパルス状の信号電圧パルスを発生する。このクランクポジションセンサ201の出力信号からエンジン回転数NEを算出することができる。エンジン1のシリンダブロック1aにはエンジン冷却水の水温を検出する水温センサ203が配置されている。また、シリンダブロック1aの上端にはシリンダヘッド1bが設けられており、このシリンダヘッド1bとピストン1cとの間に燃焼室1dが形成されている。エンジン1の燃焼室1dには点火プラグ3が配置されている。点火プラグ3の点火タイミングはイグナイタ4によって調整される。イグナイタ4はECUElectronicControlUnit100によって制御される。エンジン1のシリンダブロック1aの下部には、潤滑油エンジンオイルを貯留するオイルパン18が設けられている。オイルパン18に貯留された潤滑油は、エンジン1の運転時に、異物を除去するオイルストレーナを介してオイルポンプ図示せずによって汲み上げられて、ピストン1c、クランクシャフト15、コネクティングロッド16などエンジン各部に供給され、その各部の潤滑冷却等に使用される。そして、このようにして供給された潤滑油は、エンジン各部の潤滑冷却等のために使用された後、オイルパン18に戻され、再びオイルポンプによって汲み上げられるまでオイルパン18内に貯留される。エンジン1の燃焼室1dには吸気通路11と排気通路12とが接続されている。吸気通路11の一部は吸気ポート11a及び吸気マニホールド11bによって形成されている。また、排気通路12の一部は排気ポート12a及び排気マニホールド12bによって形成されている。吸気通路11には、吸入空気新気を濾過するエアクリーナ7、エアフロメータ204、吸気温センサ207、及び、エンジン1の吸入空気量を調整するためのスロットルバルブ5などが配置されている。エアフロメータ204は、吸入空気量新規空気量を検出する。吸気温センサ207は、エンジン1に吸入される空気の温度吸気温を検出する。スロットルバルブ5のスロットル開度はECU100によって駆動制御される。具体的には、クランクポジションセンサ201の出力信号から算出されるエンジン回転数NE、及び、ドライバのアクセルペダル踏み込み量アクセル開度等のエンジン1の運転状態に応じた最適な吸入空気量目標吸気量が得られるようにスロットルバルブ5のスロットル開度を制御している。より詳細には、スロットル開度センサ205を用いてスロットルバルブ5の実際のスロットル開度を検出し、その実スロットル開度が、上記目標吸気量が得られるスロットル開度目標スロットル開度に一致するようにスロットルバルブ5のスロットルモータ6をフィードバック制御している。なお、こうしたスロットルバルブ5の制御システムは、電子スロットルシステムと称されており、アイドリング運転時などにおいて、ドライバのアクセルペダルの操作とは独立してスロットル開度を制御することも可能である。吸気通路11と燃焼室1dとの間に吸気バルブ13が設けられており、この吸気バルブ13を開閉駆動することにより、吸気通路11と燃焼室1dとが連通または遮断される。また、排気通路12と燃焼室1dとの間に排気バルブ14が設けられており、この排気バルブ14を開閉駆動することにより、排気通路12と燃焼室1dとが連通または遮断される。これら吸気バルブ13及び排気バルブ14の開閉駆動は、クランクシャフト15の回転がタイミングチェーン等を介して伝達される吸気カムシャフト21及び排気カムシャフト22の各回転によって行われる。吸気カムシャフト21の近傍には、特定の気筒例えば第1気筒1のピストン1cが圧縮上死点TDCに達したときにパルス状の信号を発生するカムポジションセンサ202が設けられている。カムポジションセンサ202は、例えば電磁ピックアップであって、吸気カムシャフト21に一体的に設けられたロータ外周面の1個の歯図示せずに対向するように配置されており、その吸気カムシャフト21が回転する際にパルス状の信号電圧パルスを出力する。なお、吸気カムシャフト21及び排気カムシャフト22は、クランクシャフト15の1/2の回転速度で回転するので、クランクシャフト15が2回転720°回転するごとにカムポジションセンサ202が1つのパルス状の信号を発生する。このようなカムポジションセンサ202及び上記クランクポジションセンサ201の各出力信号から、エンジン運転時において、エンジン1の各気筒第1気筒1~第4気筒4のピストン位置吸入行程圧縮行程爆発行程排気行程を認識することができ、精密な燃料噴射制御や点火時期制御などのエンジン運転制御を行うことができる。一方、排気通路12には三元触媒9が配置されている。三元触媒9においては、燃焼室1dから排気通路12に排気された排気ガス中のCO、HCの酸化及びNOxの還元が行われ、それらを無害なCO2、H2O、N2とすることで排気ガスの浄化が図られている。三元触媒9の上流側排気流れの上流側の排気通路12に空燃比A/Fセンサ209が配置されている。空燃比センサ209は、空燃比に対してリニアな特性を示すセンサである。また、三元触媒9の下流側の排気通路12にはO2センサ210が配置されている。O2センサ210は、排気ガス中の酸素濃度に応じて起電力を発生するものであって、理論空燃比に相当する電圧比較電圧よりも出力が高いときはリッチと判定し、逆に比較電圧よりも出力が低いときはリーンと判定する。<燃料噴射系>次に、エンジン1の燃料噴射系について説明する。エンジン1の各気筒には、それぞれ、各燃焼室1d内に燃料を直接噴射することが可能な筒内噴射用インジェクタ筒内用燃料噴射弁2aが配置されている。これら筒内噴射用インジェクタ2aは、共通の高圧燃料用デリバリパイプ20aに接続されている。また、エンジン1の吸気通路11には、各吸気ポート11a内に燃料を噴射可能なポート噴射用インジェクタ吸気通路用燃料噴射弁2bが配置されている。ポート噴射用インジェクタ2bは各気筒毎に設けられている。これらポート噴射用インジェクタ2bは共通の低圧燃料用デリバリパイプ20bに接続されている。上記高圧燃料用デリバリパイプ20a、及び、上記低圧燃料用デリバリパイプ20bへの燃料供給は、低圧ポンプとしてのフィードポンプ301及び高圧ポンプ302によって行われる。フィードポンプ301は、燃料タンク300内の燃料ガソリン等を汲み上げて、低圧燃料用デリバリパイプ20b及び高圧ポンプ302に供給する。高圧ポンプ302は、フィードポンプ301からの低圧燃料を加圧して高圧燃料用デリバリパイプ20aに供給する。筒内噴射用インジェクタ2aは、所定電圧が印加されたときに開弁して燃焼室1d内に燃料を直接噴射する電磁駆動式の開閉弁である。筒内噴射用インジェクタ2aの開閉噴射時間噴射タイミングは、ECU100によってデューティ制御される。ポート噴射用インジェクタ2bも、同様に、所定電圧が印加されたときに開弁して吸気ポート11a内に燃料を噴射する電磁駆動式の開閉弁である。ポート噴射用インジェクタ2bについても、ECU100によって開閉噴射時間噴射タイミングがデューティ制御される。なお、筒内噴射用インジェクタ2aによる燃料噴射DI噴射と、ポート噴射用インジェクタ2bによる燃料噴射PFI噴射との噴き分け率PFI噴き分け率:KPFI等については後述する。そして、以上の筒内噴射用インジェクタ2a及びポート噴射用インジェクタ2bのいずれか一方または両方のインジェクタからの燃料噴射により、燃焼室1b内に混合気燃料空気が形成される。この混合気は点火プラグ3にて点火されて燃焼爆発する。このときに生じた高温高圧の燃焼ガスによりピストン1cが往復動され、クランクシャフト15が回転されてエンジン1の駆動力出力トルクが得られる。燃焼室1d内で燃焼した燃焼ガスは、排気バルブ14の開弁にともない排気通路12に排出される。-ECU-ECU100は、図2に示すように、CPUCentralProcessingUnit101、ROMReadOnlyMemory102、RAMRandomAccessMemory103、バックアップRAM104、失火カウンタ110、及び、検出期間カウンタ120などを備えている。ROM102は、各種制御プログラムや、それら各種制御プログラムを実行する際に参照されるマップ等が記憶されている。CPU101は、ROM102に記憶された各種制御プログラムやマップに基づいて各種の演算処理を実行する。また、RAM103は、CPU101での演算結果や各センサから入力されたデータ等を一時的に記憶するメモリであり、バックアップRAM104は、例えばエンジン1の停止時にその保存すべきデータ等を記憶する不揮発性のメモリである。検出期間カウンタ120は、エンジン1の累積回転数Revを計測するカウンタであって、この検出期間カウンタ120のカウント値が、例えば1000Revに達した時点で、1回の失火検出期間図8参照を終了する。失火カウンタ110は、後述するように、エンジン1の各気筒1~4の回転変動量ΔNEが失火判定閾値を超える度に、カウント値が1つずつカウントアップインクリメントする総失火カウンタと、噴射状態DUAL噴射、DI噴射、PFI噴射ごとに失火回数をカウントする失火時DUALカウンタ、失火時DIカウンタ、及び、失火時PFIカウンタとを備えている。この例の失火カウンタ110にあっては、図8に示す検出期間中に失火が発生したときには、その失火が発生するごとに総失火カウンタのカウント値が1つずつカウントアップされ、その失火発生時の噴射状態に応じて失火時DUALカウンタ、失火時DIカウンタ、または、失火時PFIカウンタのカウント値が1つずつカウントアップされる。以上のCPU101、ROM102、RAM103及びバックアップRAM104、並びに失火カウンタ110及び検出期間カウンタ120は、バス107を介して互いに接続されるとともに、入力インターフェース105及び出力インターフェース106と接続されている。入力インターフェース105には、クランクポジションセンサエンジン回転数センサ201、カムポジションセンサ202、水温センサ203、エアフロメータ204、スロットル開度センサ205、アクセルペダルの踏み込み量に応じた検出信号を出力するアクセル開度センサ206、吸気温センサ207、インマニ圧センサ208、空燃比センサ209、O2センサ210、筒内噴射用インジェクタ2aに供給する高圧燃料の圧力燃圧を検出する高圧燃料用燃圧センサ211、及び、ポート噴射用インジェクタ2bに供給する低圧燃料の圧力燃圧を検出する低圧燃料用燃圧センサ212などの各種センサ類が接続されている。また、入力インターフェース105にはイグニッションスイッチ213が接続されており、このイグニッションスイッチ213がオン操作IG-ONされると、スタータモータ図示せずによるエンジン1のクランキングが開始される。出力インターフェース106には、筒内噴射用インジェクタ2a、ポート噴射用インジェクタ2b、点火プラグ3のイグナイタ4、及び、スロットルバルブ5のスロットルモータ6などが接続されている。そして、ECU100は、上記した各種センサの検出信号に基づいて、下記の燃料噴射量制御、点火プラグ3の点火時期制御、及び、スロットルバルブ5のスロットルモータ6の駆動制御吸入空気量制御などを含むエンジン1の各種制御を実行する。さらに、ECU100は、下記の失火検出処理及び失火異常検出処理を実行する。以上のECU100により実行されるプログラムによって本発明の内燃機関エンジン失火検出装置が実現される。-燃料噴射量制御-まず、ECU100のROM102には、図3に示す噴き分け率マップが記憶されている。図3の噴き分け率マップは、エンジン1の運転状態を示すエンジン回転数NE及び負荷率KLをパラメータとして、燃費燃料消費率特性や出力特性などを考慮して、燃料噴射形態を実験シミュレーション等によって適合したマップであって、筒内噴射用インジェクタ2aのみによって燃料が噴射されるDI領域直噴領域、ポート噴射用インジェクタ2bのみによって燃料が噴射されるPFI領域ポート噴射領域、及び、筒内噴射用インジェクタ2a及びポート噴射用インジェクタ2bによって燃料が噴射されるDUAL領域直噴及びポート噴射領域PFIDIが設定されている。そして、ECU100は、クランクポジションセンサ201の出力信号から得られるエンジン回転数NE及びエンジン負荷率KLに基づいて、図3のマップを参照して燃料噴射の噴き分け率ポート噴射用インジェクタ2bから噴射する燃料の噴き分け率KPFIを求め、その噴き分け率KPFI及び要求噴射量に基づいて噴射時間及び噴射タイミングを算出して燃料噴射を実行する。具体的には、エンジン運転状態エンジン回転数NE負荷率KLが、DI領域噴き分け率KPFI=0である場合、DI要求噴射量、高圧燃料用燃圧センサ211の出力信号から得られる燃圧、及び、筒内噴射用インジェクタ2aの容量流量サイズに基づいて、筒内噴射用インジェクタ2aから噴射する高圧燃料のDI噴射時間及びDI噴射タイミングを算出し、その算出したDI噴射時間及びDI噴射タイミングに基づいて筒内噴射用インジェクタ2aを開閉制御して燃料噴射を実行する。エンジン運転状態エンジン回転数NE負荷率KLが、PFI領域噴き分け率KPFI=100である場合、PFI要求噴射量、低圧燃料用燃圧センサ212の出力信号から得られる燃圧、及び、ポート噴射用インジェクタ2bの容量流量サイズに基づいてポート噴射用インジェクタ2bから噴射する低圧燃料のPFI噴射時間、及び、PFI噴射タイミングを算出し、その算出したPFI噴射時間及びPFI噴射タイミングに基づいてポート噴射用インジェクタ2bを開閉制御して燃料噴射を実行する。エンジン運転状態エンジン回転数NE負荷率KLが、DUAL領域0<噴き分け率KPFI<100である場合、噴き分け率KPFIに基づいて筒内噴射用インジェクタ2aのDI要求噴射量全体要求噴射量×1-噴き分け率KPFI/100と、ポート噴射用インジェクタ2bのPFI要求噴射量全体要求噴射量×噴き分け率KPFI/100とを求め、上記と同様にして、DI噴射時間及びDI噴射タイミングと、PFI噴射時間及びPFI噴射タイミングとを算出する。そして、その算出したDI噴射時間及びDI噴射タイミングに基づいて筒内噴射用インジェクタ2aを開閉制御するとともに、算出したPFI噴射時間及びPFI噴射タイミングに基づいてポート噴射用インジェクタ2bを開閉制御して燃料噴射を実行する。ここで、上記要求噴射量は、エンジン1で燃焼された混合気の空燃比が理論空燃比となる燃料の量であって、例えば、エンジン運転状態エンジン回転数NE及びエンジン負荷率KLに基づいてマップ等を用いて算出することができる。また、エンジン負荷率KLは、例えば、エンジン回転速度NE、エアフロメータ204の出力信号から得られる吸入空気量、スロットル開度センサ205の出力信号から得られるスロットル開度などに基づいてマップ等を用いて算出することができる。-失火検出処理-次に、ECU100が実行する失火検出処理について説明する。まず、エンジン1の4つの気筒1~4のうち、ある気筒例えば第1気筒1に失火が発生した場合、その気筒複数の気筒の場合も含むの爆発行程におけるエンジン回転速度が低下するので、この失火が生じた気筒第1気筒1の爆発行程中においてクランクシャフト15が一定クランク角度を回転するのに要する時間が、他の気筒例えば第2気筒2~第4気筒4の爆発行程時におけるその時間よりも長くなる。したがって、これらの時間を計測して比較することにより失火の発生を認識することが可能になる。その具体的な処理の一例について説明する。まず、ECU100は、クランクポジションセンサエンジン回転数センサ201及びカムポジションセンサ202の各出力信号を所定のクランク角度毎例えば30°CA毎に取り込み、それらの各信号に基づいて、第1気筒1が爆発行程にあるときに、この爆発行程中において、クランクシャフト15が一定クランク角度例えば180°CAを回転するのに要する経過時間T1と、この第1気筒1の爆発行程よりも1回前360°CA前に爆発行程を迎えていた第2気筒2の爆発行程中においてクランクシャフト15が一定のクランク角度例えば180°CAを回転するのに要する経過時間T2との差を演算して、第1気筒1の回転変動量ΔNE1=T1-T2を得る。また、同様にして、エンジン1の各気筒2~4の爆発行程中においてクランクシャフト15が一定クランク角度例えば180°CAを回転するのに要する経過時間T3第3気筒3、T4第4気筒4、T2第2気筒2を順次演算して、第3気筒3の回転変動量ΔNE3=T3-T1、第4気筒4の回転変動量ΔNE4=T4-T3、及び、第2気筒2の回転変動量ΔNE2=T2-T4を得る。そして、ECU100は、上記演算により求めた各気筒1~4の回転変動量ΔNE1~ΔNE4と失火判定閾値とを比較し、回転変動量ΔNEが失火判定閾値を超えている気筒がある場合は失火が発生していると判定する。そして、この回転変動量ΔNEが失火判定閾値を超える度に、ECU100に備えられている失火カウンタ総失火カウンタ110が1つずつインクリメントされる。ここで、回転変動量ΔNEに対して設定する失火判定閾値は、失火が発生するエンジン1の回転変動量を実験シミュレーション等によって取得しておき、その結果を基に経験的に適合した値である。この失火判定閾値はECU100のROM102内に記憶されている。また、失火判定閾値は、回転変動量ΔNEなどに応じて可変に設定するようにしてもよい。なお、各気筒1~4の回転変動量は、他の公知の方法によって認識演算するようにしてもよい。また、エンジン1の失火を検出する方法としては、上記したエンジン1の回転変動量を用いて失火を検出する方法に限られることなく、例えば、触媒の前後に配置された空燃比センサとO2センサ酸素センサとの出力信号2つのセンサ検出値の差に基づいて失火の発生を検出する方法など、他の公知の方法を採用してもよい。-失火異常検出処理-まず、上述したように、従来の失火異常検出方法にあっては、失火カウンタのカウント数が所定値以上となったときに、単に、機関運転状態及び噴射状態を記憶しているのみであるため、その記憶した噴射状態と実際に失火が発生した機関運転状態異常時運転状態とが乖離する場合がある。例えば、図6に示すように、失火が発生した異常時運転状態がPFI領域ポート噴射領域内のポイントであるのにも関わらず、異常時噴射状態をDUAL噴射状態と記憶してしまう場合がある。こうした状況になると、DUAL領域と正常判定領域とを同時に満たす領域図中のハッチング領域が狭くなるため、正常復帰判定が難しくなる。このような点を解消するため、本実施形態では、失火異常が発生した際の運転状態に合わせた異常時運転状態を記憶できるようにする。その具体的な処理の例失火異常検出処理について図4のフローチャートを参照して説明する。図4の処理ルーチンはECU100において例えば数msecごとに繰り返して実行される。ここで、本実施形態において対象とする運転状態は、エンジン回転数NE、負荷率KL及び暖機状態とする。また、暖機状態は、冷間時水温が暖機温度例えば80°C未満の状態と高温時水温が暖機温度以上の状態のいずれか一方の状態とする。また、本実施形態にあっては、図4の制御ルーチンが開始された時点からECU100内の検出期間カウンタ120のカウントが開始され別ルーチンでカウント、エンジン1クランクシャフト15が1回転1Revするごとに、検出期間カウンタ120のカウント値が1つずつカウントアップされる。なお、ECU100は、クランクポジションセンサ201の出力信号に基づいてエンジン1の回転数を認識している。図4の制御ルーチンが開始されると、まずは、ステップST101において、失火カウンタ総失火カウンタ110のカウント値がアップされたか否かを判定する。ステップST101の判定結果が否定判定NOである場合失火カウンタ110のカウントアップがない場合はリターンする。ステップST101の判定結果が肯定判定YESである場合失火カウンタ110のカウントアップがある場合はステップST102に進む。ステップST102では、失火が発生したとき失火カウンタ110のカウントアップがあったときの異常時噴射状態がDUAL噴射DUAL異常であるか否かを判定する。その判定結果が肯定判定YESである場合はステップST103に進む。なお、DUAL異常時である場合、失火カウンタ110の失火時DUALカウンタのカウント値がインクリメントされる。ステップST103ではDUAL異常時運転状態を更新する。その後にステップST105に進む。このステップST102で実行する異常時運転状態の更新処理について、各運転状態エンジン回転数NE、負荷率KL、暖機状態ごとに具体的に説明する。エンジン回転数NE失火異常時失火カウンタ110のカウントアップ時のエンジン回転数NEに対して下記の式1によりなまし処理1/2なまし処理を施してエンジン回転数NEを更新する更新値を算出する。NE=NENE/21この式1において、NEは今回の失火異常時DUAL異常時のエンジン回転数、NEは前回の失火異常時DUAL異常時のエンジン回転数である。なお、上記式1を用いた場合、例えば、前回の失火異常時のエンジン回転数NEが1200rpmであり、今回の失火異常時のエンジン回転数NEが1400rpmである場合、エンジン回転数NEの更新値は1300rpmとなり、次回の失火異常時のエンジン回転数NEが1600rpmである場合、その時点でのエンジン回転数NEの更新値は1450rpmとなる。負荷率KL失火異常時失火カウンタ110のカウントアップ時の負荷率KLに対して下記の式2によりなまし処理1/2なまし処理を施して負荷率KLを更新する更新値を算出する。KL=KLKL/22この式2において、KLは今回の失火異常時DUAL異常時の負荷率、KLは前回の失火異常時DUAL異常時の負荷率である。なお、上記式2を用いた場合、例えば、前回の失火異常時の負荷率KLが30であり、今回の失火異常時の負荷率KLが40である場合、負荷率KLの更新値は35となり、次回の失火異常時の負荷率KLが45である場合、その時点での負荷率KLの更新値は40となる。暖機状態失火異常時失火カウンタ110のカウントアップ時の暖機状態については、最新の状態冷間時または高温時に順次更新していく。例えば、前回の失火異常時DUAL異常時の暖機状態が高温時であり、今回の失火異常時DUAL異常時の暖機状態が冷間時である場合は、暖機状態を冷間時に更新する。また、このような更新処理に替えて、検出期間中図8参照に、1度でも冷間時に失火異常DUAL異常時が発した場合は、暖機状態の更新値を冷間時に固定するようにしてもよい。上記ステップST102の判定結果が否定判定NOである場合、ステップST104に進む。ステップST104では、失火が発生したとき失火カウンタ110のカウントアップがあったときの異常時噴射状態がDI噴射DI異常であるか否かを判定する。その判定結果が肯定判定YESである場合はステップST113に進む。なお、DI異常時である場合、失火カウンタ110の失火時DIカウンタのカウント値がインクリメントされる。ステップST113では、上記したステップST103と同様な処理により、DI異常時の運転状態を更新する。つまり、失火異常時DI異常時のエンジン回転数NE及び負荷率KLについては、上記した式1及び式2によりなまし処理を施して、DI異常時におけるエンジン回転数NE及び負荷率KLを更新する。また、DI異常時の暖機状態については、最新の状態冷間時または高温時に更新するもしくは、検出期間中に冷間時異常があれば、暖機状態を冷間時に固定する。この更新処理を行った後にステップST105に進む。上記ステップST104の判定結果が否定判定NOである場合、つまり、失火が発生したとき失火カウンタ110のカウントアップがあったときの異常時噴射状態がPFI噴射である場合はステップST123に進む。なお、PFI異常時である場合、失火カウンタ110の失火時PFIカウンタのカウント値がインクリメントされる。ステップST123では、上記したステップST103と同様な処理により、PFI異常時の運転状態を更新する。つまり、失火異常時PFI異常時のエンジン回転数NE及び負荷率KLについては、上記した式1及び式2によりなまし処理を施して、PFI異常時におけるエンジン回転数NE及び負荷率KLを更新する。また、PFI異常時の暖機状態については、最新の状態冷間時または高温時に更新するもしくは、検出期間中に冷間時異常があれば、暖機状態を冷間時に固定する。この更新処理を行った後にステップST105に進む。ステップST105では、検出期間カウンタ120のカウント値が1000Revに達しているか否かを判定する。その判定結果が否定判定NOである場合図8に示す検出期間内である場合はリターンしてステップST101に戻る。以降、[ステップST101~ステップST103]、[ステップST101、ステップST102、ステップST104、ステップST113]、または、[ステップST101、ステップST102、ステップST104、ステップST123]の処理が、ステップST105の判定結果が肯定判定YESとなるまで順次繰り返して実行され、その繰り返し処理の過程において、失火が発生するごとに、その失火発生時の噴射状態に応じて、上述したDUAL異常時運転状態、DI異常時運転状態、及び、PFI異常時運転状態がそれぞれ更新されていく。そして、検出期間カウンタ120のカウント値が1000Revに達した時点ステップST105の判定結果が肯定判定YESとなった時点でステップST106に進む。ここで、検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時での、DUAL異常時運転状態の更新値最終なまし値等、DI異常時運転状態の更新値最終なまし値等、PFI異常時運転状態の更新値最終なまし値等を、例えばRAM103内に記憶しておく。ステップST106では異常時噴射状態を決定する。具体的には、上記失火時DUALカウンタのカウント値が所定の判定値以上である場合、DUAL噴射を異常時噴射状態DUAL異常と決定する。一方、失火時DUALカウンタのカウント値が判定値未満である場合、上記失火時DIカウンタのカウント値と、上記失火時PFIカウンタのカウント値とを比較し、カウント値が大きい方の噴射状態を異常時噴射状態と決定する。つまり、失火時DIカウンタのカウント値の方が大きい場合は、DI噴射を異常時噴射状態DI異常と決定し、失火時PFIカウンタのカウント値の方が大きい場合は、PFI噴射を異常時噴射状態PFI異常と決定する。なお、上記ステップST106において異常時噴射状態を決定する処理が、本発明でいう所定の期間内で失火が発生した際の複数の噴射状態の中から所定の条件に基づいて異常時噴射状態を決定することに相当する。ここで、上記失火時DUALカウンタのカウント値に対して設定する判定値は、1であってもよいし、2以上の正の整数であってもよい。また、失火時DIカウンタのカウント値及び失火時PFIカウンタのカウント値に対しても判定値を設定しておき、その各カウント値がともに判定値未満である場合は、失火異常なしと判定するようにしてもよい。次に、ステップST107において、上記ステップST106で決定した異常時噴射状態がDUAL異常であるか否かを判定し、その判定結果が肯定判定YESである場合はステップST108に進む。ステップST108では、上記検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時でのDUAL異常時運転状態の更新値を、例えばRAM103内に記憶する。具体的には、上記ステップST106において決定した異常時噴射状態この場合はDUAL異常とそのDUAL異常時運転状態の更新値エンジン回転数NE、負荷率KL、暖機状態とを対応づけて記憶する。ステップST107の判定結果が否定判定NOである場合はステップST109に進む。ステップST109では、上記ステップST106で決定した異常時噴射状態がDI異常であるか否かを判定し、その判定結果が肯定判定YESである場合はステップST118に進む。ステップST118では、上記検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時でのDI異常時運転状態の更新値を、例えばRAM103内に記憶する。具体的には、上記ステップST106において決定した異常時噴射状態この場合はDI異常とそのDI異常時運転状態エンジン回転数NE、負荷率KL、暖機状態の更新値とを対応づけて記憶する。上記ステップST107の判定結果が否定判定NOである場合、つまり、上記ステップST106で決定した異常時噴射状態がPFI異常である場合はステップST128に進む。ステップST128では、上記検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時でのPFI異常時運転状態の更新値を、例えばRAM103内に記憶する。具体的には、上記ステップST106において決定した異常時噴射状態この場合はPFI異常とそのPFI異常時運転状態エンジン回転数NE、負荷率KL、暖機状態の更新値とを対応づけて記憶する。以上の処理で、1回の失火異常検出を終了する。なお、このような失火異常検出処理は繰り返して実行するようにしてもよい。そして、ECU100は、RAM103内に記憶したDUAL異常時運転状態、DI異常時運転状態、または、PFI異常時運転状態に基づいて正常復帰判定を行う。その一例について図5を参照して説明する。RAM103内に記憶の異常時噴射状態及び異常時運転状態が、DUAL異常でのDUAL異常運転状態である場合、図5に示すように、DUAL異常時運転状態の更新値なまし値Pdualを中心点として、その運転ポイントPdualNEdual、KLdualに対して設定された所定の範囲例えば、NEdual±375rpm、KLdual±20の領域を正常判定領域とし、その正常判定領域でのエンジン運転状態で正常復帰判定を行う。また、同様に、RAM103内に記憶の異常時噴射状態及び異常時運転状態が、DI異常でのDI異常運転状態である場合、その運転ポイントPdiNEdi、KLdiに対して設定された所定の範囲例えば、NEdi±375rpm、KLdi±20の領域を正常判定領域とし、その正常判定領域でのエンジン運転状態で正常復帰判定を行う。また、同様に、RAM103内に記憶の異常時噴射状態及び異常時運転状態が、PFI異常でのPFI異常運転状態である場合、その運転ポイントPpfiNEpfi、KLpfiに対して設定された所定の範囲例えば、NEpfi±375rpm、Kpfi±20の領域を正常判定領域とし、その正常判定領域でのエンジン運転状態で正常復帰判定を行う。以上説明したように、本実施形態によれば、失火が発生した際の運転状態と噴射状態とを記憶し、その噴射状態ごとに異常時運転状態を求めるとともに、失火異常の検出期間内で発生する各噴射状態ごとの失火の回数に基づいて異常時噴射状態を決定する。そして、その決定した異常時噴射状態での異常時運転状態を記憶するようにしているので、失火異常が発生した際の噴射状態DUAL異常、DI異常、PFI異常に合わせて異常時運転状態を記憶することができる。これにより、失火異常検出の後に、正常復帰判定を実施するにあたり、その正常復帰判定を適正に行うことができる。しかも、例えば図5に示すように、正常判定領域を大きくすることができるので、正常復帰判定の機会を増やすことができる。なお、本実施形態において、上記ステップST106において異常時噴射状態を決定する手法としては、上記した方法のほか、例えば、失火時DUALカウンタのカウント値、失火時DIカウンタのカウント値、及び、失火時PFIカウンタのカウント値のうち、最も大きなカウント値の噴射状態を異常時噴射状態とするという方法を採用してもよい。変形例以上の実施形態では、噴射状態を、DUAL噴射と、DI噴射と、PFI噴射との3つの状態に区分しているが、本発明はこれに限られることなく、噴射状態を噴き分け率KPFIで3つに区分するようにしてもよい。その一例について図7のフローチャートを参照して説明する。この図7の制御ルーチンもECU100において実行可能である。なお、この例においても、対象とする運転状態は、エンジン回転数NE、負荷率KL及び暖機状態とする。また、暖機状態は、冷間時水温が暖機温度例えば80°C未満の状態と高温時水温が暖機温度以上の状態のいずれか一方の状態とする。また、この例においても、図7の制御ルーチンが開始された時点からECU100内の検出期間カウンタ120のカウントが開始され別ルーチンでカウント、エンジン1クランクシャフト15が1回転1Revするごとに、検出期間カウンタ120のカウント値が1つずつカウントアップされる。なお、ECU100は、クランクポジションセンサ201の出力信号に基づいてエンジン1の回転数を認識している。ここで、この例では、上記した失火時DUALカウンタ、失火時DIカウンタ、失火時PFIカウンタに替えて、第1失火時カウンタ、第2失火時カウンタ、第3失火時カウンタを用いる。図7の制御ルーチンが開始されると、まずは、ステップST201において、失火カウンタ総失火カウンタ110のカウント値がアップされたか否かを判定する。ステップST201の判定結果が否定判定NOである場合失火カウンタ110のカウントアップがない場合はリターンする。ステップST201の判定結果が肯定判定YESである場合失火カウンタ110のカウントアップがある場合はステップST202に進む。ステップST202では、失火が発生したとき失火カウンタ110のカウントアップがあったときの異常時噴射状態の噴き分け率KPFIが[0≦KPFI<30]であるか否かを判定する。その判定結果が肯定判定YESである場合はステップST203に進む。なお、噴き分け率KPFIが[0≦KPFI<30]の範囲での異常時0-30異常時である場合、失火カウンタ110の第1失火時カウンタのカウント値がインクリメントされる。ステップST203では、上記した図4のステップST103と同様な処理により、噴き分け率KPFIが[0≦KPFI<30]での異常時運転状態0-30異常時運転状態を更新する。具体的には、失火異常時0-30異常時のエンジン回転数NE及び負荷率KLについては、上記した式1及び式2によりなまし処理を施して、0-30異常時におけるエンジン回転数NE及び負荷率KLを更新する。また、0-30異常時の暖機状態については、最新の状態冷間時または高温時に更新するもしくは、検出期間中に冷間時異常があれば、暖機状態を冷間時に固定する。この更新処理を行った後にステップST205に進む。上記ステップST202の判定結果が否定判定NOである場合、ステップST204に進む。ステップST204では、失火が発生したとき失火カウンタ110のカウントアップがあったときの異常時噴射状態の噴き分け率KPFIが[30≦KPFI<70]であるか否かを判定する。その判定結果が肯定判定YESである場合はステップST213に進む。なお、噴き分け率KPFIが[30≦KPFI<70]の範囲での異常時30-70異常時である場合、失火カウンタ110の第2失火時カウンタのカウント値がインクリメントされる。ステップST213では、上記した図4のステップST103と同様な処理により、噴き分け率KPFIが[30≦KPFI<70]での異常時運転状態30-70異常時運転状態を更新する。具体的には、失火異常時30-70異常時のエンジン回転数NE及び負荷率KLについては、上記した式1及び式2によりなまし処理を施して、30-70異常時におけるエンジン回転数NE及び負荷率KLを更新する。また、30-70異常時の暖機状態については、最新の状態冷間時または高温時に更新するもしくは、検出期間中に冷間時異常があれば、暖機状態を冷間時に固定する。この更新処理を行った後にステップST205に進む。上記ステップST204の判定結果が否定判定NOである場合、つまり、失火が発生したとき失火カウンタ110のカウントアップがあったときの異常時噴射状態の噴き分け率KPFIが[70≦KPFI≦100]である場合はステップST223に進む。なお、噴き分け率KPFIが[70≦KPFI≦100]の範囲での異常時70-100異常時である場合、失火カウンタ110の第3失火時カウンタのカウント値がインクリメントされる。ステップST223では、上記した図4のステップST103と同様な処理により、噴き分け率KPFIが[70≦KPFI≦100]での異常時運転状態70-100異常時運転状態を更新する。具体的には、失火異常時70-100異常時のエンジン回転数NE及び負荷率KLについては、上記した式1及び式2によりなまし処理を施して、70-100異常時におけるエンジン回転数NE及び負荷率KLを更新する。また、70-100異常時の暖機状態については、最新の状態冷間時または高温時に更新するもしくは、検出期間中に冷間時異常があれば、暖機状態を冷間時に固定する。この更新処理を行った後にステップST205に進む。ステップST205では、上記検出期間カウンタ120のカウント値が1000Revに達しているか否かを判定する。その判定結果が否定判定NOである場合図8に示す検出期間内である場合はリターンしてステップST201に戻る。以降、[ステップST201~ステップST203]、[ステップST201、ステップST202、ステップST204、ステップST213]、または、[ステップST201、ステップST202、ステップST204、ステップST223]の処理が、ステップST205の判定結果が肯定判定YESとなるまで順次繰り返して実行され、その繰り返し処理の過程において、失火が発生するごとに、その失火発生時の噴射状態に応じて、上述した0-30異常時運転状態、30-70異常時運転状態、及び、70-100異常時運転状態がそれぞれ更新されていく。そして、検出期間カウンタ120のカウント値が1000Revに達した時点ステップST205の判定結果が肯定判定YESとなった時点でステップST206に進む。ここで、検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時での、0-30異常時運転状態の更新値最終なまし値等、30-70異常時運転状態の更新値最終なまし値等、70-100異常時運転状態の更新値最終なまし値等を、例えばRAM103図1参照内に記憶しておく。ステップST206では異常時噴射状態を決定する。具体的には、上記第1失火時カウンタ0-30失火時用のカウント値と、上記第2失火時カウンタ30-70異常時用のカウント値と、上記第3失火時カウンタ70-100異常時用のカウント値とを比較し、カウント値が最大である噴射状態を異常時噴射状態と決定する。つまり、第1失火カウンタのカウント値が最大である場合は異常時噴射状態を0-30異常と決定する。また、第2失火時カウンタのカウント値が最大である場合は異常時噴射状態を30-70異常と決定し、第3失火時カウンタのカウント値が最も大きい場合は異常時噴射状態を70-100異常と決定する。次に、ステップST207において、上記ステップST206で決定した異常時噴射状態が0-30異常であるか否かを判定し、その判定結果が肯定判定YESである場合はステップST208に進む。ステップST208では、上記検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時での0-30異常時運転状態の更新値を、例えばRAM103内に記憶する。具体的には、上記ステップST206において決定した異常時噴射状態この場合は0-30異常とその0-30異常時運転状態の更新値エンジン回転数NE、負荷率KL、暖機状態とを対応づけて記憶する。ステップST207の判定結果が否定判定NOである場合はステップST209に進む。ステップST209では、上記ステップST206で決定した異常時噴射状態が30-70異常であるか否かを判定し、その判定結果が肯定判定YESである場合はステップST218に進む。ステップST218では、上記検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時での30-70異常時運転状態の更新値を、例えばRAM103内に記憶する。具体的には、上記ステップST206において決定した異常時噴射状態この場合は30-70異常とその30-70異常時運転状態エンジン回転数NE、負荷率KL、暖機状態の更新値とを対応づけて記憶する。上記ステップST207の判定結果が否定判定NOである場合、つまり、上記ステップST206で決定した異常時噴射状態が70-100異常である場合はステップST228に進む。ステップST228では、上記検出期間カウンタ120のカウント値が1000Revに達した時点検出期間終了時での70-100異常時運転状態の更新値を、例えばRAM103内に記憶する。具体的には、上記ステップST206において決定した異常時噴射状態この場合は70-100異常とその70-100異常時運転状態エンジン回転数NE、負荷率KL、暖機状態の更新値とを対応づけて記憶する。以上の処理で、1回の失火異常検出を終了する。なお、このような失火異常検出処理は繰り返して実行するようにしてもよい。そして、ECU100は、RAM103内に記憶したDUAL異常時運転状態、DI異常時運転状態、または、PFI異常時運転状態に基づいて正常復帰判定を行う。その正常復帰判定の際の処理は、上記した実施形態の処理図5で説明した処理と基本的に同じであるので、その具体的な説明は省略する。この変形例においても、失火異常が発生した際の噴射状態つまり噴き分け率KPFIの区分0-30異常、30-70異常、70-100異常に合わせて、異常時運転状態エンジン回転数NE、負荷率KL、暖機状態を記憶することできる。これにより、正常復帰判定を実施するにあたり、その正常復帰判定を適正に行うことができる。なお、この変形例では、噴射状態を噴き分け率KPFIで3つに区分しているが、これに限られることなく、噴射状態を噴き分け率KPFIで2つまたは4つ以上に区分して、失火異常を検出するようにしてもよい。-他の実施形態-以上の例では、失火が発生した際のエンジン回転数NE及び負荷率KLに対して1/2なまし処理を行って異常時運転更新値なまし値を求めているが、これに限られることなく、例えば1/4なまし処理など、他の任意のなまし係数のなまし処理にてエンジン回転数NEのなまし値及び負荷率のなまし値を算出するようにしてもよい。以上の例では、失火が発生した際のエンジン回転数NE及び負荷率KLに対してなまし処理を施したなまし値を、異常時運転状態の更新値としているが、本発明はこれに限定されない。例えば、図8に示す失火異常の検出期間内において、失火が発生した際の各噴射状態ごとのエンジン回転数NEの平均値、負荷率KLの平均値を各噴射状態ごとの異常時運転状態の更新値としてもよい。また、図8に示す検出期間内において、失火が発生する度に、各噴射状態ごとのエンジン回転数NE及び負荷率KLを順次最新の値に更新記憶していき、検出期間が終了した際に、その検出期間内で最後に更新された値を各噴射状態ごとの異常時運転状態の更新値としてもよい。以上の例では、検出期間カウンタ120のカウント値が1000Revエンジン回転回数=1000回転に達したときに検出期間終了と判定しているが、これに限られることなく、例えば、検出期間カウンタ120のカウント値が200Revエンジン回転回数=200回転に達したときに検出期間終了と判定してもよい。また、これら1000Revや200Rev以外の任意の数値Revにカウント値が達したときに検出期間終了と判定するようにしてもよい。なお、失火異常の検出期間については、検出開始からの経過時間または走行距離などに基づいて判定するようにしてもよい。以上の例では、異常時運転状態の更新値に対して予め設定された所定範囲内の領域を正常判定領域とし、その正常判定領域での機関運転状態で正常復帰判定を行うようにしているが、本発明はこれに限られることなく、異常時運転状態の更新値と同一の機関運転状態で正常復帰判定を行うようにしてもよい。以上の例では、4気筒ガソリンエンジンに本発明を適用した場合について説明したが、本発明はこれに限られることなく、例えば6気筒ガソリンエンジンなど他の任意の気筒数のガソリンエンジンにも適用可能である。また、直列多気筒ガソリンエンジンのほか、V型多気筒ガソリンエンジンの制御にも本発明を適用することができる。