内燃機関16の作動中、複数の気筒32a~32dのうち空燃比が異常である異常気筒を特定する内燃機関診断装置14であって、前記複数の気筒32a~32dそれぞれの燃料噴射量を調整する燃料噴射量調整手段20を制御することにより空燃比を段階的に変化させる空燃比制御部84と、段階的に変化させた空燃比毎に失火カウンタ20がカウントした前記複数の気筒32a~32dの失火発生回数と、前記段階的に変化させた空燃比との関係から前記異常気筒を特定する異常気筒特定部84とを有することを特徴とする内燃機関診断装置14。請求項1記載の内燃機関診断装置14において、前記空燃比制御部84は、前記内燃機関16に負荷がかかっていない状態において、前記複数の気筒32a~32dを1つずつ順番に前記燃料噴射量を調整するように前記燃料噴射量調整手段20を制御して空燃比を段階的に増加又は減少させることを特徴とする内燃機関診断装置14。請求項1記載の内燃機関診断装置14において、前記空燃比制御部84は、前記燃料噴射量を、理論空燃比を実現するための設定値から開始して段階的に減少させることを特徴とする内燃機関診断装置14。請求項3記載の内燃機関診断装置14において、前記燃料噴射量が、前記内燃機関16の特性によって定められるリーン側の燃焼限界値を下回るとき、前記失火発生回数が第1閾値よりも低い気筒がある場合、前記異常気筒特定部84は、燃料が過剰に供給されるリッチ故障が当該気筒に発生していると判定することを特徴とする内燃機関診断装置14。請求項3記載の内燃機関診断装置14において、前記燃料噴射量が、理論空燃比を実現するための設定値であるとき又は前記内燃機関16の特性により定まる燃焼可能範囲内の所定値であるとき、前記失火発生回数が第2閾値よりも高い気筒がある場合、前記異常気筒特定部84は、燃料供給が不足しているリーン故障が当該気筒に発生していると判定することを特徴とする内燃機関診断装置14。請求項1記載の内燃機関診断装置14において、前記空燃比を段階的に変化させている際、前記複数の気筒32a~32dのいずれかの失火発生回数又はその合計が所定値を越えた場合、前記空燃比の段階的な変化を中止させることで点火プラグ36又は排ガス浄化用フィルタ18を保護する保護部84を有することを特徴とする内燃機関診断装置14。請求項1又は6記載の内燃機関診断装置14において、前記内燃機関16全体の空燃比が目標空燃比からずれている場合、前記複数の気筒32a~32dそれぞれに同一の補正値を適用して前記内燃機関16全体の空燃比が前記目標空燃比と等しくなるように制御する空燃比フィードバック制御を実行可能であり、前記内燃機関16の診断時において、前記内燃機関16の暖機運転後のアイドル運転中に、前記複数の気筒32a~32dそれぞれに対して少なくとも前記空燃比フィードバック制御を実行すると共に、前記複数の気筒32a~32dそれぞれについて失火の発生を監視し、前記失火が発生したとき、前記空燃比フィードバック制御を停止すると共に、燃料噴射基本制御を開始又は継続して失火が継続するか否かを判定し、前記燃料噴射基本制御のみでも失火が継続する場合、前記補正値が、燃料が過剰に供給されるリッチ故障を判定するための第1閾値又は燃料供給が不足しているリーン故障を判定するための第2閾値を超えるか否かを判定し、前記補正値が前記第1閾値を超える場合、その時点で失火が発生している気筒にリッチ故障が生じていると判定し、又は前記補正値が前記第2閾値を超える場合、その時点で失火が発生している気筒にリーン故障が生じていると判定することを特徴とする内燃機関診断装置14。内燃機関16の作動中、複数の気筒32a~32dのうち空燃比が異常である異常気筒を特定する内燃機関診断方法であって、前記複数の気筒32a~32dそれぞれの燃料噴射量を制御することにより空燃比を段階的に変化させる空燃比変化ステップと、段階的に変化させた空燃比毎に、前記複数の気筒32a~32dの失火発生回数をカウントする失火発生回数カウントステップと、前記段階的に変化させた空燃比と前記失火発生回数との関係から前記異常気筒を特定する異常気筒特定ステップとを有することを特徴とする内燃機関診断方法。請求項8記載の内燃機関診断方法において、前記空燃比変化ステップでは、前記内燃機関16に負荷がかかっていない状態において、前記複数の気筒32a~32dを1つずつ順番に前記燃料噴射量を制御して空燃比を段階的に増加又は減少させることを特徴とする内燃機関診断方法。請求項8記載の内燃機関診断方法において、前記空燃比変化ステップでは、前記燃料噴射量を、理論空燃比を実現するための設定値から開始して段階的に減少させることを特徴とする内燃機関診断方法。請求項10記載の内燃機関診断方法において、前記異常気筒特定ステップにおいて、前記燃料噴射量が、前記内燃機関16の特性により定まるリーン側の燃焼限界値を下回るとき、前記失火発生回数が第1閾値よりも低い気筒がある場合、燃料が過剰に供給されるリッチ故障が当該気筒に発生していると判定することを特徴とする内燃機関診断方法。請求項10記載の内燃機関診断方法において、前記異常気筒特定ステップにおいて、前記燃料噴射量が、理論空燃比を実現するための設定値であるとき又は前記内燃機関16の特性により定まる燃焼可能範囲内の値であるとき、前記失火発生回数が第2閾値よりも高い気筒がある場合、燃料供給が不足しているリーン故障が当該気筒に発生していると判定することを特徴とする内燃機関診断方法。請求項8記載の内燃機関診断方法であって、前記空燃比を段階的に変化させている際、前記複数の気筒32a~32dのいずれかの失火発生回数又はその合計が所定値を越えた場合、前記空燃比の段階的な変化を中止させることで点火プラグ36又は排ガス浄化用フィルタ18を保護する保護ステップを有することを特徴とする内燃機関診断方法。請求項8又は13記載の内燃機関診断方法であって、前記複数の気筒32a~32dそれぞれに対する燃料噴射量を調整することにより、前記複数の気筒32a~32dそれぞれにおける空燃比を制御する燃料噴射基本制御ステップと、前記複数の気筒32a~32dそれぞれの失火発生回数をカウントする失火発生回数カウントステップと、前記異常気筒を特定する異常気筒特定ステップとを備え、前記燃料噴射基本制御ステップでは、前記複数の気筒32a~32dそれぞれの空燃比が前記内燃機関16全体の目標空燃比と等しくなるように前記複数の気筒32a~32dそれぞれの空燃比を制御する燃料噴射基本制御と、前記内燃機関16全体の空燃比が目標空燃比からずれている場合、前記複数の気筒32a~32dそれぞれに同一の補正値を適用して前記内燃機関16全体の空燃比が前記目標空燃比と等しくなるように制御する空燃比フィードバック制御とを実行し、また、前記燃料噴射基本制御ステップでは、前記内燃機関16の診断時において、前記内燃機関16の暖機運転後のアイドル運転中に、前記複数の気筒32a~32dそれぞれに対して少なくとも前記空燃比フィードバック制御を実行すると共に、前記複数の気筒32a~32dそれぞれについて失火の発生を監視し、前記失火が発生したとき、前記空燃比フィードバック制御を停止すると共に、前記燃料噴射基本制御を開始又は継続して失火が継続するか否かを判定し、前記燃料噴射基本制御のみでも失火が継続する場合、前記補正値が、燃料が過剰に供給されるリッチ故障を判定するための第1閾値又は燃料供給が不足しているリーン故障を判定するための第2閾値を超えるか否かを判定し、前記補正値が前記第1閾値を超える場合、その時点で失火が発生している気筒にリッチ故障が生じていると判定し、又は前記補正値が前記第2閾値を超える場合、その時点で失火が発生している気筒にリーン故障が生じていると判定することを特徴とする内燃機関診断方法。A.一実施形態1.構成1全体構成図1は、この発明の一実施形態に係る内燃機関診断装置14以下診断装置14ともいう。を有する内燃機関診断システム10以下システム10ともいう。の概略的な構成を示すブロック図である。システム10は、診断対象としてのエンジン16を搭載した車両12と、エンジン16の診断を行う診断装置14とを有する。2車両12a全体構成車両12は、エンジン16に加え、エンジン16からの排ガスを浄化する排ガスフィルタ18以下フィルタ18ともいう。と、エンジン16の出力を制御するエンジン電子制御装置20以下エンジンECU20という。と、エンジン16の冷却水の温度Tw[°C]を検出する温度センサ22と、イグニションスイッチ24以下IGSW24という。とを有する。bエンジン16図2には、エンジン16内部の概略的な構成が示されている。エンジン16は、いわゆる直列4気筒エンジンであり、吸気量センサ28と、スロットル弁30と、開度センサ31と、第1~第4気筒32a~32d以下気筒32と総称する。と、気筒32毎の燃料噴射弁34と、気筒32毎の点火プラグ36と、空燃比センサ38と、クランクシャフト40と、クランク角センサ41と、気筒32毎の上死点センサ42とを有する。吸気量センサ28は、スロットル弁30の開度θth[°]に応じてエンジン16に吸入される空気量以下吸気量Qafという。を検出し、エンジンECU20に出力する。スロットル弁30は、インテークマニホールド44内に配置されている。開度センサ31は、スロットル弁30の開度θthを検出し、エンジンECU20に出力する。燃料噴射弁34及び点火プラグ36は、各気筒32の燃焼室46に面して配置されている。空燃比センサ38は、図示しない酸素センサを含み、エキゾーストマニホールド48内に配置されている。空燃比センサ38は、エンジン16全体の空燃比以下全体空燃比Raf_totalという。を検出し、エンジンECU20に出力する。クランク角センサ41は、クランクシャフト40の回転角以下クランク角Acという。[°]を検出し、エンジンECU20に出力する。上死点センサ42は、ピストン49の上死点を検出し、エンジンECU20に出力する。c排ガスフィルタ18排ガスフィルタ18は、エキゾーストマニホールド48の下流側排気側に配置され、エンジン16からの排ガスを浄化して放出する。本実施形態におけるフィルタ18は、排ガス浄化用の三元触媒を含む。dエンジンECU20エンジンECU20は、エンジン16の運転を制御するものであり、図1に示すように、入出力部50と、演算部52と、記憶部54とを有する。本実施形態におけるエンジンECU20は、例えば、エンジン回転数算出機能と、失火発生回数カウント機能と、スロットル弁制御機能と、燃料噴射弁制御機能と、点火プラグ制御機能とを実行する。エンジン回転数算出機能は、各上死点センサ42からの出力に基づいてエンジン16の回転数エンジン回転数Ne[rpm]を算出する機能であり、本実施形態では、各上死点センサ42と組み合わせることにより、エンジン回転数センサを構成する。代わりに、エンジンECU20とは独立のエンジン回転数センサを設け、その出力をエンジンECU20に送信してもよい。失火発生回数カウント機能は、クランク角センサ41からの出力に基づいて各気筒32それぞれにおける失火発生の有無を判別し、失火が発生したと判別された場合の各気筒32それぞれにおける失火発生回数をカウントする機能である。本実施形態では、同機能は、クランク角センサ41と組み合わせることにより、失火カウンタを構成する。なお、失火発生の有無の判別は、例えば、所定クランク角での燃焼圧力を検出し、当該燃焼圧力が所定値以下である場合に失火が発生したと判定する、又は、所定クランク角でのクランク角速度が所定値以下である場合に失火が発生したと判定する等の公知の手段を用いることができる。スロットル弁制御機能は、図示しないアクセルペダルの操作量等に基づいてスロットル弁30の開度θthを制御することにより、エンジン16の出力を制御する機能である。燃料噴射弁制御機能は、図示しないアクセルペダルの操作量等に基づいて燃料噴射弁34からの燃料噴射量Qfi目標値を制御することにより、エンジン16の出力を制御する機能である。点火プラグ制御機能は、図示しないアクセルペダルの操作量等に基づいて各点火プラグ36の点火タイミングを制御することにより、エンジン16の出力を制御する機能である。3診断装置14診断装置14は、各気筒32における空燃比の異常発生の有無を診断するものであり、図1に示すように中継器60と本体62とを有する。中継器60は、本体62とエンジンECU20との間の通信を中継するものであり、エンジンECU20に接続するためのケーブル70と、ケーブル70が連結される入出力部72と、本体62と無線通信を行う通信部74と、各部の制御を行う演算部76と、演算部76で用いる制御プログラム等の各種のプログラムやデータを記憶する記憶部78とを有する。本体62は、図示しないキーボードやタッチパッド等からなる入出力部80と、中継器60と無線通信を行う通信部82と、各部の制御及び各気筒32の異常判定を行う演算部84と、演算部84で用いる制御プログラムや異常診断プログラム等の各種プログラムやデータを記憶する記憶部86と、各種の表示を行う表示部88とを有する。本体62のハードウェア構成としては、例えば、市販のノート型パーソナルコンピュータを用いることができる。また、以下では、演算部84が実行する各気筒32の異常判定機能を異常気筒判定機能という。診断装置14を用いて各気筒32の異常診断を行う際、中継器60のケーブル70の一端を中継器60の入出力部72に接続した状態で、車両12の図示しないインスツルメントパネルに設けられた図示しないコネクタデータリンクコネクタにケーブル70の他端を接続する。その後、本体62の入出力部80に対するユーザからの操作に応じて、本体62は、各気筒32の異常診断を行う。その際、本体62は、エンジンECU20を介してエンジン16を作動させる。本体62が行う各気筒32の異常診断の詳細は後述する。2.気筒32の異常診断図3は、各気筒32の異常診断の概要を示すフローチャートである。図4は、図3に示す処理を行う際の各種の信号、数値及び処理の関係の一例を示すタイムチャートである。図5は、図4の一部計測による計測データを含む。を詳細に示すタイムチャートである。上記のように、異常診断を開始する前に、中継器60のケーブル70を車両12のエンジンECU20に接続し、診断装置14の本体62とエンジンECU20とが中継器60を介して通信可能な状態とする。診断装置14は、本体62の入出力部80を介してユーザから診断開始の指令を受けると、ステップS1において、エンジンECU20に暖機運転を行わせる暖機処理を行う。図6には、暖機処理のフローチャート図3のS1の詳細が示されている。ステップS11において、診断装置14の演算部84は、IGSW24の操作によるエンジン16の始動を要求するメッセージを表示部88に表示すると共に、エンジンECU20に対し、エンジン16が始動したか否かを問い合わせる。未だエンジン16が始動していない場合、すなわち、エンジンECU20からエンジン16の始動が通知されていない場合S12:NO、ステップS11に戻る。エンジン16が始動した場合、すなわち、エンジンECU20からエンジン16の始動が通知された場合S12:YES図4の時点t1、ステップS13において、演算部84は、エンジンECU20に対し、暖機運転の開始を要求し、当該要求を受けたエンジンECU20は、エンジン16の暖機運転を開始する。ここにいう暖機運転は、例えば、エンジン回転数Neを暖機用の所定値例えば、3000rpmまで上昇させることをいう。また、暖機運転の際、エンジンECU20は、エンジン16を作動させる際に一般的に使用する通常空燃比制御を用いる。通常空燃比制御は、エンジンECU20の燃料噴射弁制御機能で用いる制御であり、燃料噴射基本制御と空燃比フィードバック制御以下空燃比FB制御という。とを組み合わせたものである。本実施形態における燃料噴射基本制御は、各気筒32それぞれに供給する混合気における燃料ここでは、ガソリンと空気の比以下気筒空燃比Raf_1~Raf_4又はこれらを総称して気筒空燃比Raf_n若しくは空燃比Raf_nという。を理論空燃比燃料:空気=1:14.7とする制御である。より具体的には、燃料噴射基本制御では、吸気量センサ28が検出する吸気量Qafと燃料噴射弁34の燃料噴射量Qfiの目標値との関係をマップ化して事前に設定しておき、検出された吸気量Qafに対応する燃料噴射量Qfiの目標値に応じて燃料噴射弁34を制御する。但し、各気筒32の吸気/排気バルブ図示せずの作動タイミングタペットクリアランスのばらつきや燃料噴射弁34の経年変化等種々の要因のため、必ずしも各気筒32の空燃比Raf_n及びエンジン16の全体空燃比Raf_totalは、理論空燃比と等しくならない。本実施形態における空燃比FB制御は、全体空燃比Raf_totalが理論空燃比と等しくなるようにフィードバックする制御である。具体的には、空燃比センサ38の検出値が理論空燃比でない場合、当該検出値が理論空燃比となるように、全ての燃料噴射弁34の燃料噴射量Qfiを増減させることにより、理論空燃比を実現する。この際、補正値Pcを用いて燃料噴射量Qfiを補正する。なお、補正値Pcは、後述する各気筒32の燃料噴射率Rfi_n[]目標値の補正値であるが、それ以外のもの例えば、燃料噴射量Qfi目標値又は全体空燃比Raf_totalについてのものであってもよい。なお、本実施形態では、1つの空燃比センサ38がエキゾーストマニホールド48の下流側に設けられるのみであるため、各気筒32の空燃比Raf_nは検出されない。従って、燃料噴射基本制御では、エンジン16の全体空燃比Raf_totalを理論空燃比に収束させることはできるが、各気筒32の空燃比Raf_nを理論空燃比に収束させることはできない。ステップS14において、診断装置14の演算部84は、エンジン16の暖機が終了したか否かを判定する。具体的には、演算部84は、エンジンECU20に対してエンジン16用冷却水の温度Twを要求し、当該要求を受けたエンジンECU20は、演算部84に対して、温度センサ22が検出した温度Twを送信する。そして、演算部84は、温度Twが閾値TH_Tw[°C]以上であるか否かを判定する。閾値TH_Twは、暖機の終了を判定するための閾値である。暖機が終了していない場合S14:NO、ステップS14を繰り返す。暖機が終了した場合S14:YES図4の時点t2、ステップS15に進む。ステップS15において、演算部84は、エンジンECU20に対して暖機の終了を求めると共に、IGSW24のオフを求めるメッセージを表示部88に表示する。IGSW24がオンのままである場合S16:NO、ステップS15に戻り、IGSW24がオフにされた場合S16:YES図4の時点t3、暖機処理を終了する。図3に戻り、ステップS2において、診断装置14は、エンジン回転数Neを安定させるためのエンジン回転数安定化処理を行う。図7には、エンジン回転数安定化処理のフローチャート図3のS2の詳細が示されている。ステップS21において、演算部84は、異常診断を開始するためにエンジン16の再始動を求めるメッセージを表示部88に表示する。エンジン16が再始動されていない場合S22:NO、ステップS21に戻る。エンジン16が再始動された場合S22:YES図4の時点t4、ステップS23に進む。続くステップS23において、エンジンECU20は、気筒32それぞれについてエンジン16始動後における失火発生回数の累積値Tmf_total_n[回]のカウントを開始する。なお、各累積値Tmf_total_nの初期値エンジン16の始動時の値はゼロである。また、Tmf_total_nにおけるnは、各気筒32の番号を示し、例えば、累積値Tmf_total_1は、第1気筒32aの累積値を示す。上述のように、失火の検出は、クランク角センサ41からの出力とエンジンECU20における判定とを組み合わせて行う。また、図8に示すように、累積値Tmf_total_nのカウントは、エンジン16が始動した後、診断装置14から累積値Tmf_total_nのリセット要求があるまでリセットなしに継続される。続くステップS24において、演算部84は、エンジン回転数Neが安定したか否かを判定する。当該判定は、エンジン16の再始動から所定時間例えば、30秒が経過したか否かにより判定する。前記所定時間が経過するとS24:YES図4の時点t5、異常診断の事前準備が完了する。なお、前記所定時間が経過した後は、演算部84は、エンジンECU20に対し、エンジン16をアイドル運転させるよう要求し、当該要求を受けたエンジンECU20は、エンジン16をアイドル運転させる。この際、エンジンECU20は、前記燃料噴射基本制御と前記空燃比FB制御の両方を用いる。図3に戻り、ステップS3において、診断装置14は、第1診断処理を実行する。第1診断処理は、前記空燃比FB制御を停止させることに伴う診断処理である。図9は、第1診断処理のフローチャートである。上記のように事前準備が完了すると図4の時点t5、ステップS31において、診断装置14の演算部84は、エンジンECU20に対し、補正値Pcの送信を要求し、当該要求を受けたエンジンECU20は、現時点において空燃比FB制御で用いている補正値Pcを診断装置14に対して送信する。これにより、演算部84は、補正値Pcを取得する。補正値Pcは、エンジン16の全体空燃比Raf_totalを変化させるための補正値である。すなわち、補正値Pcは、理論空燃比と全体空燃比Raf_totalとの差ΔRafに対応する燃料噴射率Rfi_n後述の値として設定される。ステップS32において、診断装置14の演算部84は、気筒32のうち失火が発生しているもの以下失火気筒という。があるか否かを判定する。具体的には、演算部84は、エンジンECU20に対して、エンジン16始動後の各気筒32それぞれの失火発生回数の累積値Tmf_total_n[回]を要求し、当該要求を受けたエンジンECU20は、演算部84に対して各累積値Tmf_total_nを通知する。そして、演算部84は、各気筒32の累積値Tmf_total_nが、失火の発生を判定するための閾値TH_total1例えば、TH_total1=0を超えるか否かを個別に判定する。そして、累積値Tmf_total_nが閾値TH_total1を超えていれば、当該気筒32に失火が発生しているすなわち、失火気筒があると判定する。いずれの気筒32にも失火が発生していない場合S32:NO、ステップS44に進む。いずれかの気筒32に失火が発生している場合S32:YES、ステップS33において、診断装置14の演算部84は、エンジンECU20に対して空燃比FB制御の停止を要求する。当該要求を受けたエンジンECU20は、空燃比FB制御を停止し、燃料噴射基本制御のみを実行する。ステップS34において、診断装置14の演算部84は、燃料噴射基本制御のみの状態において失火が停止したか否かを判定する。具体的には、演算部84は、燃料噴射基本制御のみの状態に移行してから所定時間が経過した後の各気筒32の失火発生回数の累積値Tmf_total2_nが閾値TH_total1以下であるか否かを判定する。そして、各気筒32の累積値Tmf_total2_nがいずれも閾値TH_total1以下であれば、失火が停止したと判定する。空燃比FB制御を停止した結果、失火が停止した場合S34:YES、空燃比FB制御によって失火が発生しているものの、全ての気筒32が正常であるといえる。この場合、ステップS44に進む。いずれかの気筒32で失火が発生し、失火が停止しない場合S34:NO、ステップS35に進む。ステップS35において、診断装置14の演算部84は、ステップS31で取得した補正値Pcが閾値TH_Pc1以上であるか否かを判定する。閾値TH_Pc1は、補正値Pcによる補正により燃料が過度に濃くされているか否か空燃比FB制御がない場合、過度にリーン側にあるか否かを判定するためのものであり、例えば、8とすることができる。補正値Pcが閾値TH_Pc1以上である場合S35:YES、ステップS36において、診断装置14は、空燃比FB制御を停止したことにより、失火気筒が移動変化しているか否かを判定する。失火気筒が移動している場合S36:YES、ステップS37において、診断装置14の演算部84は、移動後の失火気筒にリーン故障が発生していると判定する。ここでいうリーン故障とは、エンジンECU20における気筒空燃比Raf_nの目標値は理論空燃比に設定されているにもかかわらずすなわち、燃料噴射量Qfi目標値は、理論空燃比に対応する値に設定されているにもかかわらず、失火気筒の実際の空燃比Raf_nは、過度にリーン側に変化してしまっている状態、換言すると、何らかの原因により燃料供給が不足している状態をいう。一方、失火気筒が移動変化していない場合S36:NO、ステップS38において、診断装置14の演算部84は、当該失火気筒にリーン故障が発生していると判定する。ステップS35に戻り、補正値Pcが閾値TH_Pc1以上でない場合S35:NO、ステップS39において、演算部84は、ステップS31で取得した補正値Pcが閾値TH_Pc2以下であるか否かを判定する。閾値TH_Pc2は、補正値Pcによる補正により燃料が過度に薄くされているか否か空燃比FB制御がない場合、過度にリッチ側にあるか否かを判定するためのものであり、例えば、-8とすることができる。補正値Pcが閾値TH_Pc2以下でない場合S39:NO、ステップS44に進む。補正値Pcが閾値TH_Pc2以下である場合S39:YES、ステップS40において、診断装置14の演算部84は、空燃比FB制御を停止したことにより、失火気筒が移動変化しているか否かを判定する。失火気筒が移動している場合S40:YES、ステップS41において、演算部84は、移動後の失火気筒にリッチ故障が発生していると判定する。ここでいうリッチ故障とは、エンジンECU20における気筒空燃比Raf_nの目標値は理論空燃比に設定されているにもかかわらずすなわち、燃料噴射量Qfi目標値は、理論空燃比に対応する値に設定されているにもかかわらず、失火気筒の空燃比Raf_nは、過度にリッチ側に変化してしまっている状態、換言すると、何らかの原因により燃料供給が過剰である状態をいう。一方、失火気筒が移動変化していない場合S40:NO、ステップS42において、診断装置14の演算部84は、当該失火気筒にリッチ故障が発生していると判定する。ステップS37、S38、S41、S42の後、ステップS43において、診断装置14の演算部84は、表示部88に故障の内容を表示するエラー表示を行う。ステップS32において失火気筒がない場合S32:NO、ステップS34において失火が停止した場合S34:YES、又はステップS39において補正値Pcが閾値TH_Pc2以下でない場合S39:NO、各気筒32の故障が検出できない。この場合、ステップS44において、ステップS33と同様、空燃比FB制御を停止し、今回の第1診断処理を終了する図4の時点t6。図3に戻り、ステップS4において、診断装置14の演算部84は、異常気筒の特定が終了したか否かを判定する。異常気筒の特定が終了した場合とは、図9のステップS37、S38、S41、S42のいずれかを経た場合である。異常気筒の特定が終了した場合S4:YES、今回の診断を終了する。異常気筒の特定が終了していない場合S4:NO、ステップS5に進む。ステップS5において、診断装置14は、第2診断処理を実行する図4の時点t6。第2診断処理は、気筒32毎の空燃比Raf_nの切替え変化を伴う診断処理である。より具体的には、第2診断処理は、気筒32毎の空燃比Raf_nを変化させるための補正値以下気筒補正値Cfi_n又は補正値Cfi_nという。[]の切替え変化を伴う診断処理である。補正値Cfi_nは、燃料噴射基本制御において、吸気量Qafとの関係で気筒空燃比Raf_nを理論空燃比とするための燃料噴射量Qfi気筒基準噴射量に対する燃料噴射量Qfiの目標値の割合以下気筒燃料噴射率Rfi_n又は燃料噴射率Rfi_nという。を規定するために用いるものである。100気筒基準噴射量に対応に補正値Cfi_nを加えたものが、燃料噴射率Rfi_nとなるRfi_n=100Cfi_n。Cfi_n及びRfi_nそれぞれにおけるnは、各気筒32の番号を示し、例えば、気筒補正値Cfi_1は、第1気筒32aの補正量Cfi_nを示し、燃料噴射率Rfi_1は、第1気筒32aの燃料噴射率Rfi_nを示す。なお、第1診断処理を終了したとき、空燃比FB制御は停止されている図9のS33、S44参照。従って、第2診断処理を開始する際、燃料噴射基本制御のみが実行されている。図10及び図11は、第2診断処理のフローチャートである。なお、図10及び図11のフローチャートを実行することにより、例えば、図5のような波形データを取得することができる。ステップS51、S52において、診断装置14の演算部84は、初期設定を行う。具体的には、ステップS51において、演算部84は、気筒補正値Cfi_nの切替えを行う気筒32以下対象気筒という。を示す変数nに1を設定する。n=1は、第1気筒32aを指し、n=2は、第2気筒32bを指し、n=3は、第3気筒32cを指し、n=4は、第4気筒32dを指す。従って、ステップS51において、変数nに1を設定したことで、これからの処理は、第1気筒32aを対象気筒とすることを示す。ステップS52において、演算部84は、第1気筒32aの補正量Cfi_1に0を設定するCfi_1←0。換言すると、第1気筒32aの燃料噴射率Rfi_1を、理論空燃比を実現するための100とするRfi_1←100。続くステップS53、S54において、診断装置14の演算部84は、排ガスフィルタ18が過熱状態にあるか否かを判定する。具体的には、ステップS53において、演算部84は、エンジン16始動後における対象気筒の失火発生回数の累積値Tmf_total_nそれぞれが閾値TH_total2[回]以上であるか否かを判定する。閾値TH_total2は、フィルタ18が過熱状態にあることを判定するための閾値である。また、上記の通り、累積値Tmf_total_nは、エンジン16の始動からエンジンECU20がカウントするものであるため、演算部84は、エンジンECU20から各累積値Tmf_total_nを取得する。対象気筒の累積値Tmf_total_nが閾値TH_total2未満である場合S53:NO、ステップS54において、演算部84は、測定周期Pm[sec]における対象気筒の失火発生回数の累積値Tmf_cyl_n[回]が閾値TH_cyl[回]以上であるか否かを判定する。測定周期Pmは、補正量Cfi_nを切り替える周期すなわち、燃料噴射率Rfi_n及び気筒空燃比Raf_nを切り替える周期である図5及び図12参照。このため、累積値Tmf_cyl_nは、補正量Cfi_nを切り替える毎の対象気筒の失火発生回数の累積値である。また、閾値TH_cylは、フィルタ18が過熱状態にあることを判定するための閾値である。なお、累積値Tmf_cyl_nは、診断装置14の演算部84でカウントする。具体的には、診断装置14からの指令により、エンジンECU20は、失火の発生毎に気筒32の番号と失火の発生を診断装置14に通知する。当該通知を受けた診断装置14は、図5及び図12に示すように、測定周期Pm毎に失火発生回数をカウントする。累積値Tmf_cyl_nが閾値TH_cyl未満である場合S54:NO、ステップS56に進む。累積値Tmf_total_nが閾値TH_total2以上である場合S53:YES又は累積値Tmf_cyl_nが閾値TH_cyl以上である場合S54:YES、ステップS55において演算部84は、表示部88にエラー表示を行う。すなわち、演算部84は、失火発生回数が多いため、フィルタ18の冷却のために診断を一時的に中止すべき旨を表示部88に表示すると共に、第2診断処理を中止する。当該エラー表示に従って、ユーザが第2診断処理を一時的に中止し、フィルタ18の温度を低下させることで、第2診断処理の再開が可能となる。また、診断図3の処理を再開する場合、入出力部80に対するユーザの操作に基づき、各累積値Tmf_total_nをリセットする。ステップS56において、演算部84は、エミッションE/M悪化失火レベルの判定を停止する。E/M悪化失火レベルとは、点火プラグ36に煤が溜まったことに起因する失火発生回数の程度を意味する。本実施形態では、E/M悪化失火レベルの判定を停止することでフィルタ18の保護のための失火判定図10のS53、S54を優先する。但し、第2診断処理の際、E/M悪化失火レベルの判定を継続することも可能である。ステップS57~S67により、演算部84は、異常気筒の特定を行う。すなわち、図5に示すように、本実施形態では、4つの気筒32を診断対象として順番に選択する。既に述べた通り、診断対象の気筒32を対象気筒という。そして、4つの気筒32のうち対象気筒以外の3つについて補正値Cfi_nを0とする燃料噴射基本制御を行いつつ、対象気筒について補正値Cfi_nを段階的に変化させる。この際、補正値Cfi_nは、±0、-10、-20、-30、-40の順に切り替える。換言すると、燃料噴射率Rfi_nを100理論空燃比、90、80、70、60の順に低下させることで、気筒空燃比Raf_nを変化させる。上記のような処理を行うため、ステップS57において、演算部84は、エンジンECU20に対し、変数nと変数nが示す対象気筒の補正値Cfi_nを1回又は複数回の爆発工程毎に通知する。当該通知を受けたエンジンECU20は、当該対象気筒において補正値Cfi_nで所定回数の爆発工程を実行する。本実施形態では、ステップS57を繰り返すことで、補正値Cfi_n毎すなわち、燃料噴射率Rfi_n又は気筒空燃比Raf_n毎に爆発工程を50回繰り返す。エンジンECU20が爆発工程を実行している最中、ステップS58において、演算部84は、累積値Tmf_total_n及び累積値Tmf_cyl_nをカウントする。より具体的には、エンジンECU20は、失火を検出する毎に演算部84に通知する。当該通知を受けて演算部84は、累積値Tmf_total_n及び累積値Tmf_cyl_nをカウントする。なお、後述するステップS62、S66において、累積値Tmf_cyl_nは、気筒空燃比Raf_nが変化する毎にリセットされる。このため、累積値Tmf_cyl_nは、図5及び図12に示すように、気筒補正値Cfi_n毎すなわち、測定周期Pm毎に累積される。ステップS59において、演算部84は、今回の測定周期Pmにおける計測が終了したか否か対象気筒において気筒補正値Cfi_nで爆発工程が50回行われたか否かを判定する。当該判定は、例えば、エンジンECU20を介してクランク角センサ41の出力を受信し、当該出力を用いてクランクシャフト40の回転数を検出することにより行うことができる。今回の測定周期Pmにおける計測が終了していない場合S59:NO、ステップS53に戻る。今回の測定周期Pmにおける計測が終了した場合S59:YES、図11のステップS60に進む。図11のステップS60において、演算部84は、同一の対象気筒において補正値Cfi_nを変更可能であるか否か換言すると、同一の対象気筒において未計測の補正値Cfi_nが残っているか否かを判定する。すなわち、上記のように、本実施形態では、補正値Cfi_nを、±0、-10、-20、-30、-40の順に変化させるため、今回の補正値Cfi_nが-40でなければ、補正値Cfi_nを変更可能である。補正値Cfi_nを変更可能である場合S60:YES、気筒32と燃料噴射率Rfi_nに応じて累積値Tmf_cyl_nを記憶した後図15~図18参照、ステップS61において、演算部84は、同一の対象気筒について補正値Cfi_nを変更する。具体的には、対象気筒の現在の補正値Cfi_nが±0であれば-10に、補正値Cfi_nが-10であれば-20に、補正値Cfi_nが-20であれば-30に、補正値Cfi_nが-30であれば-40に変更する。続くステップS62において、演算部84は、累積値Tmf_cyl_nをリセットし、図10のステップS53に戻る。補正値Cfi_nが変更可能でない場合S60:NO、すなわち、対象気筒の現在の補正値Cfi_nが-40である場合、当該補正値Cfi_nをリセットすると共に、気筒32と燃料噴射率Rfi_nに応じて累積値Tmf_cyl_nを記憶する図15~図18参照。その後、ステップS63において、演算部84は、全ての気筒32について診断が終了したか否かを判定する。一部の気筒32について診断が終了していない場合S63:NO、ステップS64において、演算部84は、対象気筒を特定する変数nの現在の値に1を足して新たな変数nとするn←n1。これにより、対象気筒が切り替わる図5の時点t11、t12、t13。続くステップS65において、演算部84は、新たな対象気筒の補正値Cfi_nに0を代入する。これにより、新たな対象気筒の作動は、理論空燃比±0から開始される。続くステップS66において、演算部84は、累積値Tmf_cyl_nをリセットし、ステップS53に戻る。ステップS63に戻り、全ての気筒32について診断が終了した場合S63:YES図5の時点t7、ステップS67において、演算部84は、前記各ステップで取得した各気筒32の失火発生回数の累積値Tmf_cyl_nに基づいて、各気筒32の故障の有無、及び故障が発生している場合、その種類を特定する。図13は、第2診断処理において、各気筒32の故障の有無、及び故障が発生している場合、その種類を特定するためのフローチャート図11のS67の詳細である。図13の処理は、各気筒32について行われる。図14は、第2診断処理において、各気筒32の故障の有無、及び故障が発生している場合、その種類を特定する方法の説明図である。図13のステップS71において、診断装置14の演算部84は、燃料噴射率Rfi_nが70補正値Cfi_nが-30のときの失火発生回数の累積値Tmf_cyl_nがゼロであるか否かを判定する。燃料噴射率Rfi_nが70のときの累積値Tmf_cyl_nがゼロである場合S71:YES、ステップS72において、演算部84は、当該気筒32がリッチ故障であると判定する。上記のように、リッチ故障とは、何らかの原因により燃料供給が過剰である状態をいう。燃料噴射率Rfi_nが70のときの累積値Tmf_cyl_nがゼロでない場合S71:NO、ステップS73に進む。ステップS73において、演算部84は、燃料噴射率Rfi_nが90補正値Cfi_nが-10のときの累積値Tmf_cyl_nが閾値TH_lean[回]以上であるか否かを判定する。閾値TH_leanは、リーン故障を判定するための閾値であり、本実施形態では25回である。燃料噴射率Rfi_nが90のときの累積値Tmf_cyl_nが閾値TH_lean以上である場合S73:YES、ステップS74において、演算部84は、当該気筒32がリーン故障であると判定する。上記のように、リーン故障とは、何らかの原因により燃料供給が不足している状態をいう。燃料噴射率Rfi_nが90のときの累積値Tmf_cyl_nが閾値TH_lean以上でない場合S73:NO、ステップS75において、演算部84は、当該気筒32が正常であると判定する。上記のような判定処理を行うことで、図14に示すように、各気筒32が正常、リッチ故障又はリーン故障のいずれであるかを判定することができる。上記の判定処理の結果は、所定の形式にファイル化されると共に図4の時点t7から時点t8、表示部88に表示される図4の時点t8から時点t9。なお、図13の判定では、燃料噴射率Rfi_nが100、80、60補正値Cfi_nが±0、-20、-40のときの値を用いていないが、これらの燃料噴射率Rfi_nにおけるデータは、演算部84が故障を判定した後、ユーザがデータを解析する際に用いる。図11に戻り、ステップS68において、診断装置14の演算部84は、ステップS67の判定結果を表示部88に出力する。図15~図18には、本実施形態において、診断装置14が取得する失火発生回数の累積値Tmf_cyl_nのデータテーブル100、110、120、130と、データテーブル100、110、120、130に基づくグラフ102、112、122、132と、表示部88に表示される画面104、114、124、134とを示す図である。図15には、各気筒32がいずれも正常である場合のデータテーブル100、グラフ102及び画面104が示されている。図16には、各気筒32がいずれもリッチ故障である場合のデータテーブル110、グラフ112及び画面114が示されている。図17には、各気筒32がいずれもリーン故障である場合のデータテーブル120、グラフ122及び画面124が示されている。図18には、第1気筒32a及び第3気筒32cが正常であり、第2気筒32bがリッチ故障であり、第4気筒32dがリーン故障である場合のデータテーブル130、グラフ132及び画面134が示されている。なお、図17及び図18のグラフ122、132では、燃料噴射率Rfi_nが100を超える部分のデータが含まれているが、説明の便宜のためである。3.本実施形態の効果以上のように、本実施形態によれば、気筒空燃比Raf_nが異常である異常気筒リッチ故障及びリーン故障を高精度且つ簡易に特定することが可能となる。すなわち、一般に、正常な気筒32においては、燃料噴射量Qfiに応じて変化する実際の気筒空燃比Raf_nは、補正値Cfi_nに応じた気筒空燃比Raf_nの目標値と略同一になっており、各気筒32の空燃比Raf_nと失火発生との関係は、エンジン16の構成に応じてある程度決まってくる。例えば、実際の気筒空燃比Raf_nが理論空燃比と等しいとき失火の発生は略ゼロであるが、実際の気筒空燃比Raf_nがリーン側又はリッチ側に向かうに連れて失火発生率は大きくなる。本実施形態では、気筒空燃比Raf_n燃料噴射率Rfi_n及び補正値Cfi_nを段階的に変化させ、失火発生回数の累積値Tmf_cyl_nをカウントすることで、燃焼可能な燃料噴射範囲を求め、気筒空燃比Raf_nの異常を検出する。従って、気筒空燃比Raf_nの異常を検出し易くなり、異常気筒を高精度に特定することが可能となる。また、気筒空燃比Raf_nの制御は、エンジン16について一般的に行われていることであると共に、失火発生回数の累積値Tmf_cyl_nのカウントは、例えば、クランク角センサ41とエンジンECU20とにより行うことが可能となる。従って、気筒空燃比Raf_nの制御と失火発生回数の累積値Tmf_cyl_nのカウントは、エンジン16に関する既存の構成を流用して行うことが可能である。本実施形態によれば、段階的に変化させた気筒空燃比Raf_n燃料噴射率Rfi_nと、複数の気筒32の失火発生回数の累積値Tmf_cyl_nとの関係から異常気筒を特定する。このため、エンジン16に関する既存の構成を流用して制御又は判定が可能な気筒空燃比Raf_n燃料噴射率Rfi_n及び失火発生回数の累積値Tmf_cyl_nを用いることで異常気筒を簡易に特定することが可能となる。診断装置14の演算部84は、エンジン16に負荷がかかっていないアイドル状態において、複数の気筒32を1つずつ順番に燃料噴射量Qfi補正値Cfi_nを制御して気筒空燃比Raf_nを段階的に減少させる図5参照。これにより、気筒32の異常を1つずつ確認することができるため、より正確に異常気筒を判定することが可能となる。診断装置14の演算部84は、補正値Cfi_nを0から開始して段階的に減少させることで、燃料噴射率Rfi_nを100から開始して段階的に減少させる図5参照。これにより、失火発生回数の累積値Tmf_cyl_nが略ゼロとなる理論空燃比から、失火発生回数の累積値Tmf_cyl_nが増加するリーン側へと変化させていくので、異常気筒を正確に判定可能になると共に、失火の発生による点火プラグ36又はフィルタ18への悪影響を極力抑えることが可能となる。すなわち、失火が頻繁に発生すると、気筒32の燃焼室46内の温度低下を生じ、点火プラグ36が燻り易く煤が溜まり易くなる。その結果、当該煤に起因して失火が生じる可能性も高くなり、気筒空燃比Raf_n補正値Cfi_nの変化に起因する失火発生回数の累積値Tmf_cyl_nを正確に判定できなくなることも想定される。また、点火プラグ36に溜まる煤は、点火プラグ36の耐久性に悪影響を与えることもあり得る。さらに、失火が発生すると、燃焼室46内で燃焼しなかった未燃ガスがエンジン16から排出されて、フィルタ18の熱によりフィルタ18中で着火する場合があり、この現象が頻繁に発生するとフィルタ18の耐久性に悪影響を及ぼす可能性がある。本実施形態によれば、正常な燃焼運転状態から失火し易い状態へと徐々に変化させていくので、燃焼室46内の温度低下を最小限に抑えることができる。従って、上記のような不具合を防止することが可能となる。本実施形態では、燃料噴射率Rfi_nが70であるとき補正値Cfi_nがー30であるとき、失火発生回数の累積値Tmf_cyl_nがゼロである気筒32がある場合、診断装置14の演算部84は、燃料が過剰に供給されるリッチ故障が当該気筒32に発生していると判定する。これにより、簡易にリッチ故障を判定することが可能となる。本実施形態では、燃料噴射率Rfi_nが90であるとき補正値Cfi_nがー10であるとき、失火発生回数の累積値Tmf_cyl_nが25回以上である気筒32がある場合、診断装置14の演算部84は、燃料供給が不足しているリーン故障が当該気筒32に発生していると判定する。これにより、簡易にリーン故障を判定することが可能となる。本実施形態によれば、補正値Cfi_nすなわち、燃料噴射率Rfi_n又は気筒空燃比Raf_nを段階的に変化させている際、失火発生回数の累積値Tmf_total_nが閾値TH_total2を超えた場合、又は失火発生回数の累積値Tmf_cyl_nが閾値TH_cylを超えた場合、補正値Cfi_nの段階的な変化を中止させる。このため、これらの閾値に応じて、例えば、点火プラグ36又はフィルタ18への悪影響を抑制することが可能となる。なお、点火プラグ36のへの悪影響を抑制する場合、第2診断処理の再開時には、補正値Cfi_nの段階的な変化の前に、燃料噴射基本制御と空燃比FB制御の両方を行う運転を行うことで、点火プラグ36に蓄積した煤等を焼き払うことができる。本実施形態では、診断装置14の演算部84は、対象気筒の失火発生回数の累積値Tmf_cyl_nを測定周期Pm毎にカウントする。これにより、補正値Cfi_nすなわち、燃料噴射率Rfi_n又は気筒空燃比Raf_n毎に累積値Tmf_cyl_nの異常を判定することが可能となり、異常気筒の特定時の失火の異常を好適に検出することが可能となる。本実施形態によれば、エンジン16の全体空燃比Raf_totalの制御に問題が生じていない場合でも、個々の気筒32に生じた空燃比Raf_nの制御の不具合を検出することが可能となる。すなわち、エンジン16の通常作動時には、燃料噴射基本制御と空燃比FB制御とを組み合わせて用いるが、エンジン16が4つの気筒32を備え、そのうちの1つ第1気筒32aが、燃料供給が不足しているリーン故障を生じている場合、空燃比FB制御により、他の3つの気筒32第2~第4気筒32b~32dの空燃比Raf_nを燃料供給を多くするように調整し、第1気筒32aの空燃比Raf_nを燃料供給を少なくするように調整することでエンジン16の全体空燃比Raf_totalとしては目標空燃比を実現可能である。この場合、図19及び図20からもわかるように、第1気筒32aのリーン故障を検出することができない。本実施形態によれば、エンジン16の診断時には、空燃比FB制御を停止して燃料噴射基本制御のみを実行するため、異常気筒を高精度且つ容易に特定することが可能となる。従って、検査対象のエンジン16に全体用の空燃比センサ38のみが設けられている場合でも、異常気筒を高精度且つ容易に特定することができる。本実施形態では、目標空燃比は理論空燃比であり、燃料噴射基本制御では、複数の気筒32それぞれの空燃比Raf_nが理論空燃比となるように複数の気筒32それぞれの燃料噴射率Rfi_n空燃比Raf_nを制御する。また、空燃比FB制御では、エンジン16に負荷がかかっていないアイドル状態において、エンジン16の全体空燃比Raf_totalが理論空燃比からずれている場合、複数の気筒32それぞれに同一の補正値Pcを適用して全体空燃比Raf_totalが理論空燃比と等しくなるように制御する。これにより、エンジン16の通常作動時及び診断時のいずれも、理論空燃比を基準とするため、異常気筒の判定が容易となる。B.変形例なお、この発明は、上記実施形態に限らず、この明細書の記載内容に基づき、種々の構成を採り得ることはもちろんである。例えば、以下に示す構成を採ることができる。上記実施形態では、診断装置14を車両12のエンジン16の診断に用いたが、これに限らず、内燃機関を有するその他の装置例えば、船舶等の移動体に用いることもできる。また、上記実施形態において、診断装置14は、車両12の外部からエンジンECU20と通信するものとしたが、車両12の内部に搭載してもよい。換言すると、エンジンECU20に診断装置14の機能を持たせることも可能である。上記実施形態では、エンジン16は、直列4気筒エンジンであったが、気筒32の配置や数は、これに限らない。例えば、エンジン16は、V型6気筒エンジンであってもよい。上記実施形態では、エンジン16全体で1つの空燃比センサ38を設けたが、これに限らず、空燃比センサ38を複数の気筒32毎に設けてもよい。上記実施形態では、診断装置14の演算部84は、エンジンECU20を介して気筒空燃比Raf_n燃料噴射率Rfi_n及び補正値Cfi_nの切替えを行ったが、これに限らず、演算部84から燃料噴射弁34を直接制御して気筒空燃比Raf_n燃料噴射率Rfi_n及び補正値Cfi_nの切替えを行ってもよい。或いは、エンジンECU20に診断装置14の機能を持たせることにより、エンジンECU20診断装置14が燃料噴射弁34を直接制御して気筒空燃比Raf_n燃料噴射率Rfi_n及び補正値Cfi_nの切替えを行うこともできる。上記実施形態では、エンジン16の始動後の失火発生回数の累積値Tmf_total_nを気筒32毎に求めたが、これに限らず、例えば、エンジン16全体で、エンジン16始動後の失火発生回数の累積値を求めて利用することもできる。上記実施形態では、累積値Tmf_total_nをエンジン16の始動後における失火発生回数の累積値としたが、これに限らず、例えば、その他の時点例えば、エンジン16の始動から所定時間経過後からの失火発生回数の累積値とすることもできる。上記実施形態では、ステップS33、S44において空燃比FB制御を停止する前において、燃料噴射基本制御と空燃比FB制御を同時に用いていたが、これに限らず、最初に、燃料噴射基本制御のみを用い、その後、空燃比FB制御のみを実行することもできる。この場合、ステップS33、S44において空燃比FB制御を停止する際、燃料噴射基本制御を再開する。或いは、ステップS33、S44において空燃比FB制御を停止する前において、最初に、燃料噴射基本制御と空燃比FB制御とを同時に開始し、その後、燃料噴射基本制御を停止し、空燃比FB制御のみを継続し続けてもよい。この場合も、ステップS33、S44において空燃比FB制御を停止する際、燃料噴射基本制御を再開すればよい。上記実施形態の第2診断処理では、補正値Cfi_nを減少させることで各気筒32の空燃比Raf_nを理論空燃比からリーン側に減少させていったが、これに限らない。例えば、図21に示すように、補正値Cfi_nを正から負に段階的に切り替えることで、気筒空燃比Raf_nをリッチ側からリーン側に段階的に切り替えることができる。或いは、図22に示すように、補正値Cfi_nを負から正に段階的に切り替えることで、気筒空燃比Raf_nをリーン側からリッチ側に段階的に切り替えることもできる。これらの場合、補正値Cfi_nは、±0、-10、-20、-30、-40の組合せのみではなく、適宜変更することができる。上記実施形態の第2診断処理では、対象気筒以外の気筒32について燃料噴射基本制御を行いつつ、対象気筒について空燃比Raf_n補正値Cfi_nを徐々に変化させた。これに限らず、対象気筒以外の気筒32については、燃料噴射基本制御を停止し、燃料噴射及び点火を中止することもできる。上記実施形態の第2診断処理では、図13のフローチャートを用いて故障の特定を行ったが、故障の特定の方法はこれに限らない。例えば、ステップS71では燃料噴射率Rfi_nが70であるとき補正値Cfi_nが-30であるときの累積値Tmf_cyl_nに基づいてリッチ故障であるか否かを判定した。しかし、リッチ故障の判定については、例えば、エンジン16の特性によって定められるリーン側の燃料限界値失火が発生しない臨界値を下回る燃料噴射率Rfi_nであれば、別の値図14参照であってもよい。また、その際の累積値Tmf_cyl_nの閾値第1閾値をゼロ以外の正の値とすることもできる。さらに、ステップS73では燃料噴射率Rfi_nが90であるとき補正値Cfi_nが-10であるときの累積値Tmf_cyl_nに基づいてリーン故障であるか否かを判定した。しかし、リーン故障の判定については、例えば、燃焼噴射率Rfi_nが100である、又はエンジン16の特性により定まる燃料可能範囲値失火が発生しない範囲内の値であれば、別の値図14参照であってもよい。また、その際の閾値TH_lean第2閾値の値は適宜設定することができる。また、対象気筒以外の気筒32が故障している場合に対象気筒の故障診断の精度を上げるため、図13のフローチャートにさらに別のステップを加えることもできる。例えば、図13のステップS74において対象気筒がリーン故障であると判定する前に、リーン故障であれば失火発生回数の累積値Tmf_cyl_nが変化するはずの範囲図14参照を対象気筒の空燃比Raf_nが変化したときの累積値Tmf_cyl_nの変化量例えば、対象気筒の空燃比Raf_nが90のときと100のときの累積値Tmf_cyl_nの差を算出する。そして、当該変化量が所定値以上である場合に、対象気筒がリーン故障であると判定することもできる。