(57)【特許請求の範囲】
【請求項１】
エンジン半回転毎に予め設定された複数のクランク角度位置に対応してクランクパルスを出力構成し、
該クランクパルスが入力する都度、前回クランクパルスが入力してからのクランクパルス入力間隔時間を計測すると共に、該時間値を含めエンジン半回転当たりに入力されるクランクパルスと同数個のクランクパルス入力間隔時間を経時的に記憶し、これら時間値を加算してエンジン半回転当たりの時間を算出することを特徴とするエンジンの回転時間算出方法。
【請求項２】
上記エンジンの半回転当たりに入力されるクランクパルスと同数であってこれら各クランクパルス毎のクランク位置情報に対応付けたアドレスを有するテーブルを備えて、
クランクパルスの入力毎に、上記テーブルの対応アドレスに前回クランクパルス入力から今回クランクパルス入力までの時間をストアし、
上記テーブルの各アドレスにストアされている時間を加算してエンジン半回転当たりの時間を算出することを特徴とする請求項１記載のエンジンの回転時間算出方法。
【発明の詳細な説明】
【０００１】
本発明は、クランク位置を表すクランクパルスの入力毎に、エンジン半回転当たりの最新の時間を算出するエンジンの回転時間算出方法に関する。
【０００２】
【従来の技術】
近年、自動車などの車輌にマイクロコンピュータが導入され、エンジン、パワートレインなどを高精度に制御することが可能となった。これにより、車輌制御システムの開発においては、マイクロコンピュータのソフトウエア開発が大きな比重を占めるようになり、制御アルゴリスム上の処理の効率化が重要な課題となっている。
【０００３】
上記マイクロコンピュータによるエンジン制御システムにおいては、燃料噴射量の設定、点火時期の設定などのように、エンジン回転数を基本パラメータの１つとして演算を行なう処理が多く、周知のように、クランク角センサから出力されるクランク位置を表すクランクパルス情報に基づいてエンジン回転数を算出するようにしている。（特開平４−１７１２５３号公報参照）
この場合、上記クランク角センサは、例えば、クランク軸に連接されたロータ外周に対向して設置され、ロータ外周の所定クランク位置を示す複数の突起あるいはスリットなどを検出し、クランクパルスとして出力するようになっており、このクランクパルスの入力間隔時間をタイマで計測してエンジンの半回転当たりの経過時間に換算することにより、エンジン回転数を算出することができる。
【０００４】
【発明が解決しようとする課題】
しかしながら、従来、クランクパルスの入力間隔時間をタイマで計測してエンジン半回転当たりの時間を算出する際には、特定のクランク角で計測したクランクパルスの入力間隔時間に基づいて算出するシステムが多く、このエンジン半回転当たりの時間を算出するときには、実際のクランク位置が進んで必ずしも現在の運転状況に基づく半回転当たりの時間とならず、エンジンの制御量に僅かな誤差が生じて緻密な制御を行なう上での妨げとなる。
【０００５】
本発明は、上記事情に鑑み、クランク位置を表すクランクパルスの入力毎に最新のデータに基づいてエンジン半回転当たりの時間を算出し、現在の運転状況を迅速に把握して精密な制御を可能とするエンジンの回転時間算出方法を提供することを目的とする。
【０００６】
【課題を解決するための手段】
上記目的を達成するため、請求項１記載の発明は、エンジン半回転毎に予め設定された複数のクランク角度位置に対応してクランクパルスを出力構成し、該クランクパルスが入力する都度、前回クランクパルスが入力してからのクランクパルス入力間隔時間を計測すると共に、該時間値を含めエンジン半回転当たりに入力されるクランクパルスと同数個のクランクパルス入力間隔時間を経時的に記憶し、これら時間値を加算してエンジン半回転当たりの時間を算出することを特徴とする。
【０００７】
請求項２記載の発明は、請求項１記載の発明において、上記エンジンの半回転当たりに入力されるクランクパルスと同数であってこれら各クランクパルス毎のクランク位置情報に対応付けたアドレスを有するテーブルを備えて、クランクパルスの入力毎に、上記テーブルの対応アドレスに前回クランクパルス入力から今回クランクパルス入力までの時間をストアし、上記テーブルの各アドレスにストアされている時間を加算してエンジン半回転当たりの時間を算出することを特徴とする。
【０００８】
【作用】
請求項１記載の発明は、エンジン半回転毎に予め設定された複数のクランク角度位置に対応してクランクパルスを出力構成し、該クランクパルスが入力する都度、前回クランクパルスが入力してからのクランクパルス入力間隔時間を計測すると共に、該時間値を含めエンジン半回転当たりに入力されるクランクパルスと同数個のクランクパルス入力間隔時間を経時的に記憶し、これら時間値を加算してエンジン半回転当たりの時間を算出する。
【０００９】
請求項２記載の発明は、エンジンの半回転当たりに入力されるクランクパルスと同数であってこれら各クランクパルス毎のクランク位置情報に対応付けたアドレスを有するテーブルを備える。そして、クランクパルスの入力毎に、テーブルの対応アドレスに前回クランクパルス入力から今回クランクパルス入力までの時間をストアする。そして、テーブルの各アドレスにストアされている時間を加算してエンジン半回転当たりの時間を算出する。
【００１０】
【実施例】
以下、図面を参照して本発明の実施例を説明する。図面は本発明の一実施例に係り、図１はクランク位置算出サブルーチンのフローチャート、図２は０．５ｍｓ毎の定期割込み処理のフローチャート、図３はクラセン割込み処理のフローチャート、図４はジョブ優先処理のフローチャート、図５はジョブ実行サブルーチンの部分フローチャート１、図６はジョブ実行サブルーチンの部分フローチャート２、図７はジョブ実行サブルーチンの部分フローチャート３、図８はジョブ実行サブルーチンの部分フローチャート４、図９は半回転時間推定サブルーチンのフローチャート、図１０はＣＣＡＳ・ＲＣＡＳ判別サブルーチンのフローチャート、図１１はクラセンタイマのオーバーフロー割込み処理のフローチャート、図１２はジョブの実行状態を示す説明図、図１３はジョブフラグの説明図、図１４はクランク位置変数の説明図、図１５はジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図、図１６はシステムシフトバッファの説明図、図１７はクラセン間隔テーブルの説明図、図１８は気筒・クランク位置状態マップの説明図、図１９はクランク位置とエンジンの行程を示すタイムチャート、図２０はエンジン系の概略構成図、図２１はクランクロータとクランク角センサの正面図、図２２はカムロータとカム角センサの正面図、図２３は電子制御系の回路構成図である。
【００１１】
本実施例のエンジン制御システムでは、図２３に示すマイクロコンピュータを中核とした電子制御装置（ＥＣＵ）５０により図２０に示すエンジン系が制御され、燃料噴射制御、点火時期制御などが行なわれる。上記ＥＣＵ５０のマイクロコンピュータには、新しい概念に基づくオペレーティングシステム（ＯＳ）が搭載され、このＯＳにより、各センサ類からの信号入力処理、エンジン回転数算出処理、吸入空気量算出処理、燃料噴射量設定処理、点火時期設定処理などといった各制御項目毎のジョブが管理されて効率的に実行されるようになっている。
【００１２】
まず、上記ＥＣＵ５０によって制御されるエンジン系の機器構成について説明する。
【００１３】
図２０に示すように、エンジン１（図においては水平対向４気筒型エンジンを示す）は、シリンダヘッド２の吸気ポート２ａにインテークマニホルド３が連通され、このインテークマニホルド３の上流にエアチャンバ４を介してスロットル通路５が連通されている。このスロットル通路５の上流側には、吸気管６を介してエアクリーナ７が取付けられ、このエアクリーナ７が吸入空気の取り入れ口であるエアインテークチャンバ８に連通されている。
【００１４】
また、上記排気ポート２ｂにエキゾーストマニホルド９を介して排気管１０が連通され、この排気管１０に触媒コンバータ１１が介装されてマフラ１２に連通されている。一方、上記スロットル通路５にスロットルバルブ５ａが設けられ、このスロットル通路５の直上流の上記吸気管６にインタークーラ１３が介装され、さらに、上記吸気管６の上記エアクリーナ７の下流側にレゾネータチャンバ１４が介装されている。
【００１５】
また、上記レゾネータチャンバ１４と上記インテークマニホルド３とを連通して上記スロットルバルブ５ａの上流側と下流側とをバイパスするバイパス通路１５に、アイドルスピードコントロールバルブ（ＩＳＣＶ）１６が介装されている。さらに、このＩＳＣＶ１６の直下流側に、吸気圧が負圧のとき開弁し、またターボチャージャ１８によって過給されて吸気圧が正圧になったとき閉弁するチェックバルブ１７が介装されている。
【００１６】
上記ターボチャージャ１８は、上記吸気管６の上記レゾネータチャンバ１４の下流側にコンプレッサが介装され、タービンが上記排気管１０に介装されている。さらに、上記ターボチャージャ１８のタービンハウジング流入口には、ウエストゲート弁１９が介装され、このウエストゲート弁１９には、ウエストゲート弁作動用アクチュエータ２０が連設されている。
【００１７】
上記ウエストゲート弁作動用アクチュエータ２０は、ダイヤフラムにより２室に仕切られ、一方がウエストゲート弁制御用デューティソレノイド弁２１に連通される圧力室を形成し、他方が上記ウエストゲート弁１９を閉方向に付勢するスプリングを収納したスプリング室を形成している。
【００１８】
上記ウエストゲート弁制御用デューティソレノイド弁２１は、上記レゾネータチャンバ１４と上記吸気管６の上記ターボチャージャ１８のコンプレッサ下流とを連通する通路に介装されており、ＥＣＵ５０から出力される制御信号のデューティ比に応じて、上記レゾネータチャンバ１４側の圧力と上記コンプレッサ下流側の圧力とを調圧し、上記ウエストゲート弁作動用アクチュエータ２０の圧力室に供給する。
【００１９】
すなわち、上記ＥＣＵ５０によって上記ウエストゲート弁制御用デューティソレノイド弁２１を制御し、上記ウエストゲート弁作動用アクチュエータ２０を作動させて上記ウエストゲート弁１９による排気ガスリリーフを調整することにより、上記ターボチャージャ１８による過給圧を制御するようになっている。
【００２０】
また、上記インテークマニホルド３に絶対圧センサ２２が通路２３を介して連通され、この通路２３に、上記絶対圧センサ２２と上記インテークマニホルド３あるいは大気とを選択的に連通する吸気管圧力／大気圧切換ソレノイド弁２４が介装されている。
【００２１】
さらに、上記インテークマニホルド３の各気筒の各吸気ポート２ａの直上流側にインジェクタ２５が臨まされ、また、上記シリンダヘッド２の各気筒毎に、その先端を燃焼室に露呈する点火プラグ２６ａが取付けられ、この点火プラグ２６ａに連設する点火コイル２６ｂにイグナイタ２７が接続されている。
【００２２】
上記インジェクタ２５には、燃料タンク２８内に設けたインタンク式の燃料ポンプ２９から燃料フィルタ３０を経て燃料が圧送され、プレッシャレギュレータ３１にて調圧される。
【００２３】
また、上記吸気管６の上記エアークリーナ７の直下流に、ホットワイヤ式あるいはホットフィルム式などの吸入空気量センサ３２が介装され、上記スロットルバルブ５ａに、スロットル開度センサ３３ａとアイドルスイッチ３３ｂとを内蔵したスロットルセンサ３３が連設されている。
【００２４】
さらに、上記エンジン１のシリンダブロック１ａにノックセンサ３４が取付けられるとともに、このシリンダブロック１ａの左右両バンクを連通する冷却水通路３５に冷却水温センサ３６が臨まされ、上記排気管１０の上記エキゾーストマニホルド９の集合部にＯ2 センサ３７が臨まされている。
【００２５】
また、上記シリンダブロック１ａに支承されたクランクシャフト１ｂにクランクロータ３８が軸着され、このクランクロータ３８の外周に、電磁ピックアップなどからなるクランク角センサ３９が対設されている。さらに、上記エンジン１のカムシャフト１ｃに連設するカムロータ４０に、電磁ピックアップなどからなる気筒判別用のカム角センサ４１が対設されている。尚、上記クランク角センサ３９及び上記カム角センサ４１は、電磁ピックアップなどの磁気センサに限らず、光センサなどでも良い。
【００２６】
上記クランクロータ３８は、図２１に示すように、その外周に突起３８ａ，３８ｂ，３８ｃが形成され、これらの各突起３８ａ，３８ｂ，３８ｃが、各気筒（＃１，＃２と＃３，＃４）の圧縮上死点前（ＢＴＤＣ）θ1,θ2,θ3 の位置に形成されており、本実施例においては、θ1 ＝９７°ＣＡ、θ2 ＝６５°ＣＡ、θ3 ＝１０°ＣＡである。
【００２７】
上記クランクロータ３８の各突起は、上記クランク角センサ３９によって検出され、図１９に示すように、ＢＴＤＣ９７°，６５°，１０°のクランクパルスがエンジン１／２回転毎（１８０°ＣＡ毎）に出力される。そして、上記クランク角センサ３９からのクランク位置検出信号の入力間隔時間がタイマによって計時され、エンジン半回転当たりの経過時間すなわち半回転時間に換算されてエンジン回転数が算出される。
【００２８】
尚、突起３８ｂは、点火時期設定の際の基準クランク角となり、また、突起３８ｃは、始動時噴射開始時期の基準クランク角となるとともに始動時の固定点火時期を示すクランク角となる。
【００２９】
また、図２２に示すように、上記カムロータ４０の外周には、気筒判別用の突起４０ａ，４０ｂ，４０ｃが形成され、突起４０ａが＃３，＃４気筒の圧縮上死点後（ＡＴＤＣ）θ4 の位置に形成され、突起４０ｂが３個の突起で構成されて最初の突起が＃１気筒のＡＴＤＣθ5 の位置に形成されている。さらに、突起４０ｃが２個の突起で形成され、最初の突起が＃２気筒のＡＴＤＣθ6 の位置に形成されている。本実施例においては、θ4 ＝２０°ＣＡ、θ5 ＝５°ＣＡ、θ6 ＝２０°ＣＡである。
【００３０】
そして、上記カムロータ４０の各突起が上記カム角センサ４１によって検出され、各気筒の燃焼行程順を＃１→＃３→＃２→＃４とした場合、この燃焼行程順と、上記カム角センサ４１からのカムパルスをカウンタによって計数した値とのパターン（図１９参照）に基づいて、気筒判別がなされる。
【００３１】
一方、図２３に示すＥＣＵ５０は、燃料噴射制御、点火時期制御などを行なうメインコンピュータ５１と、ノック検出処理を行なう専用のサブコンピュータ５２との２つのコンピュータを中心として構成され、各部に所定の安定化電源を供給する定電圧回路５３や各種の周辺回路が組込まれている。
【００３２】
上記定電圧回路５３は、ＥＣＵリレー５４のリレー接点を介してバッテリ５５に接続され、このバッテリ５５に、上記ＥＣＵリレー５４のリレーコイルがイグニッションスイッチ５６を介して接続されている。また、上記バッテリ５５には、上記定電圧回路５３が直接接続され、さらに、燃料ポンプリレー５７のリレー接点を介して燃料ポンプ２９が接続されている。
【００３３】
すなわち、上記定電圧回路５３は、上記イグニッションスイッチ５６がＯＮされ、上記ＥＣＵリレー５４のリレー接点が閉となったとき、制御用電源を供給し、また、上記イグニッションスイッチ５６がＯＦＦされたとき、バックアップ用の電源を供給する。
【００３４】
上記メインコンピュータ５１は、ＣＰＵ５８（以下、メインＣＰＵ５８と称する）、ＲＯＭ５９、ＲＡＭ６０、上記イグニッションスイッチ５６がＯＦＦされたときにも上記定電圧回路５３からバックアップ電源が供給されてデータを保持するバックアップＲＡＭ６１、カウンタ・タイマ群６２、シリアル通信インターフェースであるＳＣＩ６３、及び、Ｉ／Ｏインターフェース６４がバスライン６５を介して接続されたマイクロコンピュータである。
【００３５】
尚、上記カウンタ・タイマ群６２は、フリーランカウンタ、カム角センサ（以下、適宜、カムセンと略記する）信号の入力計数用カムセンカウンタなどの各種カウンタ、燃料噴射タイマ、点火タイマ、後述する０．５ｍｓ毎の定期割込みを発生させるための定期割込みタイマ、クランク角センサ（以下、適宜、クラセンと略記する）信号の入力間隔計時用クラセンタイマ、及び、システム異常監視用のウオッチドッグタイマなどの各種タイマを便宜上総称するものであり、上記メインコンピュータ５１においては、その他、各種のソフトウエアカウンタ・タイマが用いられる。
【００３６】
また、上記サブコンピュータ５２も、上記メインコンピュータ５１と同様、ＣＰＵ７１（以下、サブＣＰＵ７１と称する）、ＲＯＭ７２、ＲＡＭ７３、カウンタ・タイマ群７４、ＳＣＩ７５、及び、Ｉ／Ｏインターフェース７６がバスライン７７を介して接続されたマイクロコンピュータであり、上記メインコンピュータ５１とサブコンピュータ５２とは、上記ＳＣＩ６３，７５を介してシリアル通信ラインにより互いに接続されている。
【００３７】
上記メインコンピュータ５１のＩ／Ｏインターフェース６４には、入力ポートに、吸入空気量センサ３２、スロットル開度センサ３３ａ、水温センサ３６、Ｏ2 センサ３７、絶対圧センサ２２、車速センサ４２、及び、バッテリ５５が、８チャンネル入力のＡ／Ｄ変換器６６を介して接続されるとともに、アイドルスイッチ３３ｂ、クランク角センサ３９、カム角センサ４１が接続されており、さらに、始動状態を検出するためにスタータスイッチ４３が接続されている。
【００３８】
尚、本実施例においては、上記Ａ／Ｄ変換器６６は、７チャンネル分の入力が使用され、残りの１チャンネルは予備となっている。
【００３９】
また、上記Ｉ／Ｏインターフェース６４の出力ポートには、イグナイタ２７が接続され、さらに、駆動回路６７を介して、ＩＳＣＶ１６、インジェクタ２５、燃料ポンプリレー５７のリレーコイル、および、ウエストゲート弁制御用デューティソレノイド弁２１、吸気管圧力／大気圧切換ソレノイド弁２４が接続されている。
【００４０】
一方、上記サブコンピュータ５２のＩ／Ｏインターフェース７６は、入力ポートに、クランク角センサ３９、カム角センサ４１が接続されるとともに、Ａ／Ｄ変換器７８、周波数フィルタ７９、アンプ８０を介してノックセンサ３４が接続されており、上記ノックセンサ３４からのノック検出信号が上記アンプ８０で所定のレベルに増幅された後に上記周波数フィルタ７９により必要な周波数成分が抽出され、上記Ａ／Ｄ変換器７８にてデジタル信号に変換されて入力されるようになっている。
【００４１】
上記メインコンピュータ５１では、各センサ類からの検出信号を処理し、燃料噴射パルス幅、点火時期などを演算する。すなわち、吸入空気量センサ３２の出力信号から吸入空気量を算出し、ＲＡＭ６０及びバックアップＲＡＭ６１に記憶されている各種データに基づき、吸入空気量に見合った燃料噴射量を演算し、また、点火時期などを算出する。
【００４２】
そして、上記燃料噴射量に相応する駆動パルス幅信号を、駆動回路６７を介して所定のタイミングで該当気筒のインジェクタ２５に出力して燃料を噴射し、また、所定のタイミングでイグナイタ２７に点火信号を出力し、該当気筒の点火プラグ２６ａを点火する。
【００４３】
その結果、該当気筒に供給された混合気が爆発燃焼し、エキゾーストマニホルド９の集合部に臨まされたＯ2 センサ３７により排気ガス中の酸素濃度が検出され、この検出信号が波形整形された後、上記メインＣＰＵ５８で基準電圧（スライスレベル）と比較され、エンジンの空燃比状態が目標空燃比に対し、リッチ側にあるか、リーン側にあるかが判別され、空燃比が目標空燃比となるようフィードバック制御される。
【００４４】
一方、上記サブコンピュータ５２では、エンジン回転数とエンジン負荷とに基づいてノックセンサ３４からの信号のサンプル区間を設定し、このサンプル区間でノックセンサ３４からの信号を高速にＡ／Ｄ変換して振動波形を忠実にデジタルデータに変換し、ノック発生の有無を判定する。
【００４５】
上記サブコンピュータ５２のＩ／Ｏインターフェース７６の出力ポートは、上記メインコンピュータ５１のＩ／Ｏインターフェース６４の入力ポートに接続されており、上記サブコンピュータ５２でのノック判定結果がＩ／Ｏインターフェース７６に出力される。そして、上記メインコンピュータ５１では、上記サブコンピュータ５２からノック発生有りの判定結果が出力されると、ＳＣＩ６３を介してシリアル通信ラインよりノックデータを読込み、このノックデータに基づいて直ちに該当気筒の点火時期を遅らせ、ノックを回避する。
【００４６】
このようなエンジン制御において、上記メインコンピュータ５１では、各センサ類からの信号入力処理、エンジン回転数算出、吸入空気量算出、燃料噴射量算出、点火時期算出といった各項目毎の各種プログラムが、一つのＯＳの管理下で効率的に実行される。このＯＳは、車輌制御のための各種マネジメント機能、及び、このマネジメント機能に密着した内部ストラテジーを有し、各種ジョブを体系的に結合する。
【００４７】
上記ＯＳのマネジメント機能としては、
(1-1)ジョブの優先処理
(1ー2)セクション定義による各ジョブの分割ファイル対応
(1-3)スタックの使用状況モニタ機能
(1-4)異常割込み動作のモニタ機能
(1-5)ジョブ毎に固有の制約を作らない標準マップ・標準ワークメモリ設定
などの機能があり、制御ストラテジーの開発環境を向上させるとともに、限られたＣＰＵ能力を最大限に発揮させ、デジタル制御理論の基本である等時間間隔処理を可能な限り達成することができる。
【００４８】
等時間間隔処理としては、０．５ｍｓ毎の定期割込みを基本として、２，４，１０，５０，２５０ｍｓ毎の５種類の等間隔割込みジョブが用意されており、また、エンジン回転に同期した処理として、クランク角信号入力により即割込み実行される高優先クラセンジョブ（以下、単にクラセンジョブと称する）と、より優先順位が高い他のジョブがないときにクランク角信号入力により割込み実行される比較的緊急度の低い低優先クラセンジョブとが用意されている。
【００４９】
これらの各ジョブには、クラセンジョブ＞２ｍｓジョブ＞４ｍｓジョブ＞１０ｍｓジョブ＞低優先クラセンジョブ＞５０ｍｓジョブ＞２５０ｍｓジョブの順で、７〜１の優先レベルが高位側から低位側に向かって付けられており、図１２に示すように、高速ジョブに対し低速ジョブが分割して処理されるとともに、各ジョブの多重待ち処理が行なわれる。
【００５０】
また、上記ＯＳの下で働く各プログラムは、機能別の管理領域すなわちセクション領域毎に順番に配列されており、各セクション領域には機能毎にセクション宣言によって名前が付けられている。各ストラテジーファイル側で使用する主なセクション領域は、
○変数宣言領域
○自己ファイル名、ファイル制作時の自動記録領域
○セッティングデータ領域
○クラセンジョブ領域
○２ｍｓジョブ領域
○４ｍｓジョブ領域
○１０ｍｓジョブ領域
○低優先クラセンジョブ領域
○５０ｍｓジョブ領域
○２５０ｍｓジョブ領域
○リセット時初期化ジョブ領域
○エンスト時初期化ジョブ領域
○バックグランドジョブ領域
○プログラム本体の領域
であり、機能毎にファイルを分割してプログラム開発が可能になるとともに、プログラムの構造化記述を可能にする。
【００５１】
また、上記ＯＳには、以上のマネジメント機能に密着した内部ストラテジーとして、
(2-1)Ａ／Ｄ変換処理
(2-2)クランク位置に係る各種情報の算出
(2-3)デバッグ用シミュレーション機能（エンジン回転及びＡ／Ｄ変換）
(2-4)点火タイマのセット
(2-5)燃料噴射タイマのセット
などの機能を備えており、さらに、これらの機能に係る各種サービスルーチンが各ジョブ中に用意されている。
【００５２】
従来、このような機能は各ジョブレベルで達成するようになっていたが、本システムにおいては、すべてＯＳ側に用意され、ＯＳ側で処理したＡ／Ｄ変換結果、クランク位置情報、エンジン回転数などに基づいて、ユーザー側の各ジョブで、燃料噴射量、点火時期などを設定すると、これらの指示値がＯＳによって燃料噴射タイマ、点火タイマにセットされるようになっている。
【００５３】
次に、上記メインコンピュータ５１におけるジョブ処理の機能を、図１〜図１１のフローチャートに基づいて説明する。尚、サブコンピュータ５２はノック検出処理専用のコンピュータであるため、その動作説明を省略する。
【００５４】
まず、イグニッションスイッチ５６がＯＮされてシステムに電源が投入されると、リセットに伴うリセット割込みが起動し、各種イニシャライズが行なわれるとともに、０．５ｍｓ毎に定期割込みを起動するための定期割込みタイマが起動され、クランク角センサ３９からの信号入力毎（ＢＴＤＣ９７°，６５°，１０°ＣＡ毎のエンジン１回転に６回）に起動されるクラセン割込みが許可され、その後、バックグランドジョブの実行状態となる。
【００５５】
そして、このバックグランドジョブの上で、０．５ｍｓ毎の定期割込みと、エンジン１回転に６回のクラセン割込みとにより、７レベルのジョブが優先処理される。この２つの割込みにおいては、各自の処理を実行後、共通のアドレスにジャンプし、ジョブ優先処理を実行する。
【００５６】
尚、上記リセット割込みは、内部演算において０による除算を実行した場合や、無限ループが発生した場合など、正常時には発生しない要因によっても、起動される。
【００５７】
まず、図２に示す０．５ｍｓ毎の定期割込みについて説明する。この定期割込みでは、ステップS100で、ＯＳ用ワークエリアを設定し、ステップS101で、ウオッチドッグタイマを初期化すると、ステップS102へ進んで、Ｐ−ＲＵＮフラグを２０回に１回すなわち１０ｍｓ毎に反転する。このＰ−ＲＵＮフラグは、図示しない保護回路によってシステムが自動的にリセットされないようにするためのフラグであり、システムが正常に動作して一定時間毎（１０ｍｓ毎）に反転される限り、上記保護回路の作動が阻止される。
【００５８】
次いで、ステップS103へ進み、スイッチ出力の転写を行なう。このスイッチ出力は、各ジョブ中でメモリに書き込んだビットのＯＮ，ＯＦＦ値であり、各ジョブからは直接Ｉ／Ｏインターフェース６４の出力ポートに出力せず、ＯＳ側で０．５ｍｓ毎にメモリの値を出力ポートに転写する。
【００５９】
次に、ステップS104へ進むと、Ａ／Ｄ変換サブルーチンを実行してＡ／Ｄ変換に係る各種設定を行ない、ステップS105で、ジョブフラグ作成サブルーチンを実行して、２，４，１０，５０，２５０ｍｓ毎の各ジョブ割込み要求を示すジョブフラグＪＢ＿ＦＬＧを作成した後、ステップS106で、Ａ／Ｄ変換をスタートする。
【００６０】
上記Ａ／Ｄ変換は、基本的に、Ａ／Ｄ変換器６６の８チャンネル入力が０．５ｍｓ毎に所定の変換順番毎に処理され、４ｍｓ周期で全入力の変換が行なわれる。但し、特定の１つのチャンネルは、回転脈動が発生する吸入管圧力などをＡ／Ｄ変換するためクランク角９０°毎に（０．５ｍｓの時間精度で）同期し、変換順番に対して割込んだ形で処理が行なわれ、その後の入力の順番を１つ遅れにする。
【００６１】
尚、エンジン回転数３７５０ｒｐｍ以上では、Ａ／Ｄ変換の最後の順番の入力が完全に停止し、７５００ｒｐｍ以上では、最後から２番目の入力も停止するが、Ａ／Ｄ変換の順番は、スロットル開度、吸入空気量など変化の速いものを先として、冷却水温、電圧など比較的変化の遅いものが後になるように設定してあり、且つ、最後のＡ／Ｄ変換順番をクランク同期入力に設定してあるため、特に支障は生じない。
【００６２】
また、図１３に示すように、上記ジョブフラグＪＢ＿ＦＬＧは、１バイト変数の各ビットを各ジョブに対応するフラグとして割当てたものであり、複数のジョブ要求が同時に可能なようになっている。この１バイト変数のビット１〜ビット７は優先レベル１〜７に対応し、それぞれ、２５０ｍｓジョブ、５０ｍｓジョブ、低優先クラセンジョブ、１０ｍｓジョブ、４ｍｓジョブ、２ｍｓジョブ、クラセンジョブのフラグに割当てられている。そして、所定のビットが立てられたとき、対応する優先レベルのジョブ割込み要求がなされる。尚、ビット０はバックグランドジョブのフラグに割当てられて通常は参照されない。
【００６３】
そして、上記ステップS105でジョブフラグ作成サブルーチンによりジョブフラグＪＢ＿ＦＬＧを作成し、上記ステップS106でＡ／Ｄ変換をスタートした後は、ステップS107へ進み、ジョブフラグＪＢ＿ＦＬＧのいずれかのジョブに対応するビットが立っているか否かを調べる。
【００６４】
その結果、ジョブフラグＪＢ＿ＦＬＧのビットが一つも立っていないときには、どのジョブからも要求がないため割込みを終了し、ジョブフラグＪＢ＿ＦＬＧのいずれかのビットが立っているときには、ステップS108へ進んで、現状レベル（この定期割込みが実行される時点で所定の優先レベルのジョブが実行されていた状態）以下のフラグがないか否かを調べる。
【００６５】
上記ステップS108で、現状レベル以下のフラグがないときには、ラベルＷＡＲ＿ＪＢで示される図４のジョブ優先処理にジャンプし、現状レベル以下のフラグがあるときには、ステップS109で、現状レベル以下のレベルのオーバーラップカウンタＯＬＣを１増加させる。
【００６６】
上記オーバーラップカウンタＯＬＣは、ジョブ要求を記憶するためのカウンタであり、各優先レベル毎に１バイト割当てられ、上記ジョブフラグＪＢ＿ＦＬＧによるジョブ要求時にインクリメント、ジョブ終了時にデクリメントされる。すなわち、カウンタによってジョブ要求を記憶することによりジョブの多重要求に対応することができるのである。
【００６７】
次いで、上記ステップS109からステップS110へ進み、現状レベルより高いフラグがないか否かを調べ、現状レベルより高いフラグがないときには、ルーチンを抜けて割込みを終了し、現状レベルより高いフラグがあるときには、ラベルＷＡＲ＿ＪＢのジョブ優先処理へジャンプする。
【００６８】
一方、この０．５ｍｓ毎の定期割込みに対し、図３のクラセンによる割込みでは、ステップS200で、ＯＳ用ワークエリアを設定すると、ステップS201で、後述するクランク位置・半回転時間算出のサブルーチンを実行し、現在のクランク位置を判別するためのクランク位置変数、及び、最新の３つのクラセン間隔の和である半回転時間を算出する。
【００６９】
上記クランク位置変数は、ＯＳ中で用意されるシステム変数であり、図１４に示すように、＃１〜＃４気筒に対するクランク位置を、９７°，６５°，１０°ＣＡによって１２の状態に区分し、現在のクランク位置を表わす。
【００７０】
すなわち、各気筒毎に、０，１，２の数値でクラセン入力順を示すクランク位置情報変数Ｓ＿ＣＣＡＳ、＃１気筒を０、＃３気筒を１、＃２気筒を２、＃４気筒を３として気筒の燃焼順を示す気筒情報変数Ｓ＿ＲＣＡＳ、及び、０〜１１の数値でクラセン順序及び気筒順序を総合的に表わす総合位置変数Ｓ＿ＡＣＡＳの３変数によって現在のクランク位置を表わし、さらに、クランク位置が確証をもって正常に判別されたときを０、判別結果がつじつまが合わず不安の残る推定状態を１、不明な状態を２とするエラーレベルＳ＿ＥＣＡＳにより、クランク位置の判別状況を表わすようになっている。尚、図１４においては、システム変数であることを示すＳ＿を省略している。
【００７１】
次いで、上記ステップS201からステップS202へ進むと、クランク位置・半回転時間算出のサブルーチンにおいてクランク位置判定が正常に終了したかあるいは判定不能であったかを、アキュムレータＡにストアされているコードを読み出すことにより調べる（エラーコード１、正常終了コード０）。
【００７２】
そして、上記ステップS202で、アキュムレータＡの値が１であり、クランク位置が判定不能であったときには、割込みを終了し、アキュムレータＡの値が０であり、クランク位置が正常に判定されているときには、ステップS203へ進み、エンストフラグを解除する。
【００７３】
尚、上記エンストフラグは、エンジンがエンスト状態であることを示すフラグであり、クラセン間隔が０．５ｓｅｃ以上の時間（約３０ｒｐｍ以下）のとき、５０ｍｓジョブに用意されているエンスト処理ルーチンによりセットされ、このクラセン割込みによりクリアされてエンスト状態が解除される。
【００７４】
次に、ステップS204へ進むと、点火タイマセットのサブルーチンを実行し、ユーザージョブ側で設定した点火時期の指示値に基づいて作成された点火スケジュールに従って点火タイマをセットする。この点火スケジュールは、ドエル開始時期、ドエルオン待ち時間、ドエルオフ待ち時間などをメンバーとする構造体変数であり、１０ｍｓジョブ中に作成ルーチンが用意され、この点火スケジュールに従って点火シーケンスが決定される。
【００７５】
次いで、ステップS205で、燃料噴射タイマセットのサブルーチンを実行し、ユーザージョブ側で設定した燃料噴射量の指示値（各気筒毎の噴射幅）に対し、燃料噴射開始時期などを燃料噴射タイマにセットしてステップS206へ進む。
【００７６】
ステップS206では、このクラセンが実行された現状のジョブレベルが自身のジョブレベルであるか否かを判別し、現状がクラセンジョブ自身のレベルであるときには、ステップS207、S208で、クラセンジョブ、低優先クラセンジョブのオーバーラップカウンタＯＬＣを、それぞれ１増加させて割込みを終了し、現状のジョブレベルがクラセンジョブのレベルでないときには、ステップS209で、現状のジョブレベルが低優先クラセンジョブのレベル以上であるか否かを調べる。
【００７７】
そして、現状のジョブレベルが低優先クラセンジョブ以上であるときには、上記ステップS209からステップS210へ進んで、低優先クラセンジョブのオーバーラップカウンタＯＬＣを１増加させると、ステップS211で、クラセンジョブのジョブフラグをセットし、ラベルＷＡＲ＿ＪＢのジョブ優先処理へジャンプする。
【００７８】
一方、上記ステップS209で、現状のジョブレベルが低優先クラセンジョブ以上でないときには、上記ステップS209からステップS212へ進み、クラセンジョブのジョブフラグをセットすると、ステップS213で、低優先クラセンジョブのジョブフラグをセットし、ラベルＷＡＲ＿ＪＢのジョブ優先処理へジャンプする。
【００７９】
このジョブ優先処理では、ステップS300で、ジョブの優先レベルを示す１バイト変数であるジョブレベルＪＢ＿ＬＥＶを１つ上げると、ステップS301へ進んで、この優先レベルに対応するジョブフラグが立っていないか調べる。そして、ジョブフラグが立っていないときには、ステップS300へ戻ってさらにジョブレベルＪＢ＿ＬＥＶを１つ上げ、ジョブフラグが立っているときには、ステップS302へ進み、ジョブフラグの立っているジョブのオーバーラップカウンタＯＬＣを初期値の０から１にし、ステップS303へ進む。
【００８０】
ステップS303では、より上のジョブフラグがあるか否かを調べ、より上のジョブがあるときには、ステップS300へ戻って前述の処理を繰り返し、より上のジョブがないときには、ステップS304へ進んで、ジョブ実行中フラグＪＢ＿ＲＵＮをセットすると、ステップS305で、後述するジョブ実行サブルーチンにより最上位のジョブを実行する。
【００８１】
上記ジョブ実行中フラグＪＢ＿ＲＵＮは、ジョブの実行開始時にセットされ、終了時にクリアされるフラグであり、このフラグにより、処理の途中で、より優先度の高いジョブによって割込まれたジョブを識別することができる。
【００８２】
例えば、図１５に示すように、ＪＢ＿ＬＥＶ＝４の１０ｍｓジョブを実行中、ＪＢ＿ＬＥＶ＝６の２ｍｓジョブの割込み要求がなされると、１０ｍｓジョブの処理が中断され、より優先度の高い２ｍｓジョブが、ＪＢ＿ＲＵＮ＝１、ＯＬＣ＝１にセットされ、実行される。そして、この２ｍｓジョブの処理中に、ＪＢ＿ＬＥＶ＝５の４ｍｓジョブの割込み要求が発生すると、この４ｍｓジョブは、ＪＢ＿ＲＵＮ＝０、ＯＬＣ＝１とされて割込みが受付けられるが、実行はされず待機状態となる。
【００８３】
その後、ジョブ実行サブルーチンによるジョブの実行が終了すると、上記ステップS305からステップS306へ進んでオーバーラップカウンタＯＬＣを１減らし、ステップS307で、オーバーラップカウンタＯＬＣがゼロになったか否かを調べる。その結果、オーバラップカウンタＯＬＣがゼロになっておらず、同じ優先レベルでジョブ割込み要求が複数回あるときには、ステップS305へ戻ってジョブを繰返し実行し、オーバラップカウンタＯＬＣがゼロになったとき、ステップS307からステップS308へ進んで、ジョブ実行中フラグＪＢ＿ＲＵＮをクリアする。
【００８４】
次に、ステップS309へ進み、ジョブレベルＪＢ＿ＬＥＶを１つ下げて次のジョブレベルに移ると、ステップS310で、このジョブレベルＪＢ＿ＬＥＶがゼロになったか否かを調べる。そして、ジョブレベルＪＢ＿ＬＥＶがゼロのときには、この割込みを終了し、ジョブレベルＪＢ＿ＬＥＶがゼロでないときには、ステップS311へ進んで、オーバーラップカウンタＯＬＣがゼロか否かを調べる。
【００８５】
上記ステップS311で、オーバーラップカウンタＯＬＣがゼロのときには、このレベルではジョブ要求はないため、上記ステップS311からステップS309へ戻って、ジョブレベルＪＢ＿ＬＥＶをさらに１つ下げて同様の処理を繰返し、オーバーラップカウンタＯＬＣがゼロでないときには、ステップS312へ進んで、このジョブレベルにおいて、ジョブ実行中フラグＪＢ＿ＲＵＮがセットされているか否かを調べる。
【００８６】
上記ステップS312で、ジョブ実行中フラグＪＢ＿ＲＵＮがセットされているときには、割込み前にジョブを実行中であったため、割込みを終了して割込み前のジョブへ戻り、ジョブ実行中フラグＪＢ＿ＲＵＮがセットされていなければ、ステップS304へ戻って、このレベルのジョブを実行し、同様の処理を繰返す。
【００８７】
すなわち、図１５において、ＪＢ＿ＬＥＶ＝６の２ｍｓジョブが終了し、ＯＬＣ＝０、ＪＢ＿ＲＵＮ＝０になると、ジョブレベルが１つ下げられ、ＪＢ＿ＬＥＶ＝５の４ｍｓジョブが、ＪＢ＿ＲＵＮ＝０、ＯＬＣ＝１の待機状態からＪＢ＿ＲＵＮ＝１にセットされ、実行される。さらに、４ｍｓジョブが終了すると、ＪＢ＿ＬＥＶ＝４に移り、ＪＢ＿ＲＵＮ＝１（ジョブ実行中）の状態から、２ｍｓジョブ及び４ｍｓジョブによって中断されていた１０ｍｓジョブの処理が再開される。
【００８８】
このように、０．５ｍｓ毎の定期割込み、クラセン割込みを基本タイミングとして、各ジョブの優先レベル及び実行タイミングを知らせるジョブフラグＪＢ＿ＦＬＧを作成するため、可能な限り正確に、等時間間隔処理、エンジン回転同期処理を実現し、各ジョブを効率良く処理することができる。さらに、基本タイミングとなる各割込み毎に更新されるジョブフラグＪＢ＿ＦＬＧによらず、オーバーラップカウンタＯＬＣによってジョブの多重要求を記憶するため、あるジョブの処理時間が長引き、再度、同じジョブを実行すべきタイミングとなった場合においても、処理を途中で放棄することなく、可能な限り最後まで処理を継続することができる。
【００８９】
次に、図５〜図８のジョブ実行サブルーチンについて説明する。
【００９０】
まず、ステップS500で、ジョブフラグＪＢ＿ＦＬＧを参照して実行すべきジョブがクラセンジョブでないか否かを調べ、クラセンジョブでないときには、ラベルＡＬＪ１０へ分岐し、クラセンジョブのときには、ステップS501へ進んで、気筒判別がついているか否かを調べる。
【００９１】
そして、気筒判別がついていないときには、そのままルーチンを抜けてジョブを実行せず、気筒判別がついているとき、上記ステップS501からステップS502へ進んで、オーバーラップカウンタＯＬＣの値を参照して多重待ち状態であるか否かを調べる。
【００９２】
上記ステップS502では、多重待ち状態でないとき、ステップS503へ進んで、クラセン割込み毎に算出されるシステム変数Ｓ＿ＡＣＡＳ（クランク総合位置変数）をユーザー変数ＡＣＡＳとし、一方、多重待ち状態のときには、ステップS504へ分岐し、ユーザー変数ＡＣＡＳを一つ増やして１２で割った剰余をとって新たなユーザー変数ＡＣＡＳとし、このユーザー変数ＡＣＡＳを０，１，２，…，１１，０，１，…とソフトウエア的に更新してゆく。
【００９３】
すなわち、クラセンジョブ及び低優先クラセンジョブは、自身または優先度の高いジョブに邪魔されて遅れることがあるが、クラセン割込みは正確にクランク角センサ信号に同期して実行され、システム変数Ｓ＿ＡＣＡＳはジョブの遅れに関係なく更新される。
【００９４】
従って、ジョブ中でシステム変数Ｓ＿ＡＣＡＳを参照して気筒及びクランク位置に係る情報を知り、この情報に応じた仕事を行なおうとしても、自身が他のジョブに邪魔されて遅れた場合には、自身の仕事に対応した気筒及びクランク位置に係る情報を知ることができなくなる。このため、クラセンジョブ及び低優先クラセンジョブ中では、多重待ち状態でないときにＯＳ用のシステム変数Ｓ＿ＡＣＡＳをユーザー用変数ＡＣＡＳとして取込み、このユーザー変数ＡＣＡＳをジョブ実行毎に更新して多重要求の場合にも、自身に対応した気筒及びクランク位置に係る情報を得て適正な処理がなされるようにするのである。
【００９５】
その後、上記ステップS503あるいは上記ステップS504からステップS505へ進み、ジョブのワークエリアを設定すると、ステップS506で、レベルゼロの割込みを許可し、ステップS507で、クラセンジョブのセクションに移る。そして、このクラセンジョブセクションにリンクされた処理を実行し、ステップS508で、割込みを禁止してルーチンを抜ける。
【００９６】
次に、ステップS500で、これから実行すべきジョブがクラセンジョブでないときには、ラベルＡＬＪ１０のステップS510で、２ｍｓジョブでないか否か調べ、２ｍｓジョブのとき、ステップS511で、ジョブのワークエリアを設定すると、ステップS512で、レベルゼロの割込みを許可し、ステップS513で、２ｍｓジョブのセクションに移る。そして、このセクションにリンクされているジョブ本体（ユーザー側の制御ストラテジーに基づくルーチン、あるいは、ＯＳ側で用意したサービスルーチン）を実行し、ステップS514で、割込みを禁止してルーチンを抜ける。
【００９７】
一方、上記ステップS510で、実行すべきジョブが２ｍｓジョブでないときには、ステップS510からステップS520へ分岐し、実行すべきジョブが４ｍｓジョブか否かを調べる。そして、４ｍｓジョブでないときには、ラベルＡＬＪ３０へ分岐し、４ｍｓジョブのときには、ステップS521で、ジョブのワークエリアを設定すると、ステップS522へ進む。尚、この４ｍｓジョブは、Ａ／Ｄ変換利用ジョブであり、後述するシステムシフトバッファＳＳＨＢを介してＡ／Ｄ変換データを利用する。
【００９８】
ステップS522では、レベルゼロの割込みを許可し、次いで、ステップS523へ進むと、スイッチ入力を読み込み、ステップS524で、４ｍｓジョブのセクションに移って、リンクされているジョブ本体を実行する。その後、４ｍｓジョブのセクションから抜けると、ステップS525で、割込みを禁止し、ステップS526へ進んで、システムシフトバッファＳＳＨＢをシフトしてルーチンを抜ける。
【００９９】
上記システムシフトバッファＳＳＨＢは、図１６に示すように、８チャンネルの各Ａ／Ｄ変換結果がストアされる先頭オフセットアドレス０，＋８，＋１６，＋２４，＋３２，＋３４，＋３６，＋３８番の各メモリ、及び、４ｍｓ毎のクランク同期のＡ／Ｄ変換結果がストアされる先頭オフセットアドレス−２番地の１ワードのメモリからなり、０．５ｍｓ毎に実行される１回のＡ／Ｄ変換結果が１ワード（２バイト）でストアされる。
【０１００】
先頭オフセットアドレス０番地からは、４段のシフトメモリとなっており、９０°ＣＡ毎のＡ／Ｄ変換結果がストアされ、最新４データ（１回転分）をジョブから参照することができる。また、先頭オフセットアドレス＋３２，＋３４，＋３６，＋３８番地は、各１ワードのメモリであり、なまし処理機能が選択されたとき、Ａ／Ｄ変換結果を加重平均した値がストアされてノイズ除去と精度向上を図ることができるようになっており、これらのメモリのデータは、低速ジョブで利用できる。
【０１０１】
また、各先頭オフセットアドレス＋８，＋１６，＋２４番地からは、各４ワードのメモリであり、４ｍｓジョブで利用するようになっている。これらの各メモリは、最新のＡ／Ｄ変換結果が先頭から数えて、４ｍｓジョブのオーバーラップカウンタＯＬＣの値だけ後のワードにストアされ、４ｍｓジョブ実行に際し先頭ワードからデータが読出され、ジョブの終了に伴って後の各ワードのデータが順に先頭方向のワードにシフトされるので、先にストアしたデータから読出されるＦＩＦＯバッファとなっている。
【０１０２】
すなわち、Ａ／Ｄ変換は、０．５ｍｓ毎の定期割込みにより４ｍｓ周期で正確に行なわれるが、４ｍｓジョブは優先度の高いジョブに邪魔されて遅れることがある。従って、Ａ／Ｄ変換の受渡しにＦＩＦＯバッファを用い、４ｍｓジョブで＋８，＋１６，＋２４番地の各ＦＩＦＯバッファのデータを参照後、上記ステップS526で、各ＦＩＦＯバッファのデータを順にシフトするのである。
【０１０３】
一方、上記ステップS520で、実行すべきジョブが４ｍｓジョブでなく、ラベルＡＬＪ３０へ分岐したときには、ステップS530で、実行すべきジョブが１０ｍｓジョブか否かを調べ、１０ｍｓジョブのとき、ステップS531で、ジョブのワークエリアを設定し、ステップS532で、レベルゼロの割込みを許可すると、ステップS533で、１０ｍｓジョブのセクションに移って、ジョブ本体を実行し、ステップS534で割込みを禁止してルーチンを抜ける。
【０１０４】
尚、上記１０ｍｓジョブのセクションには、半回転時間からエンジン回転数を算出するサービスルーチン、前述した点火スケジュールを作成するサービスルーチンなどがＯＳ側で用意されている。
【０１０５】
また、上記ステップS530で、実行すべきジョブが１０ｍｓジョブでないときには、上記ステップS530からステップS540へ分岐し、実行すべきジョブが低優先クラセンジョブであるか否かを調べる。そして、低優先クラセンジョブでないときには、上記ステップS540からラベルＡＬＪ５０へ分岐し、実行すべきジョブが低優先クラセンジョブのときは、上記ステップS540からステップS541へ進んで、現在の状態が多重待ち状態であるか否かを調べる。
【０１０６】
そして、現在の状態が多重待ち状態でないときには、上記ステップS541からステップS542へ進んで、システム変数Ｓ＿ＡＣＡＳ（クランク総合位置変数）をユーザー変数ＡＣＡＳとしてステップS544へ進み、多重待ち状態のときには、上記ステップS541からステップS543へ分岐し、ユーザー変数ＡＣＡＳを一つ増やして１２で割った剰余をとった後、ステップS544へ進む。
【０１０７】
ステップS544では、ジョブのワークエリアを設定し、ステップS545で、レベルゼロの割込みを許可すると、ステップS546で、低優先クラセンジョブのセクションに移り、ジョブ本体を実行した後、ステップS547で割込みを禁止し、ルーチンを抜ける。
【０１０８】
さらに、ラベルＡＬＪ５０では、ステップS550で実行すべきジョブが５０ｍｓジョブであるか否かを調べ、５０ｍｓジョブのときには、ステップS551へ進んでジョブのワークエリアを設定し、ステップS552へ進む。
【０１０９】
ステップS552では、レベルゼロの割込みを許可すると、ステップS553で、５０ｍｓジョブのセクションに移り、ＯＳ側で用意したエンスト処理ルーチン、気筒別の点火時期リタードルーチン、燃料噴射開始時期設定ルーチンなどを実行し、また、ユーザ側の制御ストラテジーに基づくルーチンを実行する。そして、ジョブの終了後、ステップS554で割込みを禁止し、ルーチンを抜ける。
【０１１０】
一方、上記ステップS550で実行すべきジョブが５０ｍｓジョブではないときには、上記ステップS550からステップS560へ分岐し、ジョブのワークエリアを設定すると、ステップS561で、レベルゼロの割込みを許可し、ステップS562へ進んで、２５０ｍｓジョブのセクション領域へ移行し、ジョブ本体を実行後、ステップS563で割込みを禁止してルーチンを抜ける。
【０１１１】
以上のジョブ優先処理においては、クランク位置を常に的確に把握しておく必要があり、クラセン割込み毎に、図１に示すクランク位置算出サブルーチンが実行されて前述したクランク位置変数Ｓ＿ＣＣＡＳ，Ｓ＿ＲＣＡＳ，Ｓ＿ＡＣＡＳ，Ｓ＿ＥＣＡＳが算出され、半回転時間が算出される。尚、以下の説明においては、システム変数であることを示すＳ＿をクランク位置変数から省略する。
【０１１２】
このクランク位置算出サブルーチンでは、まず、ステップS600で、クラセンタイマの下２バイトをソフトタイマの下２バイトにストアする。このクラセンタイマはＥＣＵ５０に備えられたハードウエアタイマであり、本実施例においては、１６ビットタイマで最大２５５ｍｓまで計数が可能であるが、メモリ上に３バイトの連続した領域を確保して下２バイトにクラセンタイマの２バイトを転写し、クラセンタイマのオーバーフローにより発生する割込みで３バイト目をカウントアップすることによりソフトタイマとして使用する。
【０１１３】
すなわち、クラセンタイマにオーバーフローが発生したとき、図１１のオーバーフロー割込みが発生し、ステップS900で、ソフトタイマの３バイト目を１増やすと、ステップS901で、ソフトタイマの３バイト目が２５５を越えていないかを判別する。そして、２５５を越えていないときには、ステップS901からステップS903へジャンプし、２５５を越えているときには、ステップS901からステップS902へ進んでソフトタイマの３バイト目を２５５で止め、ステップS903へ進む。
【０１１４】
ステップS903では、ソフトタイマの３バイト目が２でないか否か、すなわち、クラセン間隔が０．５ｓｅｃ（２５５ｍｓ×２）を越えてエンスト状態であるか否かを調べる。そして、ソフトタイマの３バイト目が２でないときには割込みを終了し、ソフトタイマの３バイト目が２のときには、上記ステップS903からステップS904へ進んで、エンストフラグが立っているか否かを調べる。
【０１１５】
上記ステップS904では、エンストフラグが立っているときには割込みを終了し、エンストフラグが立っていないときには、ステップS905で、前述した５０ｍｓジョブに用意されているエンスト処理ルーチンを起動させるエンスト処理要求フラグを立てて割込みを終了する。
【０１１６】
これにより、クラセン間隔を最大６４ｓｅｃ（２５５ｍｓ×２５６）まで計数することが可能となり、１６ビット以上の特別なハードウエアタイマを使用することなく、クランキング時などクラセン間隔が極めて長い場合にも容易に対応することができる。
【０１１７】
一方、クランク位置算出のサブルーチンでは、ステップS600からステップS601へ進むと、クラセン間隔が設定時間以下か否かを調べる。この設定時間は、最大エンジン回転数に対応するクラセン間隔としての時間、例えば０．３ｍｓであり、上記ステップS601でクラセン間隔が設定時間以下のときには、ノイズの混入などによるクラセンタイマの計数エラーとしてステップS602でアキュムレータＡにエラーコード１を格納し、上記ステップS601で、クラセン間隔が設定時間より長いときには、クラセンタイマの計数が正常であるとしてステップS603へ進む。
【０１１８】
ステップS603では、後述するＣＣＡＳ・ＲＣＡＳ判別サブルーチンを実行してクランク位置を判別し、ステップS604で、エラーレベルＥＣＡＳが２であるか否か、すなわち、クランキング時などのように気筒判別がなされていない状態であるか否かを調べ、ＥＣＡＳ＝２のときには、ステップS605へ分岐してアキュムレータＡにエラーコード１を格納し、ルーチンを抜ける。
【０１１９】
一方、上記ステップS604で、ＥＣＡＳ≠２のときには、ステップS606へ進み、ソフトタイマの３バイト目を０とする。そしてステップS607へ進み、クランク位置情報変数ＣＣＡＳが１であるか否か、すなわち、現在のクランク位置がＢＴＤＣ６５°ＣＡ〜１０°ＣＡの間（図１４参照）であるか否かを調べ、ＣＣＡＳ＝１のときには、ステップS607からステップS609へジャンプし、ＣＣＡＳ≠１のときには、ステップS607からステップS608へ進んで、Ａ／Ｄ変換リクエストを１増加させ、ステップS609へ進む。
【０１２０】
このＡ／Ｄ変換リクエストは、クランク角９０°毎にクランク同期Ａ／Ｄ変換を指示するためのフラグ的な変数であり、０、１の値をとり、値が１のときクランク同期Ａ／Ｄ変換を指示する。すなわち、前述したように、８チャンネルのＡ／Ｄ変換のうち１チャンネルのＡ／Ｄ変換はクランク角９０°毎に行なわれるが、ＣＣＡＳが０になったとき（ＢＴＤＣ９７°）と、ＣＣＡＳが２になったとき（ＢＴＤＣ１０°）、クランク同期のＡ／Ｄ変換リクエストをセットし、０．５ｍｓ毎のＡ／Ｄ変換順番に対してクランク角９０°毎のＡ／Ｄ変換を割込ませるのである。
【０１２１】
その後、ステップS609では、気筒情報変数ＲＣＡＳを３倍してクランク位置情報変数ＣＣＡＳを加算することにより総合位置変数ＡＣＡＳを算出すると（ＡＣＡＳ＝ＲＣＡＳ×３＋ＣＣＡＳ）、ステップS610で、ソフトタイマを２バイトでリミットし、クラセンタイマがオーバーフローしている場合には下２バイトをＦＦＦＦ（２５５ｍｓ）としてステップS611へ進む。
【０１２２】
ステップS611では、総合位置変数ＡＣＡＳ＝０，１，２，…，１１を添字とする配列ＴＣＡＳ［ＡＣＡＳ］（配列の要素）にクラセン間隔データをストアし、ステップS612で、クランク位置情報変数ＣＣＡＳ＝０，１，２を添字とする配列ＭＴＣＳＸ［ＣＣＡＳ］（配列の要素）にクラセン間隔データをストアする。
【０１２３】
配列ＴＣＡＳは、図１７（ａ）に示すように、ＡＣＡＳ＝０，１，２，…、１１に対応するエンジン２回転分のクラセン間隔データがストアされた１２ワードのクラセン間隔テーブルであり、配列ＭＴＣＳＸは、図１７（ｂ）に示すように、ＣＣＡＳ＝０，１，２に対応する３ヶのクラセン間隔データがストアされた３ワードのクラセン間隔テーブルである。
【０１２４】
すなわち、上記ステップS603のＣＣＡＳ・ＲＣＡＳ判別サブルーチン（詳細は後述する）及び、ステップS609により各情報変数ＣＣＡＳ，ＲＣＡＳ，ＡＣＡＳが更新され、例えば、ＣＣＡＳ＝１、ＲＣＡＳ＝１、ＡＣＡＳ＝４に更新されて、現在、クランク位置が＃３気筒のＢＴＤＣ６５゜〜１０゜ＣＡのとき、クラセンマイマによって計時された＃３気筒のＢＴＤＣ９７゜ＣＡにおけるクラセン信号入力から＃３気筒のＢＴＤＣ６５゜ＣＡにおけるクラセン信号入力までの時間（クラセン間隔データ）を、ステップS611で総合位置変数ＡＣＡＳをパラメータとして配列ＴＣＡＳのＡＣＡＳ＝３のアドレスにストアすると共に、ステップS612でクランク位置情報変数ＣＣＡＳをパラメータとして配列ＭＴＣＳＸのＣＣＡＳ＝０のアドレスにストアする。
【０１２５】
従って、クラセン入力によるクラセン割込み毎に総合位置変数ＡＣＡＳ、クランク位置情報変数ＣＣＡＳが更新される都度、配列ＴＣＡＳ、ＭＴＣＳＸ内のデータが順次更新されるので、配列ＴＣＡＳを参照することにより、各気筒の各クランク位置におけるクラセン間隔の変化（回転速度の変化）を知ることができ、各気筒の失火の有無、燃焼状態などを判断することができ、全気筒の運転状況を把握することができる。また、配列ＭＴＣＳＸを参照することにより、常に最新のクラセン間隔を得ることができ、現在の運転状況を迅速に把握することができる。
【０１２６】
次いで、ステップS613へ進むと、再び、エラーレベルＥＣＡＳの値を調べる。ここでは、前述のステップS604においてＥＣＡＳ≠２であることを既に確認してあるため、エラーレベルＥＣＡＳが１か否か、すなわち、クランク位置の判別が不安の残る推定状態であるか否かを調べる。
【０１２７】
上記ステップS613でＥＣＡＳ≠１（すなわちＥＣＡＳ＝０）であり、クランク位置が確証をもって判別されているときには、上記ステップS613からステップS614へ進んで、最新３ヶのクラセン間隔データの和（配列ＭＴＣＳＸにストアされているクラセン間隔データの和）を、３バイトの半回転時間ＭＴＣＳ１８として算出する（ＭＴＣＳ１８＝ΣＭＴＣＳＸ）。
【０１２８】
すなわち、半回転時間ＭＴＣＳ１８は、クラセン割込み毎にクランク位置情報変数ＣＣＡＳが更新されて配列ＭＴＣＳＸ内のデータが更新される毎に算出され、ＢＴＤＣ９７°，６５°，１０°の各位置毎にクラセン間隔の移動和を取ることにより常に最新のデータが得られるため、現在の運転状況に基づいてエンジン回転数などを算出することができ、より精密な制御が可能となる。
【０１２９】
一方、上記ステップS613で、ＥＣＡＳ＝１であり、クランク位置の判別が不安の残る推定状態であるときには、配列ＭＴＣＳＸから半回転時間ＭＴＣＳ１８を算出せず、ステップS615で半回転時間推定のサブルーチンを実行して半回転時間ＭＴＣＳ１８を推定する。
【０１３０】
この半回転時間ＭＴＣＳ１８の推定について説明すると、まず、図９のステップS700で、クランク位置情報変数ＣＣＡＳが１か否か、すなわち、現在のクランク位置がＢＴＤＣ６５°〜１０°の間か否かを調べ、ＣＣＡＳ＝１のときには、ステップS701で、ＢＴＤＣ９７°〜６５°間の角度３２°から、前回のクラセン間隔×１８０／３２を半回転時間ＭＴＣＳ１８と推定してリターンする。
【０１３１】
一方、上記ステップS700で、ＣＣＡＳ≠１のときには、上記ステップS700からステップS702へ進んで、クランク位置情報変数ＣＣＡＳが２か否か、すなわち、現在のクランク位置がＢＴＤＣ１０°からＡＴＤＣ８３°（次の気筒のＢＴＤＣ９７°）の間か否かを調べ、ＣＣＡＳ≠２のとき（ＣＣＡＳ＝０のとき）には、ステップS703へ進んで、ＢＴＤＣ１０°〜ＡＴＤＣ８３°間の角度９３°から前回のクラセン間隔×１８０／９３を半回転時間ＭＴＣＳ１８と推定してリターンする。また、上記ステップS702で、ＣＣＡＳ＝２のときには、上記ステップS702からステップS704へ分岐し、ＢＴＤＣ６５°〜１０°間の角度５５°から前回のクラセン間隔×１８０／５５を半回転時間ＭＴＣＳ１８と推定してリターンする。
【０１３２】
そして、クランク位置算出サブルーチンでは、ステップS614で半回転時間ＭＴＣＳ１８を算出した後、あるいは、以上説明したステップS615のサブルーチンにより半回転時間ＭＴＣＳ１８を推定した後は、ステップS616へ進み、３バイトの半回転時間ＭＴＣＳ１８を２バイトにリミットして所定の変数ＭＴＣＳＫにストアすると、ステップS617で、この変数ＭＴＣＳＫを２倍して変数ＭＴＣＳＫ４にストアし、ステップS618で、正常終了コード０をアキュムレータＡに格納してルーチンを抜ける。
【０１３３】
そして、前述のジョブ実行サブルーチンにおいて１０ｍｓ毎にエンジン回転数が算出され、このエンジン回転数は、３バイトの半回転時間ＭＴＣＳ１８を２バイトにリミットした変数ＭＴＣＳＫの逆数から算出される。
【０１３４】
詳述すると、毎分回転数ｒｐｍの単位時間（１ｍｉｎ）の半分の時間３０ｓｅｃを半回転時間ＭＴＣＳＫで割算することにより、１ｒｐｍを単位とする２バイト単位の変数ＮＲＰＭ、すなわち、エンジン回転数が算出され（ＮＲＰＭ＝３０ｓｅｃ／ＭＴＣＳＫ）、このエンジン回転数が基本パラメータの１つとして各種の制御量演算処理に用いられるのである。
【０１３５】
次に、図１０に示されるＣＣＡＳ・ＲＣＡＳ判別サブルーチンについて説明する。このサブルーチンでは、まず最初に、ステップS800で、カムセンカウンタを０〜４にリミットする。このカムセンカウンタで計数されるカム角センサ４１からのカムパルス（クラセン信号入力間のカムパルスの数）の数は、図１９に示すように、正常状態の場合０〜３であるが、ノイズなどの影響により４以上の異常な計数値となるおそれがあるため、カムセンカウンタを０〜４にリミットして異常な状態を４で代表するのである。
【０１３６】
次に、ステップS801へ進み、カムセンカウンタ（の計数値）、気筒情報変数ＲＣＡＳ、クランク位置情報変数ＣＣＡＳから、５×４×２の組合わせ（カムセンカウンタが０〜４の５種類、気筒情報変数ＲＣＡＳが０〜３の４種類、クランク位置情報変数ＣＣＡＳが０，１と２の場合の２種類）に対する状態データがストアされている気筒・クランク位置状態マップＣＣＨＭＡＰを読む。
【０１３７】
この気筒・クランク位置状態マップＣＣＨＭＡＰは、図１８（ａ）及び（ｂ）に示すように、クランク位置情報変数ＣＣＡＳが０あるいは１の場合と、気筒情報変数ＲＣＡＳの変化点であるクランク位置情報変数ＣＣＡＳが２の場合とに分け、カムセンカウンタと気筒情報変数ＲＣＡＳの各組合わせの起こり得る全ての状態に対し、正常か異常か、確定して良いか推定すべきかを示す状態データがストアされており、現在の状態を評価し、次にとるべき状態を知ることができる。
【０１３８】
すなわち、通常の条件判断による処理に比較して大幅にプログラムを簡略化することができ、メモリ容量の節約、処理速度の向上を図ることができるとともに、仕様変更に対しても柔軟に対処することができる。
【０１３９】
この状態データは２ビットのデータであり、ビット０の値により確定か推定かを表わし、ビット１の値により正常か異常かを表わす。ビット０の値は、０のとき確定、１のとき推定を示し、図１９からわかるように、カムセンカウンタが２，３の場合にのみ確定であって、それ以外は推定せざるを得ない状態である。また、ビット１の値は、０のとき正常、１のとき異常を示し、カムセンカウンタが３以下で、且つ、図１４及び図１９による組合せに合致する場合のみ正常であって、それ以外は異常な状態である。
【０１４０】
例えば、ＣＣＡＳ＝０あるいは１、すなわち、ある気筒のＢＴＤＣ９７°〜１０°に対し、カムセンカウンタが０で気筒情報変数ＲＣＡＳが０となる組合せは、図１４及び図１９からもわかるように、クランク位置を正常に推定すれば良い状態であるため、気筒・クランク位置状態マップＣＣＨＭＡＰの該当領域に２進数で０１（正常推定）の状態データがストアされており、さらに、カムセンカウンタが１で気筒情報変数ＲＣＡＳが０となる組合せは、明らかに異常であって推定するしかない状態であるため、気筒・クランク位置状態マップＣＣＨＭＡＰの該当領域に２進数で１１（異常推定）の状態データがストアされている。
【０１４１】
また、ＣＣＡＳ＝２、すなわち、ある気筒のＢＴＤＣ１０°〜ＡＴＤＣ８３°に対し、カムセンカウンタが３で気筒情報変数ＲＣＡＳが０となる組合せは、＃１気筒のＴＤＣを挟んだクランク位置と正常に確定できるため、気筒・クランク位置状態マップＣＣＨＭＡＰの該当領域に２進数で００（正常確定）の状態データがストアされており、さらに、カムセンカウンタが２で気筒情報変数ＲＣＡＳが０となる組合せは、明らかに異常ではあるがカムセン入力が２ヶある以上確定せざるを得ない状態であるため、気筒・クランク位置状態マップＣＣＨＭＡＰの該当領域に２進数で１０（異常確定）の状態データがストアされている。
【０１４２】
そして、上記ステップS801で気筒・クランク位置状態マップＣＣＨＭＡＰから状態データを読込むと、ステップS802へ進み、エラーレベルＥＣＡＳが２でないか否か、すなわち、現在の状態が気筒判別のなされていない不明な状態であるか否かを調べ、ＥＣＡＳ＝２のときには、ステップS803で気筒・クランク位置状態マップＣＣＨＭＡＰから読込んだ状態データのビット０が０か否か、すなわち確定状態か否かを調べ、確定状態のときにはステップS804へ進み、確定状態でなく推定状態であるときにはルーチンを抜けて確定状態となるまで待つ。
【０１４３】
一方、上記ステップS802でＥＣＡＳ≠２のときにはステップS804へ進んで、推定状態か否かを調べ、確定状態、推定状態に応じてステップS805以降の処理あるいはステップS812以降の処理へ進む。また、上記ステップS803において確定状態でステップS804へ進んだときには、ステップS805以降の処理へ進む。
【０１４４】
まず、ステップS805以降の処理について説明すると、このステップS805へ進んだときには、正常、異常に拘らず気筒判別がなされた確定状態であるため、図１９のタイムチャートからもわかるように、今回のクラセン割込みはカムパルスが３ヶあるいは２ヶ入力された後のＢＴＤＣ９７°の割込みであるため、クランク位置情報変数ＣＣＡＳを０にする。
【０１４５】
次いで、ステップS806へ進んでカムセンカウンタが３でないか否かを調べ、カムセンカウンタが３でないとき、すなわちカムセンカウンタが２のときには、＃２気筒の点火後であるため、ステップS807で気筒情報変数ＲＣＡＳを３にしてステップS809へ進み、カムセンカウンタが３のときには、＃１気筒の点火後であるため、ステップS808で気筒情報変数ＲＣＡＳを１にしてステップS809へ進む。
【０１４６】
ステップS809では、更新したクランク位置情報変数ＣＣＡＳ、気筒情報変数ＲＣＡＳ、及び、カムセンカウンタをパラメータとして再び気筒・クランク位置状態マップＣＣＨＭＡＰから状態データを読込み、この状態データのビット１が１であるか、すなわち異常状態であるか否かを調べる。
【０１４７】
その結果、上記ステップS809において、状態データのビット１が１で異常状態と判定されるときには、クランク位置情報変数ＣＣＡＳ、気筒情報変数ＲＣＡＳの更新結果は不安の残る推定であるとしてステップS810でエラーレベルＥＣＡＳを１にしてルーチンを抜け、状態データのビット１が０であり正常状態であるときには、ステップS811でエラーレベルＥＣＡＳを０としてルーチンを抜ける。
【０１４８】
一方、ステップS812以降の処理では、ステップS812で、現在のクランク位置情報変数ＣＣＡＳ（前回のクラセン割込みで算出されたクランク位置情報変数ＣＣＡＳ）が２、すなわち、気筒情報変数ＲＣＡＳの変化点であるか否かを調べ、ＣＣＡＳ＝２のときには、ステップS812からステップS813へ進んで、気筒情報変数ＲＣＡＳを１増加させ、ステップS814でクランク位置情報変数ＣＣＡＳ＝０にしてステップS817へ進む。
【０１４９】
一方、上記ステップS812で、ＣＣＡＳ≠２のときには、上記ステップS812からからステップS815へ進んでカムセンカウンタが０でないか否かを調べ、カムセンカウンタが０でないときには、前述のステップS813へ分岐し、カムセンカウンタが０のときには、ステップS816でクランク位置情報変数ＣＣＡＳを１増加させ、ステップS817へ進む。
【０１５０】
ステップS817では、更新したクランク位置情報変数ＣＣＡＳ、気筒情報変数ＲＣＡＳ、及び、カムセンカウンタをパラメータとして再び気筒・クランク位置状態マップＣＣＨＭＡＰから状態データを読込んで異常状態であるか否かを調べ、状態データのビット１が０であり、正常状態であるときには、そのまま（現在のエラーレベルＥＣＡＳ＝０のまま）ルーチンを抜ける。また、上記ステップS817で、状態データのビット１が１で異常状態のときには、ステップS818へ進み、クランク位置情報変数ＣＣＡＳ、気筒情報変数ＲＣＡＳの更新結果は不安の残る推定であるとしてエラーレベルＥＣＡＳを１にし、ルーチンを抜ける。
【０１５１】
【発明の効果】
以上説明したように請求項１記載の発明によれば、エンジン半回転毎に予め設定された複数のクランク角度位置に対応してクランクパルスを出力構成し、該クランクパルスが入力する都度、前回クランクパルスが入力してからのクランクパルス入力間隔時間を計測すると共に、該時間値を含めエンジン半回転当たりに入力されるクランクパルスと同数個のクランクパルス入力間隔時間を経時的に記憶し、これら時間値を加算してエンジン半回転当たりの時間を算出するので、遅れなく常に最新のエンジン半回転当たりの時間値を得ることができ、この時間値により現在の運転状況を迅速に把握することができて、エンジン半回転当たりの時間値を用いて算出されるエンジン運転状況を表すデータが、常に遅れなく現在の運転状況を示すデータとして得られ、このデータにより現在の運転状況に基づいてより精密な制御を行うことができる。
請求項２記載の発明によれば、エンジンの半回転当たりに入力されるクランクパルスと同数であってこれら各クランクパルス毎のクランク位置情報に対応付けたアドレスを有するテーブルを備える。そして、クランクパルスの入力毎に、テーブルの対応アドレスに前回クランクパルス入力から今回クランクパルス入力までの時間をストアする。そして、テーブルの各アドレスにストアされている時間を加算してエンジン半回転当たりの時間を算出するので、上記請求項１記載の発明の効果に加え、非常に簡単な処理で各クランクパルスの入力毎に各クランクパルス間の時間の加算値を得ることができ、演算負担を軽減して実現できる。
【図面の簡単な説明】
【図１】クランク位置算出サブルーチンのフローチャート
【図２】０．５ｍｓ毎の定期割込み処理のフローチャート
【図３】クラセン割込み処理のフローチャート
【図４】ジョブ優先処理のフローチャート
【図５】ジョブ実行サブルーチンの部分フローチャート１
【図６】ジョブ実行サブルーチンの部分フローチャート２
【図７】ジョブ実行サブルーチンの部分フローチャート３
【図８】ジョブ実行サブルーチンの部分フローチャート４
【図９】半回転時間推定サブルーチンのフローチャート
【図１０】ＣＣＡＳ・ＲＣＡＳ判別サブルーチンのフローチャート
【図１１】クラセンタイマのオーバーフロー割込み処理のフローチャート
【図１２】ジョブの実行状態を示す説明図
【図１３】ジョブフラグの説明図
【図１４】クランク位置変数の説明図
【図１５】ジョブ実行中フラグとオーバーラップカウンタの変化を示す説明図
【図１６】システムシフトバッファの説明図
【図１７】クラセン間隔テーブルの説明図
【図１８】気筒・クランク位置状態マップの説明図
【図１９】クランク位置とエンジンの行程を示すタイムチャート
【図２０】エンジン系の概略構成図
【図２１】クランクロータとクランク角センサの正面図
【図２２】カムロータとカム角センサの正面図
【図２３】電子制御系の回路構成図
【符号の説明】
５０          ＥＣＵ
ＭＴＣＳＸ    クラセン間隔テーブル
ＭＴＣＳ１８  半回転時間
ＣＣＡＳ      クランク位置情報変数
【図１】
0003645576.tif 000002
【図２】
0003645576.tif 000003
【図３】
0003645576.tif 000004
【図４】
0003645576.tif 000005
【図５】
0003645576.tif 000006
【図６】
0003645576.tif 000007
【図７】
0003645576.tif 000008
【図８】
0003645576.tif 000009
【図９】
0003645576.tif 000010
【図１０】
0003645576.tif 000011
【図１１】
0003645576.tif 000012
【図１２】
0003645576.tif 000013
【図１３】
0003645576.tif 000014
【図１４】
0003645576.tif 000015
【図１５】
0003645576.tif 000016
【図１６】
0003645576.tif 000017
【図１７】
0003645576.tif 000018
【図１８】
0003645576.tif 000019
【図１９】
0003645576.tif 000020
【図２０】
0003645576.tif 000021
【図２１】
0003645576.tif 000022
【図２２】
0003645576.tif 000023
【図２３】
0003645576.tif 000024