(57)【要約】【課題】多重化した安全機能の一部に異常が生じた場合でも他の正常な安全機能を継続して実施できる。【解決手段】二重化したセーフティ機能であるセーフティ部α２０、セーフティ部β３０を、相互に異なる周期区間で実行させる。その実行中に随時シーケンス番号がシーケンス管理テーブル４３に格納される。時間・順序監視処理部４１は、例えば各周期毎に、シーケンス管理テーブル４３を参照して、その周期区間に実行されたセーフティ機能の異常判定を行う。そして、異常と判定した場合には、当該周期区間に実行されたセーフティ機能を強制終了して機能停止させるが（以降、動作させない）、他のセーフティ機能は継続して動作させる。【選択図】図１
2014206821.tif 000002
【特許請求の範囲】
【請求項１】
１つのプロセッサ上に多重化された安全機能部が備えられる安全関連装置であって、
定周期の各周期区間毎に、それぞれ、前記多重化された安全機能部のうちの何れかの安全機能部を実行させると共に、タスクレベルが最も高い監視処理部を前記定周期で実行させる割込制御手段と、
前記各安全機能部毎に対応して、予め任意の設定値が記憶されると共に、その安全機能部の実行に伴って随時所定の実績情報が記憶・更新される安全制御記憶手段とを有し、
前記監視処理部は、前記定周期で実行する毎に、そのときの前記周期区間に実行された安全機能部に関する前記設定値と前記実績情報とに基づいて、該安全機能部の正常／異常を判定することを特徴とする安全関連装置。
【請求項２】
前記監視処理部は、任意の前記安全機能部について異常と判定した場合には、該安全機能部を機能停止状態とすると共に、他の安全機能部の処理は続行させることを特徴とする請求項１記載の安全関連装置。
【請求項３】
前記各安全機能部の処理には高速処理と低速処理が含まれ、
前記定周期は、前記高速処理に応じた第一定周期と、前記低速処理に応じた第二定周期であり、
前記割込制御手段は、前記第一定周期の各周期区間毎にそれぞれ前記多重化された安全機能部のうちの何れかの安全機能部の前記高速処理を実行させると共に、前記監視処理部を前記第一定周期で実行させることを特徴とする請求項１または２記載の安全関連装置。
【請求項４】
前記監視処理部は、前記第一定周期で実行する毎に、そのときの前記周期区間に実行された安全機能部の高速処理に関する前記設定値と前記実績情報とに基づいて、該安全機能部の高速処理の正常／異常を判定することを特徴とする請求項３記載の安全関連装置。
【請求項５】
前記割込制御手段は、前記第二定周期の各周期区間毎にそれぞれ前記多重化された安全機能部のうちの何れかの安全機能部の前記低速処理を実行させると共に、前記監視処理部を更に前記第二定周期でも実行させることを特徴とする請求項３または４記載の安全関連装置。
【請求項６】
前記監視処理部は、前記第二定周期で実行する毎に、そのときの前記周期区間に実行された安全機能部の低速処理に関する前記設定値と前記実績情報とに基づいて、該安全機能部の低速処理の正常／異常を判定することを特徴とする請求項５記載の安全関連装置。
【請求項７】
前記監視処理部は、任意の前記安全機能部の前記高速処理と前記低速処理の何れかを異常と判定した場合には、該安全機能部全体を機能停止状態とすることを特徴とする請求項６記載の安全関連装置。
【請求項８】
前記各安全機能部あるいは前記高速処理／低速処理は、予め各々に実行順序番号が割り当てられた複数の部分処理から成り、
各部分処理が実行される毎に、その前記実行順序番号を前記実績情報として前記安全制御記憶手段に上書き記憶する終了情報収集処理手段を更に有し、
該安全制御記憶手段に記憶される前記設定値は、該複数の部分処理のなかで最後に実行させるべき部分処理の前記実行順序番号であり、
前記監視処理部は、前記安全制御記憶手段に記憶される前記実績情報としての前記実行順序番号が、前記設定値と一致する場合には正常と判定することを特徴とする請求項１〜７の何れかに記載の安全関連装置。
【請求項９】
前記終了情報収集処理手段は、各部分処理が実行される毎に、その実行順序が正常か否かを判定し、正常である場合にその前記実行順序番号を前記実績情報として前記安全制御記憶手段に上書き記憶することを特徴とする請求項８記載の安全関連装置。
【請求項１０】
ウォッチドッグタイマを更に有し、
前記監視処理部は、前記多重化された安全機能部が全て異常となった場合には、前記ウォッチドッグタイマをリセットしないことによって該ウォッチドッグタイマによって前記プロセッサのＣＰＵリセットを掛けさせることを特徴とする請求項１〜９の何れかに記載の安全関連装置。
【請求項１１】
前記各安全機能部の処理には更に診断処理が含まれ、
前記割込制御手段は、該複数の診断処理のうちの何れか１つを実行させ、
前記監視処理部は、前記第二定周期より長い第三定周期毎に、該第三定周期の周期区間に実行された診断処理の正常／異常を、該診断処理に係わる前記設定値と前記実績情報とに基づいて判定し、異常と判定した場合には他の診断処理に切り替えて実行させることを特徴とする請求項１〜１０の何れかに記載の安全関連装置。
【請求項１２】
ウォッチドッグタイマを更に有し、
前記監視処理部は、前記複数の診断処理の全てが異常と判定された場合には、前記ウォッチドッグタイマをリセットしないことによって該ウォッチドッグタイマによって前記プロセッサのＣＰＵリセットを掛けさせることを特徴とする請求項１１記載の安全関連装置。
【請求項１３】
前記多重化された各安全制御部毎に、それぞれ、予め所定の記憶領域が割り当てられると共に、他の安全制御部に割り当てられた記憶領域がアクセス不可の記憶領域として登録されるメモリ保護情報記憶手段と、
任意の前記安全制御部による任意のメモリアクセスが発生する毎に、前記メモリ保護情報記憶手段を参照して該メモリアクセス先が前記アクセス不可の記憶領域であるか否かを判定し、該メモリアクセス先が前記アクセス不可の記憶領域である場合には該メモリアクセスを阻止するメモリ保護手段と、
を更に有することを特徴とする請求項１〜１２の何れかに記載の安全関連装置。
【請求項１４】
１つのプロセッサ上に多重化された安全機能部が備えられる安全関連装置のコンピュータを、
定周期の各周期区間毎に、それぞれ、前記多重化された安全機能部のうちの何れかの安全機能部を実行させると共に、タスクレベルが最も高い監視処理部を前記定周期で実行させる割込制御手段と、
前記各安全機能部毎に対応して、予め任意の設定値が記憶されると共に、その安全機能部の実行に伴って随時所定の実績情報が記憶・更新される安全制御記憶手段と、
前記監視処理部が有する手段であって、該監視処理部が前記定周期で実行される毎に、そのときの前記周期区間に実行された安全機能部に関する前記設定値と前記実績情報とに基づいて、該安全機能部の正常／異常を判定する異常判定手段、
として機能させるためのプログラム。
【請求項１５】
前記コンピュータを更に、
前記多重化された各安全制御部毎に、それぞれ、予め所定の記憶領域が割り当てられると共に、他の安全制御部に割り当てられた記憶領域がアクセス不可の記憶領域として登録されるメモリ保護情報記憶手段と、
任意の前記安全制御部による任意のメモリアクセスが発生する毎に、前記メモリ保護情報記憶手段を参照して該メモリアクセス先が前記アクセス不可の記憶領域であるか否かを判定し、該メモリアクセス先が前記アクセス不可の記憶領域である場合には該メモリアクセスを阻止するメモリ保護手段、
として機能させるためのプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、安全関連の制御を行うセーフティモジュールの安全処理監視方式に関する
【背景技術】
【０００２】
例えば、自動車の車載制御装置などに、安全関連装置が適用されている。
例えば、自動車に係わる任意の制御対象の制御を行う非セーフティ部と、該非セーフティ部の制御に係る安全制御を行う安全制御部（セーフティ機能）とを有する構成の安全関連装置（安全処理監視システム）が知られている。
【０００３】
安全関連装置のセーフティ機能は、一般に、エンコーダ入力に関わる処理などマイクロ秒オーダの周期で処理をする高速処理と、非常停止など安全入力がされた場合のフォールトリアクション処理などのミリ秒オーダで処理をする低速処理と、ＣＰＵ診断、メモリ診断など、例えば１時間の周期で処理をする診断処理に分けることができる。
【０００４】
また、特許文献１には、車両の制御ユニットと監視モジュールによる車両の駆動シーケンスの監視方法が提示されている。
非特許文献１には、Combination of temporal and logical monitoring of program sequences技法の説明が記載されている。
なお、プログラムシーケンスの時間的、論理的監視によって、ＣＰＵの命令実行、アドレス変換、レジスタ、メモリ、ソフトウェアのなどのフォールトを検出できる。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２００３−１３１７３４号公報
【非特許文献】
【０００６】
【非特許文献１】ＩＳＯ２６２６２−５ Road vehicles - Functional safety -Part 5:Product development at the hardware level
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特許文献１に記載されている方法は、監視モジュールが発行した質問に対する、制御機能及び第一の監視機能の応答を、監視モジュールが確認する。質問、応答とも少なくとも１つであり、エラーの認識は制御機能に対して一律となり、安全機能を二重化しても、一律にエラー処理が行われる。従って、二重化した安全機能の片方が正常であってもエラーとして扱われ、安全機能が喪失する。
【０００８】
また、監視モジュールは質問の発行、応答の判断など高機能が要求され、好ましくはゲートアレイが要求されている。従って、一般に使用されているウオッチドッグ装置を使用することができない。
【０００９】
非特許文献１のAnnex DのD.2.9.4章では、Combination of temporal and logical monitoring of program sequencesの目的と説明が記載されているが、具体的実現方法は記載されていない。
【００１０】
本発明の課題は、多重化した安全機能の一部に異常が生じた場合でも他の正常な安全機能を継続して実施できるフォールトトレランスを向上した安全処理監視を実現でき、特に一般的且つ簡易な構成によって低コストで実現できる安全関連装置等を提供することである。
【課題を解決するための手段】
【００１１】
本発明の安全関連装置は、１つのプロセッサ上に多重化された安全機能部が備えられる安全関連装置であって、定周期の各周期区間毎に、それぞれ、前記多重化された安全機能部のうちの何れかの安全機能部を実行させると共に、タスクレベルが最も高い監視処理部を前記定周期で実行させる割込制御手段と、前記各安全機能部毎に対応して、予め任意の設定値が記憶されると共に、その安全機能部の実行に伴って随時所定の実績情報が記憶・更新される安全制御記憶手段とを有し、前記監視処理部は、前記定周期で実行する毎に、そのときの前記周期区間に実行された安全機能部に関する前記設定値と前記実績情報とに基づいて、該安全機能部の正常／異常を判定する。
【発明の効果】
【００１２】
本発明の安全関連装置等によれば、多重化した安全機能の一部に異常が生じた場合でも他の正常な安全機能を継続して実施できるフォールトトレランスを向上した安全処理監視を実現でき、特に一般的且つ簡易な構成によって低コストで実現できる。
【図面の簡単な説明】
【００１３】
【図１】本例の安全処理監視システムのシステム構成図である。
【図２】割込入力処理例である。
【図３】シーケンス管理テーブルの具体例である。
【図４】プログラム終了情報収集処理部のフローチャート図である。
【図５】（ａ）、（ｂ）は高速処理αに係わる処理の具体例である。
【図６】時間・順序監視処理部の処理フローチャート図（定周期１）である。
【図７】時間・順序監視処理部の処理フローチャート図（定周期２）である。
【図８】αとβを同一周期区間に割り当てた場合の問題点を説明する為の図である。
【図９】メモリ保護情報の一例である。
【図１０】（ａ）はアドレス変換テーブル、（ｂ）はアクセス不可テーブルの一例である。
【図１１】不図示のメモリ保護機能の処理フローチャート図である。
【発明を実施するための形態】
【００１４】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例の安全処理監視システムのシステム構成図である。
図示の安全処理監視システムは、ＣＰＵ１、ウォッチドッグタイマー２、クロック３等を有する。
【００１５】
本例の安全処理監視システム（安全関連装置）は、例えば一例としては何らかの制御対象の制御等を行う非セーフティ部と、この非セーフティ部の制御等に係わる安全制御を行う安全機能（セーフティ部）とを、１つのプロセッサ（ＣＰＵ１）上に搭載している。
【００１６】
更に、安全機能を多重化している（図示の例では二重化であるが、三重化等であってもよい）。すなわち、上記安全機能は、図示のセーフティ部α２０とセーフティ部β３０とに二重化されている。尚、これらセーフティ部α２０，セーフティ部β３０の各種機能のなかで基本的な機能は、従来と略同様であって構わない（よって、特に説明しない）。
【００１７】
また、既に述べたように、安全関連装置のセーフティ機能は、一般に、エンコーダ入力に関わる処理などマイクロ秒オーダの周期で処理をする高速処理と、非常停止ボタンなどで安全入力が行われた場合のフォールトリアクション処理などのミリ秒オーダで処理をする低速処理と、ＣＰＵ診断、メモリ診断など、例えば１時間の周期で処理をする診断処理に分けることができる。本例の安全処理監視システムの上記多重化された安全機能（セーフティ部α２０とセーフティ部β３０）も、これら高速処理、低速処理、診断処理の３種類の処理機能を有している。
【００１８】
また、本例の安全処理監視システムは、自動車の車載制御装置など、小型かつ軽量化が要求され、安全機能を多重化したくても安全関連装置（ＣＰＵ等）を多数搭載できない場合に好適である。すなわち、本例の安全処理監視システムは、１つのＣＰＵ内にセーフティ機能と非セーフティ機能が共存し、セーフティ機能は多重化され、フォールトトレランスなどの安全性や信頼性を実現する構成となっている。多重化のために多数のＣＰＵを実装する必要がなく、１つのＣＰＵで多重化を実現することにより、車載装置などに要求される、セーフティ機能を持つ装置の小型、軽量化を実現できる。
【００１９】
そして、本例の安全処理監視システムでは、上記多重化されたセーフティ機能の１つにメモリ異常やプログラムミスによるメモリーリークやループ（永久ループ）などの異常が発生した場合、当該異常が生じたセーフティ機能を機能停止して（強制終了等して）、他のセーフティ機能は運用続行できる（従来ではこの様な場合でもＣＰＵリセットを掛けていた）。また、ウオッチドッグタイマー、ＣＰＵなどで実現できるので、ハードウェアも特殊なものを使用する必要がなく、低コスト化が実現できる。
【００２０】
本例の安全処理監視システムでは、上記効果の為に例えば下記の特徴を有する。
（１）１つの一ＣＰＵ内で多重化したセーフティ機能タスクを、別々の周期に割りつけることで、時間監視とプログラムシーケンス監視をセーフティ機能タスク個別に行う。
（２）（１）の監視処理で異常を検出した場合は、多重化したセーフティ機能のうち異常を検出したセーフティ機能を機能停止する（換言すれば、従来のようにＣＰＵリセットを掛けない）。
【００２１】
上記本手法の特徴について、以下、詳しく説明する。
まず、本手法では、１つのＣＰＵ１上に、非セーフティ部１０、セーフティ部α２０、セーフティ部β３０を有している。これは、本出願人による先願（特願2012-190662号）によって提案した手法によって実現させている。すなわち、概略的には、非セーフティ部１０とセーフティ部α２０とセーフティ部β３０との間で少なくとも悪影響のある干渉が行えない構成とすることで、１つのＣＰＵ上に非セーフティ機能と（多重化した）セーフティ機能を設けても問題ないようにしている。
【００２２】
この先願の手法について、更に詳しい説明は、本説明の最後でまとめて行うものとするが、概略的には、ＣＰＵ１は不図示の内蔵メモリを有するものであって、非セーフティ部１０、セーフティ部α２０、セーフティ部β３０には各々予め所定のメモリ領域が割り当てられている。そして、例えば、非セーフティ部１０がセーフティ部α２０やセーフティ部β３０のメモリ領域にはアクセス出来ないようにする機能や、セーフティ部α２０とセーフティ部β３０とで互いのメモリ領域にはアクセス出来ないようにする機能等（不図示のメモリ保護機能）が、ＣＰＵ１に設けられている。
【００２３】
尚、セーフティ部α２０とセーフティ部β３０の各機能自体は、先願のセーフティ部とは多少異なる（図示の詳細構成を有するものであり。詳しくは後述する）。
そして、本例のＣＰＵ１は、上記非セーフティ部１０、セーフティ部α２０、セーフティ部β３０を有する構成に対して、更に、時間・順序監視処理部４１、割込処理部４２、シーケンス管理テーブル４３、プログラム終了情報収集処理部４４、プログラム終了情報収集処理部４５を有するものである。本手法では、これらの構成によって、例えば上記セーフティ部α２０とセーフティ部β３０の何れか一方に異常（暴走して永久ループ状態になる等）が生じても、強制終了等して異常があったセーフティ部は機能停止するが、他のセーフティ部は継続実施され、フォールトトレランスが実現でき、安全性を向上できる。
【００２４】
尚、ＣＰＵ１の上記不図示の内蔵メモリには、予め所定のプログラムが記憶されており、ＣＰＵ１がこのプログラムを実行することにより上記非セーフティ部１０、セーフティ部α２０、セーフティ部β３０、時間・順序監視処理部４１、割込処理部４２や不図示のメモリ保護機能等の各種処理機能が実現される。また、この内蔵メモリには上記シーケンス管理テーブル４３等が記憶される。
【００２５】
非セーフティ部１０は、図示の「非安全入力」に対して通常の制御などを行う為の図示の「非安全出力」を不図示の制御対象などに対して出力する。上記通常の制御についてはここでは関係ないので特に説明しないものとする。
【００２６】
セーフティ部α２０、セーフティ部β３０は、多重化（本例では二重化であるが三重化以上であっても構わない）されているセーフティ機能である。尚、多重化に関しては、ダイバーシティ設計を行い、同一原因で異常が発生しないように設計することが望ましい。
【００２７】
尚、ＣＰＵ１は不図示の内蔵メモリを有しており、この内蔵メモリには予め所定のプログラムが格納されている。ＣＰＵ１が、このプログラムを実行することにより、非セーフティ部１０、セーフティ部α２０、セーフティ部β３０の各種機能や、後述する時間・順序監視処理部４１や割込処理部４２の処理機能等が実現される。
【００２８】
セーフティ部α２０は、安全入力Ａに対して安全出力Ａを出力する。セーフティ部β３０は、安全入力Ｂに対して安全出力Ｂを出力する。尚、安全入力Ａと安全入力Ｂは、同じ入力であってもよく、例えば一例としてはＳＴＯ（Safe torque off）入力等である。ＳＴＯ入力は、例えば作業員等が外部の不図示の非常停止ボタンを押すことで、（正常であれば）上記二重化されたセーフティ部α２０、セーフティ部β３０の安全入力Ａ，Ｂが両方ともＯＮとなるように構成している。
【００２９】
セーフティ部α２０は、入力処理部２１、出力処理部２４、セーフティ部α高速処理部２２、セーフティ部α低速処理部２３、セーフティ部診断処理部２５に機能分割される。
尚、本説明では、セーフティ部α高速処理部２２は高速処理αを実行し、セーフティ部α低速処理部２は低速処理αを実行するものと言うものとする。また、後述するセーフティ部β高速処理部３２は高速処理βを実行し、セーフティ部β低速処理部３３は低速処理βを実行するものと言うものとする。また、本説明では、これら処理部２２，２３，３２，３３の代わりに、高速処理α、β、低速処理α、βを用いて説明する場合もあるものとする。
【００３０】
尚、背景技術で述べたように、安全関連装置のセーフティ機能は、一般に、例えばマイクロ秒オーダの周期で処理実行する高速処理と、非常停止など安全入力がされた場合のフォールトリアクション処理などのミリ秒オーダで処理実行する低速処理と、ＣＰＵ診断、メモリ診断など、例えば１時間の周期で処理をする診断処理に分けることができる。
【００３１】
尚、例えば、入力処理部２１と出力処理部２４は、セーフティ部α高速処理部２２、セーフティα低速処理部２３、セーフティ部診断処理部２５のサブルーチンの扱いとする。
セーフティ部α２０に対応して、上記プログラム終了情報収集処理部４４を設けている。プログラム終了情報収集処理部４４は、セーフティ部α２０に関して、プログラムの実行時間やシーケンスを監視する（プログラムシーケンス番号の更新とチェック等を行う）処理機能部であり、当該処理はサブルーチンの扱いとする。
【００３２】
同様に、セーフティ部β３０に対応して、上記プログラム終了情報収集処理部４５を設けている。プログラム終了情報収集処理部４５は、セーフティ部β３０に関して、プログラムの実行時間やシーケンスを監視する（プログラムシーケンス番号の更新とチェック等を行う）処理機能部であり、当該処理はサブルーチンの扱いとする。
【００３３】
上記プログラム終了情報収集処理部４４、４５については、詳細を図４、適用例を図５に示し、後に説明する。
セーフティ部α２０は、安全入力Ａに対して、安全制御を行い、安全出力Ａを出力する。この安全制御処理は、上記セーフティ部α高速処理部２２、セーフティα低速処理部２３が実行する。尚、セーフティ部α高速処理部２２は高速処理α、セーフティα低速処理部２３は低速処理αを実行するものとする。これら高速処理α、低速処理αや後述する高速処理β、低速処理βは、定周期割り込みによるタスクとして処理される。
【００３４】
また、尚、高速処理αと後述する高速処理βをまとめて高速処理と言う場合もあるものとする。同様に、低速処理αと後述する低速処理βをまとめて低速処理と言う場合もあるものとする。
【００３５】
高速処理は、後述する定周期１の定周期割り込みによって起動されて処理実行するが、例えば高速処理αと後述する高速処理βとを交互に実行する。つまり、定周期１の各周期区間（定周期１区間と記す場合もあるものとする）に対して、高速処理αと高速処理βとを相互に異なる周期区間に割り当てる（よって、交互に実行する例に限らない。例えば高速処理αを２つの周期区間で連続して実行し、高速処理βも２つの周期区間で連続して実行するようにしてもよい）。尚、この例では、高速処理αと後述する高速処理βは、それぞれ、実質的に定周期１の２倍の周期で起動されて処理実行する。
【００３６】
また、低速処理は、後述する定周期２の定周期割り込みによって起動されて処理実行するが、例えば低速処理αと後述する低速処理βとを交互に実行する。つまり、定周期２の各周期区間（定周期２区間と記す場合もあるものとする）に対して、低速処理αと低速処理βとを相互に異なる周期区間に割り当てる（よって、交互に実行する例に限らない）。尚、この例では、低速処理αと後述する低速処理βは、それぞれ、実質的に定周期２の２倍の周期で起動されて処理実行する。
【００３７】
尚、定周期１＜定周期２であり、高速処理は、低速処理よりも起動頻度が高い。定周期割り込み（起動）は、割込処理部４２によって行われる。
セーフティ部診断処理部２５は、その診断処理によって異常を検出した場合にモータ停止などの安全出力Ａを行う。その他、出力に対するフィードバック入力等があるが、ここでは説明を省略する。
【００３８】
何れにしても、高速処理、低速処理、診断処理は、何れも、その処理自体は上記背景技術で述べたような既存の処理であるので、これ以上詳細には説明しない。
ここで、セーフティ部β３０にも、セーフティ部診断処理部２５と略同一の機能部であるセーフティ部診断処理部３５がある。つまり、セーフティ部診断処理部２５は、セーフティ部α２０だけを診断対象とするのではなく安全機能全体（つまり、本例ではセーフティ部α２０とセーフティ部β３０の両方とも）を診断対象とする。同様に、セーフティ部診断処理部３５は、セーフティ部β３０だけを診断対象とするのではなく安全機能全体（つまり、本例ではセーフティ部α２０とセーフティ部β３０の両方とも）を診断対象とする。従って、セーフティ部診断処理部２５、３５の両方を実行させる必要はなく、どちらか一方のみを実行（稼動側とする）させるようにすれば済む。
【００３９】
各診断処理部２５，３５は、内部割り込み処理タスクとする。セーフティ部診断処理部２５とセーフティ部診断処理部３５とは、ダイバース化した同じ機能であり、どちらか一方が稼動側、他方が待機側となり、稼動側のみが動作する。そして、稼動側の診断処理部の異常が検出された場合は、時間・順序監視処理部４１により切り替えが実施され、他方の（待機側であった）診断処理部が新たな稼動側となって起動される。
【００４０】
また、セーフティ部診断処理部（２５または３５；そのときに稼動側となっているもの）は、上記定周期２よりも長い定周期（上記のように例えば１時間の周期）で動作する。
また、安全入力、安全出力に対して、セーフティ部αとセーフティ部βとで突き合わせを行うなどの処理もあるが、ここでの説明は省略する。
【００４１】
また、セーフティ部β３０は、入力処理部３１、出力処理部３４、セーフティ部β高速処理部３２、セーフティ部β低速処理部３３、セーフティ部診断処理部３５に機能分割される。尚、セーフティ部β高速処理部３２は高速処理β、セーフティ部β低速処理部３３は低速処理βを実行するものとする。
【００４２】
上記の通り、セーフティ部β３０は、セーフティ部α２０と略同一の機能を有するものであり、これら入力処理部３１〜セーフティ部診断処理部３５は、上記入力処理部２１〜セーフティ部診断処理部２５と略同一であるので、説明は省略する。
【００４３】
また、ＣＰＵ１の内蔵メモリ（不図示）には、シーケンス管理テーブル４３が記憶される。シーケンス管理テーブル４３は、プログラムシーケンス番号の管理等を行う為に用いられる情報であり、具体例を図３に示し、後に説明する。
【００４４】
尚、上記プログラム終了情報収集処理部４４、４５は、シーケンス管理テーブル４３の格納データを更新する処理を行う。すなわち、例えばセーフティ部α２０を例にした場合、その高速処理、低速処理が実行される毎に、プログラム終了情報収集処理部４４は、当該実行されたプログラムに関する情報（シーケンス情報等）を収集してシーケンス監理テーブル４３に格納する。
【００４５】
時間・順序監視処理部４１は、最上位のタスクレベルで動作する。そして、例えば、高速処理に応じた周期（本例では定周期１で）で動作する。つまり、例えば、定周期１の各周期区間の終了直後に、必ず動作して、当該定周期１の周期区間に実行された処理（高速処理）の正常／異常（本例ではプログラムシーケンスが正しいか否か）を判定する（後述する図６の処理を実行する）。
【００４６】
また、時間・順序監視処理部４１は、低速処理に応じた周期（本例では定周期２）でも動作する。つまり、例えば、定周期２の各周期区間の終了直後に、必ず動作して、当該定周期２の周期区間に実行された処理（低速処理）の正常／異常（本例ではプログラムシーケンスが正しいか否か）を判定する（後述する図７の処理を実行する）。
【００４７】
このように、時間・順序監視処理部４１は、安全機能の各定周期処理の周期に応じて必ず（最上位のタスクレベルで）動作して、その周期区間に実行された処理の正常／異常を判定する。
【００４８】
ここで、本例では、定周期１の複数回に１回（図２の例では４回に１回）の割合で、定周期１の周期区間の終了時に定周期２の周期区間が終了する。このときには、本例では例えば、まず、当該定周期１の周期区間に実行された処理（高速処理）の正常／異常を判定し（後述する図６の処理を実行する）、続いて、当該定周期２の周期区間に実行された処理（低速処理）の正常／異常を判定する（後述する図７の処理を実行する）。尚、この例では、図７の処理でステップＳ６１が実行された場合には、次の定周期１の周期区間に係わる図６の処理でステップＳ３２がＹＥＳとなることで、ＣＰＵリセットが掛けられることになる。但し、この例に限らない。
【００４９】
尚、ウォッチドッグタイマー２のカウンタ２ａの設定値は、定周期１より長い時間とする。従って、図６の処理実行毎にウォッチドッグタイマー２のカウンタ・リセットしている限りは、ＣＰＵリセットが掛けられることはない。
【００５０】
時間・順序監視処理部４１は、シーケンス管理テーブル４３の格納データ（上記プログラム終了情報収集処理部４４、４５が格納したシーケンス情報等）を参照して、例えば上記実行された処理の正常／異常（プログラムシーケンスが正しいか否か）を判定する。
【００５１】
そして、プログラムシーケンスが正しくない場合は、判定対象の処理を強制終了して、当該処理に係わるセーフティ機能を機能停止させる（これ以降、動作させない）。これは、例えば、セーフティ部α低速処理部２３に係わるプログラムシーケンスが正しくない場合は、セーフティ部α低速処理部２３だけを機能停止するのではなく、セーフティ部α２０全体を機能停止する。つまり、セーフティ部αに係わる低速処理、高速処理、診断処理の全てを機能停止させる（セーフティ部αに係わるメモリ領域に異常が生じている可能性があるので、低速処理αだけでなく、高速処理α等も機能停止させる）。従って、その後は、安全機能に関してはセーフティ部β３０だけが動作することになる。
【００５２】
時間・順序監視処理部４１の処理の詳細は、図６、図７に示し、後に説明する。
クロック３は、一定の時間間隔で出力を行う。
割込処理部４２は、ＣＰＵ１に対する外部割込／内部割込入力を伝達するＣＰＵ内蔵装置であり、各タスクの起動を制御する。割込処理部４２は、例えばクロック３の出力信号に基づいて定周期割り込みを生成する。
【００５３】
ウオッチドッグタイマー２が内蔵するカウンタ２ａは、上記クロック３の出力に応じて更新される（カウントアップされる）。カウンタ２ａのカウント値が設定値に達したら（カウントアップしたら）、ＣＰＵリセット信号をＣＰＵ１へ出力する。但し、通常は（正常な状態では）カウンタ２ａのカウント値が設定値に達する前に、ＣＰＵ１の時間・順序監視処理部４１によってカウンタ２ａがリセットされるように構成している。
【００５４】
尚、上記カウンタ２ａに係わる設定値は、例えば「定周期１＜設定値」や「定周期１＜設定値＜定周期１の２倍」などの条件を満たす任意の値が設定されるが、この例に限らない。
【００５５】
本例では、後述するように、上記セーフティ部α２０とセーフティ部β３０の両方とも異常となったら（両方とも強制終了され、安全機能が機能停止状態となる）、時間・順序監視処理部４１はカウンタ２ａをリセットしない。これによって、ウオッチドッグタイマー２がタイムアップして、ＣＰＵリセット信号がＣＰＵ１へ出力されることになる。ＣＰＵリセット信号によって、ＣＰＵハードウェアでのＣＰＵ１のリセット（初期化）処理が行われる。
【００５６】
尚、ウオッチドッグタイマー２は、設定時間が、超過時間のみを設定できるタイプ、タイムウインドウ（最短時間と超過時間）を設定できるタイプのどちらでも良い。
上述したように、本例の安全処理監視システムは、例えば図１に示すように、１つのＣＰＵ１と１つのウオッチドッグタイマー２を基本構成とする。そして、ＣＰＵ１内にセーフティ機能と非セーフティ機能とが設けられると共に、セーフティ機能は多重化されている（図１はセーフティ機能を二重化した例であるが、この例に限らない）。多重化された各セーフティ機能は、それぞれ、入力処理、出力処理、高速処理、低速処理、診断処理に機能分割される。
【００５７】
本手法では、プログラムの実行時間とシーケンス監視のため、各セーフティ機能毎にプログラム終了情報収集処理を設けている。更に、シーケンス管理テーブル４３、時間・順序監視処理部４１、割込処理部４２を設けている。尚、シーケンス管理テーブル４３は、安全を担保するため、反転データのテーブルを生成・保持しておくようにしてもよい（勿論、この場合には、反転データを用いてテーブル４３の正常／異常チェックを行うことになる）。
【００５８】
ここで、図２に、割込入力処理例を示す。
本例では、図２の割込入力処理に示すように、定周期１と、定周期１より長い周期（図示の例では４倍の）定周期２とが設定されている。
【００５９】
定周期１は上記高速処理に係わる周期であるが、本手法では上記の通り、上記高速処理α、βは交互に動作させる。これより、各高速処理α、βは、それぞれ、実質的に定周期１の２倍の時間間隔に動作することになる。
【００６０】
つまり、図示のように、高速処理αと高速処理βとを定周期１の別々の周期区間に割りつける（それぞれ周期的に処理されるタスクの別々の周期区間に割りつける；例えば高速処理αと同一周期区間に高速処理βを割り付けない）。
【００６１】
つまり、例えば定周期１に関しては、図示の定周期１の区間（周期区間というものとする）が繰り返されるものと見做すと、図上左端を定周期１の１番目の周期区間と見做した場合、高速処理αは奇数番目の周期区間に割り当てられ、高速処理βは偶数番目の周期区間に割り当てられるものと言うこともできる。
【００６２】
このように、セーフティ部α高速処理部２２は、定周期１の２回につき１回動作する。セーフティ部β高速処理部３２も、定周期１の２回につき１回動作する。つまり、定周期１でセーフティ部α高速処理部２２とセーフティ部β高速処理部３２とを交互に実行させることになる。
【００６３】
このようにすることで、上記時間・順序監視処理部４１の図６の処理を実行する毎に、異常判定対象の高速処理（その直前の定周期１の周期区間で実行される高速処理）は、高速処理αか高速処理βのどちらか一方のみとなる。よって、高速処理α、βのどちらかに異常がある状態であれば、α、βのどちらが異常であるのかを判別できる（本手法のようにしないと判別できない場合がある理由を、後に図８を参照して説明する）。
【００６４】
これは低速処理についても略同様である。すなわち、多重化（二重化）されているセーフティ機能の低速処理α、βを定周期２で交互に動作させる。これより、低速処理α、βは、それぞれ、実質的に定周期２の２倍の時間間隔で動作することになる。
【００６５】
つまり、図示のように、低速処理αと低速処理βとを定周期２の別々の周期区間に割りつける（例えば低速処理αと同一周期区間に低速処理βを割り付けない）。これより、セーフティ部α低速処理部２３は、定周期２の２回につき１回動作する。セーフティ部β低速処理部３３も、定周期２の２回につき１回動作する。つまり、定周期２でセーフティ部α低速処理部２３とセーフティ部β低速処理部３３とを交互に実行させることになる。
【００６６】
このようにすることで、上記時間・順序監視処理部４１の図７の処理を実行する毎に、異常判定対象の低速処理（その直前の定周期２の周期区間で実行される低速処理）は、低速処理αか低速処理βのどちらか一方のみとなる。よって、低速処理α、βのどちらかに異常がある状態であれば、α、βのどちらが異常であるのかを判別できる。
【００６７】
上述した高速処理及び低速処理をαとβとを交互に実行させることは、例えば、割込処理部４２によって行われる。一例としては、割込処理部４２は、定周期１の時間でタイマアップする高速タイマと、定周期２でタイマアップする低速タイマ（何れも不図示）を有している。そして、割込処理部４２は、例えば、高速タイマがタイマアップする毎に直ちに高速タイマを０クリアして再起動する。同様に、低速タイマがタイマアップする毎に直ちに低速タイマを０クリアして再起動する。
【００６８】
そして、割込処理部４２は、例えば上記αとβとを交互に実行させる為の構成として、更に、高速タイマ用の第１カウンタと、低速タイマ用の第２カウンタを有している。
そして、割込処理部４２は、例えば、上記高速タイマの０クリアの際に上記第１カウンタを＋１インクリメントする。そして、第１カウンタのカウント数が偶数であれば高速処理αを起動して実行させ、奇数であれば高速処理βを起動して実行させる。同様に、上記低速タイマの０クリアの際に上記第２カウンタを＋１インクリメントする。そして、第２カウンタのカウント数が偶数であれば低速処理αを起動して実行させ、奇数であれば低速理βを起動して実行させる。
【００６９】
尚、本例の場合、割込処理部４２は、上記高速タイマ／低速タイマがタイマアップする毎に、時間・順序監視処理部４１も起動する。上記の通り、時間・順序監視処理部４１は最もタスクレベルが高いので、まず、時間・順序監視処理部４１が実行されて、その後に上記起動された高速処理／低速処理が実行開始されることになる。
【００７０】
勿論、αとβを交互に実行させる為の構成は、上述した一例に限るものではなく、例えば、定周期１、定周期２それぞれに対応して、前回実行された処理がαとβのどちらであるのかを記憶するようにしてもよい。
【００７１】
また、高速処理α、βのタスクレベル（割込優先順位）は、低速処理α、βよりも上位とする。これより、図示のように、低速処理は、その実行中に高速処理や時間・順序監視処理の実行タイミングとなったら、中断されて、これら上位の処理が終了したら再開することになる（この制御も例えば割込処理部４２が実行するが、これ自体は既存技術である）。
【００７２】
また、非セーフティ部１０のタスクレベルは、低速処理よりも低位である。
更に、各セーフティ部診断処理部（２５，３５）のタスクレベルは、非セーフティ部１０よりも低位である（セーフティ部診断処理のタスクレベルは最低とする）。セーフティ部診断処理は、本例では定周期２のＮ倍の周期で動作する（尚、上記の通り、セーフティ部診断処理に関しては、αとβのどちらか一方のみが動作する）。
【００７３】
セーフティ部診断処理の時間異常の監視によって、当該処理より上位の非セーフティ部処理の時間異常を検出できる。尚、上記の通り、高速処理、低速処理、診断処理の各処理内容自体は、既存処理であるので、ここでは特に説明しない。
【００７４】
また、高速処理αと高速処理βとは、タスクレベルは同じとする（但し、上記の通り、動作周期区間は別とする）。同様に、低速処理αと低速処理βとは、タスクレベルは同じとする（但し、上記の通り、動作周期区間は別とする）。
【００７５】
また、割込処理部４２は、上記のように高速処理α、高速処理β、低速処理α、低速処理βの起動制御を行っているので、高速処理、低速処理それぞれについて、そのときに起動したもの（αかβか）を所定の記憶領域に上書き記憶するようにしてもよい。これより、例えば時間・順序監視処理部４１等は、異常判定処理対象がαとβのどちらであるのかを判別できる。
【００７６】
時間・順序監視処理部４１は、定周期１、定周期２の各周期に応じた所定のタイミングで（例えば各周期区間が終了したタイミングで）、シーケンス管理テーブル４３を参照して、その周期区間で実行された処理（αとβの何れか）に応じたシーケンス情報等に基づいて、プログラム実行に係わる異常の有無を判定する（ここではプログラムシーケンス（処理実行順序）が正しいか否かを判定する）。そして、プログラムシーケンス（処理実行順序）が正しくないと判定した場合は、当該判定対象の処理を強制終了させて当該処理を含むセーフティ機能（αとβの何れか）全体を機能停止させる（これ以降、動作させない）。
【００７７】
尚、シーケンス情報は、プログラム終了情報収集処理部（４４，４５）が、対応する高速処理／低速処理実行中に例えば後述する図５（ｂ）に示す各タイミングで収集して、シーケンス監理テーブル４３に格納している。
【００７８】
プログラムのシーケンス情報としては、例えば一例としては、プログラム実行順序（後述する順序番号等）、プログラム動作回数、プログラムのコードのデータまたはこれらのデータをチェックサムやＣＲＣなどでコード化したデータを用いる。但し、本例では、後述する順序番号を用いる例について示すものとする。
【００７９】
プログラムシーケンスが正しくない場合、多重化されている他のセーフティ機能には、処理周期、メモリ領域ともに影響しないので、多重化されている他のセーフティ機能は続行することができる（例えばαが異常の場合でもβは続行できる）。尚、上記のように他のセーフティ機能のメモリ領域に影響しないのは、上記先願のメモリ保護機能によるものである（後述するように、例えばαはβのメモリ領域には書き込み出来ないので、たとえαが異常となってβのメモリ領域に書き込みを試みても出来ないので、βのメモリ領域が破壊されたり異常なデータとなることはない）。
【００８０】
また、診断処理については、上記の通り、多重化されたセーフティ機能のうちの１つの機能（稼動側となっている機能）のセーフティ部診断処理部が実行する。従って、稼動側となっていた診断処理部が、上記強制終了等に伴って機能停止された場合には、（待機側となっていた）他のセーフティ機能のセーフティ部診断処理部が起動して、診断処理が続行される。
【００８１】
上記のように、本手法では、多重化されているセーフティ機能の一部（一例ではαとβのどちらか一方のみ）が異常となっても、ＣＰＵリセットが掛かることなく、残りの（正常な）セーフティ機能の動作は続行される。但し、多重化されているセーフティ機能が全て異常となった場合には、ウオッチドッグタイマー２が動作してＣＰＵリセットを掛けることになる。また、時間・順序監視処理が指定時間内に動作しない場合や、反転データで多重化されたシーケンス管理テーブル４３が異常の場合にも、ウオッチドッグタイマー２が動作してＣＰＵリセットを掛けることになる。
【００８２】
図３に、シーケンス管理テーブル４３の具体例を示す。
シーケンス管理テーブル４３は、後述するステータス５８以外は、予め設定される設定値（図上左側）と随時更新される実績値（図上右側）とから成る。これは、各データ項目毎に、設定値と実績値のペアが形成される形となっている。例えば、セーフティ部α高速処理に関しては、設定値である“セーフティ部α高速処理シーケンス設定値”５１と、実績値である“セーフティ部α高速処理シーケンス情報”６１のペアから成っている。他のデータ項目についても同様である。そして、上記プログラム終了情報収集処理部（４４，４５）は、実績値を随時更新するものである。
【００８３】
“セーフティ部α高速処理シーケンス設定値”５１と“セーフティ部α高速処理シーケンス情報”６１は、両方とも、セーフティ部α高速処理部２２による処理（高速処理α）に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部α高速処理シーケンス設定値”５１には、予め、高速処理αに係わる順序番号の最大値が格納される。“セーフティ部α高速処理シーケンス情報”６１には、高速処理αに係わる順序番号の実績値が格納される。
【００８４】
ここで、上記順序番号について図５を参照して説明する。図５（ａ）、（ｂ）には高速処理αに係わる処理の具体例を示している。図示の例では、高速処理αは、処理Ａ、処理Ｂ、処理Ｃの３つの処理（部分処理と呼ぶ場合もあるものとする）から構成される。
【００８５】
尚、時間・順序監視処理部４１は、これら３つの部分処理が所定の順番（処理Ａ→処理Ｂ→処理Ｃ）で実行完了していた場合に、正常に実行されたものと判定する。つまり、全ての部分処理を実行完了しなかった場合、すなわち処理の途中で（例えば処理Ｂまでしか実行されていない状態で）時間・順序監視処理部４１の処理実行タイミングとなった場合（その周期区間が終わった場合）、異常と判定される。あるいは、時間・順序監視処理部４１の処理実行タイミング時点までに全ての部分処理（処理Ａ、処理Ｂ、処理Ｃの全て）を完了していたが、順序が間違っている場合（例えば、処理Ａ→処理Ｃ→処理Ｂ等）にも、異常と判定される。
【００８６】
尚、上記のことから、上記“高速処理αに係わる順序番号の最大値”とは、“高速処理αに係わる各部分処理のなかで最後に実行すべき部分処理の順序番号”を意味するものと言える。尚、これは、高速処理αだけでなく他の処理（その設定値；最大値）についても同様である。
【００８７】
図５の説明に戻る。
図５に示す例では、上記各部分処理Ａ，Ｂ，Ｃには、予め、所定の順序番号が付与されている。図示の例では、順序番号は、処理Ａが‘１’、処理Ｂが‘２’、処理Ｃが‘３’となっている。これより、“セーフティ部α高速処理シーケンス設定値”５１には、これら順序番号のなかで最大である‘３’が、予め登録されている。
【００８８】
そして、図５（ａ）に示すように、上記プログラム終了情報収集処理部４４は、これら各部分処理Ａ，Ｂ，Ｃ実行完了毎に動作して、その順序番号を“セーフティ部α高速処理シーケンス情報”６１に格納する。これは、例えば各部分処理Ａ，Ｂ，Ｃのプログラムの最後に、プログラム終了情報収集処理部４４の呼出し処理があり、この処理では自己に関する所定情報（処理区分（例えば高速処理α、β、低速処理α、βのどれであるのか（ここでは高速処理αとなる））や、順序番号等）を引数としてプログラム終了情報収集処理部４４に渡す。プログラム終了情報収集処理部４４は、この引数に基づいて、上記のように順序番号を“セーフティ部α高速処理シーケンス情報”６１に格納することになる。
【００８９】
高速処理αが正常に実行された場合には、各部分処理Ａ，Ｂ，Ｃは順序番号通りに実行されるので、最終的には“セーフティ部α高速処理シーケンス情報”６１には‘３’が格納されることになり、これは上記の通り、“セーフティ部α高速処理シーケンス設定値”５１と同一となる。これを利用して後述する正常／異常判定を行うものであるが、詳しくは後述する。
【００９０】
以上、シーケンス管理テーブル４３における高速処理αに係わる情報について説明したが、これは高速処理β、低速処理α、低速処理β、セーフティ部診断処理についても略同様であるので、以下、これらについては簡単に説明する。
【００９１】
“セーフティ部β高速処理シーケンス設定値”５２と“セーフティ部β高速処理シーケンス情報”６２は、両方とも、セーフティ部β高速処理部３２による処理（高速処理β）に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部β高速処理シーケンス設定値”５２には、予め所定の設定値（高速処理βに係わる順序番号の最大値など）が格納される。“セーフティ部β高速処理シーケンス情報”６２には、高速処理βに係わる順序番号の実績値が格納される。
【００９２】
“セーフティ部α低速処理シーケンス設定値”５３と“セーフティ部α低速処理シーケンス情報”６３は、両方とも、セーフティ部α低速処理部２３による処理（低速処理α）に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部α低速処理シーケンス設定値”５３には、予め所定の設定値（低速処理αに係わる順序番号の最大値など）が格納される。“セーフティ部α低速処理シーケンス情報”６３には、低速処理αに係わる順序番号の実績値が格納される。
【００９３】
“セーフティ部β低速処理シーケンス設定値”５４と“セーフティ部β低速処理シーケンス情報”６４は、両方とも、セーフティ部β低速処理部３３による処理（低速処理β）に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部β低速処理シーケンス設定値”５４には、予め所定の設定値（低速処理βに係わる順序番号の最大値など）が格納される。“セーフティ部β低速処理シーケンス情報”６４には、低速処理βに係わる順序番号の実績値が格納される。
【００９４】
また、“セーフティ部診断処理回数設定値（Ｎ）”５５は、セーフティ部診断処理の監視時間に関する設定値（Ｎ）である。後述するように監視時間経過毎に診断処理に関する異常の有無を判定するものであり、監視時間そのものを設定してもよいが、本例では監視時間を定周期２のＮ倍（Ｎは任意の整数）とするものとし、この“Ｎ”の値が予め任意に決められて“セーフティ部診断処理回数設定値（Ｎ）”５５に登録される。
【００９５】
“セーフティ部診断処理回数”６５には、定周期２の実行回数が格納される。この回数が上記Ｎとなる毎に上記「診断処理に関する異常の有無を判定する」処理が実行されると共に、“セーフティ部診断処理回数”６５はリセット（０クリア）される。
【００９６】
上記「診断処理に関する異常の有無を判定する」処理には、“セーフティ部診断処理シーケンス設定値”５６と“セーフティ部診断処理シーケンス情報”６６とが用いられる。“セーフティ部診断処理シーケンス設定値”５６には、予め所定の設定値（セーフティ部診断処理に係わる順序番号の最大値など）が格納される。“セーフティ部診断処理シーケンス情報”６６には、セーフティ部診断処理に係わる順序番号の実績値が格納される。
【００９７】
“セーフティ部診断処理リトライ回数設定値（Ｍ）”５７には、ＣＰＵ１をリセットするまでの診断処理部の異常判定回数の上限値（Ｍ回）を設定する。セーフティ部がＬ重化している場合は、メモリ異常を考慮するとＭ≧Ｌ（Ｍ＝Ｌなど）が望ましい。
【００９８】
また、“セーフティ部診断処理リトライ回数”６７には、診断処理部に関して異常と判定された回数（実績値）が格納される。そして、“セーフティ部診断処理リトライ回数”６７が、Ｍ回となったら、ＣＰＵリセットを掛けることになる。
【００９９】
例えば、図１の例のようにセーフティ部が２重化されている場合には（セーフティ部診断処理部２５とセーフティ部診断処理部３５）、例えば、Ｍ＝４とする。これによって、例えば、セーフティ部診断処理部２５が稼動側となっている状態で任意のときに診断処理部２５の異常が判定された場合には、“セーフティ部診断処理リトライ回数”６７を１回とすると共に、セーフティ部診断処理部３５を稼動させる。この状態で任意のときに診断処理部３５の異常が判定された場合には、“セーフティ部診断処理リトライ回数”６７を２回とすると共に、セーフティ部診断処理部２５を再度稼動する。
【０１００】
これによってセーフティ部診断処理部２５が再度稼動側となっている状態で任意のときに診断処理部２５の異常が判定された場合には、“セーフティ部診断処理リトライ回数”６７を３回とすると共に、セーフティ部診断処理部３５を再度稼動させる。この状態で任意のときに診断処理部３５の異常が判定された場合には、“セーフティ部診断処理リトライ回数”６７を４回とするが、これは上記上限値Ｍ（＝４）と同一であるので、ＣＰＵ１をリセットすることになる。
【０１０１】
この様に、各セーフティ部診断処理毎に１度だけでなく２度までも異常と判定された場合には、ＣＰＵ１リセットを掛けるようにしてもよいが、勿論、この例に限らない（１度だけでＮＧとする場合には例えばＭ＝２に設定すればよい）。尚、上記の例では、セーフティ部診断処理に関しては、異常判定があっても機能停止しないことを前提としている（これより、上記のように再度稼動させることができる）。尚、これより、上記高速処理／低速処理の異常判定に伴ってそのセーフティ機能全体を機能停止する処理についても、セーフティ部診断処理に関しては除外する（機能停止しない）ようにしてもよい。
【０１０２】
ステータス５８には、現在の状態が格納される。現在の状態は、“正常”、“セーフティ部α異常”、“セーフティ部β異常”、“リセット”の各種ステータスの何れかとなる。
【０１０３】
上記データ構成のシーケンス管理テーブル４３を用いて、時間・順序監視処理（後述する図６、図７の処理）が実行されることになるが、これについては後述する。
ここで、シーケンス管理テーブル４３の格納データに何らかの異常が生じる場合もあり得る。これより、シーケンス管理テーブル４３自体の異常の有無を判定可能な構成としてもよい。その為に、一例として、シーケンス管理テーブル４３は、正のデータ用と反転データ用の２種類のテーブルより成るものとしてもよい。
【０１０４】
そして、シーケンス管理テーブル４３に何らかのデータを書き込む時には、この書込対象データを正のデータ用テーブルに書き込むと共に、この書込対象データの反転データを反転データ用テーブルに書き込む。一方、シーケンス管理テーブル４３からデータを読み出すときには、正のデータ用テーブルから読み出す。また、後述する時間・順序監視処理（図６の処理）では、正のデータと、反転データを反転したものとが一致するかをチェックすることで、シーケンス管理テーブル４３自体の異常の有無をチェックする。
【０１０５】
図４は、プログラム終了情報収集処理部（４４，４５）のフローチャート図である。
プログラム終了情報収集処理は、各プログラム（図５の処理Ａ、処理Ｂ、処理Ｃの各プログラム）の終了時に呼ばれるサブルーチンであり、上記のように入力パラメータ（引数）は当該終了したプログラムの順序番号等である。
【０１０６】
ここで、上記高速処理α、高速処理β、低速処理α、低速処理β、診断処理は、それぞれ、基本的に、複数のプログラム（複数の処理）より構成されており、各プログラムには予め順序番号が割り当てられている。これに関しては、既に図５（ａ）、（ｂ）に示す具体例を用いて説明している。
【０１０７】
上記の通り、プログラム終了情報収集処理は、任意の上記処理（プログラム）実行終了毎に呼び出されて、図４の処理を実行する。
図４の処理例では、各プログラム終了情報収集処理部（４４，４５）は、まず、例えば上記実行終了した処理のタスク番号から当該処理の区分（高速処理α、低速処理β、etc.)を判定する（ステップＳ１１）。尚、タスク番号は、例えば割込処理部４２で管理されている。勿論、この例に限るものではなく、例えば上述したように上記入力パラメータ（引数）として処理区分も渡すようにしてもよい。この場合には、特に処理区分を判定する必要性はない。
【０１０８】
尚、時間・順序監視処理部４１も、同様にして、実行終了した処理のタスク番号等から当該処理の区分（高速処理α、低速処理β、etc.)を判定するようにしてもよいが、この例に限らない。
【０１０９】
そして、シーケンス管理テーブル４３から、当該判定した処理区分に対応するシーケンス情報を読み込み（例えば高速処理αであれば“セーフティ部α高速処理シーケンス情報”６１を読み込む）、これと上記入力パラメータの順序番号とに基づいて、処理実行順序が正常か否かを判定する（ステップＳ１２、Ｓ１３）。これは、例えば、仮にシーケンス情報が‘２’であるとしたならば、順序番号が‘３’であれば正常、‘３’以外なら異常と判定する。
【０１１０】
処理実行順序が正常と判定した場合には（ステップＳ１３，ＹＥＳ）、シーケンス管理テーブル４３のシーケンス情報を、上記入力パラメータの順序番号に更新して（ステップＳ１４）、ＥＸＩＴの処理をする。一方、順序が異常と判定した場合には（ステップＳ１３，ＮＯ）、そのままＥＸＩＴの処理をする。
【０１１１】
上記処理によって、例えば順序番号‘１’、‘２’、‘３’の順番で各プログラムが実行された場合には、シーケンス管理テーブル４３のシーケンス情報は、‘１’→‘２’→‘３’という形で更新される（つまり、最終的には‘３’が格納された状態となり、設定値（最大値）＝‘３’と同一の値となる）。
【０１１２】
これに対して、例えば、順序番号‘１’、‘３’、‘２’の順番で各プログラムが実行された場合には、シーケンス管理テーブル４３のシーケンス情報は、‘１’→‘１’→‘２’という形で更新される（つまり、最終的には‘２’が格納された状態となり、設定値（最大値）＝‘３’と異なる値となる）。
【０１１３】
ここで、既に述べたように、図５には、高速処理αを例にした当該高速処理αの処理実行例を示している。
例えば図２に示した高速処理αは、自己に割り当てられた各定周期１の周期区間毎に、当該周期区間内に例えば図５の処理Ａ、処理Ｂ、処理Ｃの全てを所定の順番で実行するものである。ここでは、上記の通り、処理Ａ（順序番号‘１’）、処理Ｂ（順序番号‘２’）、処理Ｃ（順序番号‘３’）の順番で順次実行するものであり、これら各処理実行完了する毎に例えば図４に示すプログラム終了情報収集処理が実行される。
【０１１４】
すなわち、まず、処理Ａが実行され（ステップＳ２１）、当該処理Ａが終了したら、プログラム終了情報収集処理が実行されて（パラメータとして順序番号‘１’が渡される）、順序番号‘１’が“セーフティ部α高速処理シーケンス情報”６１に格納される（ステップＳ２２）。
【０１１５】
続いて、処理Ｂが実行され（ステップＳ２３）、当該処理Ｂが終了したら、プログラム終了情報収集処理が実行されて（パラメータとして順序番号‘２’が渡される）、順序番号‘２’が“セーフティ部α高速処理シーケンス情報”６１に格納される（ステップＳ２４）。
【０１１６】
次に、処理Ｃが実行され（ステップＳ２５）、当該処理Ｃが終了したら、プログラム終了情報収集処理が実行されて（パラメータとして順序番号‘３’が渡される）、順序番号‘３’が“セーフティ部α高速処理シーケンス情報”６１に格納される（ステップＳ２６）。
【０１１７】
但し、常に図５に示す通りに処理実行されるとは限らない。異常時には、例えば処理の順番が異なる（例えばステップＳ２５、Ｓ２６の処理が、ステップＳ２３，Ｓ２４よりも先に実行される等）場合等もあり得る。あるいは、異常時には、未だ全ての処理が実行完了していない状態（例えばステップＳ２５実行中に）時間・順序監視処理部４１が起動される場合も有り得る。
【０１１８】
図６、図７は、時間・順序監視処理部４１の処理フローチャート図である。
図６は定周期１で実行される処理であり、高速処理α、βに係わる処理である。
図７は定周期２で実行される処理であり、低速処理α、βに係わる処理である。尚、図７は、セーフティ部診断処理にも係わる。
【０１１９】
まず、図６について説明する。
図６の処理は、例えば高速処理α、βに係わる定周期１で（その周期区間の最後や終了直後等に）、今回実行された高速処理に関する異常判定処理等を実行するものである。つまり、今回実行された高速処理に関する異常判定等を実行するものである。換言すれば、図６の処理は、定周期１で、高速処理αまたは高速処理βの処理が正常に実行されたか否かのチェック等を行うものである。
【０１２０】
図６の処理では、まず、シーケンス管理テーブル４３の読込処理を行う（ステップＳ３１）。
そして、まず、ステータス５８が「リセット」となっているか否かを判定する（ステップＳ３２）。もし、ステータス５８が「リセット」になっているならば（ステップＳ３２、ＹＥＳ）、何も行わないことで、ウォッチドッグタイマー２によってＣＰＵリセットを掛けさせる。つまり、時間・順序監視処理部４１からウオッチドッグタイマー２のカウンタ２ａのリセット信号が出力されないので、ウオッチドッグがタイムオーバーして、ウオッチドッグタイマー２からＣＰＵリセット信号が出力される。
【０１２１】
一方、ステータス５８が「リセット」以外の状態であれば（ステップＳ３２，ＮＯ）、続いて、上記今回実行された高速処理（αとβのどちらかとなる）が正常に実行されたものであるか否かを、該当する設定値とシーケンス情報とが一致するか否かによって判定する（ステップＳ３３）。つまり、高速処理αに係わる定周期１区間直後の図６の処理では、“セーフティ部α高速処理シーケンス設定値”５１と“セーフティ部α高速処理シーケンス情報”６１とが一致するか否かを判定する。高速処理βに係わる定周期１区間直後の図６の処理では、“セーフティ部β高速処理シーケンス設定値”５２と“セーフティ部β高速処理シーケンス情報”６２とが一致するか否かを判定する。
【０１２２】
設定値とシーケンス情報とが一致する場合は（ステップＳ３３，ＹＥＳ）、今回実行された高速処理は、定周期１区間内にシーケンス（順序番号）通りに実行完了したと判定し（つまり、正常に実行されたと判定し）、ウオッチドッグタイマー２のカウンタ２ａをリセットする（ステップＳ３５）。但し、その前に、図示の例のように、シーケンス管理テーブル４３自体が正常か否かをチェックするようにしてもよい（ステップＳ３４）。
【０１２３】
シーケンス管理テーブル４３が正常か否かの判定処理は、例えば上述した正のデータ用のテーブルの格納データと、反転データ用のテーブルの格納データを反転したものとが一致するか否かを判定する。一致する場合にはシーケンス管理テーブル４３は正常と見做して（ステップＳ３４，ＹＥＳ）上記ステップＳ３５の処理を実行する。一方、不一致の場合にはシーケンス管理テーブル４３は異常と見做して（ステップＳ３４，ＮＯ）、上記ステップＳ３５の処理は実行しない（本例ではステータス５８を「リセット」とする（ステップＳ４１）が、この例に限らない）。
【０１２４】
つまり、シーケンス管理テーブル４３自体にメモリエラーなどによるデータ異常があれば、当該テーブル４３を用いた正常／異常判定処理の信頼性が無くなるので、ＣＰＵリセットを掛けることになる。
【０１２５】
一方、上記ステップＳ３３の判定で設定値とシーケンス情報とが一致しない場合は（ステップＳ３３，ＮＯ）、上記今回実行された高速処理は異常と見做して（定周期１の時間内に終了しなかったか、あるいは処理実行順序が異常）、ステップＳ３６へ移行する。
【０１２６】
ステップＳ３６では、シーケンス管理テーブル４３のステータス５８が、“別処理（今回がαであればβ）の異常”であるか否かを確認する。つまり、今回実行されたのが高速処理αであれば、ステータス５８が上記“セーフティ部β異常”であるか否かを確認する。今回実行されたのが高速処理βであれば、ステータス５８が上記“セーフティ部α異常”であるか否かを確認する。換言すれば、二重化（αとβ）の両方とも異常となったか否かを確認する。
【０１２７】
ステータス５８が“別処理の異常”である場合には（ステップＳ３６，ＹＥＳ）、既に二重化（α、β）のいずれかに異常が発生している状態で、更に他方にも異常が発生したことになるので（αとβの両方とも異常であることになるので）、ＣＰＵ１をリセットさせる（本例では上記ステップＳ４１の処理を行うが、何も処理を行わないようにしてもよい）。
【０１２８】
一方、ステータス５８が“別処理の異常”ではない場合には（ステップＳ３６，ＮＯ）、ステータス５８が“今回の処理の異常”（今回が高速処理αであれば上記“セーフティ部α異常”、今回が高速処理βであれば上記“セーフティ部β異常”）であるか否かを判定する（ステップＳ３７）。つまり、今回実行されて上記ステップＳ３３で異常（設定値とシーケンス情報とが不一致）と判定された処理について、既に過去の図６の処理で異常と判定されてステータス５８に異常登録されている状態か否かを判定する。そして、ステータス５８が“今回の処理の異常”である場合には（ステップＳ３７，ＹＥＳ）上記ステップＳ３４へ移行し、ステップＳ３４がＮＯとならない限りは上記ステップＳ３５が実行されるようにする。
【０１２９】
これは、任意のタイミングでの図６の処理によって例えば高速処理αが異常と判定された場合、その後も高速処理αに係わる（高速処理αが実行はされないが）図６の処理は引き続き実行されるが、シーケンス管理テーブル４３の高速処理αに係わる実績値等はそのままとなっている場合を想定している。この場合、当該高速処理αに係わる図６の処理実行毎に、ステップＳ３３の判定はＮＯとなってしまう。つまり、今回の処理は既に機能停止状態となっており、過去に異常が検出された際のデータがそのままとなっている為にステップＳ３３の判定がＮＯとなっている。しかし、この状況では当然、ステップＳ３８、Ｓ３９、Ｓ４０の処理を実行させる必要はないので（更に、もしステップＳ３９の判定が、何らかの理由でＮＯとなってしまうとＣＰＵリセットが掛かってしまうので）、上記ステップＳ３７の処理を設けている。しかし、上記想定とは異なる場合には、必ずしもステップＳ３７の処理を設ける必要はない。
【０１３０】
一方、ステップＳ３７の判定がＮＯとなる場合は、ステップＳ３２、Ｓ３６もＮＯであることから、ステータス５８は“正常”ということになる。つまり、正常な状態において高速処理α、βのどちらかが異常になったことになる。この場合、この異常な高速処理を強制終了させると共に（異常ループしていて終了していない場合もあるので）、当該高速処理が係わるセーフティ部全体（メモリ領域が破壊されている可能性があるので、高速処理だけでなく低速処理等も）を強制的に機能停止させる（ステップＳ３８）。そして、ステータス５８に、発生した異常を登録する（高速処理αが異常となった場合には“セーフティ部α異常”とする。高速処理βが異常となった場合には“セーフティ部β異常”とする）（ステップＳ４０）。そして、ステップＳ３４へ移行することで（ステップＳ３４がＮＯとならない限りは）上記ステップＳ３５の処理を実行させるようにする。
【０１３１】
但し、上記ステップＳ３８による強制終了が失敗した場合には（ステップＳ３９，ＮＯ）、何も処理を行わないことで（特にステップＳ３５を実行しないことで）ＣＰＵリセットを掛けさせる。
【０１３２】
次に、図７の処理例について説明する。
図７の処理は、低速処理α、βに係わる定周期２で（その周期区間の最後や終了直後等に）、今回実行された低速処理に関する異常判定処理等を実行するものである。換言すれば、定周期２で、低速処理αまたは低速処理βの処理が正常に実行されたか否かのチェック等を行うものである。尚、図７の処理例では、セーフティ部診断処理が正常に行われたか否かをチェックする処理も行う。また、尚、後述するステップＳ５４，Ｓ５５，Ｓ６０，Ｓ６２〜Ｓ６６は、セーフティ部診断処理に係わるチェックと異常時処理である。
【０１３３】
図７の処理でも、まず、シーケンス管理テーブル４３の読込処理を行う（ステップＳ５１）。
そして、まず、ステータス５８が「リセット」となっているか否かを判定する（ステップＳ５２）。もし、ステータス５８が「リセット」になっているならば（ステップＳ５２、ＹＥＳ）、何も行わないことで、ウォッチドッグタイマー２によってＣＰＵリセットを掛けさせる。つまり、このケースでは、直前の図６の処理でステップＳ４１が実行されてそのまま（ステップＳ３５が実行されることなく）図６の処理が終了しているはずであるので、引き続き何も行わないことで（ウォッチドッグタイマー２がリセットされないことで）、ＣＰＵ１はリセットされることになる。
【０１３４】
一方、ステータス５８が「リセット」以外の状態であれば（ステップＳ５２，ＮＯ）、続いて、上記今回実行された低速処理（αとβのどちらかとなる）が正常に実行されたものであるか否かを、該当する設定値とシーケンス情報とが一致するか否かによって判定する（ステップＳ５３）。つまり、低速処理αに係わる定周期２区間直後の図７の処理では、“セーフティ部α低速処理シーケンス設定値”５３と“セーフティ部α低速処理シーケンス情報”６３とが一致するか否かを判定する。低速処理βに係わる定周期２区間直後の図７の処理では、“セーフティ部β低速処理シーケンス設定値”５４と“セーフティ部β低速処理シーケンス情報”６４とが一致するか否かを判定する。
【０１３５】
設定値とシーケンス情報とが一致する場合は（ステップＳ５３，ＹＥＳ）、今回実行された低速処理は、定周期２区間内にシーケンス（順序番号）通りに実行完了した（つまり、正常に実行された）と見做す。そして、続いて、診断処理に関する下記の処理を実行する。
【０１３６】
すなわち、“セーフティ部診断処理回数”６５が“セーフティ部診断処理回数設定値（Ｎ）”以上（またはイコール）となったか否かを確認し（ステップＳ５４）、「処理回数６５＜設定値Ｎ」の場合には（ステップＳ５４，ＮＯ）、処理回数６５を＋１インクリメントして（ステップＳ５５）、本処理を終了する。
【０１３７】
尚、本例では、図７の処理の際にはウオッチドッグタイマー２のリセットは行わない。ウオッチドッグタイマー２のリセットは、図６の処理によって、基本的に定周期１で実行される。図７の処理によって例えば低速処理に関してα、βの両方で異常が検出された場合等には、ステップＳ６１の処理が行われることで、その後に実行される図６の処理ではウオッチドッグタイマー２のリセットが行われないようにする。上述したように、これによってＣＰＵリセットが掛かることになる。
【０１３８】
一方、「処理回数６５≧（または＝）設定値Ｎ」の場合には（ステップＳ５４，ＹＥＳ）、上記のようにこれは診断処理の異常の有無をチェックするタイミングが到来したことを意味する。これより、処理回数６５を０クリアしたうえで（ステップＳ６２）、“セーフティ部診断処理シーケンス情報”６６が、“セーフティ部診断処理シーケンス設定値”５６と一致するか否かを判定する（ステップＳ６３）。一致する場合には（ステップＳ６３，ＹＥＳ）、セーフティ部診断処理が所定時間内に（定周期２×Ｎの時間内に）シーケンス通りに実行完了したと判定し、そのまま本処理を終了する。これにより“セーフティ部診断処理回数”６５＝‘０’から再びスタートして、上記ステップＳ５５の処理を繰り返して、ステップＳ５４がＹＥＳとなる状況になったら、再び診断処理の異常チェック処理を行うことになる。
【０１３９】
一方、シーケンス情報６６が設定値５６と一致しない場合は（ステップＳ６３，ＮＯ）、診断処理の異常（所定時間内（定周期２のＮ倍の時間内）に処理終了しなかったか、シーケンスの実行順番が異常など）と判断し、ステップＳ６４〜Ｓ６６の処理を行う。
【０１４０】
ステップＳ６４〜Ｓ６６の処理は、概略的には、例えば、他の（正常な）診断処理部に切り替えて診断処理を続行させるが、正常な診断処理部が残っていない場合にはＣＰＵリセットを掛けさせる処理である。但し、上述したように、この例に限らない。
【０１４１】
すなわち、まず、“セーフティ部診断処理リトライ回数”６７を＋１インクリメントしたうえで（ステップＳ６４）、“セーフティ部診断処理リトライ回数”６７≧“セーフティ部診断処理リトライ回数設定値（Ｍ)”５７であるか否かを確認する（ステップＳ６５）。
【０１４２】
「リトライ回数６７≧（または＝）設定値Ｍ」である場合には（ステップＳ６５，ＹＥＳ）、リトライ回数６７を‘０’クリアしたうえで（ステップＳ６０）、ステータス６８に「リセット」を設定して（ステップＳ６１）本処理を終了する。これによって、その後に図６の処理が実行されて上記ステップＳ３２の判定がＹＥＳとなることで、ウォッチドッグタイムオーバーによってＣＰＵ１はリセットされることになる。
【０１４３】
尚、例えば上記Ｌを用いてＭ＝Ｌに設定しており且つ図１のようにＬ＝２（つまり二重化）の例の場合には、２つのセーフティ部診断処理部２５，３５の一方が異常（ステップＳ６３がＮＯ）になって他方で運用していたが他方までも異常（ステップＳ６３がＮＯ）となった場合には、ステップＳ６５がＹＥＳとなってＣＰＵリセットが掛けられることになる。但し、この例に限らず、上記のように、１度は異常と判定された診断処理部を再度稼動させるようにしてもよい（一時的な異常であった場合等を考慮）。
【０１４４】
一方、「リトライ回数６７＜設定値Ｍ」である場合には（ステップＳ６５，ＮＯ）、稼動中であった（そしてステップＳ６３で異常と判定された）セーフティ部診断処理を強制終了すると共に、別のセーフティ部診断処理部を起動する。すなわち、例えば、セーフティ部αのセーフティ部診断処理部２５が稼動中であったなら（そして異常と判定されたなら）、当該処理部２５を強制終了すると共に、セーフティ部βのセーフティ部診断処理３５を起動する。同様に、セーフティ部βのセーフティ部診断処理３５が稼動中であったなら（そして異常と判定されたなら）、当該処理部３５を強制終了すると共に、セーフティ部αのセーフティ部診断処理２５を起動する。
【０１４５】
以下、上記ステップＳ５３の判定がＮＯとなった場合の処理について説明する。
すなわち、上述した設定値とシーケンス情報とが一致しない場合は（ステップＳ５３，ＮＯ）、今回実行された低速処理は、正常に実行されなかった（定周期２区間内に終了しなかったか、あるいはシーケンス順番通りに実行されなかった）と判断し、下記の処理を実行する。
【０１４６】
まず、ステータス５８が“別処理（今回がαであればβ）の異常”であるか否かを確認する（ステップＳ５６）。つまり、今回実行されたのが低速処理αであれば、ステータス５８が上記“セーフティ部β異常”であるか否かを確認する。今回実行されたのが低速処理βであれば、ステータス５８が上記“セーフティ部α異常”であるか否かを確認する。換言すれば、二重化（αとβ）の両方とも異常となったか否かを確認する。
【０１４７】
ステータス５８が“別処理の異常”である場合すなわち二重化（αとβ）の両方とも異常となった場合には（ステップＳ５６，ＹＥＳ）、ステータス５８を「リセット」に設定（変更）して（ステップＳ６１）、本処理を終了する。これによって、次に実行される図６の処理ではステップＳ３２がＹＥＳとなるので、時間・順序監視処理部４１からリセット信号が出力されることはなく、ウオッチドッグがタイムオーバして、ウオッチドッグタイマー２からＣＰＵリセットが掛けられることになる。
【０１４８】
一方、ステータス５８が“別処理の異常”ではない場合には（ステップＳ５６，ＮＯ）、今回実行された（そして異常となった）低速処理を強制終了して、これに係わるセーフティ部全体（仮に低速処理α実行であった場合には、当該低速処理αだけでなく高速処理α等も）を機能停止する（ステップＳ５７）。つまり、メモリ領域が破壊されている可能性があるので、異常のあるセーフティ部αまたはセーフティ部βの全ての処理を強制終了させる。これによって、これ以降は、例えばセーフティ部αの処理は実行されることなく、セーフティ部βの処理のみが実行されることになる（但し、診断処理は例外としてもよい）。
【０１４９】
そして、強制終了成功した場合には（ステップＳ５８，ＹＥＳ）、今回実行された低速処理に係わる異常を、ステータス５８に格納（変更）する（ステップＳ５９）。すなわち、今回、低速処理αが実行されていた場合には、ステータス５８に“セーフティ部α異常”を格納（上書き）する。一方、今回、低速処理βが実行されていた場合には、ステータス５８に“セーフティ部β異常”を格納（上書き）する。
【０１５０】
一方、強制終了が失敗の場合は（ステップＳ５８，ＮＯ）、図示の例ではそのまま本処理を終了するが、この例に限らず、例えばステップＳ６１の処理を実行するようにしてもよい。これにより、次に実行される図６の処理ではステップＳ３２がＹＥＳとなるので、時間・順序監視処理部４１からウオッチドッグリセットが出力されず、ウオッチドッグがタイムオーバして、ウオッチドッグタイマー２からＣＰＵリセットが掛けられる。
【０１５１】
尚、上記ステップＳ５７の処理の前に上記ステップＳ３７に相当する処理を行うようにしてもよい。但し、この場合、ステップＳ３７に相当する処理の判定結果がＹＥＳとなった場合には、そのまま本処理を終了する。
【０１５２】
ここで、既に述べたように、本手法では、αとβの両方が同一の周期区間に実行されることが無いようにするが、その理由と効果について以下説明する。
図８に、高速処理αと高速処理βの両方が同一の定周期１区間に割り当てられる場合における割込入力処理例を示す。
【０１５３】
図８の例では、高速処理αは処理Ａ（順序番号１）、処理Ｂ（順序番号２）、処理Ｃ（順序番号３）を実行し、高速処理βは処理Ａ’（順序番号４）、処理Ｂ’（順序番号５）、処理Ｃ’（順序番号６）を実行するものとする。よって、設定値は、高速処理αに関しては‘３’、高速処理βに関しては‘６’となる。また、各定周期１区間毎に、まず高速処理αを実行し、続いて高速処理βを実行するものとする。
【０１５４】
そして、図上左から１番目の定周期１区間においては、図示の通り、高速処理αは正常に実行され（順序番号が‘１’→‘２’→‘３’の順に実行されるので、テーブル４３（実績値）には最終的には‘３’が格納された状態となる）、続いて高速処理βも正常に実行されている（順序番号が‘４’→‘５’→‘６’の順に実行されるので、テーブル４３（実績値）には最終的には‘６’が格納された状態となる）。従って、時間・順序監視処理部４１による上述した図６の処理では、高速処理α、βの両方とも正常判定となる（実績値＝設定値であるので）。
【０１５５】
しかしながら、図上左から２番目の定周期１区間においては、図示の通り、高速処理αはシーケンス実行順番が異常である（順序番号が‘１’→‘３’→‘２’の順に実行されるので、テーブル４３（実績値）には最終的には‘２’が格納された状態となる）だけでなく、処理時間が通常より長くなっている。この為、高速処理βは正常に実行されるはずであっても途中で（処理Ａ’が実行完了した時点で）当該定周期１区間が終了して時間・順序監視処理部４１による上述した処理が実行される為、このときテーブル４３（実績値）には‘４’が格納された状態となっている。この場合、高速処理α、βの両方とも異常判定となってしまう（実績値≠設定値であるので）。よって、ＣＰＵリセットが掛かってしまう。
【０１５６】
上記のように、本来は高速処理βは正常と判定されるべき状況であっても、高速処理βまでもが異常と誤判定される為にＣＰＵリセットが掛かってしまうという、「多重化された安全機能の１つが異常でもＣＰＵリセットが掛かってしまう」という従来の問題と変わらない状況が生じることになってしまう。
【０１５７】
また、上記の例に限らず、例えば図８の図上左から２番目の定周期１区間において高速処理αの処理順序自体は正常であった場合には、高速処理αは正常と判定されるが高速処理βは異常と誤判定されることになる。
【０１５８】
あるいは、例えば、高速処理αが途中で暴走して永久ループ状態となった場合には、定周期１区間が終了した監視処理が実行されるタイミングになっても、高速処理αが実行中となっている。この場合、高速処理αは異常と判定されるが、何も実行されていない高速処理βまでもが異常と判定される可能性がある。
【０１５９】
この様な問題を解決する為に、本手法では上記の通り、αとβの両方が同一の周期区間に実行されることが無いようにしている。つまり、高速処理、低速処理の両方とも、その各周期区間には、それぞれ、多重化された安全機能のうちの１つの安全機能のみ（本例ではαとβの何れか一方のみ）が、割り当てられるようにしている。
【０１６０】
この様にすることで、多重化された安全機能の一部が異常となった場合、異常となった安全機能を判別でき（そして機能停止などする）、他の正常な安全機能は続行させることができる。つまり、一部の異常だけでＣＰＵリセットが掛かることはない。また、上記多重化された安全機能を１台のプロセッサ上に搭載させる場合には、上記先願のメモリ保護機能を設けることが望ましい。これによって、１台のプロセッサ上で多重化された安全機能の一部が異常となった場合、異常となった安全機能が他の正常な安全機能のメモリ領域を破壊等することはなく、他の正常な安全機能は続行させることができる。
【０１６１】
最後に、上記先願のメモリ保護機能について、図９、図１０、図１１を参照して簡単に説明する。
上記ＣＰＵ１は、不図示のメモリ保護機能（ＭＭＵ；Memory Management Unitの機能の１つ）を備え、基本的には、非セーフティ部１０は、セーフティ部２０、３０のデータ記憶領域へのアクセス（特に書き込み）を行えないようにすると共に、セーフティ部２０、３０は、他のセーフティ部のデータ記憶領域へのアクセス（特に書き込み）を行えないようにする。
【０１６２】
これによって、メモリ空間に関して、非安全処理（非セーフティ部１０）による安全処理（セーフティ部２０，３０）への影響をなくすことができる。つまり、非セーフティ部１０の処理中に何らかの異常が発生してセーフティ部２０，３０のデータ記憶領域へのアクセス（特に書込み）が行われることで、セーフティ部２０，３０の処理に異常が生じる、等といった事態を防止できる。
【０１６３】
あるいは、セーフティ部２０の処理中に何らかの異常が発生してセーフティ部３０のデータ記憶領域へのアクセス（特に書込み）が行われることで、セーフティ部３０の処理に異常が生じる、等といった事態を防止できる。同様に、セーフティ部３０の処理中に何らかの異常が発生してセーフティ部２０のデータ記憶領域へのアクセス（特に書込み）が行われることで、セーフティ部２０の処理に異常が生じる、等といった事態を防止できる。
【０１６４】
尚、セーフティ部２０，３０は、非セーフティ部１０のデータ記憶領域への書き込みを行えるようにする。これは、例えば非セーフティ部１０による制御対象の強制停止等を行うためには、当該書込みが必要となるからである。尚、勿論、セーフティ部１０も非セーフティ部２０，３０も、どちらも、自己のデータ記憶領域へのアクセスは行えるようにする。
【０１６５】
上記不図示のメモリ保護機能は、例えば後述する図１０（ａ）、（ｂ）の各テーブルを用いて、後述する図１１の処理を実行することで、上記機能を実現する。詳しくは後述する。
【０１６６】
尚、上記メモリ保護機能は、例えばＭＭＵ（Memory Management Unit）の機能の１つとしてＣＰＵ１に実装されている。尚、後述する図１０（ａ）、（ｂ）の各テーブルは、不図示の設定機能等によって、予め例えばユーザにより任意に設定されている。
【０１６７】
また、先願の例の場合、上記セーフティ部α２０とセーフティ部β３０とは、同一の処理を実行する機能部であり、且つ、入力も同じである。つまり、セーフティ部α２０の入力である上記安全入力Ａと、セーフティ部β３０の入力である上記安全入力Ｂとは、同一である。従って、正常な状態であれば、セーフティ部α２０の処理結果である上記安全出力Ａと、セーフティ部β３０の処理結果である上記安全出力Ｂとは、同一となるはずである。これを利用して、セーフティ部α２０とセーフティ部β３０とが相互に入力や出力（処理結果）をチェックして一致／不一致を確認することで、正常な否かをチェックすることも可能である。
【０１６８】
尚、安全機能の二重化の例の場合、セーフティ部α２０とセーフティ部β３０のどちらか一方に異常が生じて機能停止した後には、上記チェックは行えなくなるが、３重化以上の多重化の場合には、一部に異常が生じて機能停止した後も、残りの正常な安全機能が２つ以上ある場合には、引き続き上記チェックを行うことができる。
【０１６９】
セーフティ部α２０とセーフティ部β３０が、同じ処理を、セーフティ部α２０とセーフティ部β３０それぞれ独立に行うことにより、並列二重化処理（Dual処理）を実現する。セーフティ部α２０とセーフティ部β３０の独立性を高めるため、例えばセーフティ部α２０の処理が暴走することでセーフティ部β３０のデータを破壊することを防止するため、先願の処理例を用いた場合には、セーフティ部α２０からセーフティ部３０のデータ記憶領域へのデータ書き込みを禁止すると共に、セーフティ部β３０からセーフティ部α２０のデータ記憶領域へのデータ書き込みを禁止することになる。
【０１７０】
例えば、上記不図示のメモリ保護機能は、予め設定される例えば図９や図１０（ａ）、（ｂ）に示すようなメモリ保護情報（ＣＰＵ１の不図示の内蔵メモリに予め記憶される）に基づいて、例えば後述する図１１の処理を実行するものである。これによって、メモリ空間に関して、セーフティ部２０とセーフティ部３０は、相互に、たとえ異常になった場合でも他者に悪影響を及ぼすことはない（他者のメモリ領域に干渉できないように制御される）。また、非セーフティ部１０が異常になっても、安全機能（セーフティ部２０、セーフティ部３０）に悪影響を及ぼすこともない（干渉しない）。
【０１７１】
図９に、メモリ保護情報の一例を示す。尚、実際には、後述する図１０（ａ）のアドレス変換テーブル７０と図１０（ｂ）のアクセス不可テーブル８０とによって、メモリ保護情報が構成されることになる。
【０１７２】
図９には、まず、各プロセス（非セーフティ部１０、セーフティ部α２０、セーフティ部β３０）毎に予め割り当てられている記憶領域を示してある。すなわち、セーフティ部α２０のプログラム格納領域として‘１０００’番地台（図示の‘０ｘ’は省略する；他も同様）が割り当てられている。セーフティ部β３０のプログラム格納領域として‘２０００’番地台が割り当てられている。非セーフティ部１０のプログラム格納領域として‘３０００’番地台〜‘４０００’番地台が割り当てられている。ＣＰＵ１は、例えば‘１０００’番地台の記憶領域に格納されているプログラムを読出し・実行することで、セーフティ部α２０の処理機能を実現させる。
【０１７３】
また、図９に示す例では、セーフティ部α２０に係るデータ格納領域として‘５０００’番地台が割り当てられている。セーフティ部β３０に係るデータ格納領域として‘６０００’番地台が割り当てられている。非セーフティ部１０に係るデータ格納領域として‘７０００’番地台が割り当てられている。
【０１７４】
そして、上記各プロセス（非セーフティ部１０、セーフティ部α２０、セーフティ部β３０）毎のメモリ領域に対して、図示のように各プロセス（非セーフティ部、セーフティ部α、セーフティ部β）毎にメモリ保護情報が設定されている。これは、例えば上記不図示の設定機能によって、ユーザ等が任意に設定するものである。
【０１７５】
すなわち、まず、セーフティ部α２０に関する図示のメモリ保護情報によれば、セーフティ部α２０は、プログラム格納領域に関しては全領域について読込可能となっている（換言すれば書込みは不可）。つまり、セーフティ部α２０は、‘１０００’番地台、‘２０００’番地台、‘３０００’番地台、‘４０００’番地台は、リードオンリーのアクセスが可能となっている。尚、これは、図示の通り、セーフティ部β３０と非セーフティ部１０に関しても同様である。つまり、プログラム格納領域に関しては、非セーフティ部１０、セーフティ部α２０、セーフティ部β３０の全てが、全領域について（自己の領域だけでなく他の領域も）リードオンリーのアクセスが可能となっている。リードオンリーであるので、書込みよるデータ破壊等は生じないからである。
【０１７６】
一方で、データ格納領域に関しては下記の通りとなっている。
すなわち、まず、セーフティ部α２０は、自己のデータ格納領域である‘５０００’番地台に関しては、当然、読書可（リードライト可能）となっているが、非セーフティ部１０のデータ格納領域である‘７０００’番地台に関しても、読書可（リードライト可能）となっている。これは、非セーフティ部１０に対して安全の為の何らかの指令を出す為には、非セーフティ部１０のデータ格納領域への所定の書込みを行う必要があるからである。その一方で、セーフティ部α２０は、セーフティ部β３０のデータ格納領域である‘６０００’番地台に関しては、アクセス不可となっている。
【０１７７】
また、セーフティ部β３０も、自己のデータ格納領域である‘６０００’番地と非セーフティ部１０のデータ格納領域である‘７０００’番地台は、読書可（リードライト可能）となっているが、セーフティ部α２０のデータ格納領域である‘５０００’番地台に関しては、アクセス不可となっている。
【０１７８】
また、非セーフティ部１０は、自己のデータ格納領域である‘７０００’番地のみ読書可（リードライト可能）となっており、セーフティ部α、βのデータ格納領域である‘５０００’番地台、‘６０００’番地台に関しては、アクセス不可となっている。これによって、たとえ非セーフティ部１０が処理実行中に異常となっても、セーフティ部のデータ格納領域に勝手にアクセスしてデータ書き換え等を行うような事態にはならず、安全機能に悪影響を及ぼすようなこと（干渉すること）はなくなる。
【０１７９】
既に述べたように、図９に示すようなメモリ保護情報は、実際には例えば図１０（ａ）、（ｂ）に示す２つのテーブル７０、８０の形で設定・登録されている。
図１０（ａ）に示すように、アドレス変換テーブル７０は、論理アドレス７１と物理アドレス７２とが対応付けられると共に、これらアドレスに対してメモリ保護７３の情報が設定されている。メモリ保護７３は、図示の例では‘０’が“読込可（リードオンリー）”、‘１’が“読書可（リードライト可）”を意味する。論理アドレス７１と物理アドレス７２は、例えば１６進数の１０００番地単位で設定される。つまり、図示の例では、例えば論理アドレス７１が‘２０００’番地台は‘０’（リードオンリー）、‘５０００’番地台は‘１’（リードライト可）となっている。
【０１８０】
ＣＰＵ１上では、任意のプロセス実行中にメモリアクセスを行う場合に生成されたアドレス（論理アドレス）は、アドレス変換テーブル７０を参照することで物理アドレスに変換されて、この物理アドレスによってメモリへアクセスすることになる。更に、その際に、当該アドレスに対応するメモリ保護７３を参照することで、アクセス方法がリードオンリーであるのかリードライト可であるのかを判別したうえで、判別結果に応じたメモリアクセス制御を行う。
【０１８１】
但し、本手法では、更に図１０（ｂ）のアクセス不可テーブル８０も参照することで、メモリアクセスを行うプロセスが上記アドレス（論理アドレス）に対応する記憶領域にアクセス可であるか否かを判別することでメモリ保護制御を実現する。このメモリ保護制御は、例えば上記不図示のメモリ保護機能が実行するものであり、その処理例を図１１に示し、後に説明するものとし、その前に、図１０（ｂ）のアクセス不可テーブル８０について説明する。
【０１８２】
図１０（ｂ）のアクセス不可テーブル８０は、論理アドレス８１、セーフティ部α８２、セーフティ部β８３、非セーフティ部８４の各データ項目より成る。論理アドレス８１は、上記論理アドレス７１と同様、１６進数の１０００番地単位で設定される。
【０１８３】
そして、この１０００番地単位のメモリ記憶領域毎に、上記各プロセスがその記憶領域にアクセス可能か否かが設定されるものである。例えば、図示のセーフティ部αデータ項目欄８２には、上記１０００番地単位の記憶領域毎に上記セーフティ部α２０がアクセス可能か否かが設定される。尚、ここでは、‘０’がアクセス可、‘１’がアクセス不可を意味する。
【０１８４】
これより、図示の例では、例えばセーフティ部α２０は、‘６０００’番地台のみがアクセス不可であり、それ以外の記憶領域（‘１０００’番地台、‘２０００’番地台、‘３０００’番地台、‘４０００’番地台、‘５０００’番地台、‘７０００’番地台）は、アクセス可能となっている。そして、これらアクセス可能な各記憶領域に関して、更に、上記アドレス変換テーブル７０を参照することで、読込可（リードオンリー）であるか読書可（リードライト可能）であるかを判別できる。
【０１８５】
ここで、図１１を参照して、上記不図示のメモリ保護機能の処理例について説明する。
図１１の処理は、任意のプロセスが任意のメモリアクセスを試みる際に起動される。
図１１において、まず、メモリアクセスを行うプロセス（非セーフティ部１０、セーフティ部α２０、セーフティ部β３０の何れか）を識別すると共に（ステップＳ７１）アクセス先の論理アドレスを取得する（ステップＳ７２）。そして、アクセス不可テーブル８０を参照することで、上記ステップＳ７１で識別したプロセスが、当該アクセス先の論理アドレスに対応する記憶領域にアクセス可能であるか否かを判別する（ステップＳ７３、Ｓ７４）。
【０１８６】
もし、アクセス不可であった場合には（ステップＳ７４、ＹＥＳ）、所定のＣＰＵ異常処理を実行する（ステップＳ７７）。当該ＣＰＵ異常処理については特に説明しない。
一方、もしアクセス可能であるならば（ステップＳ７４，ＮＯ）、上記アドレス変換テーブル７０から上記ステップＳ７２で取得した倫理アドレスに対応する物理アドレス７２とメモリ保護７３の情報を取得して（ステップＳ７５）、これら取得した情報をＭＭＵにセットする（ＬＤＴＬＢ）（ステップＳ７６）。（ＬＤＴＬＢ；LoaD Translation Look aside Buffer）。
【０１８７】
尚、上記ステップＳ７１の処理は、具体的には例えば、ＭＭＵのＰＴＥＨ（ページ・テーブル・エントリの上位レジスタ）のＡＳＩＤ（０〜７ビット）の情報を取得するものである。また、上記ステップＳ７２の処理は、具体的には例えば、ＭＭＵのＰＴＥＨ（ページ・テーブル・エントリの上位レジスタ）のＶＰＮ（１０〜１５ビット）の情報を取得するものである。また、上記ステップＳ７６の処理は、具体的には例えば、ＭＭＵのＰＴＥＬ（ページ・テーブル・エントリの下位レジスタ）のＰＰＮ（１０〜１５ビット）、ＰＲ５〜６ビット）に、上記取得した物理アドレス７２とメモリ保護７３のデータをセットするものである。
【０１８８】
（ＡＳＩＤ；アドレス空間識別子；論理ページをアクセスできるプロセスを示す）
（ＶＰＮ；論理ページ番号，  ＰＰＮ；物理ページ番号，  ＰＲ；保護キー・データ）
図９や図１０（ａ）、（ｂ）に示すメモリ保護情報に基づいて、図１１の処理を実行することで、例えば、非セーフティ部１０がセーフティ部（セーフティ部α２０、セーフティ部β３０）のデータ格納領域にアクセスしようとしても、ステップＳ７４の判定がＹＥＳとなるので、リードもライトも出来ないことになる。また、非セーフティ部１０は、セーフティ部（セーフティ部α２０、セーフティ部β３０）のプログラム格納領域については、リードは出来てもライトは出来ないことになる（ステップＳ７６でセットされるメモリ保護７３の情報は、‘０’（リードオンリー）となる）。
【０１８９】
一方、セーフティ部（セーフティ部α２０、セーフティ部β３０）は、どちらも、非セーフティ部１０のデータ格納領域にはアクセス可能であるが、他方のセーフティ部（セーフティ部α２０から見れば、セーフティ部β３０が他方のセーフティ部）のデータ格納領域にはアクセスできない（リードもライトも不可）。
【０１９０】
この様にして、たとえ各機能部（非セーフティ部１０、セーフティ部α２０、セーフティ部β３０）の何れかが異常となって他の機能部のデータ格納領域にアクセスしようとしても、アクセスは許可されないので、他の機能部のデータ格納領域が破壊されることはない（異常があった機能部のデータ格納領域は破壊されるかもしれない。この為、上記のように、例えば高速処理αに異常があった場合には、同じ機能部の他の処理（例えば低速処理α等）に係わるデータ格納領域までも破壊されている可能性があるので、セーフティ部α２０全体を機能停止するようにしている。
【０１９１】
また、図示していないが、更に、時間・順序監視処理部４１と割込処理部４２とシーケンス管理テーブル４３に係わるプログラム格納領域とデータ格納領域とが割り当てられているものとする。尚、これらを監視／実行制御に係わるプログラム格納領域とデータ格納領域と呼ぶものとする。そして、メモリ保護機能によって、例えば、上記非セーフティ部１０、セーフティ部α２０、セーフティ部β３０は、全て、監視／実行制御に係わるデータ領域にはアクセス出来ない（少なくとも書込みは出来ない）ようにする（その為の登録データについては図示・説明はしないものとする）。これによって、例えば、安全機能部（セーフティ部α２０やセーフティ部β３０）に異常が生じても、監視／実行制御のデータ領域に干渉して異常なデータを書き込んだりメモリ破壊が生じるような事態は、防止できる。
【０１９２】
尚、監視／実行制御が、上記非セーフティ部１０、セーフティ部α２０、セーフティ部β３０のデータ格納領域にもアクセス出来るようにするか否かについては、特に言及しないものとする。
【０１９３】
以上説明したように、本例の安全処理監視システムでは、１つのＣＰＵ上で多重化されたセーフティ機能の１つにメモリ異常やプログラムミスによるメモリーリークやループなどの異常が発生した場合、当該異常が生じたセーフティ機能を機能停止して（強制終了等して）、他のセーフティ機能は運用続行できる。従来ではこの様な場合でもＣＰＵリセットを掛けていた。また、本手法では、ウオッチドッグタイマー、ＣＰＵなど、ハードウェアは特殊なものを使用する必要がなく、低コスト化が実現できる。
【０１９４】
例えば非特許文献１のCombination of temporal and logical monitoring of program sequencesの目的と説明を満たし、多重化した安全機能の一部（１つなど）が異常で、その他が正常であった場合は、正常な安全機能を継続して実施できる（フォールトトレランスを向上した）安全処理監視を実現し、かつ、ゲートアレイなどの特殊なものでなく、一般的なウオッチドッグ装置で、低コストで実現することができる。
【符号の説明】
【０１９５】
１  ＣＰＵ
２  ウォッチドッグタイマー
３  クロック
１０  非セーフティ部
２０  セーフティ部α
２１  入力処理部
２２  セーフティ部α高速処理部
２３  セーフティ部α低速処理部
２４  出力処理部
２５  セーフティ部診断処理部
３０  セーフティ部β
３１  入力処理部
３２  セーフティ部α高速処理部
３３  セーフティ部α低速処理部
３４  出力処理部
３５  セーフティ部診断処理部
４１  時間・順序監視処理部
４２  割込処理部
４３  シーケンス管理テーブル
４４  プログラム終了情報収集処理部
４５  プログラム終了情報収集処理部
５１  “セーフティ部α高速処理シーケンス設定値”
５２  “セーフティ部β高速処理シーケンス設定値”
５３  “セーフティ部α低速処理シーケンス設定値”
５４  “セーフティ部β低速処理シーケンス設定値”
５５  “セーフティ部診断処理回数設定値（Ｎ）”
５６  “セーフティ部診断処理シーケンス設定値”
５７  “セーフティ部診断処理リトライ回数設定値（Ｍ）”
５８  ステータス
６１  “セーフティ部α高速処理シーケンス情報”
６２  “セーフティ部β高速処理シーケンス情報”
６３  “セーフティ部α低速処理シーケンス情報”
６４  “セーフティ部β低速処理シーケンス情報”
６５  “セーフティ部診断処理回数”
６６  “セーフティ部診断処理シーケンス情報”
６７  “セーフティ部診断処理リトライ回数”
【図１】
2014206821.tif 000003
【図２】
2014206821.tif 000004
【図３】
2014206821.tif 000005
【図４】
2014206821.tif 000006
【図５】
2014206821.tif 000007
【図６】
2014206821.tif 000008
【図７】
2014206821.tif 000009
【図８】
2014206821.tif 000010
【図９】
2014206821.tif 000011
【図１０】
2014206821.tif 000012
【図１１】
2014206821.tif 000013