以下、図面を参照して本発明の実施の形態について説明する。
図1は、本例の安全処理監視システムのシステム構成図である。
図示の安全処理監視システムは、CPU1、ウォッチドッグタイマー2、クロック3等を有する。
本例の安全処理監視システム(安全関連装置)は、例えば一例としては何らかの制御対象の制御等を行う非セーフティ部と、この非セーフティ部の制御等に係わる安全制御を行う安全機能(セーフティ部)とを、1つのプロセッサ(CPU1)上に搭載している。
更に、安全機能を多重化している(図示の例では二重化であるが、三重化等であってもよい)。すなわち、上記安全機能は、図示のセーフティ部α20とセーフティ部β30とに二重化されている。尚、これらセーフティ部α20,セーフティ部β30の各種機能のなかで基本的な機能は、従来と略同様であって構わない(よって、特に説明しない)。
また、既に述べたように、安全関連装置のセーフティ機能は、一般に、エンコーダ入力に関わる処理などマイクロ秒オーダの周期で処理をする高速処理と、非常停止ボタンなどで安全入力が行われた場合のフォールトリアクション処理などのミリ秒オーダで処理をする低速処理と、CPU診断、メモリ診断など、例えば1時間の周期で処理をする診断処理に分けることができる。本例の安全処理監視システムの上記多重化された安全機能(セーフティ部α20とセーフティ部β30)も、これら高速処理、低速処理、診断処理の3種類の処理機能を有している。
また、本例の安全処理監視システムは、自動車の車載制御装置など、小型かつ軽量化が要求され、安全機能を多重化したくても安全関連装置(CPU等)を多数搭載できない場合に好適である。すなわち、本例の安全処理監視システムは、1つのCPU内にセーフティ機能と非セーフティ機能が共存し、セーフティ機能は多重化され、フォールトトレランスなどの安全性や信頼性を実現する構成となっている。多重化のために多数のCPUを実装する必要がなく、1つのCPUで多重化を実現することにより、車載装置などに要求される、セーフティ機能を持つ装置の小型、軽量化を実現できる。
そして、本例の安全処理監視システムでは、上記多重化されたセーフティ機能の1つにメモリ異常やプログラムミスによるメモリーリークやループ(永久ループ)などの異常が発生した場合、当該異常が生じたセーフティ機能を機能停止して(強制終了等して)、他のセーフティ機能は運用続行できる(従来ではこの様な場合でもCPUリセットを掛けていた)。また、ウオッチドッグタイマー、CPUなどで実現できるので、ハードウェアも特殊なものを使用する必要がなく、低コスト化が実現できる。
本例の安全処理監視システムでは、上記効果の為に例えば下記の特徴を有する。
(1)1つの一CPU内で多重化したセーフティ機能タスクを、別々の周期に割りつけることで、時間監視とプログラムシーケンス監視をセーフティ機能タスク個別に行う。
(2)(1)の監視処理で異常を検出した場合は、多重化したセーフティ機能のうち異常を検出したセーフティ機能を機能停止する(換言すれば、従来のようにCPUリセットを掛けない)。
上記本手法の特徴について、以下、詳しく説明する。
まず、本手法では、1つのCPU1上に、非セーフティ部10、セーフティ部α20、セーフティ部β30を有している。これは、本出願人による先願(特願2012-190662号)によって提案した手法によって実現させている。すなわち、概略的には、非セーフティ部10とセーフティ部α20とセーフティ部β30との間で少なくとも悪影響のある干渉が行えない構成とすることで、1つのCPU上に非セーフティ機能と(多重化した)セーフティ機能を設けても問題ないようにしている。
この先願の手法について、更に詳しい説明は、本説明の最後でまとめて行うものとするが、概略的には、CPU1は不図示の内蔵メモリを有するものであって、非セーフティ部10、セーフティ部α20、セーフティ部β30には各々予め所定のメモリ領域が割り当てられている。そして、例えば、非セーフティ部10がセーフティ部α20やセーフティ部β30のメモリ領域にはアクセス出来ないようにする機能や、セーフティ部α20とセーフティ部β30とで互いのメモリ領域にはアクセス出来ないようにする機能等(不図示のメモリ保護機能)が、CPU1に設けられている。
尚、セーフティ部α20とセーフティ部β30の各機能自体は、先願のセーフティ部とは多少異なる(図示の詳細構成を有するものであり。詳しくは後述する)。
そして、本例のCPU1は、上記非セーフティ部10、セーフティ部α20、セーフティ部β30を有する構成に対して、更に、時間・順序監視処理部41、割込処理部42、シーケンス管理テーブル43、プログラム終了情報収集処理部44、プログラム終了情報収集処理部45を有するものである。本手法では、これらの構成によって、例えば上記セーフティ部α20とセーフティ部β30の何れか一方に異常(暴走して永久ループ状態になる等)が生じても、強制終了等して異常があったセーフティ部は機能停止するが、他のセーフティ部は継続実施され、フォールトトレランスが実現でき、安全性を向上できる。
尚、CPU1の上記不図示の内蔵メモリには、予め所定のプログラムが記憶されており、CPU1がこのプログラムを実行することにより上記非セーフティ部10、セーフティ部α20、セーフティ部β30、時間・順序監視処理部41、割込処理部42や不図示のメモリ保護機能等の各種処理機能が実現される。また、この内蔵メモリには上記シーケンス管理テーブル43等が記憶される。
非セーフティ部10は、図示の「非安全入力」に対して通常の制御などを行う為の図示の「非安全出力」を不図示の制御対象などに対して出力する。上記通常の制御についてはここでは関係ないので特に説明しないものとする。
セーフティ部α20、セーフティ部β30は、多重化(本例では二重化であるが三重化以上であっても構わない)されているセーフティ機能である。尚、多重化に関しては、ダイバーシティ設計を行い、同一原因で異常が発生しないように設計することが望ましい。
尚、CPU1は不図示の内蔵メモリを有しており、この内蔵メモリには予め所定のプログラムが格納されている。CPU1が、このプログラムを実行することにより、非セーフティ部10、セーフティ部α20、セーフティ部β30の各種機能や、後述する時間・順序監視処理部41や割込処理部42の処理機能等が実現される。
セーフティ部α20は、安全入力Aに対して安全出力Aを出力する。セーフティ部β30は、安全入力Bに対して安全出力Bを出力する。尚、安全入力Aと安全入力Bは、同じ入力であってもよく、例えば一例としてはSTO(Safe torque off)入力等である。STO入力は、例えば作業員等が外部の不図示の非常停止ボタンを押すことで、(正常であれば)上記二重化されたセーフティ部α20、セーフティ部β30の安全入力A,Bが両方ともONとなるように構成している。
セーフティ部α20は、入力処理部21、出力処理部24、セーフティ部α高速処理部22、セーフティ部α低速処理部23、セーフティ部診断処理部25に機能分割される。
尚、本説明では、セーフティ部α高速処理部22は高速処理αを実行し、セーフティ部α低速処理部2は低速処理αを実行するものと言うものとする。また、後述するセーフティ部β高速処理部32は高速処理βを実行し、セーフティ部β低速処理部33は低速処理βを実行するものと言うものとする。また、本説明では、これら処理部22,23,32,33の代わりに、高速処理α、β、低速処理α、βを用いて説明する場合もあるものとする。
尚、背景技術で述べたように、安全関連装置のセーフティ機能は、一般に、例えばマイクロ秒オーダの周期で処理実行する高速処理と、非常停止など安全入力がされた場合のフォールトリアクション処理などのミリ秒オーダで処理実行する低速処理と、CPU診断、メモリ診断など、例えば1時間の周期で処理をする診断処理に分けることができる。
尚、例えば、入力処理部21と出力処理部24は、セーフティ部α高速処理部22、セーフティα低速処理部23、セーフティ部診断処理部25のサブルーチンの扱いとする。
セーフティ部α20に対応して、上記プログラム終了情報収集処理部44を設けている。プログラム終了情報収集処理部44は、セーフティ部α20に関して、プログラムの実行時間やシーケンスを監視する(プログラムシーケンス番号の更新とチェック等を行う)処理機能部であり、当該処理はサブルーチンの扱いとする。
同様に、セーフティ部β30に対応して、上記プログラム終了情報収集処理部45を設けている。プログラム終了情報収集処理部45は、セーフティ部β30に関して、プログラムの実行時間やシーケンスを監視する(プログラムシーケンス番号の更新とチェック等を行う)処理機能部であり、当該処理はサブルーチンの扱いとする。
上記プログラム終了情報収集処理部44、45については、詳細を図4、適用例を図5に示し、後に説明する。
セーフティ部α20は、安全入力Aに対して、安全制御を行い、安全出力Aを出力する。この安全制御処理は、上記セーフティ部α高速処理部22、セーフティα低速処理部23が実行する。尚、セーフティ部α高速処理部22は高速処理α、セーフティα低速処理部23は低速処理αを実行するものとする。これら高速処理α、低速処理αや後述する高速処理β、低速処理βは、定周期割り込みによるタスクとして処理される。
また、尚、高速処理αと後述する高速処理βをまとめて高速処理と言う場合もあるものとする。同様に、低速処理αと後述する低速処理βをまとめて低速処理と言う場合もあるものとする。
高速処理は、後述する定周期1の定周期割り込みによって起動されて処理実行するが、例えば高速処理αと後述する高速処理βとを交互に実行する。つまり、定周期1の各周期区間(定周期1区間と記す場合もあるものとする)に対して、高速処理αと高速処理βとを相互に異なる周期区間に割り当てる(よって、交互に実行する例に限らない。例えば高速処理αを2つの周期区間で連続して実行し、高速処理βも2つの周期区間で連続して実行するようにしてもよい)。尚、この例では、高速処理αと後述する高速処理βは、それぞれ、実質的に定周期1の2倍の周期で起動されて処理実行する。
また、低速処理は、後述する定周期2の定周期割り込みによって起動されて処理実行するが、例えば低速処理αと後述する低速処理βとを交互に実行する。つまり、定周期2の各周期区間(定周期2区間と記す場合もあるものとする)に対して、低速処理αと低速処理βとを相互に異なる周期区間に割り当てる(よって、交互に実行する例に限らない)。尚、この例では、低速処理αと後述する低速処理βは、それぞれ、実質的に定周期2の2倍の周期で起動されて処理実行する。
尚、定周期1<定周期2であり、高速処理は、低速処理よりも起動頻度が高い。定周期割り込み(起動)は、割込処理部42によって行われる。
セーフティ部診断処理部25は、その診断処理によって異常を検出した場合にモータ停止などの安全出力Aを行う。その他、出力に対するフィードバック入力等があるが、ここでは説明を省略する。
何れにしても、高速処理、低速処理、診断処理は、何れも、その処理自体は上記背景技術で述べたような既存の処理であるので、これ以上詳細には説明しない。
ここで、セーフティ部β30にも、セーフティ部診断処理部25と略同一の機能部であるセーフティ部診断処理部35がある。つまり、セーフティ部診断処理部25は、セーフティ部α20だけを診断対象とするのではなく安全機能全体(つまり、本例ではセーフティ部α20とセーフティ部β30の両方とも)を診断対象とする。同様に、セーフティ部診断処理部35は、セーフティ部β30だけを診断対象とするのではなく安全機能全体(つまり、本例ではセーフティ部α20とセーフティ部β30の両方とも)を診断対象とする。従って、セーフティ部診断処理部25、35の両方を実行させる必要はなく、どちらか一方のみを実行(稼動側とする)させるようにすれば済む。
各診断処理部25,35は、内部割り込み処理タスクとする。セーフティ部診断処理部25とセーフティ部診断処理部35とは、ダイバース化した同じ機能であり、どちらか一方が稼動側、他方が待機側となり、稼動側のみが動作する。そして、稼動側の診断処理部の異常が検出された場合は、時間・順序監視処理部41により切り替えが実施され、他方の(待機側であった)診断処理部が新たな稼動側となって起動される。
また、セーフティ部診断処理部(25または35;そのときに稼動側となっているもの)は、上記定周期2よりも長い定周期(上記のように例えば1時間の周期)で動作する。
また、安全入力、安全出力に対して、セーフティ部αとセーフティ部βとで突き合わせを行うなどの処理もあるが、ここでの説明は省略する。
また、セーフティ部β30は、入力処理部31、出力処理部34、セーフティ部β高速処理部32、セーフティ部β低速処理部33、セーフティ部診断処理部35に機能分割される。尚、セーフティ部β高速処理部32は高速処理β、セーフティ部β低速処理部33は低速処理βを実行するものとする。
上記の通り、セーフティ部β30は、セーフティ部α20と略同一の機能を有するものであり、これら入力処理部31〜セーフティ部診断処理部35は、上記入力処理部21〜セーフティ部診断処理部25と略同一であるので、説明は省略する。
また、CPU1の内蔵メモリ(不図示)には、シーケンス管理テーブル43が記憶される。シーケンス管理テーブル43は、プログラムシーケンス番号の管理等を行う為に用いられる情報であり、具体例を図3に示し、後に説明する。
尚、上記プログラム終了情報収集処理部44、45は、シーケンス管理テーブル43の格納データを更新する処理を行う。すなわち、例えばセーフティ部α20を例にした場合、その高速処理、低速処理が実行される毎に、プログラム終了情報収集処理部44は、当該実行されたプログラムに関する情報(シーケンス情報等)を収集してシーケンス監理テーブル43に格納する。
時間・順序監視処理部41は、最上位のタスクレベルで動作する。そして、例えば、高速処理に応じた周期(本例では定周期1で)で動作する。つまり、例えば、定周期1の各周期区間の終了直後に、必ず動作して、当該定周期1の周期区間に実行された処理(高速処理)の正常/異常(本例ではプログラムシーケンスが正しいか否か)を判定する(後述する図6の処理を実行する)。
また、時間・順序監視処理部41は、低速処理に応じた周期(本例では定周期2)でも動作する。つまり、例えば、定周期2の各周期区間の終了直後に、必ず動作して、当該定周期2の周期区間に実行された処理(低速処理)の正常/異常(本例ではプログラムシーケンスが正しいか否か)を判定する(後述する図7の処理を実行する)。
このように、時間・順序監視処理部41は、安全機能の各定周期処理の周期に応じて必ず(最上位のタスクレベルで)動作して、その周期区間に実行された処理の正常/異常を判定する。
ここで、本例では、定周期1の複数回に1回(図2の例では4回に1回)の割合で、定周期1の周期区間の終了時に定周期2の周期区間が終了する。このときには、本例では例えば、まず、当該定周期1の周期区間に実行された処理(高速処理)の正常/異常を判定し(後述する図6の処理を実行する)、続いて、当該定周期2の周期区間に実行された処理(低速処理)の正常/異常を判定する(後述する図7の処理を実行する)。尚、この例では、図7の処理でステップS61が実行された場合には、次の定周期1の周期区間に係わる図6の処理でステップS32がYESとなることで、CPUリセットが掛けられることになる。但し、この例に限らない。
尚、ウォッチドッグタイマー2のカウンタ2aの設定値は、定周期1より長い時間とする。従って、図6の処理実行毎にウォッチドッグタイマー2のカウンタ・リセットしている限りは、CPUリセットが掛けられることはない。
時間・順序監視処理部41は、シーケンス管理テーブル43の格納データ(上記プログラム終了情報収集処理部44、45が格納したシーケンス情報等)を参照して、例えば上記実行された処理の正常/異常(プログラムシーケンスが正しいか否か)を判定する。
そして、プログラムシーケンスが正しくない場合は、判定対象の処理を強制終了して、当該処理に係わるセーフティ機能を機能停止させる(これ以降、動作させない)。これは、例えば、セーフティ部α低速処理部23に係わるプログラムシーケンスが正しくない場合は、セーフティ部α低速処理部23だけを機能停止するのではなく、セーフティ部α20全体を機能停止する。つまり、セーフティ部αに係わる低速処理、高速処理、診断処理の全てを機能停止させる(セーフティ部αに係わるメモリ領域に異常が生じている可能性があるので、低速処理αだけでなく、高速処理α等も機能停止させる)。従って、その後は、安全機能に関してはセーフティ部β30だけが動作することになる。
時間・順序監視処理部41の処理の詳細は、図6、図7に示し、後に説明する。
クロック3は、一定の時間間隔で出力を行う。
割込処理部42は、CPU1に対する外部割込/内部割込入力を伝達するCPU内蔵装置であり、各タスクの起動を制御する。割込処理部42は、例えばクロック3の出力信号に基づいて定周期割り込みを生成する。
ウオッチドッグタイマー2が内蔵するカウンタ2aは、上記クロック3の出力に応じて更新される(カウントアップされる)。カウンタ2aのカウント値が設定値に達したら(カウントアップしたら)、CPUリセット信号をCPU1へ出力する。但し、通常は(正常な状態では)カウンタ2aのカウント値が設定値に達する前に、CPU1の時間・順序監視処理部41によってカウンタ2aがリセットされるように構成している。
尚、上記カウンタ2aに係わる設定値は、例えば「定周期1<設定値」や「定周期1<設定値<定周期1の2倍」などの条件を満たす任意の値が設定されるが、この例に限らない。
本例では、後述するように、上記セーフティ部α20とセーフティ部β30の両方とも異常となったら(両方とも強制終了され、安全機能が機能停止状態となる)、時間・順序監視処理部41はカウンタ2aをリセットしない。これによって、ウオッチドッグタイマー2がタイムアップして、CPUリセット信号がCPU1へ出力されることになる。CPUリセット信号によって、CPUハードウェアでのCPU1のリセット(初期化)処理が行われる。
尚、ウオッチドッグタイマー2は、設定時間が、超過時間のみを設定できるタイプ、タイムウインドウ(最短時間と超過時間)を設定できるタイプのどちらでも良い。
上述したように、本例の安全処理監視システムは、例えば図1に示すように、1つのCPU1と1つのウオッチドッグタイマー2を基本構成とする。そして、CPU1内にセーフティ機能と非セーフティ機能とが設けられると共に、セーフティ機能は多重化されている(図1はセーフティ機能を二重化した例であるが、この例に限らない)。多重化された各セーフティ機能は、それぞれ、入力処理、出力処理、高速処理、低速処理、診断処理に機能分割される。
本手法では、プログラムの実行時間とシーケンス監視のため、各セーフティ機能毎にプログラム終了情報収集処理を設けている。更に、シーケンス管理テーブル43、時間・順序監視処理部41、割込処理部42を設けている。尚、シーケンス管理テーブル43は、安全を担保するため、反転データのテーブルを生成・保持しておくようにしてもよい(勿論、この場合には、反転データを用いてテーブル43の正常/異常チェックを行うことになる)。
ここで、図2に、割込入力処理例を示す。
本例では、図2の割込入力処理に示すように、定周期1と、定周期1より長い周期(図示の例では4倍の)定周期2とが設定されている。
定周期1は上記高速処理に係わる周期であるが、本手法では上記の通り、上記高速処理α、βは交互に動作させる。これより、各高速処理α、βは、それぞれ、実質的に定周期1の2倍の時間間隔に動作することになる。
つまり、図示のように、高速処理αと高速処理βとを定周期1の別々の周期区間に割りつける(それぞれ周期的に処理されるタスクの別々の周期区間に割りつける;例えば高速処理αと同一周期区間に高速処理βを割り付けない)。
つまり、例えば定周期1に関しては、図示の定周期1の区間(周期区間というものとする)が繰り返されるものと見做すと、図上左端を定周期1の1番目の周期区間と見做した場合、高速処理αは奇数番目の周期区間に割り当てられ、高速処理βは偶数番目の周期区間に割り当てられるものと言うこともできる。
このように、セーフティ部α高速処理部22は、定周期1の2回につき1回動作する。セーフティ部β高速処理部32も、定周期1の2回につき1回動作する。つまり、定周期1でセーフティ部α高速処理部22とセーフティ部β高速処理部32とを交互に実行させることになる。
このようにすることで、上記時間・順序監視処理部41の図6の処理を実行する毎に、異常判定対象の高速処理(その直前の定周期1の周期区間で実行される高速処理)は、高速処理αか高速処理βのどちらか一方のみとなる。よって、高速処理α、βのどちらかに異常がある状態であれば、α、βのどちらが異常であるのかを判別できる(本手法のようにしないと判別できない場合がある理由を、後に図8を参照して説明する)。
これは低速処理についても略同様である。すなわち、多重化(二重化)されているセーフティ機能の低速処理α、βを定周期2で交互に動作させる。これより、低速処理α、βは、それぞれ、実質的に定周期2の2倍の時間間隔で動作することになる。
つまり、図示のように、低速処理αと低速処理βとを定周期2の別々の周期区間に割りつける(例えば低速処理αと同一周期区間に低速処理βを割り付けない)。これより、セーフティ部α低速処理部23は、定周期2の2回につき1回動作する。セーフティ部β低速処理部33も、定周期2の2回につき1回動作する。つまり、定周期2でセーフティ部α低速処理部23とセーフティ部β低速処理部33とを交互に実行させることになる。
このようにすることで、上記時間・順序監視処理部41の図7の処理を実行する毎に、異常判定対象の低速処理(その直前の定周期2の周期区間で実行される低速処理)は、低速処理αか低速処理βのどちらか一方のみとなる。よって、低速処理α、βのどちらかに異常がある状態であれば、α、βのどちらが異常であるのかを判別できる。
上述した高速処理及び低速処理をαとβとを交互に実行させることは、例えば、割込処理部42によって行われる。一例としては、割込処理部42は、定周期1の時間でタイマアップする高速タイマと、定周期2でタイマアップする低速タイマ(何れも不図示)を有している。そして、割込処理部42は、例えば、高速タイマがタイマアップする毎に直ちに高速タイマを0クリアして再起動する。同様に、低速タイマがタイマアップする毎に直ちに低速タイマを0クリアして再起動する。
そして、割込処理部42は、例えば上記αとβとを交互に実行させる為の構成として、更に、高速タイマ用の第1カウンタと、低速タイマ用の第2カウンタを有している。
そして、割込処理部42は、例えば、上記高速タイマの0クリアの際に上記第1カウンタを+1インクリメントする。そして、第1カウンタのカウント数が偶数であれば高速処理αを起動して実行させ、奇数であれば高速処理βを起動して実行させる。同様に、上記低速タイマの0クリアの際に上記第2カウンタを+1インクリメントする。そして、第2カウンタのカウント数が偶数であれば低速処理αを起動して実行させ、奇数であれば低速理βを起動して実行させる。
尚、本例の場合、割込処理部42は、上記高速タイマ/低速タイマがタイマアップする毎に、時間・順序監視処理部41も起動する。上記の通り、時間・順序監視処理部41は最もタスクレベルが高いので、まず、時間・順序監視処理部41が実行されて、その後に上記起動された高速処理/低速処理が実行開始されることになる。
勿論、αとβを交互に実行させる為の構成は、上述した一例に限るものではなく、例えば、定周期1、定周期2それぞれに対応して、前回実行された処理がαとβのどちらであるのかを記憶するようにしてもよい。
また、高速処理α、βのタスクレベル(割込優先順位)は、低速処理α、βよりも上位とする。これより、図示のように、低速処理は、その実行中に高速処理や時間・順序監視処理の実行タイミングとなったら、中断されて、これら上位の処理が終了したら再開することになる(この制御も例えば割込処理部42が実行するが、これ自体は既存技術である)。
また、非セーフティ部10のタスクレベルは、低速処理よりも低位である。
更に、各セーフティ部診断処理部(25,35)のタスクレベルは、非セーフティ部10よりも低位である(セーフティ部診断処理のタスクレベルは最低とする)。セーフティ部診断処理は、本例では定周期2のN倍の周期で動作する(尚、上記の通り、セーフティ部診断処理に関しては、αとβのどちらか一方のみが動作する)。
セーフティ部診断処理の時間異常の監視によって、当該処理より上位の非セーフティ部処理の時間異常を検出できる。尚、上記の通り、高速処理、低速処理、診断処理の各処理内容自体は、既存処理であるので、ここでは特に説明しない。
また、高速処理αと高速処理βとは、タスクレベルは同じとする(但し、上記の通り、動作周期区間は別とする)。同様に、低速処理αと低速処理βとは、タスクレベルは同じとする(但し、上記の通り、動作周期区間は別とする)。
また、割込処理部42は、上記のように高速処理α、高速処理β、低速処理α、低速処理βの起動制御を行っているので、高速処理、低速処理それぞれについて、そのときに起動したもの(αかβか)を所定の記憶領域に上書き記憶するようにしてもよい。これより、例えば時間・順序監視処理部41等は、異常判定処理対象がαとβのどちらであるのかを判別できる。
時間・順序監視処理部41は、定周期1、定周期2の各周期に応じた所定のタイミングで(例えば各周期区間が終了したタイミングで)、シーケンス管理テーブル43を参照して、その周期区間で実行された処理(αとβの何れか)に応じたシーケンス情報等に基づいて、プログラム実行に係わる異常の有無を判定する(ここではプログラムシーケンス(処理実行順序)が正しいか否かを判定する)。そして、プログラムシーケンス(処理実行順序)が正しくないと判定した場合は、当該判定対象の処理を強制終了させて当該処理を含むセーフティ機能(αとβの何れか)全体を機能停止させる(これ以降、動作させない)。
尚、シーケンス情報は、プログラム終了情報収集処理部(44,45)が、対応する高速処理/低速処理実行中に例えば後述する図5(b)に示す各タイミングで収集して、シーケンス監理テーブル43に格納している。
プログラムのシーケンス情報としては、例えば一例としては、プログラム実行順序(後述する順序番号等)、プログラム動作回数、プログラムのコードのデータまたはこれらのデータをチェックサムやCRCなどでコード化したデータを用いる。但し、本例では、後述する順序番号を用いる例について示すものとする。
プログラムシーケンスが正しくない場合、多重化されている他のセーフティ機能には、処理周期、メモリ領域ともに影響しないので、多重化されている他のセーフティ機能は続行することができる(例えばαが異常の場合でもβは続行できる)。尚、上記のように他のセーフティ機能のメモリ領域に影響しないのは、上記先願のメモリ保護機能によるものである(後述するように、例えばαはβのメモリ領域には書き込み出来ないので、たとえαが異常となってβのメモリ領域に書き込みを試みても出来ないので、βのメモリ領域が破壊されたり異常なデータとなることはない)。
また、診断処理については、上記の通り、多重化されたセーフティ機能のうちの1つの機能(稼動側となっている機能)のセーフティ部診断処理部が実行する。従って、稼動側となっていた診断処理部が、上記強制終了等に伴って機能停止された場合には、(待機側となっていた)他のセーフティ機能のセーフティ部診断処理部が起動して、診断処理が続行される。
上記のように、本手法では、多重化されているセーフティ機能の一部(一例ではαとβのどちらか一方のみ)が異常となっても、CPUリセットが掛かることなく、残りの(正常な)セーフティ機能の動作は続行される。但し、多重化されているセーフティ機能が全て異常となった場合には、ウオッチドッグタイマー2が動作してCPUリセットを掛けることになる。また、時間・順序監視処理が指定時間内に動作しない場合や、反転データで多重化されたシーケンス管理テーブル43が異常の場合にも、ウオッチドッグタイマー2が動作してCPUリセットを掛けることになる。
図3に、シーケンス管理テーブル43の具体例を示す。
シーケンス管理テーブル43は、後述するステータス58以外は、予め設定される設定値(図上左側)と随時更新される実績値(図上右側)とから成る。これは、各データ項目毎に、設定値と実績値のペアが形成される形となっている。例えば、セーフティ部α高速処理に関しては、設定値である“セーフティ部α高速処理シーケンス設定値”51と、実績値である“セーフティ部α高速処理シーケンス情報”61のペアから成っている。他のデータ項目についても同様である。そして、上記プログラム終了情報収集処理部(44,45)は、実績値を随時更新するものである。
“セーフティ部α高速処理シーケンス設定値”51と“セーフティ部α高速処理シーケンス情報”61は、両方とも、セーフティ部α高速処理部22による処理(高速処理α)に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部α高速処理シーケンス設定値”51には、予め、高速処理αに係わる順序番号の最大値が格納される。“セーフティ部α高速処理シーケンス情報”61には、高速処理αに係わる順序番号の実績値が格納される。
ここで、上記順序番号について図5を参照して説明する。図5(a)、(b)には高速処理αに係わる処理の具体例を示している。図示の例では、高速処理αは、処理A、処理B、処理Cの3つの処理(部分処理と呼ぶ場合もあるものとする)から構成される。
尚、時間・順序監視処理部41は、これら3つの部分処理が所定の順番(処理A→処理B→処理C)で実行完了していた場合に、正常に実行されたものと判定する。つまり、全ての部分処理を実行完了しなかった場合、すなわち処理の途中で(例えば処理Bまでしか実行されていない状態で)時間・順序監視処理部41の処理実行タイミングとなった場合(その周期区間が終わった場合)、異常と判定される。あるいは、時間・順序監視処理部41の処理実行タイミング時点までに全ての部分処理(処理A、処理B、処理Cの全て)を完了していたが、順序が間違っている場合(例えば、処理A→処理C→処理B等)にも、異常と判定される。
尚、上記のことから、上記“高速処理αに係わる順序番号の最大値”とは、“高速処理αに係わる各部分処理のなかで最後に実行すべき部分処理の順序番号”を意味するものと言える。尚、これは、高速処理αだけでなく他の処理(その設定値;最大値)についても同様である。
図5の説明に戻る。
図5に示す例では、上記各部分処理A,B,Cには、予め、所定の順序番号が付与されている。図示の例では、順序番号は、処理Aが‘1’、処理Bが‘2’、処理Cが‘3’となっている。これより、“セーフティ部α高速処理シーケンス設定値”51には、これら順序番号のなかで最大である‘3’が、予め登録されている。
そして、図5(a)に示すように、上記プログラム終了情報収集処理部44は、これら各部分処理A,B,C実行完了毎に動作して、その順序番号を“セーフティ部α高速処理シーケンス情報”61に格納する。これは、例えば各部分処理A,B,Cのプログラムの最後に、プログラム終了情報収集処理部44の呼出し処理があり、この処理では自己に関する所定情報(処理区分(例えば高速処理α、β、低速処理α、βのどれであるのか(ここでは高速処理αとなる))や、順序番号等)を引数としてプログラム終了情報収集処理部44に渡す。プログラム終了情報収集処理部44は、この引数に基づいて、上記のように順序番号を“セーフティ部α高速処理シーケンス情報”61に格納することになる。
高速処理αが正常に実行された場合には、各部分処理A,B,Cは順序番号通りに実行されるので、最終的には“セーフティ部α高速処理シーケンス情報”61には‘3’が格納されることになり、これは上記の通り、“セーフティ部α高速処理シーケンス設定値”51と同一となる。これを利用して後述する正常/異常判定を行うものであるが、詳しくは後述する。
以上、シーケンス管理テーブル43における高速処理αに係わる情報について説明したが、これは高速処理β、低速処理α、低速処理β、セーフティ部診断処理についても略同様であるので、以下、これらについては簡単に説明する。
“セーフティ部β高速処理シーケンス設定値”52と“セーフティ部β高速処理シーケンス情報”62は、両方とも、セーフティ部β高速処理部32による処理(高速処理β)に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部β高速処理シーケンス設定値”52には、予め所定の設定値(高速処理βに係わる順序番号の最大値など)が格納される。“セーフティ部β高速処理シーケンス情報”62には、高速処理βに係わる順序番号の実績値が格納される。
“セーフティ部α低速処理シーケンス設定値”53と“セーフティ部α低速処理シーケンス情報”63は、両方とも、セーフティ部α低速処理部23による処理(低速処理α)に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部α低速処理シーケンス設定値”53には、予め所定の設定値(低速処理αに係わる順序番号の最大値など)が格納される。“セーフティ部α低速処理シーケンス情報”63には、低速処理αに係わる順序番号の実績値が格納される。
“セーフティ部β低速処理シーケンス設定値”54と“セーフティ部β低速処理シーケンス情報”64は、両方とも、セーフティ部β低速処理部33による処理(低速処理β)に係わる情報であり、上記の通り前者は設定値、後者は実績値である。すなわち、“セーフティ部β低速処理シーケンス設定値”54には、予め所定の設定値(低速処理βに係わる順序番号の最大値など)が格納される。“セーフティ部β低速処理シーケンス情報”64には、低速処理βに係わる順序番号の実績値が格納される。
また、“セーフティ部診断処理回数設定値(N)”55は、セーフティ部診断処理の監視時間に関する設定値(N)である。後述するように監視時間経過毎に診断処理に関する異常の有無を判定するものであり、監視時間そのものを設定してもよいが、本例では監視時間を定周期2のN倍(Nは任意の整数)とするものとし、この“N”の値が予め任意に決められて“セーフティ部診断処理回数設定値(N)”55に登録される。
“セーフティ部診断処理回数”65には、定周期2の実行回数が格納される。この回数が上記Nとなる毎に上記「診断処理に関する異常の有無を判定する」処理が実行されると共に、“セーフティ部診断処理回数”65はリセット(0クリア)される。
上記「診断処理に関する異常の有無を判定する」処理には、“セーフティ部診断処理シーケンス設定値”56と“セーフティ部診断処理シーケンス情報”66とが用いられる。“セーフティ部診断処理シーケンス設定値”56には、予め所定の設定値(セーフティ部診断処理に係わる順序番号の最大値など)が格納される。“セーフティ部診断処理シーケンス情報”66には、セーフティ部診断処理に係わる順序番号の実績値が格納される。
“セーフティ部診断処理リトライ回数設定値(M)”57には、CPU1をリセットするまでの診断処理部の異常判定回数の上限値(M回)を設定する。セーフティ部がL重化している場合は、メモリ異常を考慮するとM≧L(M=Lなど)が望ましい。
また、“セーフティ部診断処理リトライ回数”67には、診断処理部に関して異常と判定された回数(実績値)が格納される。そして、“セーフティ部診断処理リトライ回数”67が、M回となったら、CPUリセットを掛けることになる。
例えば、図1の例のようにセーフティ部が2重化されている場合には(セーフティ部診断処理部25とセーフティ部診断処理部35)、例えば、M=4とする。これによって、例えば、セーフティ部診断処理部25が稼動側となっている状態で任意のときに診断処理部25の異常が判定された場合には、“セーフティ部診断処理リトライ回数”67を1回とすると共に、セーフティ部診断処理部35を稼動させる。この状態で任意のときに診断処理部35の異常が判定された場合には、“セーフティ部診断処理リトライ回数”67を2回とすると共に、セーフティ部診断処理部25を再度稼動する。
これによってセーフティ部診断処理部25が再度稼動側となっている状態で任意のときに診断処理部25の異常が判定された場合には、“セーフティ部診断処理リトライ回数”67を3回とすると共に、セーフティ部診断処理部35を再度稼動させる。この状態で任意のときに診断処理部35の異常が判定された場合には、“セーフティ部診断処理リトライ回数”67を4回とするが、これは上記上限値M(=4)と同一であるので、CPU1をリセットすることになる。
この様に、各セーフティ部診断処理毎に1度だけでなく2度までも異常と判定された場合には、CPU1リセットを掛けるようにしてもよいが、勿論、この例に限らない(1度だけでNGとする場合には例えばM=2に設定すればよい)。尚、上記の例では、セーフティ部診断処理に関しては、異常判定があっても機能停止しないことを前提としている(これより、上記のように再度稼動させることができる)。尚、これより、上記高速処理/低速処理の異常判定に伴ってそのセーフティ機能全体を機能停止する処理についても、セーフティ部診断処理に関しては除外する(機能停止しない)ようにしてもよい。
ステータス58には、現在の状態が格納される。現在の状態は、“正常”、“セーフティ部α異常”、“セーフティ部β異常”、“リセット”の各種ステータスの何れかとなる。
上記データ構成のシーケンス管理テーブル43を用いて、時間・順序監視処理(後述する図6、図7の処理)が実行されることになるが、これについては後述する。
ここで、シーケンス管理テーブル43の格納データに何らかの異常が生じる場合もあり得る。これより、シーケンス管理テーブル43自体の異常の有無を判定可能な構成としてもよい。その為に、一例として、シーケンス管理テーブル43は、正のデータ用と反転データ用の2種類のテーブルより成るものとしてもよい。
そして、シーケンス管理テーブル43に何らかのデータを書き込む時には、この書込対象データを正のデータ用テーブルに書き込むと共に、この書込対象データの反転データを反転データ用テーブルに書き込む。一方、シーケンス管理テーブル43からデータを読み出すときには、正のデータ用テーブルから読み出す。また、後述する時間・順序監視処理(図6の処理)では、正のデータと、反転データを反転したものとが一致するかをチェックすることで、シーケンス管理テーブル43自体の異常の有無をチェックする。
図4は、プログラム終了情報収集処理部(44,45)のフローチャート図である。
プログラム終了情報収集処理は、各プログラム(図5の処理A、処理B、処理Cの各プログラム)の終了時に呼ばれるサブルーチンであり、上記のように入力パラメータ(引数)は当該終了したプログラムの順序番号等である。
ここで、上記高速処理α、高速処理β、低速処理α、低速処理β、診断処理は、それぞれ、基本的に、複数のプログラム(複数の処理)より構成されており、各プログラムには予め順序番号が割り当てられている。これに関しては、既に図5(a)、(b)に示す具体例を用いて説明している。
上記の通り、プログラム終了情報収集処理は、任意の上記処理(プログラム)実行終了毎に呼び出されて、図4の処理を実行する。
図4の処理例では、各プログラム終了情報収集処理部(44,45)は、まず、例えば上記実行終了した処理のタスク番号から当該処理の区分(高速処理α、低速処理β、etc.)を判定する(ステップS11)。尚、タスク番号は、例えば割込処理部42で管理されている。勿論、この例に限るものではなく、例えば上述したように上記入力パラメータ(引数)として処理区分も渡すようにしてもよい。この場合には、特に処理区分を判定する必要性はない。
尚、時間・順序監視処理部41も、同様にして、実行終了した処理のタスク番号等から当該処理の区分(高速処理α、低速処理β、etc.)を判定するようにしてもよいが、この例に限らない。
そして、シーケンス管理テーブル43から、当該判定した処理区分に対応するシーケンス情報を読み込み(例えば高速処理αであれば“セーフティ部α高速処理シーケンス情報”61を読み込む)、これと上記入力パラメータの順序番号とに基づいて、処理実行順序が正常か否かを判定する(ステップS12、S13)。これは、例えば、仮にシーケンス情報が‘2’であるとしたならば、順序番号が‘3’であれば正常、‘3’以外なら異常と判定する。
処理実行順序が正常と判定した場合には(ステップS13,YES)、シーケンス管理テーブル43のシーケンス情報を、上記入力パラメータの順序番号に更新して(ステップS14)、EXITの処理をする。一方、順序が異常と判定した場合には(ステップS13,NO)、そのままEXITの処理をする。
上記処理によって、例えば順序番号‘1’、‘2’、‘3’の順番で各プログラムが実行された場合には、シーケンス管理テーブル43のシーケンス情報は、‘1’→‘2’→‘3’という形で更新される(つまり、最終的には‘3’が格納された状態となり、設定値(最大値)=‘3’と同一の値となる)。
これに対して、例えば、順序番号‘1’、‘3’、‘2’の順番で各プログラムが実行された場合には、シーケンス管理テーブル43のシーケンス情報は、‘1’→‘1’→‘2’という形で更新される(つまり、最終的には‘2’が格納された状態となり、設定値(最大値)=‘3’と異なる値となる)。
ここで、既に述べたように、図5には、高速処理αを例にした当該高速処理αの処理実行例を示している。
例えば図2に示した高速処理αは、自己に割り当てられた各定周期1の周期区間毎に、当該周期区間内に例えば図5の処理A、処理B、処理Cの全てを所定の順番で実行するものである。ここでは、上記の通り、処理A(順序番号‘1’)、処理B(順序番号‘2’)、処理C(順序番号‘3’)の順番で順次実行するものであり、これら各処理実行完了する毎に例えば図4に示すプログラム終了情報収集処理が実行される。
すなわち、まず、処理Aが実行され(ステップS21)、当該処理Aが終了したら、プログラム終了情報収集処理が実行されて(パラメータとして順序番号‘1’が渡される)、順序番号‘1’が“セーフティ部α高速処理シーケンス情報”61に格納される(ステップS22)。
続いて、処理Bが実行され(ステップS23)、当該処理Bが終了したら、プログラム終了情報収集処理が実行されて(パラメータとして順序番号‘2’が渡される)、順序番号‘2’が“セーフティ部α高速処理シーケンス情報”61に格納される(ステップS24)。
次に、処理Cが実行され(ステップS25)、当該処理Cが終了したら、プログラム終了情報収集処理が実行されて(パラメータとして順序番号‘3’が渡される)、順序番号‘3’が“セーフティ部α高速処理シーケンス情報”61に格納される(ステップS26)。
但し、常に図5に示す通りに処理実行されるとは限らない。異常時には、例えば処理の順番が異なる(例えばステップS25、S26の処理が、ステップS23,S24よりも先に実行される等)場合等もあり得る。あるいは、異常時には、未だ全ての処理が実行完了していない状態(例えばステップS25実行中に)時間・順序監視処理部41が起動される場合も有り得る。
図6、図7は、時間・順序監視処理部41の処理フローチャート図である。
図6は定周期1で実行される処理であり、高速処理α、βに係わる処理である。
図7は定周期2で実行される処理であり、低速処理α、βに係わる処理である。尚、図7は、セーフティ部診断処理にも係わる。
まず、図6について説明する。
図6の処理は、例えば高速処理α、βに係わる定周期1で(その周期区間の最後や終了直後等に)、今回実行された高速処理に関する異常判定処理等を実行するものである。つまり、今回実行された高速処理に関する異常判定等を実行するものである。換言すれば、図6の処理は、定周期1で、高速処理αまたは高速処理βの処理が正常に実行されたか否かのチェック等を行うものである。
図6の処理では、まず、シーケンス管理テーブル43の読込処理を行う(ステップS31)。
そして、まず、ステータス58が「リセット」となっているか否かを判定する(ステップS32)。もし、ステータス58が「リセット」になっているならば(ステップS32、YES)、何も行わないことで、ウォッチドッグタイマー2によってCPUリセットを掛けさせる。つまり、時間・順序監視処理部41からウオッチドッグタイマー2のカウンタ2aのリセット信号が出力されないので、ウオッチドッグがタイムオーバーして、ウオッチドッグタイマー2からCPUリセット信号が出力される。
一方、ステータス58が「リセット」以外の状態であれば(ステップS32,NO)、続いて、上記今回実行された高速処理(αとβのどちらかとなる)が正常に実行されたものであるか否かを、該当する設定値とシーケンス情報とが一致するか否かによって判定する(ステップS33)。つまり、高速処理αに係わる定周期1区間直後の図6の処理では、“セーフティ部α高速処理シーケンス設定値”51と“セーフティ部α高速処理シーケンス情報”61とが一致するか否かを判定する。高速処理βに係わる定周期1区間直後の図6の処理では、“セーフティ部β高速処理シーケンス設定値”52と“セーフティ部β高速処理シーケンス情報”62とが一致するか否かを判定する。
設定値とシーケンス情報とが一致する場合は(ステップS33,YES)、今回実行された高速処理は、定周期1区間内にシーケンス(順序番号)通りに実行完了したと判定し(つまり、正常に実行されたと判定し)、ウオッチドッグタイマー2のカウンタ2aをリセットする(ステップS35)。但し、その前に、図示の例のように、シーケンス管理テーブル43自体が正常か否かをチェックするようにしてもよい(ステップS34)。
シーケンス管理テーブル43が正常か否かの判定処理は、例えば上述した正のデータ用のテーブルの格納データと、反転データ用のテーブルの格納データを反転したものとが一致するか否かを判定する。一致する場合にはシーケンス管理テーブル43は正常と見做して(ステップS34,YES)上記ステップS35の処理を実行する。一方、不一致の場合にはシーケンス管理テーブル43は異常と見做して(ステップS34,NO)、上記ステップS35の処理は実行しない(本例ではステータス58を「リセット」とする(ステップS41)が、この例に限らない)。
つまり、シーケンス管理テーブル43自体にメモリエラーなどによるデータ異常があれば、当該テーブル43を用いた正常/異常判定処理の信頼性が無くなるので、CPUリセットを掛けることになる。
一方、上記ステップS33の判定で設定値とシーケンス情報とが一致しない場合は(ステップS33,NO)、上記今回実行された高速処理は異常と見做して(定周期1の時間内に終了しなかったか、あるいは処理実行順序が異常)、ステップS36へ移行する。
ステップS36では、シーケンス管理テーブル43のステータス58が、“別処理(今回がαであればβ)の異常”であるか否かを確認する。つまり、今回実行されたのが高速処理αであれば、ステータス58が上記“セーフティ部β異常”であるか否かを確認する。今回実行されたのが高速処理βであれば、ステータス58が上記“セーフティ部α異常”であるか否かを確認する。換言すれば、二重化(αとβ)の両方とも異常となったか否かを確認する。
ステータス58が“別処理の異常”である場合には(ステップS36,YES)、既に二重化(α、β)のいずれかに異常が発生している状態で、更に他方にも異常が発生したことになるので(αとβの両方とも異常であることになるので)、CPU1をリセットさせる(本例では上記ステップS41の処理を行うが、何も処理を行わないようにしてもよい)。
一方、ステータス58が“別処理の異常”ではない場合には(ステップS36,NO)、ステータス58が“今回の処理の異常”(今回が高速処理αであれば上記“セーフティ部α異常”、今回が高速処理βであれば上記“セーフティ部β異常”)であるか否かを判定する(ステップS37)。つまり、今回実行されて上記ステップS33で異常(設定値とシーケンス情報とが不一致)と判定された処理について、既に過去の図6の処理で異常と判定されてステータス58に異常登録されている状態か否かを判定する。そして、ステータス58が“今回の処理の異常”である場合には(ステップS37,YES)上記ステップS34へ移行し、ステップS34がNOとならない限りは上記ステップS35が実行されるようにする。
これは、任意のタイミングでの図6の処理によって例えば高速処理αが異常と判定された場合、その後も高速処理αに係わる(高速処理αが実行はされないが)図6の処理は引き続き実行されるが、シーケンス管理テーブル43の高速処理αに係わる実績値等はそのままとなっている場合を想定している。この場合、当該高速処理αに係わる図6の処理実行毎に、ステップS33の判定はNOとなってしまう。つまり、今回の処理は既に機能停止状態となっており、過去に異常が検出された際のデータがそのままとなっている為にステップS33の判定がNOとなっている。しかし、この状況では当然、ステップS38、S39、S40の処理を実行させる必要はないので(更に、もしステップS39の判定が、何らかの理由でNOとなってしまうとCPUリセットが掛かってしまうので)、上記ステップS37の処理を設けている。しかし、上記想定とは異なる場合には、必ずしもステップS37の処理を設ける必要はない。
一方、ステップS37の判定がNOとなる場合は、ステップS32、S36もNOであることから、ステータス58は“正常”ということになる。つまり、正常な状態において高速処理α、βのどちらかが異常になったことになる。この場合、この異常な高速処理を強制終了させると共に(異常ループしていて終了していない場合もあるので)、当該高速処理が係わるセーフティ部全体(メモリ領域が破壊されている可能性があるので、高速処理だけでなく低速処理等も)を強制的に機能停止させる(ステップS38)。そして、ステータス58に、発生した異常を登録する(高速処理αが異常となった場合には“セーフティ部α異常”とする。高速処理βが異常となった場合には“セーフティ部β異常”とする)(ステップS40)。そして、ステップS34へ移行することで(ステップS34がNOとならない限りは)上記ステップS35の処理を実行させるようにする。
但し、上記ステップS38による強制終了が失敗した場合には(ステップS39,NO)、何も処理を行わないことで(特にステップS35を実行しないことで)CPUリセットを掛けさせる。
次に、図7の処理例について説明する。
図7の処理は、低速処理α、βに係わる定周期2で(その周期区間の最後や終了直後等に)、今回実行された低速処理に関する異常判定処理等を実行するものである。換言すれば、定周期2で、低速処理αまたは低速処理βの処理が正常に実行されたか否かのチェック等を行うものである。尚、図7の処理例では、セーフティ部診断処理が正常に行われたか否かをチェックする処理も行う。また、尚、後述するステップS54,S55,S60,S62〜S66は、セーフティ部診断処理に係わるチェックと異常時処理である。
図7の処理でも、まず、シーケンス管理テーブル43の読込処理を行う(ステップS51)。
そして、まず、ステータス58が「リセット」となっているか否かを判定する(ステップS52)。もし、ステータス58が「リセット」になっているならば(ステップS52、YES)、何も行わないことで、ウォッチドッグタイマー2によってCPUリセットを掛けさせる。つまり、このケースでは、直前の図6の処理でステップS41が実行されてそのまま(ステップS35が実行されることなく)図6の処理が終了しているはずであるので、引き続き何も行わないことで(ウォッチドッグタイマー2がリセットされないことで)、CPU1はリセットされることになる。
一方、ステータス58が「リセット」以外の状態であれば(ステップS52,NO)、続いて、上記今回実行された低速処理(αとβのどちらかとなる)が正常に実行されたものであるか否かを、該当する設定値とシーケンス情報とが一致するか否かによって判定する(ステップS53)。つまり、低速処理αに係わる定周期2区間直後の図7の処理では、“セーフティ部α低速処理シーケンス設定値”53と“セーフティ部α低速処理シーケンス情報”63とが一致するか否かを判定する。低速処理βに係わる定周期2区間直後の図7の処理では、“セーフティ部β低速処理シーケンス設定値”54と“セーフティ部β低速処理シーケンス情報”64とが一致するか否かを判定する。
設定値とシーケンス情報とが一致する場合は(ステップS53,YES)、今回実行された低速処理は、定周期2区間内にシーケンス(順序番号)通りに実行完了した(つまり、正常に実行された)と見做す。そして、続いて、診断処理に関する下記の処理を実行する。
すなわち、“セーフティ部診断処理回数”65が“セーフティ部診断処理回数設定値(N)”以上(またはイコール)となったか否かを確認し(ステップS54)、「処理回数65<設定値N」の場合には(ステップS54,NO)、処理回数65を+1インクリメントして(ステップS55)、本処理を終了する。
尚、本例では、図7の処理の際にはウオッチドッグタイマー2のリセットは行わない。ウオッチドッグタイマー2のリセットは、図6の処理によって、基本的に定周期1で実行される。図7の処理によって例えば低速処理に関してα、βの両方で異常が検出された場合等には、ステップS61の処理が行われることで、その後に実行される図6の処理ではウオッチドッグタイマー2のリセットが行われないようにする。上述したように、これによってCPUリセットが掛かることになる。
一方、「処理回数65≧(または=)設定値N」の場合には(ステップS54,YES)、上記のようにこれは診断処理の異常の有無をチェックするタイミングが到来したことを意味する。これより、処理回数65を0クリアしたうえで(ステップS62)、“セーフティ部診断処理シーケンス情報”66が、“セーフティ部診断処理シーケンス設定値”56と一致するか否かを判定する(ステップS63)。一致する場合には(ステップS63,YES)、セーフティ部診断処理が所定時間内に(定周期2×Nの時間内に)シーケンス通りに実行完了したと判定し、そのまま本処理を終了する。これにより“セーフティ部診断処理回数”65=‘0’から再びスタートして、上記ステップS55の処理を繰り返して、ステップS54がYESとなる状況になったら、再び診断処理の異常チェック処理を行うことになる。
一方、シーケンス情報66が設定値56と一致しない場合は(ステップS63,NO)、診断処理の異常(所定時間内(定周期2のN倍の時間内)に処理終了しなかったか、シーケンスの実行順番が異常など)と判断し、ステップS64〜S66の処理を行う。
ステップS64〜S66の処理は、概略的には、例えば、他の(正常な)診断処理部に切り替えて診断処理を続行させるが、正常な診断処理部が残っていない場合にはCPUリセットを掛けさせる処理である。但し、上述したように、この例に限らない。
すなわち、まず、“セーフティ部診断処理リトライ回数”67を+1インクリメントしたうえで(ステップS64)、“セーフティ部診断処理リトライ回数”67≧“セーフティ部診断処理リトライ回数設定値(M)”57であるか否かを確認する(ステップS65)。
「リトライ回数67≧(または=)設定値M」である場合には(ステップS65,YES)、リトライ回数67を‘0’クリアしたうえで(ステップS60)、ステータス68に「リセット」を設定して(ステップS61)本処理を終了する。これによって、その後に図6の処理が実行されて上記ステップS32の判定がYESとなることで、ウォッチドッグタイムオーバーによってCPU1はリセットされることになる。
尚、例えば上記Lを用いてM=Lに設定しており且つ図1のようにL=2(つまり二重化)の例の場合には、2つのセーフティ部診断処理部25,35の一方が異常(ステップS63がNO)になって他方で運用していたが他方までも異常(ステップS63がNO)となった場合には、ステップS65がYESとなってCPUリセットが掛けられることになる。但し、この例に限らず、上記のように、1度は異常と判定された診断処理部を再度稼動させるようにしてもよい(一時的な異常であった場合等を考慮)。
一方、「リトライ回数67<設定値M」である場合には(ステップS65,NO)、稼動中であった(そしてステップS63で異常と判定された)セーフティ部診断処理を強制終了すると共に、別のセーフティ部診断処理部を起動する。すなわち、例えば、セーフティ部αのセーフティ部診断処理部25が稼動中であったなら(そして異常と判定されたなら)、当該処理部25を強制終了すると共に、セーフティ部βのセーフティ部診断処理35を起動する。同様に、セーフティ部βのセーフティ部診断処理35が稼動中であったなら(そして異常と判定されたなら)、当該処理部35を強制終了すると共に、セーフティ部αのセーフティ部診断処理25を起動する。
以下、上記ステップS53の判定がNOとなった場合の処理について説明する。
すなわち、上述した設定値とシーケンス情報とが一致しない場合は(ステップS53,NO)、今回実行された低速処理は、正常に実行されなかった(定周期2区間内に終了しなかったか、あるいはシーケンス順番通りに実行されなかった)と判断し、下記の処理を実行する。
まず、ステータス58が“別処理(今回がαであればβ)の異常”であるか否かを確認する(ステップS56)。つまり、今回実行されたのが低速処理αであれば、ステータス58が上記“セーフティ部β異常”であるか否かを確認する。今回実行されたのが低速処理βであれば、ステータス58が上記“セーフティ部α異常”であるか否かを確認する。換言すれば、二重化(αとβ)の両方とも異常となったか否かを確認する。
ステータス58が“別処理の異常”である場合すなわち二重化(αとβ)の両方とも異常となった場合には(ステップS56,YES)、ステータス58を「リセット」に設定(変更)して(ステップS61)、本処理を終了する。これによって、次に実行される図6の処理ではステップS32がYESとなるので、時間・順序監視処理部41からリセット信号が出力されることはなく、ウオッチドッグがタイムオーバして、ウオッチドッグタイマー2からCPUリセットが掛けられることになる。
一方、ステータス58が“別処理の異常”ではない場合には(ステップS56,NO)、今回実行された(そして異常となった)低速処理を強制終了して、これに係わるセーフティ部全体(仮に低速処理α実行であった場合には、当該低速処理αだけでなく高速処理α等も)を機能停止する(ステップS57)。つまり、メモリ領域が破壊されている可能性があるので、異常のあるセーフティ部αまたはセーフティ部βの全ての処理を強制終了させる。これによって、これ以降は、例えばセーフティ部αの処理は実行されることなく、セーフティ部βの処理のみが実行されることになる(但し、診断処理は例外としてもよい)。
そして、強制終了成功した場合には(ステップS58,YES)、今回実行された低速処理に係わる異常を、ステータス58に格納(変更)する(ステップS59)。すなわち、今回、低速処理αが実行されていた場合には、ステータス58に“セーフティ部α異常”を格納(上書き)する。一方、今回、低速処理βが実行されていた場合には、ステータス58に“セーフティ部β異常”を格納(上書き)する。
一方、強制終了が失敗の場合は(ステップS58,NO)、図示の例ではそのまま本処理を終了するが、この例に限らず、例えばステップS61の処理を実行するようにしてもよい。これにより、次に実行される図6の処理ではステップS32がYESとなるので、時間・順序監視処理部41からウオッチドッグリセットが出力されず、ウオッチドッグがタイムオーバして、ウオッチドッグタイマー2からCPUリセットが掛けられる。
尚、上記ステップS57の処理の前に上記ステップS37に相当する処理を行うようにしてもよい。但し、この場合、ステップS37に相当する処理の判定結果がYESとなった場合には、そのまま本処理を終了する。
ここで、既に述べたように、本手法では、αとβの両方が同一の周期区間に実行されることが無いようにするが、その理由と効果について以下説明する。
図8に、高速処理αと高速処理βの両方が同一の定周期1区間に割り当てられる場合における割込入力処理例を示す。
図8の例では、高速処理αは処理A(順序番号1)、処理B(順序番号2)、処理C(順序番号3)を実行し、高速処理βは処理A’(順序番号4)、処理B’(順序番号5)、処理C’(順序番号6)を実行するものとする。よって、設定値は、高速処理αに関しては‘3’、高速処理βに関しては‘6’となる。また、各定周期1区間毎に、まず高速処理αを実行し、続いて高速処理βを実行するものとする。
そして、図上左から1番目の定周期1区間においては、図示の通り、高速処理αは正常に実行され(順序番号が‘1’→‘2’→‘3’の順に実行されるので、テーブル43(実績値)には最終的には‘3’が格納された状態となる)、続いて高速処理βも正常に実行されている(順序番号が‘4’→‘5’→‘6’の順に実行されるので、テーブル43(実績値)には最終的には‘6’が格納された状態となる)。従って、時間・順序監視処理部41による上述した図6の処理では、高速処理α、βの両方とも正常判定となる(実績値=設定値であるので)。
しかしながら、図上左から2番目の定周期1区間においては、図示の通り、高速処理αはシーケンス実行順番が異常である(順序番号が‘1’→‘3’→‘2’の順に実行されるので、テーブル43(実績値)には最終的には‘2’が格納された状態となる)だけでなく、処理時間が通常より長くなっている。この為、高速処理βは正常に実行されるはずであっても途中で(処理A’が実行完了した時点で)当該定周期1区間が終了して時間・順序監視処理部41による上述した処理が実行される為、このときテーブル43(実績値)には‘4’が格納された状態となっている。この場合、高速処理α、βの両方とも異常判定となってしまう(実績値≠設定値であるので)。よって、CPUリセットが掛かってしまう。
上記のように、本来は高速処理βは正常と判定されるべき状況であっても、高速処理βまでもが異常と誤判定される為にCPUリセットが掛かってしまうという、「多重化された安全機能の1つが異常でもCPUリセットが掛かってしまう」という従来の問題と変わらない状況が生じることになってしまう。
また、上記の例に限らず、例えば図8の図上左から2番目の定周期1区間において高速処理αの処理順序自体は正常であった場合には、高速処理αは正常と判定されるが高速処理βは異常と誤判定されることになる。
あるいは、例えば、高速処理αが途中で暴走して永久ループ状態となった場合には、定周期1区間が終了した監視処理が実行されるタイミングになっても、高速処理αが実行中となっている。この場合、高速処理αは異常と判定されるが、何も実行されていない高速処理βまでもが異常と判定される可能性がある。
この様な問題を解決する為に、本手法では上記の通り、αとβの両方が同一の周期区間に実行されることが無いようにしている。つまり、高速処理、低速処理の両方とも、その各周期区間には、それぞれ、多重化された安全機能のうちの1つの安全機能のみ(本例ではαとβの何れか一方のみ)が、割り当てられるようにしている。
この様にすることで、多重化された安全機能の一部が異常となった場合、異常となった安全機能を判別でき(そして機能停止などする)、他の正常な安全機能は続行させることができる。つまり、一部の異常だけでCPUリセットが掛かることはない。また、上記多重化された安全機能を1台のプロセッサ上に搭載させる場合には、上記先願のメモリ保護機能を設けることが望ましい。これによって、1台のプロセッサ上で多重化された安全機能の一部が異常となった場合、異常となった安全機能が他の正常な安全機能のメモリ領域を破壊等することはなく、他の正常な安全機能は続行させることができる。
最後に、上記先願のメモリ保護機能について、図9、図10、図11を参照して簡単に説明する。
上記CPU1は、不図示のメモリ保護機能(MMU;Memory Management Unitの機能の1つ)を備え、基本的には、非セーフティ部10は、セーフティ部20、30のデータ記憶領域へのアクセス(特に書き込み)を行えないようにすると共に、セーフティ部20、30は、他のセーフティ部のデータ記憶領域へのアクセス(特に書き込み)を行えないようにする。
これによって、メモリ空間に関して、非安全処理(非セーフティ部10)による安全処理(セーフティ部20,30)への影響をなくすことができる。つまり、非セーフティ部10の処理中に何らかの異常が発生してセーフティ部20,30のデータ記憶領域へのアクセス(特に書込み)が行われることで、セーフティ部20,30の処理に異常が生じる、等といった事態を防止できる。
あるいは、セーフティ部20の処理中に何らかの異常が発生してセーフティ部30のデータ記憶領域へのアクセス(特に書込み)が行われることで、セーフティ部30の処理に異常が生じる、等といった事態を防止できる。同様に、セーフティ部30の処理中に何らかの異常が発生してセーフティ部20のデータ記憶領域へのアクセス(特に書込み)が行われることで、セーフティ部20の処理に異常が生じる、等といった事態を防止できる。
尚、セーフティ部20,30は、非セーフティ部10のデータ記憶領域への書き込みを行えるようにする。これは、例えば非セーフティ部10による制御対象の強制停止等を行うためには、当該書込みが必要となるからである。尚、勿論、セーフティ部10も非セーフティ部20,30も、どちらも、自己のデータ記憶領域へのアクセスは行えるようにする。
上記不図示のメモリ保護機能は、例えば後述する図10(a)、(b)の各テーブルを用いて、後述する図11の処理を実行することで、上記機能を実現する。詳しくは後述する。
尚、上記メモリ保護機能は、例えばMMU(Memory Management Unit)の機能の1つとしてCPU1に実装されている。尚、後述する図10(a)、(b)の各テーブルは、不図示の設定機能等によって、予め例えばユーザにより任意に設定されている。
また、先願の例の場合、上記セーフティ部α20とセーフティ部β30とは、同一の処理を実行する機能部であり、且つ、入力も同じである。つまり、セーフティ部α20の入力である上記安全入力Aと、セーフティ部β30の入力である上記安全入力Bとは、同一である。従って、正常な状態であれば、セーフティ部α20の処理結果である上記安全出力Aと、セーフティ部β30の処理結果である上記安全出力Bとは、同一となるはずである。これを利用して、セーフティ部α20とセーフティ部β30とが相互に入力や出力(処理結果)をチェックして一致/不一致を確認することで、正常な否かをチェックすることも可能である。
尚、安全機能の二重化の例の場合、セーフティ部α20とセーフティ部β30のどちらか一方に異常が生じて機能停止した後には、上記チェックは行えなくなるが、3重化以上の多重化の場合には、一部に異常が生じて機能停止した後も、残りの正常な安全機能が2つ以上ある場合には、引き続き上記チェックを行うことができる。
セーフティ部α20とセーフティ部β30が、同じ処理を、セーフティ部α20とセーフティ部β30それぞれ独立に行うことにより、並列二重化処理(Dual処理)を実現する。セーフティ部α20とセーフティ部β30の独立性を高めるため、例えばセーフティ部α20の処理が暴走することでセーフティ部β30のデータを破壊することを防止するため、先願の処理例を用いた場合には、セーフティ部α20からセーフティ部30のデータ記憶領域へのデータ書き込みを禁止すると共に、セーフティ部β30からセーフティ部α20のデータ記憶領域へのデータ書き込みを禁止することになる。
例えば、上記不図示のメモリ保護機能は、予め設定される例えば図9や図10(a)、(b)に示すようなメモリ保護情報(CPU1の不図示の内蔵メモリに予め記憶される)に基づいて、例えば後述する図11の処理を実行するものである。これによって、メモリ空間に関して、セーフティ部20とセーフティ部30は、相互に、たとえ異常になった場合でも他者に悪影響を及ぼすことはない(他者のメモリ領域に干渉できないように制御される)。また、非セーフティ部10が異常になっても、安全機能(セーフティ部20、セーフティ部30)に悪影響を及ぼすこともない(干渉しない)。
図9に、メモリ保護情報の一例を示す。尚、実際には、後述する図10(a)のアドレス変換テーブル70と図10(b)のアクセス不可テーブル80とによって、メモリ保護情報が構成されることになる。
図9には、まず、各プロセス(非セーフティ部10、セーフティ部α20、セーフティ部β30)毎に予め割り当てられている記憶領域を示してある。すなわち、セーフティ部α20のプログラム格納領域として‘1000’番地台(図示の‘0x’は省略する;他も同様)が割り当てられている。セーフティ部β30のプログラム格納領域として‘2000’番地台が割り当てられている。非セーフティ部10のプログラム格納領域として‘3000’番地台〜‘4000’番地台が割り当てられている。CPU1は、例えば‘1000’番地台の記憶領域に格納されているプログラムを読出し・実行することで、セーフティ部α20の処理機能を実現させる。
また、図9に示す例では、セーフティ部α20に係るデータ格納領域として‘5000’番地台が割り当てられている。セーフティ部β30に係るデータ格納領域として‘6000’番地台が割り当てられている。非セーフティ部10に係るデータ格納領域として‘7000’番地台が割り当てられている。
そして、上記各プロセス(非セーフティ部10、セーフティ部α20、セーフティ部β30)毎のメモリ領域に対して、図示のように各プロセス(非セーフティ部、セーフティ部α、セーフティ部β)毎にメモリ保護情報が設定されている。これは、例えば上記不図示の設定機能によって、ユーザ等が任意に設定するものである。
すなわち、まず、セーフティ部α20に関する図示のメモリ保護情報によれば、セーフティ部α20は、プログラム格納領域に関しては全領域について読込可能となっている(換言すれば書込みは不可)。つまり、セーフティ部α20は、‘1000’番地台、‘2000’番地台、‘3000’番地台、‘4000’番地台は、リードオンリーのアクセスが可能となっている。尚、これは、図示の通り、セーフティ部β30と非セーフティ部10に関しても同様である。つまり、プログラム格納領域に関しては、非セーフティ部10、セーフティ部α20、セーフティ部β30の全てが、全領域について(自己の領域だけでなく他の領域も)リードオンリーのアクセスが可能となっている。リードオンリーであるので、書込みよるデータ破壊等は生じないからである。
一方で、データ格納領域に関しては下記の通りとなっている。
すなわち、まず、セーフティ部α20は、自己のデータ格納領域である‘5000’番地台に関しては、当然、読書可(リードライト可能)となっているが、非セーフティ部10のデータ格納領域である‘7000’番地台に関しても、読書可(リードライト可能)となっている。これは、非セーフティ部10に対して安全の為の何らかの指令を出す為には、非セーフティ部10のデータ格納領域への所定の書込みを行う必要があるからである。その一方で、セーフティ部α20は、セーフティ部β30のデータ格納領域である‘6000’番地台に関しては、アクセス不可となっている。
また、セーフティ部β30も、自己のデータ格納領域である‘6000’番地と非セーフティ部10のデータ格納領域である‘7000’番地台は、読書可(リードライト可能)となっているが、セーフティ部α20のデータ格納領域である‘5000’番地台に関しては、アクセス不可となっている。
また、非セーフティ部10は、自己のデータ格納領域である‘7000’番地のみ読書可(リードライト可能)となっており、セーフティ部α、βのデータ格納領域である‘5000’番地台、‘6000’番地台に関しては、アクセス不可となっている。これによって、たとえ非セーフティ部10が処理実行中に異常となっても、セーフティ部のデータ格納領域に勝手にアクセスしてデータ書き換え等を行うような事態にはならず、安全機能に悪影響を及ぼすようなこと(干渉すること)はなくなる。
既に述べたように、図9に示すようなメモリ保護情報は、実際には例えば図10(a)、(b)に示す2つのテーブル70、80の形で設定・登録されている。
図10(a)に示すように、アドレス変換テーブル70は、論理アドレス71と物理アドレス72とが対応付けられると共に、これらアドレスに対してメモリ保護73の情報が設定されている。メモリ保護73は、図示の例では‘0’が“読込可(リードオンリー)”、‘1’が“読書可(リードライト可)”を意味する。論理アドレス71と物理アドレス72は、例えば16進数の1000番地単位で設定される。つまり、図示の例では、例えば論理アドレス71が‘2000’番地台は‘0’(リードオンリー)、‘5000’番地台は‘1’(リードライト可)となっている。
CPU1上では、任意のプロセス実行中にメモリアクセスを行う場合に生成されたアドレス(論理アドレス)は、アドレス変換テーブル70を参照することで物理アドレスに変換されて、この物理アドレスによってメモリへアクセスすることになる。更に、その際に、当該アドレスに対応するメモリ保護73を参照することで、アクセス方法がリードオンリーであるのかリードライト可であるのかを判別したうえで、判別結果に応じたメモリアクセス制御を行う。
但し、本手法では、更に図10(b)のアクセス不可テーブル80も参照することで、メモリアクセスを行うプロセスが上記アドレス(論理アドレス)に対応する記憶領域にアクセス可であるか否かを判別することでメモリ保護制御を実現する。このメモリ保護制御は、例えば上記不図示のメモリ保護機能が実行するものであり、その処理例を図11に示し、後に説明するものとし、その前に、図10(b)のアクセス不可テーブル80について説明する。
図10(b)のアクセス不可テーブル80は、論理アドレス81、セーフティ部α82、セーフティ部β83、非セーフティ部84の各データ項目より成る。論理アドレス81は、上記論理アドレス71と同様、16進数の1000番地単位で設定される。
そして、この1000番地単位のメモリ記憶領域毎に、上記各プロセスがその記憶領域にアクセス可能か否かが設定されるものである。例えば、図示のセーフティ部αデータ項目欄82には、上記1000番地単位の記憶領域毎に上記セーフティ部α20がアクセス可能か否かが設定される。尚、ここでは、‘0’がアクセス可、‘1’がアクセス不可を意味する。
これより、図示の例では、例えばセーフティ部α20は、‘6000’番地台のみがアクセス不可であり、それ以外の記憶領域(‘1000’番地台、‘2000’番地台、‘3000’番地台、‘4000’番地台、‘5000’番地台、‘7000’番地台)は、アクセス可能となっている。そして、これらアクセス可能な各記憶領域に関して、更に、上記アドレス変換テーブル70を参照することで、読込可(リードオンリー)であるか読書可(リードライト可能)であるかを判別できる。
ここで、図11を参照して、上記不図示のメモリ保護機能の処理例について説明する。
図11の処理は、任意のプロセスが任意のメモリアクセスを試みる際に起動される。
図11において、まず、メモリアクセスを行うプロセス(非セーフティ部10、セーフティ部α20、セーフティ部β30の何れか)を識別すると共に(ステップS71)アクセス先の論理アドレスを取得する(ステップS72)。そして、アクセス不可テーブル80を参照することで、上記ステップS71で識別したプロセスが、当該アクセス先の論理アドレスに対応する記憶領域にアクセス可能であるか否かを判別する(ステップS73、S74)。
もし、アクセス不可であった場合には(ステップS74、YES)、所定のCPU異常処理を実行する(ステップS77)。当該CPU異常処理については特に説明しない。
一方、もしアクセス可能であるならば(ステップS74,NO)、上記アドレス変換テーブル70から上記ステップS72で取得した倫理アドレスに対応する物理アドレス72とメモリ保護73の情報を取得して(ステップS75)、これら取得した情報をMMUにセットする(LDTLB)(ステップS76)。(LDTLB;LoaD Translation Look aside Buffer)。
尚、上記ステップS71の処理は、具体的には例えば、MMUのPTEH(ページ・テーブル・エントリの上位レジスタ)のASID(0〜7ビット)の情報を取得するものである。また、上記ステップS72の処理は、具体的には例えば、MMUのPTEH(ページ・テーブル・エントリの上位レジスタ)のVPN(10〜15ビット)の情報を取得するものである。また、上記ステップS76の処理は、具体的には例えば、MMUのPTEL(ページ・テーブル・エントリの下位レジスタ)のPPN(10〜15ビット)、PR5〜6ビット)に、上記取得した物理アドレス72とメモリ保護73のデータをセットするものである。
(ASID;アドレス空間識別子;論理ページをアクセスできるプロセスを示す)
(VPN;論理ページ番号, PPN;物理ページ番号, PR;保護キー・データ)
図9や図10(a)、(b)に示すメモリ保護情報に基づいて、図11の処理を実行することで、例えば、非セーフティ部10がセーフティ部(セーフティ部α20、セーフティ部β30)のデータ格納領域にアクセスしようとしても、ステップS74の判定がYESとなるので、リードもライトも出来ないことになる。また、非セーフティ部10は、セーフティ部(セーフティ部α20、セーフティ部β30)のプログラム格納領域については、リードは出来てもライトは出来ないことになる(ステップS76でセットされるメモリ保護73の情報は、‘0’(リードオンリー)となる)。
一方、セーフティ部(セーフティ部α20、セーフティ部β30)は、どちらも、非セーフティ部10のデータ格納領域にはアクセス可能であるが、他方のセーフティ部(セーフティ部α20から見れば、セーフティ部β30が他方のセーフティ部)のデータ格納領域にはアクセスできない(リードもライトも不可)。
この様にして、たとえ各機能部(非セーフティ部10、セーフティ部α20、セーフティ部β30)の何れかが異常となって他の機能部のデータ格納領域にアクセスしようとしても、アクセスは許可されないので、他の機能部のデータ格納領域が破壊されることはない(異常があった機能部のデータ格納領域は破壊されるかもしれない。この為、上記のように、例えば高速処理αに異常があった場合には、同じ機能部の他の処理(例えば低速処理α等)に係わるデータ格納領域までも破壊されている可能性があるので、セーフティ部α20全体を機能停止するようにしている。
また、図示していないが、更に、時間・順序監視処理部41と割込処理部42とシーケンス管理テーブル43に係わるプログラム格納領域とデータ格納領域とが割り当てられているものとする。尚、これらを監視/実行制御に係わるプログラム格納領域とデータ格納領域と呼ぶものとする。そして、メモリ保護機能によって、例えば、上記非セーフティ部10、セーフティ部α20、セーフティ部β30は、全て、監視/実行制御に係わるデータ領域にはアクセス出来ない(少なくとも書込みは出来ない)ようにする(その為の登録データについては図示・説明はしないものとする)。これによって、例えば、安全機能部(セーフティ部α20やセーフティ部β30)に異常が生じても、監視/実行制御のデータ領域に干渉して異常なデータを書き込んだりメモリ破壊が生じるような事態は、防止できる。
尚、監視/実行制御が、上記非セーフティ部10、セーフティ部α20、セーフティ部β30のデータ格納領域にもアクセス出来るようにするか否かについては、特に言及しないものとする。
以上説明したように、本例の安全処理監視システムでは、1つのCPU上で多重化されたセーフティ機能の1つにメモリ異常やプログラムミスによるメモリーリークやループなどの異常が発生した場合、当該異常が生じたセーフティ機能を機能停止して(強制終了等して)、他のセーフティ機能は運用続行できる。従来ではこの様な場合でもCPUリセットを掛けていた。また、本手法では、ウオッチドッグタイマー、CPUなど、ハードウェアは特殊なものを使用する必要がなく、低コスト化が実現できる。
例えば非特許文献1のCombination of temporal and logical monitoring of program sequencesの目的と説明を満たし、多重化した安全機能の一部(1つなど)が異常で、その他が正常であった場合は、正常な安全機能を継続して実施できる(フォールトトレランスを向上した)安全処理監視を実現し、かつ、ゲートアレイなどの特殊なものでなく、一般的なウオッチドッグ装置で、低コストで実現することができる。