(57)【要約】【課題】ダブルＲＡＭアルゴリズムによるＲＡＭ診断手法を用い、ＲＡＭ診断間隔の時間保証を実現できる。【解決手段】ダブルＲＡＭ領域２２に関してはダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を適用する。ダブルＲＡＭ領域２２には、予めＲＡＭ診断間隔が保証されると判断されたデータが格納される。但し、何らかの異常が生じる場合も有り得るので、ダブルＲＡＭ監視タスク１３により、定期的に（例えばＲＡＭ診断間隔に相当する時間毎に）ダブルＲＡＭ領域２２の全アドレスが診断完了か否かをチェックする。もし診断未実施のアドレスが１つでもあれば、アラーム報知する。【選択図】図１
2011128780.tif 000002
【特許請求の範囲】
【請求項１】
各種安全関連データがそれぞれ所定の１又は複数のアドレスに格納されるＲＡＭと、該ＲＡＭに対する診断処理を行う診断処理部とからなるＲＡＭ診断装置であって、
前記ＲＡＭにおいて、予め所定のＲＡＭ診断間隔が保証されると判断された安全関連データを格納する領域である第１領域と、予めＲＡＭ診断間隔が保証されないと判断された安全関連データを格納する領域である第２領域とを設け、更に前記第１領域内の前記各アドレス毎に対応して、そのアドレスについて前記診断処理を実施済か未実施かを示す管理情報が記憶され、
前記診断処理部は、
前記第１領域に対しては、ダブルＲＡＭアルゴリズムによって該第１領域内の任意のデータにアクセスした際に該データの格納アドレスに対する診断処理を行うと共に、該ＲＡＭ診断処理を行ったアドレスに対応する前記管理情報を実施済とする診断処理手段と、
前記ＲＡＭ診断間隔に相当する所定時間毎に、前記管理情報を参照して未実施となっている管理情報があるか否かをチェックして、未実施となっている管理情報がある場合にはアラーム出力する監視手段と、
を有することを特徴とするＲＡＭ診断装置。
【請求項２】
前記診断処理手段は、前記第２領域に対しては、前記ＲＡＭ診断間隔に相当する所定時間毎に又は該ＲＡＭ診断間隔より短い所定時間毎に、任意の診断アルゴリズムによる診断処理を実行することを特徴とする請求項１記載のＲＡＭ診断装置。
【請求項３】
前記第１領域または／及び前記第２領域は、複数のブロックに分割されていることを特徴とする請求項２記載のＲＡＭ診断装置。
【請求項４】
前記診断処理手段は、前記ＲＡＭ診断間隔より短い所定時間毎に前記第２領域の１又は複数のブロックに対して前記任意の診断アルゴリズムによる診断処理を実行し、前記ＲＡＭ診断間隔内に前記第２領域の全てのブロックについて診断処理を実行することを特徴とする請求項３記載のＲＡＭ診断装置。
【請求項５】
各種安全関連データがそれぞれ所定の１又は複数のアドレスに格納されるＲＡＭと、該ＲＡＭに対する診断処理を行う診断処理装置とからなるＲＡＭ診断装置における前記診断処理装置であって、
予めＲＡＭ診断間隔が保証されると判断された安全関連データを格納する領域である第１領域と、予めＲＡＭ診断間隔が保証されないと判断された安全関連データを格納する領域である第２領域とが設けられると共に、前記第１領域内の前記各アドレス毎に対応して、そのアドレスについて前記診断処理を実施済か未実施かを示す管理情報が記憶される前記ＲＡＭに対する診断処理を行う手段であって、前記第１領域に対しては、ダブルＲＡＭアルゴリズムによって該第１領域内の任意のデータにアクセスした際に該データの格納アドレスに対する診断処理を行うと共に、該ＲＡＭ診断処理を行ったアドレスに対応する前記管理情報を実施済とする診断処理手段と、
前記ＲＡＭ診断間隔に相当する所定時間毎に、前記管理情報を参照して未実施となっている管理情報があるか否かをチェックして、未実施となっている管理情報がある場合にはアラーム出力する監視手段と、
を有することを特徴とするＲＡＭ診断装置の診断処理装置。
【請求項６】
各種安全関連データがそれぞれ所定の１又は複数のアドレスに格納されるＲＡＭと、該ＲＡＭに対する診断処理を行う診断処理装置とからなるＲＡＭ診断装置における前記診断処理装置のコンピュータを、
予めＲＡＭ診断間隔が保証されると判断された安全関連データを格納する領域である第
１領域と、予めＲＡＭ診断間隔が保証されないと判断された安全関連データを格納する領域である第２領域とが設けられると共に、前記第１領域内の前記各アドレス毎に対応して、そのアドレスについて前記診断処理を実施済か未実施かを示す管理情報が記憶される前記ＲＡＭに対する診断処理を行う手段であって、前記第１領域に対しては、ダブルＲＡＭアルゴリズムによって該第１領域内の任意のデータにアクセスした際に該データの格納アドレスに対する診断処理を行うと共に、該ＲＡＭ診断処理を行ったアドレスに対応する前記管理情報を実施済とする診断処理手段と、
前記ＲＡＭ診断間隔に相当する所定時間毎に、前記管理情報を参照して未実施となっている管理情報があるか否かをチェックして、未実施となっている管理情報がある場合にはアラーム出力する監視手段、
として機能させる為のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＲＡＭの故障診断方式に関する。
【背景技術】
【０００２】
特許文献１には、所定の診断タイミング毎にリード・ライト方式で、予め定めた診断バイト数で、ＤＭＡの状態を判断するＲＡＭの診断装置が開示されている。
非特許文献１にはＲＡＭ診断の各種のアルゴリズムと当該アルゴリズムの診断効果が記載されている。また、非特許文献１には、ダブルＲＡＭアルゴリズムの概要等が開示されている。
【０００３】
非特許文献２は、非特許文献１に開示されているＲＡＭ診断アルゴリズムであるダブルＲＡＭアルゴリズム（Double RAM with hardware or software comparison and read/write test）についての概要が記載されている。非特許文献２によれば、ダブルＲＡＭアルゴリズムでは、データ書込みの際に、このデータを指定アドレスに書き込むと共に、このデータの反転データを上記指定アドレスを反転したアドレスに書き込む。そして、データ読み出し時に、上記反転データを再反転して上記データとの一致を確認することでＲＡＭ故障を検出する旨が書かれている。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２０００−６６９６５号公報
【非特許文献】
【０００５】
【非特許文献１】ＩＥＣ６１５０８  電気・電子・プログラマブル電子安全関連系の機能安全
【非特許文献２】Computers can now perform vital functions safely. Otto Berg von Linde, Railway Gazette International, Vol. 135, No. 11, 1979.
【発明の概要】
【発明が解決しようとする課題】
【０００６】
特許文献１には、所定の診断タイミング毎にリード・ライト方式で、予め定めた診断バイト数で、ＤＭＡの状態を判断するＲＡＭの診断装置について開示されているが、非特許文献１に記載されているダブルＲＡＭアルゴリズム（Double RAM with hardware or software comparison and read/write test)によるランダムなタイミングで行うオンライン診断については触れられていない。
【０００７】
非特許文献２にはダブルＲＡＭアルゴリズムの概要が記載され、高頻度で実施する旨が記載されているが、具体的実現方法については書かれていない。
非特許文献１には、ダブルＲＡＭアルゴリズムの概要と、ダブルＲＡＭアルゴリズムは自己診断率が高く自己診断の効果が高いこと、診断間隔と故障発生確率の関係が書かれているが、具体的なダブルＲＡＭアルゴリズムによる診断の実現方法については記載されていない。
【０００８】
ここで、特にプログラマブルコントローラ等の制御分野におけるコントローラ本体（ＣＰＵ、ＲＡＭ等を有する）においては、このＲＡＭには制御用データ等が格納されるので、ＲＡＭに異常が発生した場合、異常な制御が行われる可能性がある。もし、モータやプレス機等が異常動作した場合、その近くにいる作業員等に人的被害が発生する可能性があ
る。この為、コントローラ本体は、故障発生確率を減少させる為、自己診断（ＲＡＭ診断）をある程度頻繁に行うことが望ましい。
【０００９】
上記の通り、非特許文献１には、ダブルＲＡＭアルゴリズムは、自己診断率が高く自己診断の効果が高いことや、診断間隔と故障発生確率の関係が記載されている。よって、上記プログラマブルコントローラ等の制御分野におけるコントローラ本体におけるＲＡＭの診断に、この様な自己診断率が高く自己診断の効果が高い診断手法であるダブルＲＡＭアルゴリズムを用いることは、望ましいものである。
【００１０】
ここで、ダブルＲＡＭアルゴリズムを用いるＲＡＭ診断に係り、故障発生確率を低減させることに関して、以下に説明する問題が生じる。
まず、一般的に、自己診断率はλＤＤ/λＤと定義されている。
（ここで  λＤ：危険側故障確率、λＤＤ：自己診断で検出可能な故障確率）
【００１１】
また、診断間隔と故障発生確率の関係として、診断間隔が短いと故障発生確率が減少することが知られている。これは例えば冗長化システムでは、危険側共通原因故障ファクタβＤのスコアＳＤ＝Ｘ（Ｚ＋１）＋Ｙ  のＺが増加しβＤが減少する。βＤが減少するとＰＦＤ及びＰＦＨが減少する（尚、Ｘ；診断に関係する危険側共通原因故障ファクタのスコア値、Ｙ；診断に関係しない危険側共通原因故障ファクタのスコア値、ＰＦＤ；デマンド時の故障平均確率、ＰＦＨ；１時間あたりの危険側故障確率、Ｚ；診断試験の間隔と自己診断率に基づいて決まる値である）。
【００１２】
また、冗長化のないシステムではＰＳＴ（Process Safety Time；危険事象が発生してから故障に至るまでの時間）より診断間隔Ｔを短くする必要がある。
従って、ダブルＲＡＭアルゴリズム以外のＲＡＭ診断アルゴリズムにおいては、例えば、任意の適切な診断間隔Ｔ（故障発生確率が十分に低減されるように設計者等が考えて設定する）で定期的にＲＡＭの記憶領域全体の診断処理を行うことで、ＲＡＭ診断間隔の時間保証を実現でき、故障発生確率が減少させることが考えられる。
【００１３】
しかしながら、ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理では、定期的にＲＡＭの記憶領域全体の診断処理を行うものではなく、上記の通りＲＡＭからのデータ読み出し処理の際に診断を行うので（ランダムに実行される診断処理であるので）、ＲＡＭの記憶領域全体に対する診断間隔というものはなく、各データ格納領域毎の診断間隔があることになる。そして、各データ格納領域毎の診断間隔は、その領域の格納データを読出す処理の処理実行間隔に依存することになり、またこの間隔は一定になるとは限らない。つまり、ＲＡＭ診断間隔の時間保証が実現されないことになる。
【００１４】
例えば故障処理等の処理がランダムで頻度が少ない処理が扱うデータのＲＡＭ領域についてはＲＡＭ診断の処理間隔が長く、また、ＲＡＭ診断間隔の時間保証がされていない。
上記任意の適切な診断間隔Ｔに相当する所定時間内に（例えば診断間隔が１時間毎であった場合には１時間以内に）、上記各データ格納領域全てについて最低１回、その領域の格納データを読出す処理が実行される（これに伴い、その領域の診断処理が実行される）のであれば、結果的に、ＲＡＭ診断間隔の時間保証が実現できる（上記所定期間内にＲＡＭ内の全領域の診断が行われている）ことになる。つまり、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現できることになる。
【００１５】
しかしながら、例えば故障発生時の対応処理等のような、ランダムに実行され且つ実行頻度が少ない処理が扱うデータの格納領域については、上記所定期間内にＲＡＭ診断処理が実行される可能性は低く、ＲＡＭ診断間隔の時間保証がされていないという問題がある。これは、換言するならば、この場合には、例えばＲＡＭの記憶領域全てについて最低１
回はＲＡＭ診断処理が実行された状態になる毎にリセットし、このリセット時から再びＲＡＭの記憶領域全てについて最低１回はＲＡＭ診断処理が実行された状態になるまでの時間を、そのＲＡＭ全体に関するＲＡＭ診断間隔と見做すことができる。そして、このＲＡＭ診断間隔は一定ではなく不定となり、特に上記「ランダムに実行され且つ実行頻度が少ない処理」に影響されるものとなる。そして、上記の通り、ＲＡＭ全体に関するＲＡＭ診断間隔は、場合によっては非常に長いものとなり、ＲＡＭ診断間隔を短くすることで故障発生確率が減少させたくても、出来ないことになる。
【００１６】
この問題を解決する為に、例えば上記他のアルゴリズムと同様に定期的に（例えば上記所定時間経過毎に）ＲＡＭの記憶領域全体の診断処理を行うことも考えられる。しかしながら、この様な全領域診断処理は、処理負荷や処理時間が大きくなり、ＣＰＵの資源を大きく消費するという問題があり、高価な処理能力の高いＣＰＵを使用する、ＣＰＵを増設するなどの対応が必要であった。
【００１７】
また、診断対象のＲＡＭが、何らかの制御システムのコントローラ内のメモリであった場合、ＲＡＭに格納されるデータは大別して安全関連データと非安全関連データとがあることになる。この場合、特に故障発生確率を減少させたいのは、安全関連データの格納領域であり、非安全関連データは必ずしもＲＡＭ診断処理対象とはならない。よって、上記の説明では、ＲＡＭの記憶領域全体を診断処理対象として説明したが、安全関連データに係る格納領域（安全関連データの上記反転データの格納領域も含む）のみを診断処理対象としてもよく、この場合には当該診断処理対象の記憶領域についてのみ、上述したＲＡＭ診断間隔の時間保証が実現できればよい。
【００１８】
上記特許文献１は、ダブルＲＡＭアルゴリズムによるＲＡＭ診断手法ではなく、よって上述したダブルＲＡＭアルゴリズムによるＲＡＭ診断手法を用いる場合のＲＡＭ診断間隔の時間保証の問題は、想到されるはずもなく、その解決手段は何等示されていない。
【００１９】
また、非特許文献１、非特許文献２には、ダブルＲＡＭアルゴリズムによるＲＡＭ診断手法についての開示はあるが、上述したＲＡＭ診断間隔の時間保証の問題に関しては何等考えられておらず、よって当然、その解決手段は何等示されていない。
【００２０】
本発明の課題は、自己診断率の高いダブルＲＡＭアルゴリズムを用いる場合でも、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現でき、更にもしＲＡＭ診断間隔の時間保証を実現できなかった場合でもこれを検出してアラーム報知することができ、また処理負荷を軽減でき、更に定期的な診断処理を併用しつつ当該処理の処理時間・負荷を軽減できるＲＡＭ診断装置等を提供することである。
【課題を解決するための手段】
【００２１】
本発明のＲＡＭ診断装置は、各種安全関連データがそれぞれ所定の１又は複数のアドレスに格納されるＲＡＭと、該ＲＡＭに対する診断処理を行う診断処理部とからなるＲＡＭ診断装置であって、前記ＲＡＭにおいて、予め所定のＲＡＭ診断間隔が保証されると判断された安全関連データを格納する領域である第１領域と、予めＲＡＭ診断間隔が保証されないと判断された安全関連データを格納する領域である第２領域とを設け、更に前記第１領域内の前記各アドレス毎に対応して、そのアドレスについて前記診断処理を実施済か未実施かを示す管理情報が記憶され、前記診断処理部は、前記第１領域に対しては、ダブルＲＡＭアルゴリズムによって該第１領域内の任意のデータにアクセスした際に該データの格納アドレスに対する診断処理を行うと共に、該ＲＡＭ診断処理を行ったアドレスに対応する前記管理情報を実施済とする診断処理手段と、前記ＲＡＭ診断間隔に相当する所定時間毎に、前記管理情報を参照して未実施となっている管理情報があるか否かをチェックして、未実施となっている管理情報がある場合にはアラーム出力する監視手段とを有する。
【００２２】
また、上記ＲＡＭ診断装置において例えば、前記診断処理手段は、前記第２領域に対しては、前記ＲＡＭ診断間隔に相当する所定時間毎に又は該ＲＡＭ診断間隔より短い所定時間毎に、任意の診断アルゴリズムによる診断処理を実行する。
【００２３】
上記ＲＡＭ診断装置では、第１領域に関しては、ダブルＲＡＭアルゴリズムによる任意のデータアクセスに伴う診断処理、つまりランダムに実行される診断処理であっても、ＲＡＭ診断間隔の時限保証を実現できる。但し、何らかの異常等によってＲＡＭ診断間隔の時限保証が実現されない事態となる可能性があることから、監視手段によって監視を行って、異常があればアラーム出力することで対応可能となる。
【００２４】
また、第２領域に関しては、例えばＲＡＭ診断間隔に相当する所定時間毎に定期的な診断処理を行う。従来の定期的な診断処理では、ＲＡＭの全領域に対する診断処理であった為、処理負荷や処理時間が大きくなり、ＣＰＵの資源を大きく消費するという問題があったが、本手法では第１領域は除外して第２領域のみを処理対象とできるので、この様な問題を解消できる。
【００２５】
また、前記第１領域または／及び前記第２領域は、複数のブロックに分割されているようにしてもよい。
そして、更に、前記診断処理手段は、前記ＲＡＭ診断間隔より短い所定時間毎に前記第２領域の１又は複数のブロックに対して前記任意の診断アルゴリズムによる診断処理を実行し、前記ＲＡＭ診断間隔内に前記第２領域の全てのブロックについて診断処理を実行するようにしてもよい。
【００２６】
上記第２領域に関する定期的な診断処理を、第２領域全体に対して一度に行うのではなく各ブロック毎に行うことで、１回の処理当たりの処理時間を短縮することができ、診断処理によって本来のアプリケーション処理等が実行できなくなる時間を短縮することができる。
【発明の効果】
【００２７】
本発明のＲＡＭ診断装置等によれば、自己診断率の高いダブルＲＡＭアルゴリズムを用いる場合でも、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現でき、更にもしＲＡＭ診断間隔の時間保証を実現できなかった場合でもこれを検出してアラーム報知することができる。また処理負荷を軽減できる。更に定期的な診断処理を併用しつつ当該処理の処理時間・負荷を軽減できる。
【図面の簡単な説明】
【００２８】
【図１】本例のＲＡＭ診断装置の構成ブロック図である。
【図２】（ａ）〜（ｃ）は、ダブルＲＡＭ管理情報記憶部のデータ構成例である。
【図３】（ａ）、（ｂ）は、ダブルＲＡＭ管理領域に格納されるデータ構成例である。
【図４】ブロックに関する一例を示す図である。
【図５】ダブルＲＡＭ書込関数による処理のフローチャート図である。
【図６】図５のステップＳ２４の処理の詳細フローチャート図である。
【図７】ＲＡＭ診断完了ビット領域の各ビット情報とダブルＲＡＭ領域の各アドレスとの対応関係の一例を示す図である。
【図８】ダブルＲＡＭ読込関数による処理のフローチャート図である。
【図９】図８のステップＳ５４の処理の詳細フローチャート図である。
【図１０】ダブルＲＡＭ監視タスクによる処理のフローチャート図である。
【図１１】ＲＡＭ診断タスクによる処理のフローチャート図である。
【図１２】図１１のステップＳ９３の処理の詳細フローチャート図（その１）である。
【図１３】図１２のステップＳ１０５の処理について説明する為の図である。
【図１４】図１１のステップＳ９３の処理の詳細フローチャート図（その２）である。
【図１５】安全関連アプリケーション部の処理フローチャート図である。
【発明を実施するための形態】
【００２９】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例のＲＡＭ診断装置の構成ブロック図である。
尚、このＲＡＭ診断装置は、例えば一例としては、プログラマブルコントローラシステム（制御システム）におけるコントローラ本体であるが、この例に限らない。この例で言うならば、例えば、コントローラ本体（ＣＰＵ、ＲＡＭ等を有する）は、自己診断処理として自己のＲＡＭの診断処理を行うものであり、特にこの様なＲＡＭ診断処理に係る構成を図１に示している。
【００３０】
図１に示すＲＡＭ診断装置は、ＣＰＵ１、ＲＯＭ１０、ＲＡＭ２０から成る。ＣＰＵ１は、アドレス線、データ線等を介して、ＲＯＭ１０、ＲＡＭ２０にアクセスして、任意のデータのリード／ライト処理等を行う。あるいは、ＣＰＵ１は、ＲＯＭから各種プログラムを読出し・実行する。
【００３１】
ＲＡＭ２０は、本例のＲＡＭ診断装置による診断対象のメモリである。ＲＡＭ２０に対する診断処理は、ＣＰＵ１が、ＲＯＭ１０に予め記憶されている各種アプリケーションプログラムやタスク、関数等を実行することにより実現される。
【００３２】
まず、ＲＯＭ１０について説明する。
ＲＯＭ１０には、ダブルＲＡＭ書込関数１１、ダブルＲＡＭ読込関数１２、ダブルＲＡＭ監視タスク１３、ＲＡＭ診断タスク１４、安全関連アプリケーション１５等が予め格納されている。また、ＲＯＭ１０にはダブルＲＡＭ管理情報１６も予め格納されている。尚、ＲＯＭ１０の自己診断は、公知技術である、格納されているデータのＣＲＣ（Cyclic Redundancy Check:巡回冗長度検査）等により別途行うが、ここでは特に関係ないものであり、また公知技術であるので、特に説明しない。
【００３３】
上記各関数（ダブルＲＡＭ書込関数１１とダブルＲＡＭ読込関数１２）は、安全関連アプリケーション１５のプログラム内にインライン展開されており、安全関連アプリケーション１５の実行中に呼び出されてそれぞれの処理を実行する。
【００３４】
ダブルＲＡＭ書込関数１１は、ＲＡＭ２０のダブルＲＡＭ領域２２内の任意の記憶領域
（アドレス）に任意のデータを書込む処理を行うための関数である。また、この任意のデータを反転させたデータ（反転データ）を反転ダブルＲＡＭ領域２５に書込む処理を行う。上述したように、ダブルＲＡＭアルゴリズムによる診断処理では、反転データを用いる必要がある。例えば一例としては、上記のようにデータ書込みの際にその反転データを生成・格納しておき、ダブルＲＡＭ読込関数１２によるデータ読込みの際に、反転データを用いて診断を行う。
【００３５】
但し、この例に限らず、データ書込みの際にもダブルＲＡＭアルゴリズムによる診断処理を行うようにしてもよい。これより、本説明においては、ダブルＲＡＭ書込関数１１は、上述した処理に加えて、更に、上述したダブルＲＡＭアルゴリズムによるＲＡＭ２０の診断処理（書込データの記憶領域に関する診断）を行うものとして説明するが、この例に限るものではない。但し、データ書込みの際にも診断処理を行う理由は、メモリの書き込み回路のチェックを行うことで、より厳密にＲＡＭ診断を行う為である。
【００３６】
尚、ダブルＲＡＭ書込関数１１は、ＲＡＭ２０の診断処理を行う場合には、更に、後述するＲＡＭ診断完了ビット領域６２の該当ビット情報の更新処理を行う。後述するように、ダブルＲＡＭ監視タスク１３の処理の際には、ＲＡＭ診断完了ビット領域６２を参照する。
【００３７】
ダブルＲＡＭ書込関数１１による処理フローチャートは、図５、図６に示し、後に説明する。
ダブルＲＡＭ読込関数１２は、ＲＡＭ２０のダブルＲＡＭ領域２２内の任意の記憶領域（アドレス）から任意のデータを読込むと共に、このデータの反転データを反転ダブルＲＡＭ領域２５から読込んで、ＲＡＭ２０の診断（読込データの記憶領域に関する診断）を行う（すなわち上述したダブルＲＡＭアルゴリズムによる診断処理を行う）ための関数である。更に、後述するＲＡＭ診断完了ビット領域６２の該当ビット情報の更新処理を行う。
【００３８】
ダブルＲＡＭ読込関数１２による処理フローチャートは、図５、図６に示し、後に説明する。
上記のように、ダブルＲＡＭ書込関数１１は、上記ダブルＲＡＭ領域２２へのデータ書き込みの際に、反転ダブルＲＡＭ領域２５に、このデータを反転させたデータ（反転データというものとする）を書き込む。これは、例えば、上記ダブルＲＡＭ領域２２への書込データの格納アドレスを反転させたアドレスに上記反転データ書き込むものである（例；ダブルＲＡＭ領域２２における5050番地に16進数‘0101’のデータを格納する場合、その反転データ（16進数‘FEFE’）はAFAF番地に格納する）。尚、この例の場合、反転ダブルＲＡＭ領域２５のアドレスは、ダブルＲＡＭ領域２２のアドレスによって自動的に決まるものとなり、自由に決められるものではないことになる。
【００３９】
また、上記のように、ダブルＲＡＭ書込関数１２は、上記ダブルＲＡＭ領域２２から任意のデータを読み込む際に、この読込データに対応する反転データを反転ダブルＲＡＭ領域２５から取得する（例えば、5050番地からデータを読み出す際には、AFAF番地から反転データも取得する）。そして、この反転データを反転させたものが上記読込データと一致するか否かによりこのアドレス領域（5050番地等）の診断を行う。
【００４０】
尚、上記のようにデータ読込み時だけでなくデータ書込みの際にもＲＡＭ診断処理が実行される例の場合には、ダブルＲＡＭ領域２２に格納すべきデータは、上述した任意の適切な診断間隔Ｔ（故障発生確率が十分に低減されるように設計者等が考えて予め設定する）内に、データ読込処理、データ書込処理の少なくともどちらか一方が確実に実行される（勿論、両方実行されてもよい）と判断されるデータとなる。一方、データ書込みの際に
は反転データの生成・格納は行うが診断は行わない例、すなわちデータ読込処理の際だけ診断を行う例の場合、ダブルＲＡＭ領域２２に格納すべきデータは、上述した任意の適切な診断間隔内に、データ読込処理が確実に実行されると判断されるデータとなる。
【００４１】
上記の通り、本説明においては一例として、データ読込みの際だけでなくデータ書込み際にも、ダブルＲＡＭアルゴリズムによる診断処理も行う。よって、後述するフローチャート図もこの例に応じた内容となっている。
【００４２】
上記ダブルＲＡＭ書込関数１１、ダブルＲＡＭ書込関数１２の機能・処理については、詳しくは後に図５〜図９のフローチャート図を参照して説明する。
ダブルＲＡＭ監視タスク１３は、ダブルＲＡＭ領域２２内の全てのデータ格納領域について、上記予め設定された診断間隔Ｔ内に診断が実施されているかを監視するタスクである。ダブルＲＡＭ監視タスク１３は、例えば上記診断間隔Ｔに相当する所定時間毎に起動して処理実行する。
【００４３】
後にダブルＲＡＭ領域２２に関して説明する通り、ダブルＲＡＭ領域２２に格納するデータは全て、予め設定された診断間隔Ｔ内に上記ダブルＲＡＭ書込関数１１またはダブルＲＡＭ書込関数１２による診断が実施されているはずであるが、何らかの異常等によって診断実施されていない可能性もあるので、ダブルＲＡＭ監視タスク１３によって監視を行うものである。
【００４４】
ダブルＲＡＭ監視タスク１３の処理フローチャート図は、図１０に示し、後に説明する。
ＲＡＭ診断タスク１４は、ダブルＲＡＭ混在領域２３に対するＲＡＭ診断を行うタスクである。ダブルＲＡＭ混在領域２３には、リード／ライトによってはＲＡＭ診断間隔が保証されないデータ等が格納される。つまり、ダブルＲＡＭ混在領域２３には、上記診断間隔Ｔ内に上記ダブルＲＡＭ書込関数１１またはダブルＲＡＭ書込関数１２による診断処理が必ず実行されるとは限らない（つまり、リード／ライトが行われるとは限らない）データ等が格納される。
【００４５】
この為、ダブルＲＡＭ混在領域２３に関しては、ＲＡＭ診断タスク１４が、例えば上記診断間隔Ｔに相当する所定時間毎に起動して診断処理を行う。これによって、ダブルＲＡＭ混在領域２３に関しても、予め設定された診断間隔Ｔ内に診断が実施されることになる。また、上記ダブルＲＡＭ領域２２のようにリード／ライトの際に診断処理を行うと、ＲＡＭ診断タスク１４の診断処理によって重複して診断が行われることになるので、ダブルＲＡＭ混在領域２３に関しては、リード／ライトの際の診断処理は行われない。
【００４６】
ＲＡＭ診断タスク１４による処理の一例を、図１１、図１２等に示し、後に説明する。
尚、ＲＡＭ診断タスク１４によるＲＡＭの診断方法は、例えばダブルＲＡＭアルゴリズム以外のアルゴリズムを用いる。図１２では一例としてギャルパットを用いる例を示している。勿論、図１２に示すアルゴリズムに限るものではなく、ダブルＲＡＭアルゴリズム以外のアルゴリズムとして、例えばIEC61508-2 Table A.6に示されている手法などを使用することができる。但し、図１４に示すように、ダブルＲＡＭアルゴリズムを用いてもよい。但し、定期的な診断処理でダブルＲＡＭアルゴリズムを利用する場合は、非特許文献２で説明されているように、他のアルゴリズム（ギャルパット等）に比べて診断間隔を短くし、高頻度の診断間隔とする必要がある。
【００４７】
安全関連アプリケーション１５は、例えば上記安全関連データに係る何らかの処理を行うアプリケーションである。安全関連アプリケーション１５の処理フローチャートを図１３に示し後に説明する。
【００４８】
ダブルＲＡＭ管理情報１６は、ＲＡＭ２０に格納されるデータ（ダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３等に格納されるデータ等）を管理するための各種管理データである。ダブルＲＡＭ管理情報１６の具体的なデータ構成例は、図２に示し、後に説明する。
【００４９】
ここで、ＣＰＵ１は、上記各アプリケーション／関数／タスクを実行することで所定の処理機能を実現することになり、これよりＣＰＵ１は図示しないが各種処理機能部を有するものと見做してよい。すなわち、図１には示していないが、ＣＰＵ１は、ダブルＲＡＭ書込部１１’、ダブルＲＡＭ読込部１２’、ダブルＲＡＭ監視部１３’、ＲＡＭ診断部１４’、安全関連アプリケーション部１５’の各種処理機能部を有するものである。
【００５０】
ＣＰＵ１は、ダブルＲＡＭ書込関数１１を実行することによりダブルＲＡＭ書込部１１’の処理機能を実現する。これは、例えば図５、図６に示す処理を実行するものである。また、ＣＰＵ１は、ダブルＲＡＭ読込関数１２を実行することによりダブルＲＡＭ読込部１２’の処理機能を実現する。これは、例えば図８、図９に示す処理を実行するものである。
【００５１】
同様にして、ＣＰＵ１は、ダブルＲＡＭ監視タスク１３を実行することにより、ダブルＲＡＭ監視部１３’の処理機能を実現する。これは、例えば図１０に示す処理を実行するものである。ＣＰＵ１は、ＲＡＭ診断タスク１４を実行することにより、ＲＡＭ診断部１４’の処理機能を実現する。これは、例えば図１１、図１２（あるいは図１４）に示す処理を実行するものである。ＣＰＵ１は、安全関連アプリケーション１５を実行することにより、安全関連アプリケーション部１５’の処理機能を実現する。これは、例えば図１５に示す処理を実行するものである。
【００５２】
次に、以下、ＲＡＭ２０について説明する。
ＲＡＭ２０は、各種記憶領域を有する。すなわち、図示のダブルＲＡＭ管理領域２１、ダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３、バッファ領域２４、反転ダブルＲＡＭ領域２５を有する。
【００５３】
ダブルＲＡＭ管理領域２１は、ＲＡＭ診断監視を管理するための情報を格納する領域である。詳しくは後に図３を参照して説明するが、ダブルＲＡＭ管理領域２１には、ＲＡＭ診断カウンタ、ＲＡＭ診断完了ビット等のＲＡＭ管理情報が格納される。尚、これらカウンタ、ビットの値は、初期値として‘０’が設定される。
【００５４】
ダブルＲＡＭ領域２２は、ダブルＲＡＭアルゴリズムによる診断処理（データリード／ライトに伴う診断処理）によって上記診断間隔Ｔを満たすと判断された可変データを格納する領域である。診断間隔Ｔは、予め設計により要求された（上記のように故障発生確率が十分に低減されるように設計者等が考えた／定義した）診断間隔である。基本的には、そのデータに対する書込み又は読込み処理（換言すれば、ダブルＲＡＭアルゴリズムによる診断処理）が、予め定義された所定時間内（診断間隔Ｔ内）に確実に発生すると考えられるデータは、ダブルＲＡＭ領域２２に格納するように設定する。定義した所定時間内に確実に診断処理があるか否かは、例えば処理の静的解析等により開発時に開発者等が決定する。
【００５５】
このように、基本的には、ダブルＲＡＭ領域２２に格納されるデータ（当該データの記憶領域）に関しては、診断間隔Ｔを満たすようにしてダブルＲＡＭアルゴリズムによる診断処理が実行されるはずである。しかしながら、現実には、必ずその様になるという保証はなく、何らかの異常等によって診断間隔Ｔが満たされない事態が生じる可能性がある。
例えば、設計ミスや実装ミス、処理プログラムのエラー、ハードウェアの故障に起因する処理エラー等が発生する可能性がある。
【００５６】
特にプログラマブルコントローラ等の制御分野におけるコントローラ本体においては、その内蔵ＲＡＭには制御用データ等が格納されるので、ＲＡＭに異常が発生した場合、異常な制御が行われる可能性がある。もし、モータやプレス機等が異常動作した場合、その近くにいる作業員等に人的被害が発生する可能性がある。この為、特に故障発生確率を減少させることが必要となる。
【００５７】
この様な問題に対応する為に、本手法では、上記ダブルＲＡＭ監視タスク１３を設けている。上記ダブルＲＡＭ監視部１３’の処理（図１０の処理）は、例えば診断間隔Ｔと同じ所定時間毎に実行されるものであり、後述する図３（ｂ）に示すＲＡＭ診断完了ビット領域６２を参照することで、ダブルＲＡＭ領域２２に格納される全てのデータの記憶領域）について、上記所定時間内に上記ダブルＲＡＭ書込部１１’または上記ダブルＲＡＭ読込部１２’による診断処理が実行済みであるか否かをチェックする。
【００５８】
上記の通り、何等かの異常が発生していないならば、全てのデータ記憶領域について診断処理が実行済みであるはずである。よって、もし１つでも診断処理が未実行である記憶領域があるならば、何等かの異常があるものとしてアラーム出力する。このアラームによって、作業者／開発者等が、何らかの対応を行うことができる。例えば、アラームが出力された場合は、ダブルＲＡＭ領域２２の見直しを行い、定数を変更すること等の対応が可能となる。これによって、ダブルＲＡＭ領域２２に関して診断間隔の時限保証をすることができる。
【００５９】
また、診断間隔Ｔを満たすものと判断されたデータを、所定の記憶領域（ダブルＲＡＭ領域２２）にまとめて格納しておくことで、上記ダブルＲＡＭ監視部１３’のチェック処理が効率的に行えることになり、処理時間が短縮できる。
【００６０】
一方、ダブルＲＡＭ混在領域２３には、上記ダブルＲＡＭ領域２２に格納されるデータ以外のデータが格納される。すなわち、上述した診断間隔Ｔを満たすものと判断されたデータ以外のデータが格納される。つまり、ダブルＲＡＭ混在領域２３に格納されるデータに関しては、上記ダブルＲＡＭ書込関数１１やダブルＲＡＭ読込関数１２の処理による診断が、上記診断間隔Ｔ内に実行されている保証はないので、定期的な診断処理を実行する。すなわち、上記ＲＡＭ診断タスク１４による診断処理を、例えば診断間隔Ｔと同じ所定時間毎に実行することで、ダブルＲＡＭ混在領域２３に関しても診断間隔の時限保証をすることができる。
【００６１】
尚、ダブルＲＡＭ混在領域２３に格納されるデータの一例は、下記の通りであるが、この例に限るものではない。
・外部から設定するパラメータ設定値
・プログラムで使用する定数
・故障時にしか使用しない可変データ等、そのデータ更新が診断時限（診断間隔Ｔ）を超過するようなデータ
・外部機器のＤＭＡ（Direct Memory Access）によるデータ
上記の通り、本例では例えば一例として、ＲＡＭ２０内には上記安全関連データが格納されるものとし、各安全関連データは、ダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３の何れかに格納されるものであり、その分類方法は既に述べた通りである。
【００６２】
そして、ダブルＲＡＭ領域２２に関しては、基本的にはダブルＲＡＭアルゴリズムの診断処理によって診断間隔の時限保証をすることができ、万が一異常等によって診断間隔Ｔ
内に診断が実行されなかった場合でも、監視処理を行っていることから、異常を検出して速やかに対応を図ることができ、診断間隔の時限保証をすることができる。自己診断率の高いダブルＲＡＭアルゴリズムを使用し且つ診断間隔を保証することによって、故障確率を減少させることができる。
【００６３】
また、ダブルＲＡＭ混在領域２３に関しては定期的な診断処理によって診断間隔の時限保証をすることができる。従来の課題で述べた通り、ＲＡＭの全領域に対して定期的な診断処理を行うと、処理負荷や処理時間が大きくなり、ＣＰＵの資源を大きく消費するという問題がある。これに対して、本手法では、全領域ではなく、ダブルＲＡＭ混在領域２３のみに対して定期的な診断処理を行うので、従来に比べて、処理負荷や処理時間が大きくなることはなく、ＣＰＵの資源を大きく消費することもない。
【００６４】
また、上記ＲＡＭ診断タスク１４による診断処理は、例えば後述するようにＲＡＭ２０の記憶領域を複数ブロックに分割する構成例の場合には、診断間隔Ｔより短い所定時間毎に実行することになる。例えば後述する診断カウント＝１、２、・・・Ｎの場合には、ＲＡＭ診断タスク１４による診断処理周期をｔとすると、「“ｔ×Ｎ”≦診断間隔Ｔ」となるようにｔを設定することになる。この様にすることで、定期的な診断処理に係る処理負荷や処理時間を更に少なくすることができる。詳しくは後述する。
【００６５】
また、上記の通り、ダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３に格納されるデータは、何れも上記従来の課題で述べた安全関連データであるが、上記非安全関連データもＲＡＭ２０に格納されてもよい。但し、上述した通り、診断間隔の時限保証が必要なデータは安全関連データであるので、非安全関連データに関しては、ここでは特に示さないし、説明もしない。
【００６６】
また、上記のことから、安全関連データに係る何らかの所定の処理を実行するアプリケーションである安全関連アプリケーション１５は、その処理実行中に、ダブルＲＡＭ領域２２またはダブルＲＡＭ混在領域２３の安全関連データにアクセスすることになる。
【００６７】
反転ダブルＲＡＭ領域２５は、既に説明したように、ダブルＲＡＭ領域２２の格納データの反転データを格納する領域である。これは、既に述べた通り、ダブルＲＡＭ領域２２のアドレスを反転したアドレスとなっている（例；5050番地の反転アドレスはAFAF番地）。
【００６８】
バッファ領域２４は、ＲＡＭ診断タスク１４による処理においてデータ退避に使用する領域である。詳しくは後述する。尚、当該領域２４のＲＡＭ自己診断は、公知である格納されているデータのＣＲＣ（Cyclic Redundancy Check:巡回冗長度検査）などにより別途行う。なお、ＲＡＭ診断タスク１４による診断処理がダブルＲＡＭアルゴリズムを利用した診断処理である場合は、レジスタにデータを退避するため当該領域２４は不要である。
【００６９】
以下、図２以降を参照して更に詳細に説明する。
図２（ａ）〜（ｃ）は、上記ＲＯＭ１０に予め格納されているダブルＲＡＭ管理情報１６のデータ構成例である。図示の例では、ダブルＲＡＭ管理情報１６は、図２（ａ）に示すデータ番号管理テーブル３０、図２（ｂ）に示すＲＡＭ診断制御テーブル４０、図２（ｃ）に示すダブルＲＡＭ領域アドレスデータテーブル５０等の各種テーブルである。
【００７０】
尚、図２（ｂ）に示すＲＡＭ診断制御テーブル４０は、後述するようにＲＡＭ２０の記憶領域が複数ブロックに分割されている構成例に対応するものであり、よって複数ブロックに分割されていない場合には必要ないものである。この場合、ダブルＲＡＭ領域アドレスデータテーブル５０に関しても、図示のようなブロック番号毎とする必要はないことに
なる。
【００７１】
図２（ａ）に示すデータ番号管理テーブル３０は、ＲＡＭに格納されている各安全関連データに対して一意に付与した通し番号であるデータ番号３１に対応付けて、当該安全関連データのデータ量であるデータバイト数３２を格納する。このデータは、アクセスするデータのアドレス範囲のチェックに使用する（図５のステップＳ１２の処理等で使用する）。
【００７２】
図２（ｂ）に示すＲＡＭ診断制御テーブル４０は、上記の通り、ＲＡＭ２０の記憶領域を複数のブロックに分割した構成である場合に設けられ、ダブルＲＡＭ混在領域２３に対する診断処理の際に、処理対象のブロックを決定する為に用いられる。
【００７３】
ＲＡＭ診断制御テーブル４０は、図示の例では、診断カウント４１と「診断ダブルＲＡＭ混在領域ブロック番号」４２とから成る。つまり、診断を時分割で行うことを可能とするため、各診断カウント値に対応付けて、その診断カウント値の時に診断を行うべきダブルＲＡＭ混在領域２３のブロック番号を格納する。
【００７４】
診断カウンタ４１には、例えば１，２、３、・・・というように連続する整数が格納される。ここで、後述する図３（ａ）に示すＲＡＭ診断カウンタが設けられており、ＲＡＭ診断タスク１４による処理では後述する図１１に示すように処理実行毎に当該ＲＡＭ診断カウンタのカウント値を更新（＋１インクリメント等）する。ＲＡＭ診断カウンタは、ここでは１〜Ｎまでカウントするものであり、Ｎの次は１に戻る。つまり、ＲＡＭ診断カウンタによるカウント値は、1→2→3→・・Ｎ→1→２・・・となる。この例の場合、診断カウント４１には、１，２、３、・・・Ｎが格納される。
【００７５】
そして、詳しくは後述するように、ＲＡＭ診断タスク１４による処理において、そのときの上記ＲＡＭ診断カウンタのカウント値を得て、このカウント値に対応する「診断ダブルＲＡＭ混在領域ブロック番号」４２を取得することで、処理対象のブロックを決定する。図示の例では例えば診断カウント値＝‘１’であったならば、ブロック番号＝‘２’のブロックが処理対象となる。
【００７６】
尚、「診断ダブルＲＡＭ混在領域ブロック番号」４２には、ダブルＲＡＭ混在領域２３が格納されているブロックのブロック番号のみが格納される。図示の例は、後述する図４に示す例に対応するものであり、よって図示の通りブロック番号１と４は格納されていない。
【００７７】
図２（ｃ）に、ダブルＲＡＭ領域アドレスデータテーブル５０のデータ構成例を示す。
ダブルＲＡＭ領域アドレスデータテーブル５０には、各ブロック番号５０−１に対応付けて、そのブロックに対応した領域に関係するアドレス５０−２（各種領域それぞれの先頭アドレスと最終アドレス）が格納されている。
【００７８】
図示の例では、アドレス５０−２には、ダブルＲＡＭ領域先頭アドレス５１、ダブルＲＡＭ領域最終アドレス５２、反転ダブルＲＡＭ領域先頭アドレス５３、反転ダブルＲＡＭ領域最終アドレス５４、診断完了ビット領域先頭アドレス５５、診断完了ビット領域最終アドレス５６、ダブルＲＡＭ混在領域先頭アドレス５７、ダブルＲＡＭ混在領域最終アドレス５８が格納される。
【００７９】
但し、これらのアドレス５１〜５８の全てが格納されるわけではない。
例えば、ダブルＲＡＭ混在領域２３が格納される任意のブロックに関しては、このブロックのブロック番号５０−１に対応するアドレス５０−２には、このダブルＲＡＭ混在領
域２３の先頭アドレス５７と最終アドレス５８が格納されている（これは、このブロックの先頭／最終アドレスに相当することになる）。
【００８０】
あるいは、ダブルＲＡＭ領域２２が格納される任意のブロックに関しては、このブロックのブロック番号５０−１に対応するアドレス５０−２には、このダブルＲＡＭ領域２２の先頭アドレス５１と最終アドレス５２が格納されており、更に後述する図３（ｂ）等に示すＲＡＭ診断完了ビット領域６２の先頭アドレス５５と最終アドレス５６が格納されており、更にこのダブルＲＡＭ領域２２に対応する反転ダブルＲＡＭ領域２５の先頭アドレス５３と最終アドレス５４も格納されている。尚、複数ブロック分割の例の場合、後述する図３（ｂ）等に示すＲＡＭ診断完了ビット領域６２は、ダブルＲＡＭ領域２２が格納される各ブロック毎に対応して存在する。
【００８１】
ここで、図４に、上記ブロックに関する一例を示す。
図４に示す一例では、例えばブロック番号＝‘１’のブロックはブロック１、例えばブロック番号＝‘２’のブロックはブロック２等として示すものとする。そして、この例では、ブロック１〜ブロック６の６つのブロックから成り、各ブロック１〜６にはそれぞれダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３の何れかが格納される。図示の例では、ブロック１、４にはダブルＲＡＭ領域２２が格納され、ブロック２，３，５，６にはダブルＲＡＭ混在領域２３が格納される。但し、これは、別の見方をすれば、ダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３それぞれが、複数のブロックに分割されているとも言える。何れにしても本例では、ダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３は、それぞれ、１つではなく複数存在するものであり、この様な形態を「複数のブロックに分割された構成例」、「複数ブロックの例」等と呼ぶものとする。
【００８２】
また、図示していないが、ブロック１とブロック４の各ダブルＲＡＭ領域２２にそれぞれ対応する反転ダブルＲＡＭ領域２５も格納されており、これらもブロック１、ブロック２として扱われる。
【００８３】
よって、例えばブロック１を例にすると、図示の通りブロック１のアドレス範囲は２０００番地〜２７ＦＦ番地であるので、そのダブルＲＡＭ領域２２に対応する反転ダブルＲＡＭ領域２５のアドレス範囲はＡＦＦＦ番地〜Ａ８００番地となる。よって、ダブルＲＡＭ領域アドレスデータテーブル５０におけるブロック番号＝１に対応するデータは、上記ダブルＲＡＭ領域先頭アドレス５１、ダブルＲＡＭ領域最終アドレス５２として２０００番地、２７ＦＦ番地が格納され、上記反転ダブルＲＡＭ領域先頭アドレス５３、反転ダブルＲＡＭ領域最終アドレス５４としてＡ８００番地、ＡＦＦＦ番地が格納されることになる。また、図示していないが上記の通り、ブロック１に対応するＲＡＭ診断完了ビット領域６２も所定の記憶領域に記憶されており、その先頭アドレス５５、最終アドレス５６も格納されていることになる。
【００８４】
同様にして、例えばブロック２を例にすると、図示の通りブロック２にはダブルＲＡＭ混在領域２３が格納されており、そのアドレス範囲は２８００番地〜３７ＦＦ番地であるので、ダブルＲＡＭ領域アドレスデータテーブル５０におけるブロック番号＝２に対応するデータは、上記ダブルＲＡＭ混在領域先頭アドレス５７、ダブルＲＡＭ混在領域最終アドレス５８として２８００番地、３７ＦＦ番地が格納されることになる。
【００８５】
ダブルＲＡＭ領域アドレスデータテーブル５０は、後述するように、アドレスを求めたり、アドレス範囲をチェックするために使用する。
図３（ａ）、（ｂ）に、ＲＡＭ２０のダブルＲＡＭ管理領域２１に格納されるデータ構成例を示す。図示の通り、ダブルＲＡＭ管理領域２１には、図３（ａ）のＲＡＭ診断カウンタ６１、図３（ｂ）のＲＡＭ診断完了ビット領域６２等が格納される。
【００８６】
図３（ａ）に示すＲＡＭ診断カウンタ６１は、例えば任意のカウント値を保持する記憶領域である。このカウント値は、ＲＡＭ診断タスク１４の処理の際に参照され、また更新される（上述した一例では、1→2→3→・・Ｎ→1→2・・・と更新される）。
【００８７】
上記の通り、ＲＡＭ診断カウンタ６１は、ＲＡＭ２０の記憶領域が複数のブロックに分割された構成例に対応して設けられるものであり、複数ブロックではない構成の場合には必要ないものである。
【００８８】
複数ブロックの例である場合、上記の通りダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３がそれぞれ複数存在することになる。そして、ダブルＲＡＭ混在領域２３に対するＲＡＭ診断タスク１４による診断処理は、１回の処理で全ての処理対象ブロックについて（換言すれば全てのダブルＲＡＭ混在領域２３について）診断処理を行うのではなく、そのときの上記カウント値に対応する１又は複数のブロックについてのみ診断処理を行う。つまり、ダブルＲＡＭ混在領域２３に関しては、診断を時分割で行う。これによって、例えば全てのダブルＲＡＭ混在領域２３に関して一度に診断しようとする場合、時間が掛かり、診断中は本来の処理（安全関連アプリケーション１５の処理）が実行できないことになるが、この様な問題を解消できる。
【００８９】
次に、図３（ｂ）に示すＲＡＭ診断完了ビット領域６２について説明する。
上記の通り、ダブルＲＡＭ領域２２に関しては、基本的に必ず上記診断間隔Ｔ内にアクセスがあるはずであり、このアクセスによって上記ダブルＲＡＭ書込関数１１またはダブルＲＡＭ書込関数１２による診断が実行されているはずである。しかし、本手法では、上記の通り異常等によって診断が実行されない可能性があることに対応して、ダブルＲＡＭ監視部１３’による監視を行うようにしている。そして、その為にＲＡＭ診断完了ビット領域６２を用いる。
【００９０】
図３（ｂ）に示すＲＡＭ診断完了ビット領域６２には、ダブルＲＡＭ領域２２内の各アドレス（１バイト単位）に対応するビット情報群が格納される。つまり、図示のビット情報群（bit０、bit1、bit2、・・・bitn・・・bitn+2）が格納される。このビット情報は、それが対応するアドレスに関して上記アクセスに伴うＲＡＭ診断（ダブルＲＡＭ書込関数１１またはダブルＲＡＭ書込関数１２による診断）が実行済みであるか否かを示すものである（定義した時間内にＲＡＭ診断を実行したか否かを示す）。本例では、ビットＯＮ＝‘１’はＲＡＭ診断実行済み（完了）を意味し、ビットＯＦＦ＝‘０’はＲＡＭ診断が未完了であることを意味するものとする。これより、初期状態では全てのビット情報は‘０’に設定される。
【００９１】
例えば、ＲＡＭ診断完了ビット領域６２の先頭ビット（bit 0）は、ダブルＲＡＭ領域２２の“先頭アドレス＋0”のアドレス（すなわち、先頭アドレス）に対応するビット情報である。よって、ダブルＲＡＭ領域２２の先頭アドレスに対するアクセスがあった場合（これに伴う診断処理があった場合）には、bit 0は‘１’になる。
【００９２】
同様に、ＲＡＭ診断完了ビット領域６２の先頭から２番目のビット（bit 1）は、ダブルＲＡＭ領域２２の“先頭アドレス＋1”のアドレスに対応するビット情報である。仮に、ダブルＲＡＭ領域２２の先頭アドレスが８０００番地であったならば、bit 1は、８００１番地に対応するビット情報ということになる。同様にして、例えばbitnは、ダブルＲＡＭ領域２２の“先頭アドレス＋ｎ”のアドレスに対応するビット情報である。
【００９３】
ＲＡＭ診断完了ビット領域６２は、ダブルＲＡＭ書込関数１１またはダブルＲＡＭ書込関数１２の処理の際に更新される（アクセス先データの格納アドレスに対応するビット情
報が‘１’にセットされる）。また、ＲＡＭ診断完了ビット領域６２は、ダブルＲＡＭ監視部１３’による処理の際に参照される。また、ダブルＲＡＭ監視部１３’による処理実行毎に、例えば当該処理の最後で全てのビット情報は‘０’にリセットされる。
【００９４】
また、既に述べたが、ＲＡＭ２０の記憶領域が複数ブロックに分割された構成例の場合には、ＲＡＭ診断完了ビット領域６２は、各ブロック毎に対応してそれぞれ設けられる。
以下、図５以降のフローチャート図を参照して、上記各種関数／タスク／アプリケーションの処理例について説明する。
【００９５】
まず、ダブルＲＡＭ書込関数１１について説明する。
図５は、ダブルＲＡＭ書込関数１１（ダブルＲＡＭ書込部１１’）による処理フローチャート図である。図６は、図５におけるステップＳ２４の処理の詳細フローチャート図である。
【００９６】
尚、図５の処理に係るパラメータ（入力）、関数値（出力）は下記の通りとする。
パラメータ
・データ番号
・書込アドレス
・書込データ
・書込データバイト数
関数値
・正常終了／異常終了／データ異常
尚、上記パラメータにおいて、データ番号は書込データのデータ番号であり、書込アドレスは書込データの書込み先領域の先頭アドレスを意味する。
【００９７】
また、尚、ダブルＲＡＭ書込関数１１は、安全関連アプリケーション１５のプログラム内にインライン展開する。これにより、スタック領域等の可変のＲＡＭ領域の使用を制限し、領域オーバなどのリスクを軽減する。
【００９８】
図５の処理は、まず、上記パラメータの書込アドレスに基づいて書込み先領域（複数ブロックの例の場合には書込み先ブロック）を認識できるので、この書き込み先領域すなわちダブルＲＡＭ領域２２、ダブルＲＡＭ混在領域２３の何れかの領域の先頭アドレスと最終アドレスを、上記ダブルＲＡＭ領域アドレスデータテーブル５０から取得する。これより、書き込み先領域（ダブルＲＡＭ領域２２／ダブルＲＡＭ混在領域２３）のアドレス範囲が分かる。更に、上記パラメータの書込アドレスと書込データバイト数とから、上記書込データの書込み先アドレス範囲（先頭アドレスと最終アドレス；以下、書込データの格納領域という場合もある）を計算する（ステップＳ１１）。上記の通り“書込アドレス＝先頭アドレス”であり、最終アドレスは、例えば「書込アドレス＋書込データバイト数−１」によって求めることができる。
【００９９】
そして、上記書込データの書込み先アドレス範囲が、書き込み先領域（ダブルＲＡＭ領域２２／ダブルＲＡＭ混在領域２３）内であるか否かを判定する（ステップＳ１２）。もし、書込データのアクセス先が書き込み先領域内では無い場合には（ステップＳ１２，ＮＯ）、何等かの異常があるものとして異常終了する（ステップＳ２６）。これは、上記関数値として異常終了を返すものである。尚、ステップＳ１２の判定は、例えば何らかの異常により例えばアドレスデータが変化していないかを念の為に確認するものであり、よって、この処理は必ずしも必要なものではない。
【０１００】
一方、異常が無い場合には、すなわち上記書込データのアドレス範囲が上記書き込み先領域内である場合には（ステップＳ１２，ＹＥＳ）、続いて、上記パラメータの書込デー
タバイト数に関するチェックを行う（ステップＳ１３）。すなわち、上記パラメータのデータ番号を用いて上記図２（ａ）に示すデータ番号管理テーブル３０を検索して、該当するレコードのデータバイト数３２を取得し、上記パラメータの書込データバイト数がこのデータバイト数３２と一致するか否かをチェックする。不一致であれば（ステップＳ１３，ＮＯ）、異常終了とする（ステップＳ２６）。一致する場合には（ステップＳ１３，ＹＥＳ）ステップＳ１４以降の処理へ移行する。
【０１０１】
尚、ステップＳ１３の判定も上記ステップＳ１２の判定と同様、念の為のチェック処理であり、必ずしも必要な処理ではない。
上記ステップＳ１２，Ｓ１３の処理により異常が無いことを確認したら、上記書込データを書込アドレス（先頭アドレス）から書込データバイト数分書込む（ステップＳ１４）。
【０１０２】
そして、上記書き込み先領域が、ダブルＲＡＭ混在領域２３であったならば（ステップＳ１５，ＮＯ）、ステップＳ１６以降の処理を行うことなく、本処理を終了する（ステップＳ２３の正常終了とする）。尚、これは上記関数値として正常終了を返すものである。
【０１０３】
ダブルＲＡＭ混在領域２３に関しては、後にＲＡＭ診断タスク１４による定期的な診断処理を行うため、ここで診断を行うと重複して診断を行うことになり無駄な処理が発生する為、基本的にはデータ書込みを行うだけで本処理を終了する。
【０１０４】
一方、上記書き込み先領域が、ダブルＲＡＭ領域２２であった場合には（ステップＳ１５，ＹＥＳ）ステップＳ１６以降の処理へ移行する。すなわち、まず、ダブルＲＡＭアルゴリズムによる診断処理を行う。
【０１０５】
まず、上記ステップＳ１４で書込データを書き込んだ記憶領域から、データを読み出す。これは、ＲＡＭ診断のために読出すものであり、読み出したデータは後述するステップＳ２１の判定の際に用いる。尚、異常がなければ読み出されたデータは書込データであるはずである。更に、上記パラメータの書込アドレスを反転する（反転アドレスを求める）（ステップＳ１６）。例えばアドレス‘０１０１’（１６進）の反転アドレスは‘ＦＥＦＥ’である。
【０１０６】
尚、アドレス反転を行うのは、ＲＡＭの制御は、アドレス制御機構とビット制御機構で行われているからである。すなわち、単にデータ反転を行うだけではビット制御機構の異常チェックしか出来ないので、アドレス反転によりアドレス制御機構の異常チェックも行えるようにしている。
【０１０７】
次に、上記ダブルＲＡＭ領域アドレスデータテーブル５０を参照して、反転ダブルＲＡＭ領域２５のアドレス範囲（先頭アドレスと最終アドレス）を取得する（ステップＳ１７）。そして、ステップＳ１６で求めた反転アドレスが反転ダブルＲＡＭ領域２５内であるか否かをチェックする（ステップＳ１８）。領域２５内で無ければ（ステップＳ１８，ＮＯ）上記ステップＳ２６の異常終了とする。尚、ステップＳ１７，Ｓ１８の処理も、上記ステップＳ１２等と同様、必ずしも必要なものではない。
【０１０８】
一方、異常が無い場合すなわち反転アドレスが領域２５内である場合には（ステップＳ１８，ＹＥＳ）、上記パラメータの書込データを反転する(反転データを求める)(ステップＳ１９)。そして、この反転データを上記反転アドレスから上記書込データバイト数分、書き込む。更に、この反転データを書き込んだ記憶領域から、データを読み出す（ステップＳ２０）。これは、ＲＡＭ診断のために読出すものであり、異常がなければ読み出されたデータは上記反転データであるはずである。
【０１０９】
そして、ステップＳ２０で読込んだデータを反転させて（異常が無ければ反転データを反転させて元の書込データに戻すことになる）、これがステップＳ１６で読込んだデータ（異常が無ければ書込データのはずである）と一致するか否かを確認する（ステップＳ２１）。一致しない場合は（ステップＳ２１，ＮＯ）、データ異常とする（ステップＳ２５）。これは、上記関数値としてデータ異常を返すものである。
【０１１０】
一致する場合には（ステップＳ２１，ＹＥＳ）、データ異常はないものとして（診断結果は正常であるものとして）、続いて、ダブルＲＡＭ監視処理を実行し（ステップＳ２４）、本処理を終了する。
【０１１１】
図６に、ステップＳ２４のダブルＲＡＭ監視処理の詳細フローチャート図を示す。
図６の処理では、まず、上記ステップＳ１１で計算した書込データの書込み先アドレス範囲（先頭アドレスと最終アドレス）に基づいて、ＲＡＭ診断完了ビット領域６２における当該アドレス範囲に対応するビット範囲（先頭位置と最終位置）を求める（ステップＳ３１）。尚、書込データの格納領域が１アドレスであった場合、上記ビット範囲の先頭位置と最終位置は同じものとなる。
【０１１２】
上記ビット範囲の先頭位置は、以下の計算式（１）の商と余りから得られる。
（ダブルＲＡＭ領域２２の先頭アドレスからの相対バイト数）／８  ・・・（１）式
上記（１）式の商が、ＲＡＭ診断完了ビット領域６２の先頭からの相対アドレスになり、余りがこのアドレス内の先頭からの相対ビット位置になる。
【０１１３】
尚、ＲＡＭ診断完了ビット領域６２における各ビット情報の位置は、「アドレス（番地）におけるアドレス内相対ビット数α（α；０〜７）」（アドレス（番地）における＋α）で表すものとする（後に、図７の例を用いて説明するものとする）。
【０１１４】
上記（１）式に示す「ダブルＲＡＭ領域２２の先頭アドレスからの相対バイト数」は、上記パラメータの書込アドレス（書込データの格納領域の先頭アドレス）から上記ステップＳ１１で取得したダブルＲＡＭ領域２２の先頭アドレスを差し引くことで求められる。
【０１１５】
上記計算式（１）の商がＲＡＭ診断完了ビット領域６２の先頭からの相対アドレスになり、余りが当該アドレス内の先頭からの相対ビット数（先頭から何番目のビットか；ここでは先頭ビットは先頭から０番目と定義する）になる。つまり、商をｍ、余りをｎとするならば、上記（１）式で求める位置は「ｍ番地における＋ｎ」となる（このｎは上記αに相当し、よって０〜７の何れかの値となる）。
【０１１６】
但し、上記（１）式によって求められる「ｍ番地における＋ｎ」は、ＲＡＭ診断完了ビット領域６２の先頭からの相対位置を意味するので、これを絶対位置に変換する必要がある。つまり、例えば、ＲＡＭ診断完了ビット領域６２の先頭アドレス＝３０００番地であるならば、上記書込データの書き込み先領域に対応するＲＡＭ診断完了ビット領域６２のビット情報の絶対位置は、“（３０００＋ｍ）番地における＋ｎ”となる。
【０１１７】
上記（１）式に関して具体例を用いて説明するならば、例えば図７に示すように、ダブルＲＡＭ領域２２の先頭アドレスは７０００番地、ＲＡＭ診断完了ビット領域６２の先頭アドレスは３０００番地であるとする。
【０１１８】
図３（ｂ）に示すＲＡＭ診断完了ビット領域６２のビット情報群は、実際には図７に示すようにバイト単位で格納されており、１バイト分のビット情報群は、ダブルＲＡＭ領域２２の８バイト分に対応するものである。
【０１１９】
この例では、例えば３０００番地における最初のビット（“３０００番地における＋０）は、７０００番地に対応するものである。同様にして、３０００番地における２番目のビット（３０００番地における＋１）は、７００１番地に対応するものであり、最後のビット（３０００番地における＋７）は、７００７番地に対応するものである。また、例えば、３００１番地における最初のビット（３００１番地における＋０）は、７００８番地に対応するものである。尚、各ビット情報は、それが対応するダブルＲＡＭ領域２２のアドレスに関して診断完了か未完了かを示すものとなる。
【０１２０】
この例において、例えば上記パラメータの書込アドレスが７００９番地であったならば、上記（１）式に示す「ダブルＲＡＭ領域２２の先頭アドレスからの相対バイト数」は、７００９−７０００＝０００９となる（アドレスは１バイト単位なので、“先頭アドレスからの相対バイト数”は“先頭アドレスからの相対アドレス”と考えてよい）。よって、この例の場合、上記（１）式における商は１、余りは１となる。よって、上記絶対位置は、“３００１番地における＋１”となる。つまり、３００１番地における２番目のビットとなる。
【０１２１】
以上の処理により、ステップＳ３１で求めるべきビット範囲（先頭位置と最終位置）のうち、まず先頭位置が求められる。続いて、最終位置を求める。
これについては、上記のように求めた先頭位置における“＋ｎ”に上記パラメータにおける読込データバイト数（仮にβとする）をプラスしてから−１デクリメントすればよい。つまり、“ｎ＋（β−１）”を最終位置の“＋ｎ”とすればよい。上記の例において仮にβ＝３であったならば、最終位置は「３００１番地＋３」となる。
【０１２２】
尚、“ｎ＋（β−１）”＞７であったならば、番地を＋１して、「“ｎ＋（β−１）”−８」を最終位置の“＋ｎ”とすればよい。上記の例において仮にβ＝９であったならば、最終位置は「“３００１＋１”番地＋（“１＋（９−１）”−８）」＝「３００２番地＋１」となる。
【０１２３】
以上により、ステップＳ３１で求めるべきビット範囲（書込データの格納領域に対応するビット情報群の先頭ビット位置と最終ビット位置）が求められる。
続いて、ステップＳ３２以降の処理を実行する。
【０１２４】
まず、ダブルＲＡＭ領域アドレスデータテーブル５０から、ＲＡＭ診断完了ビット領域６２の先頭アドレスと最終アドレス（領域６２のアドレス範囲）を取得する（ステップＳ３２）。
【０１２５】
そして、ステップＳ３１で求めたビット範囲が、ステップＳ３２で取得したアドレス範囲内に入っているか否かをチェックする（ステップＳ３３）。範囲内に入っていればチェックＯＫとして（ステップＳ３３，ＹＥＳ）ステップＳ３４以降の処理へ移行する。一方、ステップＳ３１で計算したビット範囲の一部でも、ステップＳ３２で取得したアドレス範囲外であったならば、チェックＮＧとして（ステップＳ３３，ＮＯ）、異常終了（ステップＳ３６）とする。尚、ステップＳ３２，Ｓ３３の処理も、必ず必要というものではない。
【０１２６】
上記チェックＯＫの場合、ＲＡＭ診断完了ビット領域６２において上記ステップＳ３１で求めたビット範囲内の全ビット情報をＯＮ（‘１’）する（ステップＳ３４）。その後、正常終了とする（ステップＳ３５）。
【０１２７】
尚、ステップＳ３４の処理は、例えば、上記ステップＳ３１で計算した先頭位置から後
ろ（下位）に上記パラメータの読込バイト数に対応するビット数分オンする等であってもよい。上記の例では、先頭位置＝「３００１番地＋１」であり、例えば上記β＝３の例の場合には、「３００１番地＋１」、「３００１番地＋２」、「３００１番地＋３」（＝最終位置）の３つのビット情報がＯＮになる。
【０１２８】
図８は、ダブルＲＡＭ読込関数１２（ダブルＲＡＭ読込部１２’）による処理のフローチャート図であり、図９は、図８におけるステップＳ５４のダブルＲＡＭ監視処理の詳細フローチャート図である。
【０１２９】
図８の処理に関するパラメータは、下記の通りである。
・データ番号
・読込アドレス
・読込データバイト数
復帰データ
・読込データ
関数値
・正常終了／データ異常／異常終了
尚、ダブルＲＡＭ読込関数１２は、安全関連アプリケーション１５のプログラム内にインライン展開する。これによって、スタック領域など可変のＲＡＭ領域の使用を制限し、領域オーバなどのリスクを軽減する。
【０１３０】
尚、上記パラメータのデータ番号は読込対象データのデータ番号であり、読込アドレスは読込対象データの格納領域の先頭アドレスであり、読込データバイト数は読込対象データのデータ量である。
【０１３１】
図８において、まずステップＳ４１〜Ｓ４３の処理は、上記ステップＳ１１〜Ｓ１３の処理と略同様の処理であり（読込か書込かの違いだけ）、単なるチェック処理であるので、ここでは特に説明しない。
【０１３２】
ステップＳ４２、Ｓ４３のチェック処理により異常が無ければ（ステップＳ４２，Ｓ４３；共にＹＥＳ）、上記パラメータの読込アドレスから読込データバイト数分、データを読込む（ステップＳ４４）。つまり、読込対象データを読込む。
【０１３３】
そして、上記データ読込を行った記憶領域がダブルＲＡＭ領域２２であるかダブルＲＡＭ混在領域２３であるかによって処理を分岐させる（ステップＳ４５）。ダブルＲＡＭ混在領域２３である場合には（ステップＳ４５，ＮＯ）、この領域２３に関してはＲＡＭ診断タスク１４による定期的な診断処理を行うため、ここでは診断処理を行うことなく、そのまま正常終了して（ステップＳ５４）本処理を終了させる。一方、ダブルＲＡＭ領域２２である場合には、ステップＳ４６以降の処理へ移行し、ダブルＲＡＭアルゴリズムによる診断処理を行うと共に、ステップＳ５５のダブルＲＡＭ監視処理を行う。
【０１３４】
ステップＳ４６以降の処理では、まず、上記の通り説明は省略したがステップＳ４１の処理の際にはステップＳ１１と略同様にして読込対象データの格納領域のアドレス範囲（先頭アドレスと最終アドレス）を求めており、この先頭アドレスと最終アドレスをそれぞれ反転する（ステップＳ４６）。つまり、上記読込対象データの反転データが格納されている領域のアドレス範囲（反転ダブルＲＡＭ領域２５内のどこか）を求める。続いて、ダブルＲＡＭ領域アドレスデータテーブル５０を参照して、反転ダブルＲＡＭ領域２５の先頭アドレス５３と最終アドレス５４を取得する（ステップＳ４７）。
【０１３５】
そして、ステップＳ４６で求めたアドレス範囲が、反転ダブルＲＡＭ領域２５内にある
か否かを判定する（ステップＳ４８）。もし、領域２５内にない場合には（ステップＳ４８，ＮＯ）、異常終了とする（ステップＳ５３）。一方、ステップＳ４６で求めたアドレス範囲が、反転ダブルＲＡＭ領域２５内にある場合には（ステップＳ４８，ＹＥＳ）、ステップＳ４６で求めたアドレス範囲のデータを読み込む（ステップＳ４９）。
【０１３６】
上記の通り、このアドレス範囲には、上記読込対象データの反転データが格納されているはずであり、ステップＳ４９で読み込んだデータを反転させて（ステップＳ５０）、これがステップＳ４４で読込んだデータと一致するか否かを判定する（ステップＳ５１）。もし、両者が不一致であれば（ステップＳ５１，ＮＯ）、データ異常として（ステップＳ５２）本処理を終了する。つまり、この場合にはＲＡＭ診断により異常が検出されたことになる。
【０１３７】
一方、両者が一致するならば（ステップＳ５１，ＹＥＳ）、ＲＡＭ診断により異常は検出されないことになり、続いて、ステップＳ５５のダブルＲＡＭ監視処理を実行したうえで、本処理を終了することになる。
【０１３８】
以下、図９を参照して、ステップＳ５５のダブルＲＡＭ監視処理の詳細フローについて説明する。
図９の処理では、まず、上記読込対象データの格納領域のアドレス範囲（ステップＳ４１で求めた先頭アドレスと最終アドレス）に基づいて、このアドレス範囲に対応するＲＡＭ診断完了ビット領域６２のビット情報の位置（アドレス（番地）とアドレス内相対ビット位置）を計算する（ステップＳ６１）。これは、上記ステップＳ３１と同様に、上述した計算式（１）を用いて、その商と余りにより、ＲＡＭ診断完了ビット領域６２において上記読込対象データの格納領域の先頭アドレスに対応するビット情報の位置を求めるものである。また、最終アドレスに対応するビット情報の位置も求める。対象が書込データではなく読込データであるという違いがあるが、ステップＳ３１に関して説明したものと略同様であるので、ここでは特に説明しないが、ステップＳ６１の処理によって、ＲＡＭ診断完了ビット領域６２における該当ビット情報群（上記読込対象データの格納領域に対応するビット情報群）の範囲（先頭位置と最終位置）が求められる。
【０１３９】
続いてステップＳ６２の処理により、ダブルＲＡＭ領域アドレスデータテーブル５０を参照して、ＲＡＭ診断完了ビット領域６２の先頭アドレス５５と最終アドレス５６を取得する。そして、ステップＳ６１で求めた該当ビット情報群の範囲が、ＲＡＭ診断完了ビット領域６２内にあるか否かを判定する（ステップＳ６３）。もし、範囲内に無ければ（ステップＳ６３，ＮＯ）、異常終了とする（ステップＳ６６）。もし、範囲内にあれば（ステップＳ６３，ＹＥＳ）、ステップＳ６１で求めた該当ビット情報群の全ビットをＯＮする（ステップＳ６４）。そして、正常終了とする（ステップＳ６５）。
【０１４０】
以上、図８、図９の処理において、図９の処理が実行される場合には、読込対象データの格納領域に対するＲＡＭ診断が行われて異常が無いことが確認されたうえで、この格納領域に関するＲＡＭ診断が完了済みであることをＲＡＭ診断完了ビット領域６２に記録しておくことになる。そして、以下に説明するダブルＲＡＭ監視タスク１３の処理では、ＲＡＭ診断完了ビット領域６２を参照することになる。
【０１４１】
図１０は、ダブルＲＡＭ監視タスク１３（ダブルＲＡＭ監視部１３’）による処理のフローチャート図である。
ダブルＲＡＭ監視タスク１３は、予め開発者等が監視間隔として定義した所定の時間周期で起動する。これは、例えば、上記診断間隔Ｔに相当する所定時間毎に起動して処理実行するものである。
【０１４２】
また、ダブルＲＡＭ監視タスク１３は、安全関連アプリケーション１５より優先レベルの高いタスクレベルで動作する。
尚、本処理例は、複数ブロックに分割された構成例の場合を例にしており、図１０の処理は、ダブルＲＡＭ領域２２を格納する全てのブロックを処理対象として、各ブロック毎に順次実行することになる。図４に示す例では、最初はブロック１が処理対象となり、次にブロック４が処理対象となり、ブロック４に関する処理が完了したら本処理は終了となる。
【０１４３】
図１０に示す処理では、まず、ダブルＲＡＭ領域アドレスデータテーブル５０における処理対象ブロック（上記の例では最初はブロック１）のデータから、ＲＡＭ診断完了ビット領域６２の先頭アドレス５５と最終アドレス５６を取得する（ステップＳ７１）。尚、ここでは、先頭アドレス５５は、当該アドレスの先頭ビットからＲＡＭ診断完了ビット領域６２が始まっているものとして、アドレス情報のみとなっている。一方、最終アドレス５６は、ＲＡＭ診断完了ビット領域６２の最後が、最終アドレスの最後のビットとなっているとは限らないので、アドレス情報と当該アドレス内の相対ビット位置の情報からなっているものとする。
【０１４４】
但し、この例に限らず、最終アドレス５６もアドレス情報のみとなっていてもよい。この場合には、計算により上記相対ビット位置を求める。すなわち、この場合には更に、ダブルＲＡＭ領域アドレスデータテーブル５０からダブルＲＡＭ領域２２の先頭アドレス５１と最終アドレス５２を取得して、「（最終アドレス５２−先頭アドレス５１）／８」を計算して、その余りが上記相対ビット位置として求められる。
【０１４５】
そして、ＲＡＭ診断完了ビット領域６２において、上記先頭アドレス５５から順に１アドレスずつ（１バイトずつ）処理対象として、そのアドレスのデータがＦＦ（１６進数）であるか否かをチェックする（ステップＳ７２）。つまり、このアドレスの全てのビットが‘１’（ＯＮ）（完了／診断実施済み）となっているか否かをチェックする。
【０１４６】
もし、１つでもビットＯＮになっていないならばＦＦ（１６進数）ではないことになるので(ステップＳ７２，ＮＯ)、ＲＡＭチェック漏れアラームを出力して（ステップＳ８１）本処理を終了する。尚、図示の例では、この様な異常の場合でも一応、チェック対象のアドレスの全ビットを初期化するが（‘０’を書き込む）（ステップＳ８０）、この例に限らない。
【０１４７】
既に述べた通り、ダブルＲＡＭ領域２２に格納されているデータは、何らかの異常が無い限り、予め監視間隔として定義した時間周期内に診断処理が行われているはずである。すなわち、上記時間周期内に、ダブルＲＡＭ書込関数１１または／及びダブルＲＡＭ読込関数１２によるアクセスが実行され、それによって上記の通りダブルＲＡＭアルゴリズムによる診断処理が実行されると共にＲＡＭ診断完了ビット領域６２における該当ビット(アクセス先アドレスに対応するビット)がＯＮされているはずである。よって、ステップＳ７２の判定がＮＯとなるということは、何らかの異常が発生したことを意味すると考えられ、上記の通りアラーム出力（アラーム表示、アラーム音の発生等）するものである。
【０１４８】
このアラームによって、ユーザは何らかの異常が発生したと認識して、何らかの対応を行うことになる。例えば、保守員等が、保守マニュアルに従って、ハードウェア故障か、設計等によるエラーかを切り分けて、それぞれの対応を行う。何れにしても重要なことは、診断間隔が満たされない状態のまま運用し続けることで、最悪の場合、作業員等に人的被害が発生する可能性があるが、この様な事態が生じることを防止できる。
【０１４９】
一方、処理対象のアドレスのデータがＦＦ（１６進数）であるならば（ステップＳ７２
，ＹＥＳ）、異常は生じていないことになるので、このアドレスの全ビットを初期化する（‘０’を書き込む）（ステップＳ７３）。そして、次のアドレスを処理対象として、次のアドレスのデータを取得して（ステップＳ７５）、再び当該データがＦＦであるか否かの判定を行うが（ステップＳ７２）、その前に次のアドレスが最終アドレスであるか否かをチェックする（ステップＳ７４）。次のアドレスが最終アドレスでなければ（ステップＳ７４，ＮＯ）上記ステップＳ７５の処理へ移行するが、次のアドレスが最終アドレスである場合には（ステップＳ７４，ＹＥＳ）ループを抜けてステップＳ７６の処理へ移行する。
【０１５０】
ステップＳ７６では、この最終アドレスにおける先頭ビットから上記ステップＳ７１で得た上記相対ビット位置までの全てのビットが‘１’（ＯＮ）であるか否かをチェックする（ステップＳ７６）。これは、上記の通り、最終アドレスに関しては８ビットであるとは限らないので、上記‘ＦＦ’の判定を行えるとは限らない為であり、本質的には上記‘ＦＦ’の判定と同じものである。
【０１５１】
よって、１つでも‘１’（ＯＮ）となっていないビットがあった場合には（ステップＳ７６，ＮＯ）、上記ステップＳ７２の判定がＮＯとなった場合と同様に、上記ステップＳ８０、Ｓ８１の処理を実行することになる。
【０１５２】
一方、全てのビットが‘１’（ＯＮ）であったならば（ステップＳ７６，ＹＥＳ）、これら全てのビットを初期化する（‘０’を書き込む）(ステップＳ７７)。これにより、この処理対象ブロックに関するチェックは正常終了したことになり、続いて、ダブルＲＡＭ領域２２を格納する全てのブロックについて本処理を実行したか否かを判定し（ステップＳ７８）、未だ未処理のブロックがあるならば（ステップＳ７８，ＮＯ）、この未処理のブロックを次の処理対象ブロックとして（ステップＳ７９）、ステップＳ７１に戻り、上記と同様の処理を行う。全てのブロックについて本処理を実行したら（ステップＳ７８，ＹＥＳ）、本処理は終了となる。
【０１５３】
図１１は、ＲＡＭ診断タスク１４（ＲＡＭ診断部１４’）による処理のフローチャート図である。また、図１２、図１４は、図１１におけるステップＳ９３の処理の詳細フローチャート図（その１）、（その２）である。
【０１５４】
本処理は、例えば、ＲＡＭの診断間隔Ｔとして定義した時間周期で起動する。但し、複数ブロックに分割された構成例の場合には、既に述べた通り、ＲＡＭ診断タスク１４による診断処理周期をｔとすると、例えば「“ｔ×Ｎ”≦診断間隔Ｔ」となるようにｔを設定することになる。すなわち、ＲＡＭの診断間隔Ｔ内にＲＡＭ診断部１４’による処理が複数回実行され、結果的にＲＡＭの診断間隔Ｔ内に全てのダブルＲＡＭ混在領域２３に関する診断処理が実行完了するように診断処理周期ｔを設定する。
【０１５５】
また、ＲＡＭ診断タスク１４は、安全関連アプリケーション１５より優先レベルの高いタスクレベルで動作する。これは、換言すれば、ＲＡＭ診断タスク１４の処理を実行中は、安全関連アプリケーション１５による処理（本来の処理）が実行されないことになり、ＲＡＭ診断タスク１４の処理時間が長いと、本来の処理が実行されない期間が長くなり、運用に支障が出る可能性があることを意味する。しかし、本手法では、ＲＡＭ診断タスク１４による定期的な診断処理の対象は、ダブルＲＡＭ混在領域２３のみであり、ダブルＲＡＭ領域２２は対象外であることから、ＲＡＭ診断タスク１４の処理時間を短くできる。更に、複数ブロックに分割された構成例の場合には、例えばＲＡＭ診断タスク１４による１回の処理で１ブロックのみを処理対象とする事等が実現できるので、１回の処理に掛かる時間は非常に短くて済み、安全関連アプリケーション１５による処理を妨げる期間が非常に短くて済む。
【０１５６】
図１１に示す処理例は、複数ブロックに分割された構成例に対応するものである。
よって、まず、上記ＲＡＭ診断カウンタ６１のカウント値を読み込み、続いてこのＲＡＭ診断カウンタ６１のカウント値を更新する（＋１インクリメントする）（ステップＳ９１）。尚、既に述べた通り、ＲＡＭ診断カウンタ６１のカウント値は、1→2→3→・・Ｎ→1→2・・の順で更新される。また、尚、カウント値の更新は、カウント値を読み込んだ後であれば本処理内のどこで行っても良く、例えばステップＳ９５の処理後に行っても良い。
【０１５７】
次に、図２（ｂ）のＲＡＭ診断制御テーブル４０を参照して、ステップＳ９１で読み込んだカウント値に対応するブロック番号４２を取得する。ブロック番号４２に複数のブロック番号が格納されている場合にはそのうちの１つを取得する（まだ本診断処理を行っていないブロックのブロック番号を１つ取得する）。つまり、処理対象とするブロックのブロック番号を取得する。そして、ダブルＲＡＭ領域アドレスデータテーブル５０を参照して、上記取得したブロック番号におけるダブルＲＡＭ混在領域先頭アドレス５７とダブルＲＡＭ混在領域最終アドレス５８を取得する（ここまで、ステップＳ９２）。
【０１５８】
尚、既に述べた通り、ブロック番号４２にはダブルＲＡＭ混在領域２３を格納するブロックのブロック番号のみが格納されている。よって、処理対象ブロックは必ずダブルＲＡＭ混在領域２３を格納するブロックとなる。
【０１５９】
そして、上記処理対象ブロックに関するＲＡＭ自己診断処理を実行する（ステップＳ９３）。この診断の結果が“異常”であったならば（ステップＳ９４，ＮＯ）、本処理は終了とする。一方、診断結果が“正常”ならば（ステップＳ９４，ＹＥＳ）、ブロック番号４２に格納されていた全てのブロックについて本診断処理を実行したならば（ステップＳ９５，ＹＥＳ）本処理は終了し、未だ本診断処理を実行していないブロックがあるならば（ステップＳ９５，ＮＯ）、未処理のブロックのうちの１つを次の処理対象ブロックとして（ステップＳ９６）、上記ステップＳ９２〜Ｓ９４の処理を実行する。
【０１６０】
ここで、ステップＳ９３のＲＡＭ自己診断処理の詳細フローチャートを、図１２、図１４に示す。図１２は、ＲＡＭ自己診断処理をダブルＲＡＭアルゴリズム以外のアルゴリズムで行う場合を示しており、ここでは一例としてギャルパット（Galpat）アルゴリズムを例にするが、この例に限らない。また、図１４は、ＲＡＭ診断処理をダブルＲＡＭアルゴリズムを利用した処理で行う場合を示している。この様に、ダブルＲＡＭ混在領域２３に対するＲＡＭ診断処理は、ダブルＲＡＭアルゴリズムを用いて行っても良いし、それ以外のアルゴリズムを用いて行っても良い。
【０１６１】
但し、図１４の処理は、任意のデータアクセスに伴って診断処理を行うものではなく、定期的に実行される処理となるので、その意味では厳密にはダブルＲＡＭアルゴリズムの診断処理とは言えないかもしれない点を考慮して、上記のように「ダブルＲＡＭアルゴリズムを利用した処理（診断処理）」というものとする。
【０１６２】
尚、ステップＳ９３の処理は、ＲＡＭ診断タスク１４の内部関数により実行される。
まず、図１２に示すＲＡＭ診断処理の詳細フローチャート（その１）について説明する。尚、本処理は上記の通り既存のアルゴリズム（ギャルパット）による処理であり、特に詳細には説明しないものとする。
【０１６３】
図１２の処理では、まず、診断対象領域の全データ、すなわち上記ステップＳ９２で取得した先頭アドレス５７から最終アドレス５８までの領域のデータを、バッファ領域２４に退避させる。尚、その際、退避データのＣＲＣ（Cyclic Redundancy Check:巡回冗長度
検査）を付加するなど、バッファ領域２４の診断に必要な処理を行うようにしてもよいが、ここでは特に関係ないので説明しない。
【０１６４】
そして、例えば上記先頭アドレス５７から最終アドレス５８まで順番に例えば１アドレスずつ処理対象として、この処理対象アドレスについて以下のステップＳ１０２〜Ｓ１０９の処理を実行する。そして、最終アドレス５８まで処理実行したら（ステップＳ１１０，ＹＥＳ）、ステップＳ１１１以降の処理を実行する。但し、途中で異常が検出された場合には、ステップＳ１１５のＲＡＭ異常アラーム出力を行って異常終了することになる。
【０１６５】
上記処理対象アドレスについて、まず、ＲＡＭ２０における当該処理対象アドレスにテストデータパターンを書込む（ステップＳ１０２）。テストデータパターンは、当該アドレスのメモリセルをテストするための任意のデータであり、ここでは複数のテストデータパターンを用いるものとし、この複数のテストデータパターンのうちの１つを書き込む。
【０１６６】
そして、この処理対象アドレスのデータを読込み（ステップＳ１０３）、この読込データが上記ステップＳ１０２で書き込んだデータ（テストデータパターン）と一致するか否かをチェックする（ステップＳ１０４）。もし、不一致であったならば（ステップＳ１０４，ＮＯ）、ステップＳ１１５のＲＡＭ異常アラーム出力を行い、異常終了とする。また、バッファ領域２４に退避してあったデータをＲＡＭへ復元させる（ステップＳ１１２）。尚、この場合、上記ステップＳ９４の判定はＮＯとなることになる。
【０１６７】
一方、データ一致の場合には（ステップＳ１０４，ＹＥＳ）、更に、例えば図１３に示すように、処理対象アドレス以外のアドレスのデータを参照して、これらのデータがバッファ領域２４に退避してあったデータと同じか否かをチェックする（ステップＳ１０５）。これは、処理対象アドレスにテストデータを書き込むことにより他のアドレスのデータが誤動作等により変化していないか（クロストークしていないか）を確認する為である。
【０１６８】
尚、ステップＳ１０５の処理におけるチェック対象は、先頭アドレス５７から最終アドレス５８までの領域のデータのうち処理対象アドレス以外の全データとしてもよいし、処理対象アドレスの前後の一定のアドレス範囲（例えば±１０番地程度）としてもよい。
【０１６９】
他のアドレスデータに変化があった場合には（ステップＳ１０６，ＮＯ）、上記ステップＳ１０４の判定がＮＯとなった場合と同様に、上記ステップＳ１１５の処理（ＲＡＭ異常アラーム出力等）を実行し、上記ステップＳ１１２の処理を実行して、本処理を終了する。
【０１７０】
一方、他のアドレスデータに変化がない場合には（ステップＳ１０６，ＹＥＳ）、上記複数のテストデータパターン全てについて処理実行したか否かを判定し（ステップＳ１０７）、未処理のテストデータパターンがある場合には（ステップＳ１０７，ＮＯ）そのなかから次のテストデータパターンを決定・設定して（ステップＳ１１３）、このテストデータを用いて上記ステップＳ１０２〜Ｓ１０６の処理を実行する。
【０１７１】
上記複数のテストデータパターン全てについて上記ステップＳ１０２〜Ｓ１０６の処理を実行したならば（ステップＳ１０７，ＹＥＳ）、処理対象アドレスのデータを復元する（ステップＳ１０８）。つまり、このときＲＡＭ２０における処理対象アドレスにはテストデータが格納されているので、バッファ領域２４に退避してあった元のデータを、処理対象アドレスに書き込む。更に続いて、この処理対象アドレスからデータを読込み、これがステップＳ１０８で書込んだデータと一致するか確認する（ステップＳ１０９）。読込んだデータも書込データも上記“バッファ領域２４に退避してあった元のデータ”であるので、一致するはずであるが、何らかの異常により不一致となる場合も有り得る。もし、
不一致であったならば（ステップＳ１０９，ＮＯ）、上記ステップＳ１０４の判定がＮＯとなった場合と同様に、上記ステップＳ１１５の処理（ＲＡＭ異常アラーム出力等）を実行し、上記ステップＳ１１２の処理を実行して、本処理を終了する。
【０１７２】
一方、一致する場合には（ステップＳ１０９，ＹＥＳ）、この処理対象アドレスに関する診断結果は“正常”であることになり、この処理対象アドレスが最終アドレス５８である場合以外は（ステップＳ１１０，ＮＯ）、次のアドレスを処理対象アドレスとして（処理対象アドレス＝処理対象アドレス＋１）（ステップＳ１１４）、当該次の処理対象アドレスについて上記ステップＳ１０２〜Ｓ１０９の処理を実行する。
【０１７３】
そして、ダブルＲＡＭ混在領域２３（上記先頭アドレス５７から最終アドレス５８まで）の全てのアドレスについて、途中で異常終了（ステップＳ１１５）となることなく上述したステップＳ１０２〜Ｓ１０９の診断処理を実行したらならば（ステップＳ１１０，ＹＥＳ）、このダブルＲＡＭ混在領域２３には異常は無いことになり、正常終了とする（ステップＳ１１１）（これによって上記ステップＳ９４の判定がＹＥＳとなる）。
【０１７４】
そして最後に、バッファ領域２４に退避してあった全てのデータ（ダブルＲＡＭ混在領域２３の全データ）を、ＲＡＭ２０に復元させる（ステップＳ１１２）。尚、その際、復元データのＣＲＣ（Cyclic Redundancy Check:巡回冗長度検査）などを行い、異常があればＲＡＭ２０のバッファ領域２４に異常があるとみなしＲＡＭ異常アラーム出力をし、異常終了するようにしてもよい。ＣＲＣは既存技術であり、また本手法には直接関係しないので、特に説明しない。
【０１７５】
次に、図１４に示すＲＡＭ診断処理の詳細フローチャート（その２）について説明する。これは、上記の通り、ステップＳ９３のＲＡＭ自己診断処理にダブルＲＡＭアルゴリズムを利用した場合の、ステップＳ９３の詳細フロー例を示すものである。
【０１７６】
尚、この処理例の場合には、図１には示していないが、ＲＡＭ２０には更に不図示の反転ダブルＲＡＭ混在領域が存在するものとする。上記反転ダブルＲＡＭ領域２５がダブルＲＡＭ領域２２の格納データの反転データを格納する領域であるのと同様、反転ダブルＲＡＭ混在領域はダブルＲＡＭ混在領域２３の格納データの反転データを格納する領域である。また、上記反転ダブルＲＡＭ領域２５と同様、反転ダブルＲＡＭ混在領域の各アドレスは、ダブルＲＡＭ混在領域２３の各アドレスを反転させたものである。例えば、ダブルＲＡＭ混在領域２３内に４０００番地があったならば、その反転アドレスである反転ダブルＲＡＭ混在領域内のＢＦＦＦ番地に、４０００番地のデータの反転データが格納されていることになる。
【０１７７】
また、これより、図２（ｃ）には示していないが、ダブルＲＡＭ領域アドレスデータテーブル５０において、ダブルＲＡＭ混在領域２３を格納するブロックのブロック番号５０−１に対応するアドレス５０−２には、上記ダブルＲＡＭ混在領域の先頭アドレス５７と最終アドレス５８だけでなく、上記不図示の反転ダブルＲＡＭ混在領域の先頭アドレスと最終アドレスも格納されている。そして、後述するステップＳ１２２の処理では、これら４つのアドレスを取得することになる。
【０１７８】
図１４の処理では、まず、予め用意されているテストデータパターンを読み込む（ステップＳ１２１）。尚、テストデータパターンは、予め固定値で複数用意しておき、診断カウンタの値によって適用するテストデータパターンを選択するようにしてもよい(当該ＲＡＭ自己診断アルゴリズムが呼ばれる毎に変更し、ＲＡＭの異常を検出可能とする)。
【０１７９】
また、ダブルＲＡＭ領域アドレスデータテーブル５０を参照して、上述したダブルＲＡ
Ｍ混在領域の先頭アドレス５７と最終アドレス５８、及び不図示の反転ダブルＲＡＭ混在領域の先頭アドレスと最終アドレスを取得する（ステップＳ１２２）。
【０１８０】
そして、例えば、ダブルＲＡＭ混在領域の先頭アドレス５７から最終アドレス５８まで順番に各アドレスを処理対象アドレスとして、この処理対象アドレスについて以下のステップＳ１２３〜Ｓ１３０の処理を実行する。
【０１８１】
まず、処理対象アドレス（本例では最初は先頭アドレス５７）とその反転アドレスのデータをレジスタに退避する（ステップＳ１２３）。上述したように、例えば、処理対象アドレスが４０００番地であったならば、その反転アドレスはＢＦＦＦ番地である。
【０１８２】
次に、上記テストデータパターンを処理対象アドレスに書き込む（ステップＳ１２４）。更に、このテストデータパターンを反転して（ステップＳ１２５）、この反転テストデータパターンを上記反転アドレスに書き込む（ステップＳ１２６）。
【０１８３】
そして、処理対象アドレスのデータを読込む（ステップＳ１２７）。また、反転アドレスのデータを読込み、これを反転させる（異常が無ければ、上記反転テストデータパターンを反転させることになり、上記テストデータパターンが得られるはずである）（ステップＳ１２８）。
【０１８４】
そして、ステップＳ１２７で読込んだデータとステップＳ１２８で得られたデータ（反転アドレスのデータを反転させたもの）とが、一致するか否かを判定する（ステップＳ１２９）。もし不一致であれば（ステップＳ１２９，ＮＯ）、上記レジスタへの退避データを復旧させて（処理対象アドレスとその反転アドレスに元データを戻す）、ＲＡＭ異常アラームを出力し、異常終了し、呼び出し元タスクに復帰する（ステップＳ１３４）。尚、この場合、上記ステップＳ９４の判定はＮＯとなる。
【０１８５】
一方、一致した場合には（ステップＳ１２９，ＹＥＳ）、上記レジスタへの退避データを復旧させて（ステップＳ１３０）、当該処理対象アドレスに関する診断結果は“正常”であるものとし、ダブルＲＡＭ混在領域２３の全てのアドレスについて処理実行したならば、すなわち当該処理対象アドレスが最終アドレス５８であるならば（ステップＳ１３１，ＹＥＳ）、正常終了し（ステップＳ１３２）、呼び出し元タスクに復帰する。尚、この場合、上記ステップＳ９４の判定はＹＥＳとなる。
【０１８６】
一方、未だダブルＲＡＭ混在領域２３の全てのアドレスについて処理実行していないならば(ステップＳ１３１，ＮＯ)、当該処理対象アドレスの次のアドレスを処理対象アドレスとして（例えば、処理対象アドレス＝処理対象アドレス＋１）（ステップＳ１３３）、ステップＳ１２３に戻る。この様にして、ダブルＲＡＭ混在領域２３の全てのアドレスについて処理実行するまで、ステップＳ１２３〜Ｓ１３１の処理を繰り返し実行する。
【０１８７】
最後に、図１５を参照して、安全関連アプリケーション１５の処理について説明する。
図１５は、安全関連アプリケーション部１５’の処理フローチャート図である。
図示の各処理において、ステップＳ１４２の処理は、上記ダブルＲＡＭ書込関数１１によって上述した図５、図６の処理を実行させるものである。同様に、ステップＳ１４６の処理は、上記ダブルＲＡＭ読込関数１２によって上述した図８、図９の処理を実行させるものである。尚、これらの関数１１、１２は、安全関連アプリケーション１５のプログラム内にインライン展開することにより、ＲＡＭのスタック領域を使用しないようにする。
【０１８８】
尚、ダブルＲＡＭ書込関数１１のパラメータは下記の通りであり、下記の（定数）は設計時に決まり、プログラムコード内に記載されるデータとなる。
・データ番号（定数）
・書込アドレス（定数）
・書込データ
・書込データバイト数（定数）
関数値
・正常終了／異常終了/データ異常
また、尚、ダブルＲＡＭ読込関数１２のパラメータは下記の通りであり、下記の（定数）は設計時に決まり、プログラムコード内に記載されるデータとなる。
・データ番号（定数）
・読込アドレス（定数）
・読込データバイト数（定数）
復帰データ
・読込データ
関数値
・正常終了／異常終了/データ異常
尚、これら各関数の処理に関しては、既に説明してあり、ここでは説明しない。
【０１８９】
以下、図１５のフローチャートについて簡単に説明する。
図１５において、安全関連アプリケーション部１５’は所定のアプリケーション処理を実行し（ステップＳ１４１）、このアプリケーション処理に係り安全関連データをＲＡＭ２０から読込むイベントが発生した場合には上記ダブルＲＡＭ読込関数１２を呼び出す（ステップＳ１４２）。これによって、上述した図８、図９の処理が実行されることになる。そして、上記正常終了／異常終了/データ異常の何れかの関数値が返されてくるので、正常終了以外の場合は（ステップＳ１４３，ＮＯ）終了情報を設定し(ステップＳ１４９)、所定の処理（処理異常アプリケーション処理）を実行し（この終了情報や所定の処理については特に説明しない）（ステップＳ１５０）、本処理は終了する。
【０１９０】
正常終了の場合（ステップＳ１４３，ＹＥＳ）上記アプリケーション処理を続行し（ステップＳ１４４）、処理中に安全関連データをＲＡＭ２０に書き込むイベントが発生した場合には上記パラメータ（書込データ等）を設定して（ステップＳ１４５）、上記ダブルＲＡＭ書込関数１１を呼び出す（ステップＳ１４６）。これにより上述した図５、図６の処理が実行されることになる。尚、図示していないが、パラメータの設定は上記ステップＳ１４２の処理の際にも行っている。
【０１９１】
そして、上記正常終了／異常終了/データ異常の何れかの関数値が返されてくるので、正常終了以外の場合は（ステップＳ１４７，ＮＯ）上記ステップＳ１４９、Ｓ１５０の処理を実行し、正常終了であったならば（ステップＳ１４７，ＹＥＳ）上記アプリケーション処理を続行する（ステップＳ１４８）。図示していないが、その後も、アプリケーション処理実行中に、ＲＡＭ２０に対する安全関連データの読込／書込イベントが発生する毎に、上述した関数呼び出しの処理が行われ、アプリケーション処理が最後まで実行されたら本処理は終了する。
【０１９２】
以上説明したように、本例のＲＡＭ診断装置では、予め設計者等によりＲＡＭ診断間隔Ｔを満たすと判断されたデータはダブルＲＡＭ領域に格納すると共に、運用中は本当にＲＡＭ診断間隔Ｔを満たしているかを監視し、満たしていない場合はアラームを出力する。尚、ＲＡＭ診断間隔Ｔは、予め設計・検証により要求される（上記のように故障発生確率が十分に低減されるように設計者等が考えた／定義した）所定の診断間隔であり、これを満たす場合には故障発生確率が十分に低減される。
【０１９３】
上記の本例のＲＡＭ診断装置によれば、自己診断率の高いダブルＲＡＭアルゴリズムで
診断を行うと共にＲＡＭ診断間隔Ｔを保証することができる（ＲＡＭ診断間隔の時限保証を実現できる）。診断間隔が保証されないことでＲＡＭの故障検出が遅れて重大な故障が発生するといった事態は生じることを防止することができる。更に、ダブルＲＡＭアルゴリズムによるＲＡＭ自己診断が要求された診断間隔Ｔを満たすことを監視することができる。また、ダブルＲＡＭ対象領域が適切であることを検証することができる。また、この検証は、設計・検証時および運用時に適用できる。つまり、本手法のＲＡＭ診断処理は、基本的には運用時に適用するものであるが、設計・検証時に適用することで、例えば設計ミス等を検出できる。
【０１９４】
また、上記監視の対象はまとめてダブルＲＡＭ領域に格納されており、上記の通りビット情報を用いてまとめて効率よくチェックできるので、監視処理に係るＣＰＵの負荷を軽減することができる。
【０１９５】
また、上記ダブルＲＡＭ領域に格納するデータ以外のデータ、換言すれば予め設計・検証により要求されるＲＡＭ診断間隔を満たさないと判断されたデータは、ダブルＲＡＭ混在領域に格納する。そして、例えばＲＡＭ診断間隔Ｔに相当する所定時間毎に、ダブルＲＡＭ混在領域に対するＲＡＭ診断を行う。まとめて効率よく診断できると共に、ダブルＲＡＭ領域は診断対象から除外されるので、少なくとも従来のような全領域診断処理を行う手法に比べて、処理時間を短縮できＣＰＵの負荷を軽減することができる。
【０１９６】
また、これによりＣＰＵ資源を有効に使用することができ、ＣＰＵの数や能力、ＲＡＭの数を削減することでコストを削減することができる。
また、ダブルＲＡＭ領域、ダブルＲＡＭ混在領域それぞれの領域に適したＲＡＭ自己診断方式を採用でき、自己診断処理のパフォーマンスを向上することができる。
【０１９７】
また、上記ダブルＲＡＭ領域やダブルＲＡＭ混在領域は、それぞれ連続した領域とする必要なく、複数ブロック化してもよい。そして、例えば図４に示すように、ダブルＲＡＭ領域の複数ブロックとダブルＲＡＭ混在領域の複数ブロックとが混在するようにしてもよい。これは、例えば、図４において最初はブロック１とブロック２のみが格納されていたとして、その後、例えばダブルＲＡＭ領域に格納すべき新たなデータが生じた場合、複数ブロック化しない場合には、ブロック１の領域を拡げ、これに伴ってブロック２の領域も移動させる必要があるが、複数ブロック化により、新たなダブルＲＡＭ領域のブロックを追加すれば済むことになる。
【０１９８】
また、複数ブロック化により、上記診断カウンタを用いた処理のように、ダブルＲＡＭ混在領域に対する診断処理を、一度に行うことなく、時分割して行うことができ、１回の診断処理の時間を短くすることができ、診断処理によって長時間、本来の処理が実行できなくなるという事態を防止することができる。ＲＡＭ自己診断により故障発生時のリアクションタイムが長くなることを防止でき、安全性能を向上することができる。
【０１９９】
また、上記関数１１、１２等のように処理を関数化し作成コード量を減少させることで、システム故障の削減を図ることができる。
また、関数のパラメータは設計時に決定する固定値と動作時に決定するものを明確化し、あらかじめプログラムコード内に展開することで可変データを減少させ、ＣＰＵ演算故障やＲＡＭ故障によるリスクの軽減と処理の負荷軽減を図ることができる。
【符号の説明】
【０２００】
１  ＣＰＵ
１０  ＲＯＭ
１１  ダブルＲＡＭ書込関数
１２  ダブルＲＡＭ読込関数
１３  ダブルＲＡＭ監視タスク
１４  ＲＡＭ診断タスク
１５  安全関連アプリケーション
１１’  ダブルＲＡＭ書込部
１２’  ダブルＲＡＭ読込部
１３’  ダブルＲＡＭ監視部
１４’  ＲＡＭ診断部
１５’  安全関連アプリケーション部
１６  ダブルRAM管理情報
２０  ＲＡＭ
２１  ダブルＲＡＭ管理領域
２２  ダブルＲＡＭ領域
２３  ダブルＲＡＭ混在領域
２４  バッファ領域
２５  反転ダブルＲＡＭ領域
３０  データ番号管理テーブル
３１  データ番号
３２  データバイト数
４０  ＲＡＭ診断制御テーブル
４１  診断カウント
４２  診断ダブルＲＡＭ混在領域ブロック番号
５０  ダブルＲＡＭ領域アドレスデータテーブル
５０−１  ブロック番号
５０−２  アドレス５０−２
５１  ダブルＲＡＭ領域先頭アドレス
５２  ダブルＲＡＭ領域最終アドレス
５３  反転ダブルＲＡＭ領域先頭アドレス
５４  反転ダブルＲＡＭ領域最終アドレス
５５  診断完了ビット領域先頭アドレス
５６  診断完了ビット領域最終アドレス
５７  ダブルＲＡＭ混在領域先頭アドレス
５８  ダブルＲＡＭ混在領域最終アドレス
６１  ＲＡＭ診断カウンタ
６２  ＲＡＭ診断完了ビット領域
【図１】
2011128780.tif 000003
【図２】
2011128780.tif 000004
【図３】
2011128780.tif 000005
【図４】
2011128780.tif 000006
【図５】
2011128780.tif 000007
【図６】
2011128780.tif 000008
【図７】
2011128780.tif 000009
【図８】
2011128780.tif 000010
【図９】
2011128780.tif 000011
【図１０】
2011128780.tif 000012
【図１１】
2011128780.tif 000013
【図１２】
2011128780.tif 000014
【図１３】
2011128780.tif 000015
【図１４】
2011128780.tif 000016
【図１５】
2011128780.tif 000017