(57)【特許請求の範囲】
【請求項１】
各種安全関連データがそれぞれ安全関連データ用領域内の所定の１又は複数のアドレスに格納されるＲＡＭに対して、ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行うＲＡＭ診断装置であって、
前記ＲＡＭにおける前記安全関連データ用領域内の前記各アドレス毎に対応して、該アドレスについて前記ＲＡＭ診断処理を実施済か未実施かを示す管理情報を記憶する管理情報記憶手段と、
任意の前記安全関連データを前記ＲＡＭからリードする処理又は該ＲＡＭにライトする処理を行う手段あって、該リード処理の際に、該リードする安全関連データの格納領域に関して前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行うと共に、前記管理情報記憶手段における該ＲＡＭ診断処理を行った格納領域のアドレスに対応する前記管理情報を、実施済とする安全関連データアクセス処理手段と、
予め決められた診断間隔で、前記管理情報記憶手段を参照して、未実施となっている管理情報に対応するアドレスに関して、前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行う診断時限保証手段と、
前記ＲＡＭにおける前記安全関連データ用領域内の前記各アドレス毎に対応して、予め要／不要情報が登録される要／不要情報記憶手段とを有し、
前記安全関連データアクセス処理手段は、前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行った格納領域のアドレスに対応する前記要／不要情報が、不要であった場合には、前記対応する管理情報を実施済とする処理は行わず、
前記診断時限保証手段は、対応する管理情報が未実施となっているアドレスであっても、該アドレスに対応する前記要／不要情報が不要となっている場合には、該アドレスに関しては前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理は実行しないことを特徴とするＲＡＭ診断装置。
【請求項２】
前記ＲＡＭには、更に非安全関連データ用領域が存在し、
安全関連データアクセス処理手段は、前記安全関連データのリード／ライト処理の際、該リード／ライト処理に係るアクセス先領域が前記安全関連データ用領域内であるか否かをチェックし、安全関連データ用領域内では無い場合には該リード／ライト処理を行わないことを特徴とする請求項１記載のＲＡＭ診断装置。
【請求項３】
前記ＲＡＭには、更に非安全関連データ用領域が存在し、
前記ＲＡＭに対して非安全関連データのリード／ライト処理を行う非安全関連データアクセス処理手段を更に有し、
該非安全関連データアクセス処理手段は、前記非安全関連データのリード／ライト処理の際、該リード／ライト処理に係るアクセス先領域が前記非安全関連データ用領域内であるか否かをチェックし、非安全関連データ用領域内では無い場合には該リード／ライト処理を行わないことを特徴とする請求項１記載のＲＡＭ診断装置。
【請求項４】
各種安全関連データがそれぞれ安全関連データ用領域内の所定の１又は複数のアドレスに格納されるＲＡＭに対して、ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行うＲＡＭ診断装置のコンピュータを、
前記ＲＡＭにおける前記安全関連データ用領域内の前記各アドレス毎に対応して、該アドレスについて前記ＲＡＭ診断処理を実施済か未実施かを示す管理情報を記憶する管理情報記憶手段と、
前記ＲＡＭにおける前記安全関連データ用領域内の前記各アドレス毎に対応して、予め要／不要情報が登録される要／不要情報記憶手段と、
任意の前記安全関連データを前記ＲＡＭからリードする処理又は該ＲＡＭにライトする処理を行う手段あって、該リード処理の際に、該リードする安全関連データの格納領域に関して前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行うと共に、前記管理情報記憶手段における該ＲＡＭ診断処理を行った格納領域のアドレスに対応する前記管理情報を実施済とするが、該アドレスに対応する前記要／不要情報が不要であった場合には該実施済とする処理は行わない安全関連データアクセス処理手段と、
予め決められた診断間隔で、前記管理情報記憶手段を参照して、未実施となっている管理情報に対応するアドレスに関して、前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行うが、該未実施となっている管理情報に対応するアドレスに対応する前記要／不要情報が、不要となっている場合には該ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理は実行しない診断時限保証手段、
として機能させる為のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、ＲＡＭの故障診断方式に関する。
【背景技術】
【０００２】
特許文献１には、メモリセルの検査手法についての開示があり、検査結果を３重に格納し、多数決により誤りの訂正をすることが開示されている。
特許文献２には、一組のデータを複数のアドレスにビット位置を変えて記憶し、制御開始時にそれらから読み出し、比較することが記載されている。
【０００３】
非特許文献１にはＲＡＭ診断の各種のアルゴリズムと当該アルゴリズムの診断効果が記載されている。また、非特許文献１には、ダブルＲＡＭアルゴリズムの概要等が開示されている。
【０００４】
非特許文献２には、上記ダブルＲＡＭアルゴリズム（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.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
特にプログラマブルコントローラ等の制御分野におけるコントローラ本体（ＣＰＵ、ＲＡＭ等を有する）においては、このＲＡＭには制御用データ等が格納されるので、ＲＡＭに異常が発生した場合、異常な制御が行われる可能性がある。もし、モータやプレス機等が異常動作した場合、その近くにいる作業員等に人的被害が発生する可能性がある。この為、コントローラ本体は、故障発生確率を減少させる為、自己診断（ＲＡＭ診断）をある程度頻繁に行うことが望ましい。
【０００８】
ここで、非特許文献１には、ダブルＲＡＭアルゴリズムは、自己診断率が高く自己診断の効果が高いことや、診断間隔と故障発生確率の関係が記載されている。
本手法では、この様な自己診断率が高く自己診断の効果が高い診断手法であるダブルＲＡＭアルゴリズムを用いることを前提とする。
【０００９】
ダブルＲＡＭアルゴリズムを用いるＲＡＭ診断に係り、故障発生確率を低減させることに関して、以下に説明する問題が生じる。
まず、一般的に、自己診断率はλＤＤ/λＤと定義されている。
【００１０】
（ここで  λＤ：危険側故障確率、λＤＤ：自己診断で検出可能な故障確率）
また、診断間隔と故障発生確率の関係として、診断間隔が短いと故障発生確率が減少することが知られている。具体的には、危険側共通原因故障ファクタβＤのスコアＳＤ＝Ｘ（Ｚ＋１）＋Ｙ  のＺが増加しβＤが減少する。βＤが減少するとＰＦＤ及びＰＦＨが減少する（尚、Ｘ；診断に関係する危険側共通原因故障ファクタのスコア値、Ｙ；診断に関係しない危険側共通原因故障ファクタのスコア値、ＰＦＤ；デマンド時の故障平均確率、ＰＦＨ；１時間あたりの危険側故障確率、Ｚ；診断試験の間隔と自己診断率に基づいて決まる値である）。
【００１１】
従って、ダブルＲＡＭアルゴリズム以外のＲＡＭ診断アルゴリズムにおいては、例えば、任意の適切な診断間隔（故障発生確率が十分に低減されるように設計者等が考えて設定する）で定期的にＲＡＭの記憶領域全体の診断処理を行うことで、ＲＡＭ診断間隔の時間保証を実現でき、故障発生確率が減少させることが考えられる。
【００１２】
しかしながら、ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理では、定期的にＲＡＭの記憶領域全体の診断処理を行うものではなく、上記の通りＲＡＭからのデータ読み出し処理の際に診断を行うので、ＲＡＭの記憶領域全体に対する診断間隔というものはなく、各データ格納領域毎の診断間隔があることになる。そして、各データ格納領域毎の診断間隔は、その領域の格納データを読出す処理の処理実行間隔に依存することになり、またこの間隔は一定になるとは限らない。
【００１３】
上記任意の適切な診断間隔による所定期間内に（例えば診断間隔が１時間毎であった場合には１時間以内に）、上記各データ格納領域全てについて最低１回、その領域の格納データを読出す処理が実行される（これに伴い、その領域の診断処理が実行される）のであれば、結果的に、ＲＡＭ診断間隔の時間保証が実現できる（上記所定期間内にＲＡＭ内の全領域の診断が行われている）ことになる。つまり、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現できることになる。
【００１４】
しかしながら、例えば故障発生時の対応処理等のような、ランダムに実行され且つ実行頻度が少ない処理が扱うデータの格納領域については、上記所定期間内にＲＡＭ診断処理が実行される可能性は低く、ＲＡＭ診断間隔の時間保証がされていないという問題がある。これは、換言するならば、この場合には、例えばＲＡＭの記憶領域全てについて最低１回はＲＡＭ診断処理が実行された状態になる毎にリセットし、このリセット時から再びＲＡＭの記憶領域全てについて最低１回はＲＡＭ診断処理が実行された状態になるまでの時間を、そのＲＡＭ全体に関するＲＡＭ診断間隔と見做すことができる。そして、このＲＡＭ診断間隔は一定ではなく不定となり、特に上記「ランダムに実行され且つ実行頻度が少ない処理」に影響されるものとなる。そして、上記の通り、ＲＡＭ全体に関するＲＡＭ診断間隔は、場合によっては非常に長いものとなり、ＲＡＭ診断間隔を短くすることで故障発生確率が減少させたくても、出来ないことになる。
【００１５】
この問題を解決する為に、例えば上記他のアルゴリズムと同様に定期的に（例えば上記所定期間の最後に）ＲＡＭの記憶領域全体の診断処理を行うことも考えられる。しかしながら、この様な全領域診断処理は、処理負荷や処理時間が大きくなり、ＣＰＵの資源を大きく消費するという問題があり、また無駄な処理が多くなる可能性がある。つまり、例えば上記データ読出し処理の際のＲＡＭ診断処理によって、上記所定期間内にＲＡＭの記憶
領域の９０％が既に診断済みの状態であるにも係らず、残りの１０％の為にこの９０％についても再度ＲＡＭ診断処理を行うことになり、これは無駄な処理となる。
【００１６】
また、診断対象のＲＡＭが、何らかの制御システムのコントローラ内のメモリであった場合、ＲＡＭに格納されるデータは大別して安全関連系データと非安全関連系データとがあることになる。この場合、特に故障発生確率を減少させたいのは、安全関連系データの格納領域であり、非安全関連系データは必ずしもＲＡＭ診断処理対象とはならない。よって、上記の説明では、ＲＡＭの記憶領域全体を診断処理対象として説明したが、安全関連系データに係る格納領域（安全関連系データの上記反転データの格納領域も含む）のみを診断処理対象としてもよく、この場合には当該診断処理対象の記憶領域についてのみ、上述したＲＡＭ診断間隔の時間保証が実現できればよい。
【００１７】
ここで、安全関連系データと非安全関連系データとの関係については、「IEC61508-2  7.4.2.3  備考1」に“従属故障の確率が故障確率より十分低い”と記載されている。つまり、非安全関連系データに起因する安全関連系データに影響する従属故障の確率を故障確率より十分小さくすることが必要とされている。しかしながら、その為の具体的な実現方法については記載されていない。
【００１８】
これに関しては、従来は、安全関連系データと非安全関連系データのＣＰＵ及びＲＡＭを別々に設けるなどの対応をしている。つまり、安全関連系データの処理・記憶用のＣＰＵ及びＲＡＭと、非安全関連系データの処理・記憶用のＣＰＵ及びＲＡＭとを設けることで、上述した従属故障の確率を故障確率より十分小さくすることを実現している。
【００１９】
つまり、安全関連系データの記憶領域と非安全関連系データの記憶領域とを完全に分離し、例えば非安全関連系データの処理の際に何らかの原因で安全関連系データの記憶領域にアクセスするような事態が生じないようにすることで、上述した従属故障の確率を故障確率より十分小さくすることを実現できる。
【００２０】
しかしながら、この方法では、ＣＰＵやＲＡＭのコストが増大してしまう。
この為、ＣＰＵ及びＲＡＭを別々に設けることなく、上述した従属故障の確率を故障確率より十分小さくすることが要望される。つまり、この場合、１つのＲＡＭ内に安全関連系データと非安全関連系データとが記憶されることになるが、この様な状況であっても上述した従属故障の確率を故障確率より十分小さくすることが要望される。
【００２１】
尚、上記特許文献１、特許文献２は、ダブルＲＡＭアルゴリズムによるＲＡＭ診断手法ではなく、よって上述したダブルＲＡＭアルゴリズムによるＲＡＭ診断手法を用いる場合のＲＡＭ診断間隔の時間保証の問題は、想到されるはずもなく、その解決手段は何等示されていない。また、安全関連系データと非安全関連系データの同一ＲＡＭ内で混在した場合の上記要望についても何等考えられていない。
【００２２】
また、非特許文献１、非特許文献２には、ダブルＲＡＭアルゴリズムによるＲＡＭ診断手法についての開示はあるが、上述したＲＡＭ診断間隔の時間保証の問題に関しては何等考えられておらず、よって当然、その解決手段は何等示されていない。
【００２３】
本発明の課題は、ダブルＲＡＭアルゴリズムを用いるＲＡＭ診断手法に係り、処理負荷や処理時間の増大を招くことなく、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現できるＲＡＭ診断装置等を提供することである。
【課題を解決するための手段】
【００２４】
本発明のＲＡＭ診断装置は、各種安全関連データがそれぞれ安全関連データ用領域内の
所定の１又は複数のアドレスに格納されるＲＡＭに対して、ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行うＲＡＭ診断装置であって、前記ＲＡＭにおける前記安全関連データ用領域内の前記各アドレス毎に対応して、該アドレスについて前記ＲＡＭ診断処理を実施済か未実施かを示す管理情報を記憶する管理情報記憶手段と、任意の前記安全関連データを前記ＲＡＭからリードする処理又は該ＲＡＭにライトする処理を行う手段あって、該リード処理の際に、該リードする安全関連データの格納領域に関して前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行うと共に、前記管理情報記憶手段における該ＲＡＭ診断処理を行った格納領域のアドレスに対応する前記管理情報を、実施済とする安全関連データアクセス処理手段と、予め決められた診断間隔で、前記管理情報記憶手段を参照して、未実施となっている管理情報に対応するアドレスに関して、前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行う診断時限保証手段とを有する。
【００２５】
上記の通り、ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理では、自己診断率が高く自己診断の効果が高いことが知られている。このアルゴリズムの診断処理は、上記安全関連データアクセス処理手段によるリード／ライト処理に伴って行われる為、予め決められた診断間隔内（所定時間内）に全てのアドレスに関してリード／ライト処理が行われる保証はない。これに対して本発明のＲＡＭ診断装置では、上記管理情報記憶手段と診断時限保証手段とを備えることで、診断時限保証手段は所定の診断間隔でそのときまでに診断未実施であったアドレスに関してのみＲＡＭ診断を行う。これにより、処理負荷や処理時間の増大を招くことなく、ＲＡＭ診断間隔の時間保証を実現でき、以って故障確率を減少させることができる。
【００２６】
また、上記ＲＡＭ診断装置において、例えば更に、前記ＲＡＭにおける前記安全関連データ用領域内の前記各アドレス毎に対応して、予め要／不要情報が登録される要／不要情報記憶手段を有し、前記安全関連データアクセス処理手段は、前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理を行った格納領域のアドレスに対応する前記要／不要情報が、不要であった場合には、前記対応する管理情報を実施済とする処理は行わず、前記診断時限保証手段は、対応する管理情報が未実施となっているアドレスであっても、該アドレスに対応する前記要／不要情報が不要となっている場合には、該アドレスに関しては前記ダブルＲＡＭアルゴリズムによるＲＡＭ診断処理は実行しないようにしてもよい。
【００２７】
要／不要情報記憶手段を設けたことで、安全関連データアクセス処理手段は管理情報を更新する処理を行わずに済むので、その分、処理時間、処理負荷を軽減できる。
【発明の効果】
【００２８】
本発明のＲＡＭ診断装置等によれば、ダブルＲＡＭアルゴリズムを用いるＲＡＭ診断手法に係り、処理負荷や処理時間の増大を招くことなく、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現できる。更に、ＣＰＵ、ＲＡＭを増設することなく、非安全関連系データに起因する安全関連系データに影響する従属故障の確率を、故障確率より十分小さくすることができる。
【図面の簡単な説明】
【００２９】
【図１】本例のＲＡＭ診断装置のブロック図である。
【図２】（ａ）〜（ｃ）は、図１に示すＲＡＭ管理テーブルのデータ構成例である。
【図３】ＲＡＭ内の各領域のアドレス例である。
【図４】安全関連データ管理領域のデータ構成例である。
【図５】安全関連データ書込部の処理フローチャート図である。
【図６】安全関連データ読込部の処理フローチャート図（その１）である。
【図７】安全関連データ読込部の処理フローチャート図（その２）である。
【図８】診断時限保証処理部の処理フローチャート図（その１）である。
【図９】診断時限保証処理部の処理フローチャート図（その２）である。
【図１０】ＥＯＲ、ＡＮＤに関する具体例を示す図である。
【図１１】非安全関連データ読み書き部の処理フローチャート図である。
【図１２】安全関連アプリケーション部の処理フローチャート図である。
【図１３】非安全関連アプリケーション部の処理フローチャート図である。
【発明を実施するための形態】
【００３０】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例のＲＡＭ診断装置の構成ブロック図である。
尚、このＲＡＭ診断装置は、例えば上述したプログラマブルコントローラシステム（制御システム）におけるコントローラ本体に相当する。上記の通り、コントローラ本体（ＣＰＵ、ＲＡＭ等を有する）は、自己診断処理として自己のＲＡＭの診断処理を行うものであり、特にこの様なＲＡＭ診断処理に係る構成を図１に示している。
【００３１】
図１に示すＲＡＭ診断装置は、ハードウェア的にはＣＰＵ１、ＲＯＭ１０、ＲＡＭ２０から成る。ＣＰＵ１は、特に図示しないアドレス線、データ線等を介して、ＲＯＭ１０、ＲＡＭ２０にアクセスして、データ・リード／ライト処理を行う。
【００３２】
ＲＡＭ２０は、本診断装置による診断対象のメモリである。ＲＡＭ２０に対する診断処理は、ＣＰＵ１が、ＲＯＭ１０に予め記憶されている各種アプリケーションプログラム（後述する）を読出し・実行することにより実現される。
【００３３】
ＲＯＭ１０には、上記各種アプリケーションとして、安全関連アプリケーション１５，非安全関連アプリケーション１６が記憶されており、また、安全関連データ書込関数１１、安全関連データ読込関数１２、非安全関連データ読み書き関数１４の各種関数や、診断時限保証タスク１３が格納されており、またＲＡＭ管理テーブル１７が格納されている。
【００３４】
上記各種関数は、上記アプリケーション１５，１６のプログラム内にインライン展開されている。すなわち、安全関連データ書込関数１１及び安全関連データ読込関数１２は安全関連アプリケーション１５のプログラム内にインライン展開され、安全関連アプリケーション１５の実行中に呼び出されてそれぞれの処理を実行する。また、非安全関連データ読み書き関数１４は、非安全関連アプリケーション１６のプログラム内にインライン展開され、非安全関連アプリケーション１６の処理を実行中に呼び出されてその処理を実行する。
【００３５】
安全関連データ書込関数１１は、ＲＡＭ２０の安全関連データ領域２２内の任意の記憶領域に任意のデータを書込むための関数である。また、安全関連データ読込関数１２は、
ＲＡＭ２０の安全関連データ領域２２内の任意の記憶領域から任意のデータを読込むための関数である。
【００３６】
また、診断時限保証タスク１３は、予め定められた診断間隔で起動し（所定時間毎に起動し）、処理実行する。
診断時限保証タスク１３は、予め定義された所定時間内に、ＲＡＭ２０における安全関連データに係る全記憶領域についての自己診断が行われることを保障するタスクである。つまり、上述してある故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現するものであり、更にこれを処理負荷や処理時間の増大を招くことなく実現するものである。つまり、診断時限保証タスク１３は、処理実行中、安全関連データ管理領域２１（ＲＡＭ診断完了ビット領域４５）を参照することで、定義された所定時間内に診断処理が行われていない記憶領域（アドレス）を判定し、当該アドレス（記憶領域）に関する診断を行う。この診断は上記ダブルＲＡＭ方式でテストデータの書込み・読出しを行うものである。
【００３７】
非安全関連読み書き関数１４は、非安全関連データ領域２３からのデータ読込みや非安全関連データ領域２３へのデータ書込み行うための関数である。
安全関連アプリケーション１５は、安全関連データに関する処理を行うアプリケーションである。
【００３８】
非安全関連アプリケーション１６は、非安全関連データに関する処理を行うアプリケーションである。
尚、上記各種アプリケーション／関数／タスク１１〜１６やテーブル１７は、ＲＯＭ１０ではなくＲＡＭ２０上に配置してもよい。
【００３９】
ここで、ＣＰＵ１は、上記各アプリケーション／関数／タスクを実行することで所定の処理機能を実現することになり、これよりＣＰＵ１は図示しないが各種処理機能部を有するものと見做してよく、本説明では以下の通り定義する。
【００４０】
すなわち、図１には示していないが、ＣＰＵ１は、安全関連アプリケーション部１５’、非安全関連アプリケーション部１６’、安全関連データ書込部１１’、安全関連データ読込部１２’、非安全関連データ読み書き部１４’、診断時限保証処理部１３’の各種処理機能部を有するものである。
【００４１】
ＣＰＵ１は、安全関連アプリケーション１５を実行することにより安全関連アプリケーション部１５’の処理機能を実現する。同様に、ＣＰＵ１は、非安全関連アプリケーション１６を実行することにより非安全関連アプリケーション部１６’の処理機能を実現する。ＣＰＵ１は、安全関連データ書込関数１１を実行することにより安全関連データ書込部１１’の処理機能を実現する。ＣＰＵ１は、安全関連データ読込関数１２を実行することにより安全関連データ読込部１２’の処理機能を実現する。ＣＰＵ１は、非安全関連データ読み書き関数１４を実行することにより非安全関連データ読み書き部１４’の処理機能を実現する。ＣＰＵ１は、診断時限保証タスク１３を実行することにより診断時限保証処理部１３’の処理機能を実現する。
【００４２】
尚、上述したことから、安全関連データ書込部１１’及び安全関連データ読込部１２’は安全関連アプリケーション部１５’に含まれると考えてもよく、同様に非安全関連データ読み書き部１４’は非安全関連アプリケーション部１６’に含まれると考えても良い。
【００４３】
そして、後述する図５は安全関連データ書込部１１’の処理フローチャート図、図６、図７は安全関連データ読込部１２の処理フローチャート図、図８、図９は診断時限保証処理部１３’の処理フローチャート図、図１１は非安全関連データ読み書き部１４’の処理
フローチャート図、図１２は安全関連アプリケーション部１５’の処理フローチャート図、図１３は非安全関連アプリケーション部１６’の処理フローチャート図と考えて良い。
【００４４】
また、ＲＡＭ管理テーブル１７には、ＲＡＭ２０を管理するための各種データが格納されている。ＲＡＭ管理テーブル１７のデータ構成は、図２に示し、後に説明する。
また、図１に示すように、ＲＡＭ２０の記憶領域は図示の領域２１〜２５の各種記憶領域から成る。すなわち、ＲＡＭ２０は、安全関連データ管理領域２１、安全関連データ領域２２、非安全関連データ領域２３、反転安全関連データ領域２４、反転安全関連データ管理領域２５を有する。
【００４５】
安全関連データ管理領域２１は、安全関連データ領域２２を管理するための情報を格納する領域である。図４に安全関連データ管理領域２１のデータ構成例を示し、後に説明するが、図４に示す各ビット情報は、初期値として全て‘０’（ビットＯＦＦ）（未実施）が格納される。
【００４６】
反転安全関連データ管理領域２５は、反転安全関連データ領域２４を管理するための情報を格納する領域である。尚、詳しくは後述するが、反転安全関連データ管理領域２５には、実質的に、安全関連データ管理領域２１のデータの反転データが格納されることになる。よって、そのデータ構成自体は安全関連データ管理領域２１と略同様であってよく、後に図４の説明の際に説明するが、そのビット情報の意味は、安全関連データ管理領域２１とは反対であり、よって初期値として各ビット情報は全て‘１’（ビットＯＮ）（未実施）が格納される。詳しくは後述する。
【００４７】
安全関連データ領域２２は、安全関連データ（可変データ）を格納する領域である。
非安全関連データ領域２３は、非安全関連データ（可変データ）を格納する領域である。
【００４８】
ここで、安全関連データとは、上記従来の課題で述べた安全関連系データに相当し、例えば制御システムにおいてプログラマブルコントローラ本体が制御対象機器の動作を制御することに関するデータ等であり、特に作業員等の安全に係わるデータである。すなわち、例えば、モータやプレス機の動作の開始／停止を指示することに係るデータである。よって、安全関連データに異常が生じた場合、それによって誤った指示が制御対象機器に送られると、突然、モータやプレス機が動作開始する等して近くにいる作業員に危険が生じる可能性がある。このように、（作業員等の）安全に関連するデータであるから、安全関連データと呼ぶ。
【００４９】
よって、ＲＡＭ２０の記憶領域のなかで特に安全関連データに関する記憶領域（安全関連データ領域２２等）に関しては、上述した「故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現する」ことが大事であり、本手法では処理負荷や処理時間の増大を招くことなくこれを実現するものである。
【００５０】
一方、上記非安全関連系データに相当する非安全関連データは、例えばランプ点灯等、誤動作しても（作業員等の）安全に特に影響しない制御に関するデータであり、よって、特にＲＡＭ診断処理を行わなくても良い。
【００５１】
尚、安全関連データ、非安全関連データは、例えばシステム構築者が任意に判断して各データを分類してよい。
反転安全関連データ領域２４は、安全関連データ領域２２のデータの反転データを格納する領域である。
【００５２】
ここで、反転データは、当該反転データに対応するデータが格納されている安全関連データ領域２２のアドレスを反転したアドレスに格納する。（例；安全関連データ領域２２において5050番地に‘０１０１’（16進数）のデータが格納されていれば、このデータの反転データ‘ＦＥＦＥ’（16進数）は、AFAF番地に格納されることになる）。
【００５３】
尚、ＲＯＭ１０の自己診断は、公知である格納されているデータのＣＲＣ（Cyclic Redundancy Check:巡回冗長度検査）などにより別途行うが、これは本手法には関係ないので説明しない。
【００５４】
図２（ａ）〜（ｃ）に、上記ＲＡＭ管理テーブル１７のデータ構成例を示す。
図２（ａ）には全体構成を示し、そのうちのＲＡＭ時限保証診断不要ビット領域（番号３１＝‘１１’）のデータ構成を図２（ｂ）に、「データ番号・データバイト数」（番号３１＝‘１２’）のデータ構成を図２（ｃ）に示す。
【００５５】
図２（ａ）に示すように、ＲＡＭ管理テーブル１７は番号３１と管理情報３２からなる。
番号３１は、各項目（レコード）を特定するための一意の通し番号である。
【００５６】
管理情報３２には、番号３１＝‘１’〜‘１０’に関しては特定のアドレスが格納され、番号３１＝‘１１’、‘１２’に関しては図２（ｂ）、（ｃ）に示すデータが格納される。
【００５７】
まず、番号３１＝‘１’〜‘１０’の管理情報３２（アドレス）について説明する。
図示の安全関連データ管理領域先頭アドレス（番号３１＝‘１’）、安全関連データ管理領域最終アドレス（番号３１＝‘２’）は、それぞれ、ＲＡＭ２０の安全関連データ管理領域２１の先頭アドレス、最終アドレスである。
【００５８】
安全関連データ領域先頭アドレス（番号３１＝‘３’）、安全関連データ領域最終アドレス（番号３１＝‘４’）は、それぞれ、ＲＡＭ２０の安全関連データ領域２２の先頭アドレス、最終アドレスである。
【００５９】
非安全関連データ領域先頭アドレス（番号３１＝‘５’）、非安全関連データ領域最終アドレス（番号３１＝‘６’）は、それぞれ、ＲＡＭ２０の非安全関連データ領域２３の先頭アドレス、最終アドレスである。
【００６０】
反転安全関連データ領域先頭アドレス（番号３１＝‘７’）、反転安全関連データ領域最終アドレス（番号３１＝‘８’）は、それぞれ、ＲＡＭ２０の反転安全関連データ領域２４の先頭アドレス、最終アドレスである。
【００６１】
反転安全関連データ管理領域先頭アドレス(番号３１＝‘９’)、反転安全関連データ管理領域最終アドレス（番号３１＝‘１０’）は、それぞれ、ＲＡＭ２０の反転安全関連データ管理領域２５の先頭アドレス、最終アドレスである。
【００６２】
ＲＡＭ時限保証診断不要ビット領域（番号３１＝‘１１’）には、ＲＡＭ２０の安全関連データ領域２２内の各アドレス（各番地；１バイト単位）毎に対応付けて、そのアドレスに対する時限保証診断処理の要／不要を示すビット情報を格納する。詳細は図２（ｂ）に示し後に説明する。
【００６３】
ＲＡＭ時限保証診断不要ビット領域（番号３１＝‘１１’）の内容は、例えば本システムの開発者等が任意に決定して設定する。基本的には、ＲＡＭ２０の安全関連データ領域
２２内の当該アドレスからのデータ読み込み処理が、上記予め定義された所定時間内に確実に発生する場合に、当該アドレスに対応する上記ビット情報を‘１’にする。データ読み込み処理が行われれば安全関連データ読込関数１２による処理によって当該アドレスに関する診断が行われるからである。つまり、換言すれば、上記予め定義された所定時間内に確実にデータ読込みに伴う診断処理があると考えられるアドレスに関しては、予め当該アドレスに対応する上記ビット情報を‘１’に設定しておく。定義した時間内に確実に診断処理があるか否かは、例えば処理の静的解析等により開発時に開発者等が決定する。
【００６４】
尚、ＲＡＭ時限保証診断不要ビット領域における各ビットの先頭からの相対ビット数は、安全関連データ領域２２の先頭からの相対アドレス（１バイト単位）と一致させる。また、尚、ＲＡＭ時限保証診断不要ビット領域は、例えば通常運転時の診断と初期時の診断など診断の種類に対応させて複数設けても良い。
【００６５】
データ番号・データバイト数（番号３１＝‘１１’）は、例えば図２（ｃ）に示すテーブル情報であり、ＲＡＭ２０の上記安全関連データ領域２２、非安全関連データ領域２３に格納されている各データに対して一意に付けた通し番号４３に対応付けて、当該データのバイト数４３が格納されている。これは開発時に開発者等が任意に定義したデータ番号とデータのバイト数が格納されるものである。
【００６６】
以下、図２（ｂ）を参照してＲＡＭ時限保証診断不要ビット領域の具体例について説明する。
図示の例のＲＡＭ時限保証診断不要ビット領域４１は、図示の通り多数のビット情報（bit０、bit1、bit2、・・・bitn・・・bit(n+2)）より構成される。上記の通り、これら各ビット情報は、それぞれ、安全関連データ領域２２における各アドレス（１バイト単位）に対応する情報であり、そのアドレスに関して時限保証診断要か時限保証診断不要かを示している。本例ではビット情報＝‘１’は時限保証診断不要、ビット情報＝‘０’は時限保証診断要を意味するものとする。
【００６７】
例えば、ＲＡＭ時限保証診断不要ビット領域４１における先頭ビット（先頭からの相対ビット数＝０のビット；bit０）は、安全関連データ領域２２の先頭アドレス（安全関連データ領域２２の先頭からの相対アドレス＝０のアドレス；「先頭アドレス＋０」と記すものとする）に対応するものであり、もしbit０＝‘１’であったならば、領域２２の先頭アドレスについては時限保証診断不要と設定されていることになる。一方、bit０＝‘０’であったならば、領域２２の先頭アドレスについては時限保証診断要と設定されていることになる。
【００６８】
尚、bit０以外のビットもbit０と同様であり、例えば、ＲＡＭ時限保証診断不要ビット領域４１における先頭からの相対ビット数＝１のビット（bit１）は、安全関連データ領域２２の“先頭アドレス＋1”のアドレスに対応する診断要／不要を示すビット情報である。同様に、例えば、ＲＡＭ時限保証診断不要ビット領域４１における先頭からの相対ビット数＝ｎのビット（bit ｎ）は、安全関連データ領域２２の“先頭アドレス＋ｎ”のアドレスに対する時限保証診断要／不要を示すビット情報である。
【００６９】
例えば、図３に示す例では、安全関連データ領域２２には７０００番地〜７ＦＦＦ番地までの各アドレスが割り当てられており、その先頭アドレスは７０００番地であり、よって上記bit０(相対ビット数＝０)はこの７０００番地（7000番地＋０）に対応するビット情報である。同様に、上記bit１（相対ビット数＝１）は７００１番地（7000番地＋１）に対応するビット情報であり、bit２（相対ビット数＝２）は７００２番地（７０００番地＋２）に対応するビット情報である。
【００７０】
尚、上記ＲＡＭ時限保証診断不要ビット領域４１の各ビット情報は、上記の通り開発者等が判断して設定するが、基本的には、各データ毎に対応付けて設定する。例えば上記図２（ｃ）に示す「データ番号・データバイト数」４２のテーブルのデータ番号４３＝‘１’、データバイト数４４＝‘４’のデータが、仮に安全関連データ領域２２の先頭アドレスから４バイト分の領域に格納されるデータであった場合、開発者等はこのデータに関して診断不要か診断要かを判断して、上記ＲＡＭ時限保証診断不要ビット領域４１における対応するビット情報を設定する。つまり、この場合、ＲＡＭ時限保証診断不要ビット領域４１における先頭から４ビット分（図示のbit０、bit1、bit2と、更に図示していないがbit3）を設定する。もし、このデータに関しては時限保証診断不要と判断したならば、この４ビットは全て‘１’に設定され、このデータに関しては時限保証診断要と判断したならば、この４ビットは全て‘０’に設定されることになる。
【００７１】
図４は、上記安全関連データ管理領域２１のデータ構成例である。
安全関連データ管理領域２１には、図４に示すＲＡＭ診断完了ビット領域４５が含まれる。ここでは、安全関連データ管理領域２１＝ＲＡＭ診断完了ビット領域４５と見做してもよい。つまり、以下の説明における安全関連データ管理領域２１は、ＲＡＭ診断完了ビット領域４５のことであると考えても良い（その逆も同様）。
【００７２】
図４に示すように、安全関連データ管理領域２１も、上記ＲＡＭ時限保証診断不要ビット領域４１と略同様に、それぞれが安全関連データ領域２２における各アドレス（１バイト単位）に対応付けた複数のビット情報より成る。これら各ビット情報は、それが対応する安全関連データ領域２２のアドレスについてＲＡＭ診断処理を実行済みか未実行であるかを示すものであり、ここではビット‘１’(on)は実行済み（完了）を意味し（定義した時間内にＲＡＭ診断を完了したことを示し）、ビット‘０’(off)は未実行（未完了）を意味するものとする。初期値は、全ビット‘０’とする。
【００７３】
例えば図示の先頭ビット（ＲＡＭ診断完了ビット領域４５における先頭からの相対ビット数＝０のビット；bit0）は、安全関連データ領域２２の先頭アドレス（「先頭アドレス＋０」；本例では７０００番地）に対応するビット情報であり、基本的には、bit0＝‘１’であったならば先頭アドレスについては既に診断処理実行済みであり、bit0＝‘０’であったならば先頭アドレスについて未だ診断処理を行っていないことを意味する。但し、時限保証診断不要の場合には、診断処理実行済みであってもビットＯＦＦ‘０’のままである。これについては後に説明するが、時限保証診断不要の場合にはビットＯＮとする処理を行わずに済むので、この処理の分、処理時間を減少させ処理負荷を軽減することができる。
【００７４】
尚、bit０以外のビットもbit０と同様であり、例えば、安全関連データ管理領域２１における先頭からの相対ビット数＝１のビット（bit１）は、安全関連データ領域２２の“先頭アドレス＋1”のアドレスに対する診断完了／未完了を示すビット情報である。同様に、例えば、安全関連データ管理領域２１における先頭からの相対ビット数＝ｎのビット（bitｎ）は、安全関連データ領域２２の“先頭アドレス＋ｎ”のアドレスに対する診断完了／未完了を示すビット情報である。
【００７５】
反転安全関連データ管理領域２５のデータ構成も、図４に示すものと同様であってよい。但し、その意味は異なる。つまり、ビット‘１’(on)は診断未実行（未完了）を意味し、ビット‘０’(off)は診断実行済み（完了）を意味するものとする。よって、初期値は、全ビット‘１’とする。また、各ビット情報が対応するアドレスも、上記安全関連データ管理領域２１のものとは異なる（例えば、先頭ビットは７０００番地に対応するものではない）が、これについては後にフローチャートの説明の際に説明する。
【００７６】
以下、上記ＲＯＭ１０に格納されている各関数／タスク／アプリケーションを、ＣＰＵ１が読出・実行することにより実現される処理について、図５〜図１３を参照して説明する。
【００７７】
尚、上述してある通り、図５は安全関連データ書込部１１’の処理フローチャート図、図６、図７は安全関連データ読込部１２’の処理フローチャート図、図８、図９は診断時限保証処理部１３’の処理フローチャート図、図１１は非安全関連データ読み書き部１４’の処理フローチャート図、図１２は安全関連アプリケーション部１５’の処理フローチャート図、図１３は非安全関連アプリケーション部１６’の処理フローチャート図である。
【００７８】
まず、図５の処理について説明する。
上記の通り、図５は、安全関連データ書込部１１’の処理フローチャート図である。すなわち、安全関連データ書込関数１１によって実現される機能処理を示すフローチャート図である。
【００７９】
尚、図５の処理に対するパラメータ（入力）は、下記の通りである。このパラメータは、安全関連アプリケーション部１５’から渡される。
・データ番号（ＲＡＭ２０に書き込む（書込対象の）安全関連データの上記データ番号）・書込アドレス（上記書込対象の安全関連データを書き込む領域の先頭アドレス）
・書込データ（上記書込対象の安全関連データ）
・書込データバイト数（上記書込データのデータサイズ（バイト単位））
また、図５の処理による関数値（処理結果）は下記の情報であり、通常、これらは数値化されている（例えば、正常終了→１、異常終了→０）。
【００８０】
・正常終了／異常終了
また尚、当該関数１１は安全関連アプリケーション１５のプログラム内にインライン展開する。これにより、ＲＡＭ２０内のスタック領域（不図示）を使用しないようにする。ＲＡＭ２０の不図示のスタック領域は、不図示のスタック割込処理がコントロールする領域であり、診断処理を適用できないからである。
【００８１】
安全関連アプリケーション１５は、その処理実行中に任意の安全関連データをＲＡＭ２０内の任意のアドレスに書き込むイベントが発生した場合、当該関数１１を呼び出して上記パラメータを渡す。これにより図５の処理が実行される。
【００８２】
図５の処理は、まず、ＲＡＭ管理テーブル１７から安全関連データ領域先頭アドレス（番号３１＝‘３’）と安全関連データ領域最終アドレス（番号３１＝‘４’）を読込む。また、上記パラメータの書込アドレスと書込データバイト数とに基づいて、上記書込データ（書込対象の安全関連データ）を書き込む領域のアドレス範囲（先頭アドレスと最終アドレス）を計算する（ステップＳ１１）。上記の通り、書込アドレス＝先頭アドレスであり、本例では例えば「書込アドレス＋書込データバイト数−１」を最終アドレスとしてよい。
【００８３】
そして、上記読込んだ先頭／最終アドレスにより上記安全関連データ領域２２のアドレス範囲が分かるので、上記書込データを書き込む領域のアドレス範囲がこの安全関連データ領域２２のアドレス範囲内（領域内）に入っているか否かをチェックする（ステップＳ１２）。安全関連データ領域２２内に入っている場合にはチェックＯＫと判定し（ステップＳ１２，ＹＥＳ）ステップＳ１３の処理へ移行し、そうでない場合（一部でも領域２２外である場合）にはチェックＮＧと判定し（ステップＳ１２，ＮＯ）、異常終了とする（ステップＳ２１）。
【００８４】
このチェック処理は、図１に示すＲＡＭ２０のように安全関連データと非安全関連データとが記憶される場合において、何らかの理由で誤って安全関連アプリケーション１５（その関数１１や関数１２）による処理で他の領域（特に非安全関連データ領域２３）にアクセスすることが無いようにする為のものである（よって、リード時も同様の処理を行う）。また、後述する図１１は非安全関連データ読み書き部１４’の処理においても、誤って他の領域（特に安全関連データ領域２２）にアクセスすることが無いように、同様のチェック処理を行っている。これによって、ＣＰＵ、ＲＡＭを増設することなく、非安全関連系データに起因する安全関連系データに影響する従属故障の確率を、故障確率より十分小さくすることができる。
【００８５】
ステップＳ１３では、上記パラメータの書込データバイト数に関するチェックを行う。すなわち、上記パラメータのデータ番号を用いて上記図２（ｃ）に示す「データ番号・データバイト数」４２のテーブルを検索して、該当するレコードのデータバイト数４４を取得し、上記パラメータの書込データバイト数がこのデータバイト数４４と一致するか否かをチェックする。不一致であれば（ステップＳ１３，ＮＯ）、異常終了とする（ステップＳ２１）。一致する場合には（ステップＳ１３，ＹＥＳ）ステップＳ１４以降の処理へ移行する。
【００８６】
尚、本例のＲＡＭ２０の上記安全関連データ領域２２に格納される各データは、予め決まった種類のデータである。例えば上記図２（ｃ）に示す「データ番号・データバイト数」４２におけるデータ番号４２＝‘１’のデータはセンサＡによって検出されるデータ（例えばモータ回転数）、データ番号４２＝‘２’のデータはセンサＢによって検出されるデータ（例えばステージ位置）等というように、予め決められている。また、各データのデータ量（データバイト数）は一定であり、例えば、上記センサＡによって検出されるデータは必ず４バイトである（これより、上記ステップＳ１３の判定を行っている）。そして、例えば、定期的にセンサＡによって検出されるデータを取得して、この取得データを上記安全関連データ領域２２においてデータ番号４２＝‘１’のデータ格納領域に上書き記憶する処理を行う（最新のデータへと更新する）。この処理の際に図５の処理が実行される。また、上記データ番号４２＝‘１’のデータ格納領域から上記センサＡの最新データを読み出す際には、後述する図６、図７の処理が実行される。
【００８７】
以下、ステップＳ１４以降の処理について説明する。
まず、上記パラメータの書込データを、当該パラメータの書込アドレス、書込バイト数に従って、ＲＡＭ２０の安全関連データ領域２２内の該当領域に書込む（ステップＳ１４）。
【００８８】
次に、上記書込データの反転データを、ＲＡＭ２０の反転安全関連データ領域２４内の該当領域に書き込む処理、すなわちステップＳ１５〜Ｓ１９の処理を実行する。
これは、まず、上記書込アドレスを反転することで、反転安全関連データ領域２４における上記反転データの書き込みアドレス範囲を求める（このアドレス範囲の先頭アドレスと最終アドレスを求める）（ステップＳ１５）。これは、上記ステップＳ１１で計算した書込アドレス範囲の先頭アドレスと最終アドレスそれぞれについてアドレス反転を行うものである。尚、例えばアドレス‘０１０１’（１６進）の反転アドレスは‘ＦＥＦＥ’である。
【００８９】
アドレス反転を行うのは、ＲＡＭの制御は、アドレス制御機構とビット制御機構で行われているからである。すなわち、単にデータ反転を行うだけではビット制御機構の異常チェックしか出来ないので、アドレス反転によりアドレス制御機構の異常チェックも行えるようにしている。
【００９０】
続いて、ＲＡＭ管理テーブル１７から反転安全関連データ領域先頭アドレス（番号３１＝‘７’）と反転安全関連データ領域最終アドレス（番号３１＝‘８’）を読込む（ステップＳ１６）。これより、反転安全関連データ領域２４のアドレス範囲が分かるので、上記ステップＳ１５で求めたアドレス範囲が、この反転安全関連データ領域２４のアドレス範囲内（領域内）に入っているか否かをチェックする（ステップＳ１７）。つまり、上記ステップＳ１２と同様の処理を、反転データに関して行う。
【００９１】
反転安全関連データ領域２４内に入っていればチェックＯＫであり（ステップＳ１７，ＹＥＳ）、ステップＳ１８の処理へ移行する。一方、上記ステップＳ１５で求めたアドレス範囲が、その一部でも反転安全関連データ領域２４外であるならばチェックＮＧとして（ステップＳ１７，ＮＯ）、異常終了する（ステップＳ２１）。
【００９２】
ステップＳ１８の処理では、上記パラメータの書込データを反転して反転データを生成する。そして、この反転データを、上記ステップＳ１５で求めたアドレス範囲（反転安全関連データ領域２４における該当領域）に書き込む（ステップＳ１９）。そして、正常終了の関数値をセットし終了する（ステップＳ２０）。尚、上記ステップＳ２１は異常終了の関数値をセットし終了するものである。
【００９３】
次に、以下、安全関連データ読込部１２’（安全関連データ読込関数１２）による処理について説明する。
図６、図７は安全関連データ読込部１２’の処理フローチャート図である。尚、これは、１つのフローチャート図を２つの図面に分けて示しているものである。
【００９４】
尚、本処理に対するパラメータ（入力）は、下記の通りとする。
・データ番号（ＲＡＭ２０から読込む安全関連データ（読込対象データ）のデータ番号）・読込アドレス（ＲＡＭ２０における上記読込対象データの格納領域の先頭アドレス）
・読込データバイト数（上記読込対象データのデータサイズ（バイト単位））
・ＲＡＭ管理テーブル１７のＲＡＭ時限保証診断不要ビット領域４１の情報
また、下記を復帰データとする。
・読込データ
また、下記を関数値とする。
・データ正常／データ異常／異常終了
尚、当該関数１２は、安全関連アプリケーション１５のプログラム内にインライン展開する。これにより、ＲＡＭ２０内のスタック領域（不図示）を使用しないようにする。安全関連アプリケーション１５は、その処理実行中に任意の安全関連データをＲＡＭ２０から読み込むイベントが発生した場合、関数１２を呼び出して上記パラメータを渡す。これにより図６、図７の処理が実行される。
【００９５】
本処理は、図６に示すように、まず、ＲＡＭ管理テーブル１７から安全関連データ領域先頭アドレス（番号３１＝‘３’）と安全関連データ領域最終アドレス（番号３１＝‘４’）を読込む。また、上記パラメータの読込アドレスと読込データバイト数に基づいて、上記読込対象データの格納領域のアドレス範囲（先頭アドレスと最終アドレス）を計算する（ステップＳ３１）。上記の通り、パラメータの読込アドレス＝先頭アドレスであり、本例では例えば「読込アドレス＋読込データバイト数−１」を最終アドレスとしてよい。
【００９６】
そして、上記読込んだ先頭／最終アドレスにより上記安全関連データ領域２２のアドレス範囲が分かるので、上記読込対象データの格納領域が、安全関連データ領域２２に入っているか否かをチェックする（ステップＳ３２）。安全関連データ領域２２内に入っている場合にはチェックＯＫと判定し（ステップＳ３２，ＹＥＳ）ステップＳ３３の処理へ移
行し、そうでない場合（一部でも領域２２外である場合）にはチェックＮＧと判定し（ステップＳ３２，ＮＯ）、異常終了とする（ステップＳ４４）。
【００９７】
このチェック処理の意味については既に上記ステップＳ２１の説明ので述べた内容と同様である。
ステップＳ３３では、上記パラメータの読込データバイト数に関するチェックを行う。すなわち、上記パラメータのデータ番号を用いて上記図２（ｃ）に示す「データ番号・データバイト数」４２のテーブルを検索して、該当するレコードのデータバイト数４４を取得し、上記パラメータの読込データバイト数がこのデータバイト数４４と一致するか否かをチェックする。このチェック処理の意味も上記ステップＳ１３の場合と略同様である。不一致であれば（ステップＳ３３，ＮＯ）、異常終了とする（ステップＳ４４）。一致する場合には（ステップＳ３３，ＹＥＳ）ステップＳ３４以降の処理へ移行する。
【００９８】
以下、ステップＳ３４以降の処理について説明する。
尚、以下のステップＳ３４〜Ｓ３８の処理の間は、レベルマスクなどにより排他制御をする。
【００９９】
概略的には、ステップＳ３４〜Ｓ４０の処理は、上記読込対象データをＲＡＭ２０からリードすると共に、上述したダブルＲＡＭアルゴリズムにより上記読込対象データの格納領域に対するＲＡＭ故障診断を行うものである。そして、更にステップＳ４１で時限保証診断の要／不要を判定し、時限保証診断要の場合には（ステップＳ４１，ＮＯ）、図７に示す処理を実行する。つまり、時限保証診断要の場合には図７の処理によりＲＡＭ診断完了ビット領域４５における該当ビットをＯＮ（完了）とするが、不要の場合にはこの処理は行わない。不要の場合には時限保証診断処理を行う時点では既に診断が行われているはずであり、該当ビットＯＮ（完了）する処理は省けると考えられるからである。そして、後述する“ＥＯＲ”の処理により、ビットＯＦＦ（未完了）のままであっても、時限保証診断の処理対象とはならない。図７の処理を行わずに済む分だけ、処理時間を短縮でき処理負荷を軽減できる。
【０１００】
尚、上記該当ビットとは、上記読込対象データの格納領域（１以上のアドレス）に対応するビット情報である。
尚、上記診断不要ビット領域４１を用いることは、必ず必要なものではなく、無くても良い。この場合には、ステップＳ４１の処理は必要なく、必ず図７の処理を行うことになる。また、この場合には後述する“ＥＯＲ”の処理や“ＡＮＤ”の処理も必要なく、単純に、ＲＡＭ診断完了ビット領域４５を参照して、未完了であるビット情報に対応するアドレスを、時限保証診断の処理対象とすればよい。
【０１０１】
ステップＳ３４以降の処理では、まず、上記ステップＳ３１で求めた上記読込対象データの格納領域のアドレス範囲に応じて、ＲＡＭ２０からこのアドレス範囲のデータを読み出す（これが上記復帰データとしての読込データとなる）（ステップＳ３４）。
【０１０２】
次に、当該読込対象データの格納領域のアドレス範囲（先頭アドレスと最終アドレス）を反転する（これを反転アドレス範囲と呼ぶものとする）（ステップＳ３５）。また、ＲＡＭ管理テーブル１７から反転安全関連データ領域先頭アドレス（番号３１＝‘７’）と反転安全関連データ領域最終アドレス（番号３１＝‘８’）を読込む（ステップＳ３６）。これにより上記反転安全関連データ領域２４のアドレス範囲が分かるので、上記ステップＳ３５で得た反転アドレス範囲が、反転安全関連データ領域２４内に入っているか否かをチェックする（ステップＳ３７）。
【０１０３】
もし、反転アドレス範囲の一部でも領域２４内に入っていない場合にはチェックＮＧと
し（ステップＳ３７，ＮＯ）、異常終了する（ステップＳ４４）。一方、反転アドレス範囲の全てが領域２４内に入っている場合にはチェックＯＫとし（ステップＳ３７，ＹＥＳ）、ステップＳ３８以降の処理を実行する。
【０１０４】
まず、ＲＡＭ２０における上記反転アドレス範囲の記憶領域からデータを取得する（ステップＳ３８）。そして、取得したデータを反転し（ステップＳ３９）、この反転データが上記ステップＳ３４で得た読込データと一致するか否かを確認する（ステップＳ４０）。不一致の場合には（ステップＳ４０，ＮＯ）データ異常（ステップＳ４３）とし、処理終了する。
【０１０５】
一方、一致する場合には（ステップＳ４０，ＹＥＳ）、基本的には正常終了（診断ＯＫ）とし（ステップＳ４２）、上記ステップＳ３４で得た読込データを安全関連アプリケーション部１５’に返すことになるが、その前にステップＳ４１の判定処理を実行し、判定「不要」の場合には（ステップＳ４１，ＹＥＳ）そのまま上記ステップＳ４２の処理を実行して本処理を終了するが、判定「要」の場合（ステップＳ４１，ＮＯ）には図７の処理を実行後、上記ステップＳ４２の処理を実行して本処理を終了する（但し、図７の処理において異常終了（ステップＳ４４）となる可能性もある。
【０１０６】
尚、ステップＳ４２は正常終了の関数値をセットするものであり、ステップＳ４３はデータ異常の関数値をセットするものであり、ステップＳ４４は異常終了の関数値をセットするものである。
【０１０７】
ステップＳ４１の処理では、パラメータとして与えられている、ＲＡＭ管理テーブル１７のＲＡＭ時限保証診断不要ビット領域４１（番号３１＝‘１１’）のビット情報に基づいて、上記読込対象データの格納領域に関する時限保証診断処理の要／不要を判定する。すなわち、上記ステップＳ３１で求めた上記読込対象データの格納領域のアドレス範囲に基づいて、このアドレス範囲内の各アドレスに対応するＲＡＭ時限保証診断不要ビット領域４１の各ビット情報を参照し、これらビット情報が全て‘１’であれば「時限保証診断処理は不要」と判定し（ステップＳ４１，ＹＥＳ）そのまま上記ステップＳ４２の処理を実行する。一方、上記ビット情報が全て‘０’であれば、「時限保証診断処理要」と判定し（ステップＳ４１，ＮＯ）、図７のステップＳ４５以降の処理へ移行する。
【０１０８】
尚、時限保証診断処理の要／不要は、本例ではデータ単位で設定される為、開発者等が設定ミスしない限り、上記読込対象データに対応する各ビット情報は、全て‘１’であるか全て‘０’であるかのどちらかである。本説明では、開発者等が設定ミスするケースは考慮しないものとして説明する。
【０１０９】
以下、図７に示すステップＳ４５以降の処理について説明する。
まず、上記読込対象データの格納領域に対応する安全関連データ管理領域２１のビット情報群（該当ビット情報群というものとする）の範囲（先頭位置と最終位置）を計算する（ステップＳ４５）。尚、読込対象データの格納領域が１アドレスであった場合、先頭位置＝最終位置となる。また、この場合、厳密にはビット情報群ではなくビット情報となるが、特に区別せず説明するものとする。
【０１１０】
上記該当ビット情報群の範囲における上記先頭位置は、以下の計算式（１）の商と余りから得られる。
尚、安全関連データ管理領域２１における各ビット情報の位置は、後述するように「アドレス（番地）におけるアドレス内相対ビット数α（α；０〜７）」（アドレス（番地）における＋α）で表すものとする。
【０１１１】
（安全関連データ領域の先頭アドレスからの相対バイト数）／８  ・・・（１）式
上記「安全関連データ領域の先頭アドレスからの相対バイト数」は、上記パラメータの読込アドレス（読込対象データの格納領域の先頭アドレス）から上記ステップＳ３１で取得した安全関連データ領域２２の先頭アドレスを差し引くことで求められる。例えば、上記パラメータの読込アドレスが７００２番地であったならば、本例では安全関連データ領域２２の先頭アドレスは７０００番地であるので、上記「安全関連データ領域の先頭アドレスからの相対バイト数」＝７００２−７０００＝０００２となる（アドレスは１バイト単位なので、“先頭アドレスからの相対バイト数”は“先頭アドレスからの相対アドレス”と考えてよい）。
【０１１２】
上記計算式（１）の商が安全関連データ管理領域２１の先頭からの相対アドレスになり、余りが当該アドレス内の先頭からの相対ビット数（先頭から何番目のビットか；上記の通り、ここでは先頭ビットは先頭から０番目と定義する）になる。つまり、商をｍ、余りをｎとするならば、上記（１）式で求める位置は「ｍ番地における＋ｎ」となる（このｎは上記αに相当し、よって０〜７の何れかの値となる）。
【０１１３】
上記「ｍ番地における＋ｎ」は安全関連データ管理領域２１の先頭からの相対位置を意味するので、これを絶対位置に変換する。つまり、例えば、安全関連データ管理領域２１の先頭アドレス＝３０００番地であるならば、上記（１)式で求めた位置の絶対位置は“（３０００＋ｍ）番地における＋ｎ”となる。
【０１１４】
図４に示す安全関連データ管理領域２１のビット情報群は、実際には図３に示すようにバイト単位で格納されており、１バイト分のビット情報群は、安全関連データ領域２２の８バイト分に対応するものである。
【０１１５】
例えば、図４に示す例では安全関連データ管理領域２１は３０００番地から始まり、安全関連データ領域２２は７０００番地から始まる。この例において、例えば３０００番地のビット情報群（１バイト）は、７０００番地〜７００７番地に対応する情報である。同様に、３００１番地のビット情報群（１バイト）は、７００８番地〜７００Ｆ番地に対応する情報である。そして、安全関連データ管理領域２１の各ビット情報の位置は、「アドレス（番地）における＋相対ビット数α（α；０〜７）」で表されるものとする。このαが上記“アドレス内の先頭からの相対ビット数”に相当する。
【０１１６】
これより、例えば、位置「３０００番地における＋０」のビット情報は７０００番地に対応するビット情報であり、位置「３０００番地における＋７」のビット情報は７００７番地に対応するビット情報であり、位置「３００１番地における＋０」のビット情報は７００８番地に対応するビット情報であることになる。各ビット情報は、それが対応する安全関連データ領域２２のアドレスに関して診断完了か未完了かを示すものとなる。
【０１１７】
この例において、上記パラメータの読込アドレスが７００９番地であったならば、上記「安全関連データ領域の先頭アドレスからの相対バイト数」＝９となるので、上記（１）式の商＝１、余り＝１となり、よって上記ステップＳ４５で求める先頭位置は「３００１番地における＋１」（α＝１）となる。つまり、３００１番地における先頭から１番目のビット位置となる。また、ステップＳ４５で求める最終位置は、上記のように求めた先頭位置におけるαに上記パラメータにおける読込データバイト数（仮にβとする）をプラスしてから−１デクリメントすればよい。つまり、“α＋（β−１）”を最終位置のαとすればよい。上記の例において仮にβ＝３であったならば、最終位置は「３００１番地における＋３」となる。
【０１１８】
尚、“α＋（β−１）”＞７であったならば、番地を＋１して、「“α＋（β−１）”
−８」を最終位置のαとすればよい。上記の例において仮にβ＝９であったならば、最終位置は「“３００１＋１”番地における＋（“１＋（９−１）”−８）」＝「３００２番地における＋１」となる。
【０１１９】
次に、ＲＡＭ管理テーブル１７から安全関連データ管理領域２１の先頭アドレスと最終アドレス（アドレス範囲）を読込む（ステップＳ４６）。
そして、ステップＳ４５で計算したアドレス範囲が、ステップＳ４６で読み込んだアドレス範囲内に入っているか否かをチェックする（ステップＳ４７）。範囲内に入っていればチェックＯＫとして（ステップＳ４７，ＹＥＳ）ステップＳ４８以降の処理へ移行する。一方、ステップＳ４５で計算したアドレス範囲の一部でも、ステップＳ４６で読み込んだアドレス範囲外であったならば、チェックＮＧとして（ステップＳ４７，ＮＯ）、上記異常終了（ステップＳ４４）とする。
【０１２０】
上記チェックＯＫの場合、安全関連データ管理領域２１において上記ステップＳ４５で求めた範囲内の全ビット情報をＯＮ‘１’する（ステップＳ４８）。これは、例えば、上記ステップＳ４５で計算した先頭位置から後ろ（下位）に上記パラメータの読込バイト数分オンする等であってもよい。上記の例では、先頭位置＝「３００１番地における＋１」であり、例えば上記β＝３の例の場合には、「３００１番地における＋１」、「３００１番地における＋２」、「３００１番地における＋３」（＝最終位置）の３つのビット情報がＯＮになる。
【０１２１】
次に、ステップＳ４５で計算した範囲の先頭位置、最終位置をそれぞれ反転することで、反転安全関連データ管理領域２５における該当ビット情報群の位置範囲を求める。すなわち、上記読込対象データの反転データの格納領域に対応するビット情報群の位置範囲（先頭位置、最終位置）を求める（ステップＳ４９）。尚、この位置範囲を反転範囲、その先頭位置を反転先頭位置、最終位置を反転最終位置というものとする。
【０１２２】
上記の例では、先頭位置＝「３００１番地における＋１」なのでこれを反転した反転先頭位置は「ＣＦＦＥ番地における＋６」となる。同様に、最終位置＝「３００１番地における＋３」なのでこれを反転した反転最終位置は「ＣＦＦＥ番地における＋４」となる。尚、位置「番地における＋α」のαの部分に関しては、“反転位置のα”＝「７−α」となる（つまり、番地だけでなく番地内におけるビットの順番も反転する）。尚、これによって、反転位置は、上記の通り、反転最終位置（ＣＦＦＥ番地における＋４）の方が反転先頭位置（ＣＦＦＥ番地における＋６）よりも先となる（これより後述するステップＳ５２では、上記ステップＳ４８のような“下位”ではなく、“上位”となる）。
【０１２３】
次に、ＲＡＭ管理テーブル１７から反転安全関連データ管理領域先頭アドレス（番号３１＝‘９’）と反転安全関連データ管理領域最終アドレス（番号３１＝‘１０’）を読込む（ステップＳ５０）。そして、ステップＳ４９で得た位置範囲（反転先頭位置〜反転最終位置）が、反転安全関連データ管理領域２５内に入っているか（上記ステップＳ５０で読み込んだアドレス範囲内に入っているか）否かを判定する（ステップＳ５１）。
【０１２４】
領域２５内に入っていればチェックＯＫとして（ステップＳ５１，ＹＥＳ）ステップＳ５２の処理を行う。一方、ステップＳ４９で得たアドレス範囲の一部でも領域２５外である場合にはチェックＮＧとして上記ステップＳ４４の異常終了とする。
【０１２５】
ステップＳ５２では、反転安全関連データ管理領域２５において、上記ステップＳ４９で得た位置範囲内の全ビット情報をオフ（０）する。これは、ステップＳ４９で得た反転先頭位置から前（上位）に上記パラメータの読込バイト数分オンする等であってもよい。上記の例では、「ＣＦＦＥ番地における＋６」、「ＣＦＦＥ番地における＋５」、「ＣＦ
ＦＥ番地における＋４」の３つのビット情報がＯＦＦになる。
【０１２６】
このようにして、反転安全関連データ管理領域２５において、上記読込対象データの反転データの格納領域に対応するビット情報群が全てビットＯＦＦとなる。上述してあるように、これは、診断済み（完了）を意味する。
【０１２７】
ステップＳ５２の処理後は、上記ステップＳ４２の正常終了となる。
尚、ステップＳ４８〜Ｓ５２の処理の間は、レベルマスクなどにより排他制御をする。また、ステップＳ４５以降の処理ではＲＡＭの当該アドレスの読込を条件に診断完了ビットをオンしているが、書込と読込のＡＮＤ条件で診断完了ビットをオンすることにしても良い。
【０１２８】
次に、以下、診断時限保証処理部１３’の処理について説明する。
図８、図９は診断時限保証処理部１３’（診断時限保証タスク１３）による処理フローチャート図である。尚、これは、１つのフローチャート図を２つの図面に分けて示しているものである。
【０１２９】
尚、本処理は、ＲＡＭ２０の診断間隔として定義した所定時間毎に起動する。ここでは、仮に、診断間隔＝１時間と定義したなら、１時間経過する毎に起動する。そして、図８、図９の処理によって、この１時間内に診断処理が行われていない記憶領域について、診断処理を実行することになる。この１時間内の任意のときに既に診断処理が行われている記憶領域については、本処理では診断処理は行わない。つまり、ダブルＲＡＭアルゴリズムを用いるＲＡＭ診断手法において、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現できると共に、無駄な処理が行われないので、処理負荷や処理時間の増大を招くことはない。
【０１３０】
尚、本処理は、安全関連アプリケーション１５の処理より優先レベルの高いタスクレベルで動作する。
まず、図８に示すように、本処理に必要な各種データを読み込む（ステップＳ６１）。すなわち、安全関連データ管理領域２１の先頭アドレス（番号３１＝‘１’）と最終アドレス（番号３１＝‘２’）を、ＲＡＭ管理テーブル１７から読込む。また、反転安全関連データ管理領域２５の先頭アドレス（番号３１＝‘９’）と最終アドレス（番号３１＝‘１０’）を、ＲＡＭ管理テーブル１７から読込む。更に、ＲＡＭ管理テーブル１７におけるＲＡＭ時限保証診断不要ビット領域４１（番号３１＝‘１１’）の先頭アドレスを読込む。
【０１３１】
そして、上記読み込んだ各領域（２１、２５、テーブル１７の番号３１＝‘１１’）の相互に対応するデータ同士を用いて、以下のステップＳ６２，Ｓ６３の所定の確認処理を行う。これは、上記先頭アドレス／最終アドレスに基づいて、各領域の先頭／最後から順に、各番地毎に（１バイト単位で）所定の確認処理を行うものである。安全関連データ管理領域２１とＲＡＭ時限保証診断不要ビット領域４１に関してはその先頭番地から順に、反転安全関連データ管理領域２５に関してはその最終番地から順に、その番地の（１バイト分の）データを取得して、取得したデータに基づいてステップＳ６２〜Ｓ６４の処理を実行する。
【０１３２】
これを安全関連データ管理領域２１の最終番地の処理実行するまで（ステップＳ６５がＹＥＳになるまで）繰り返し実行する。つまり、ステップＳ６５がＮＯの場合、ステップＳ６６で今回の上記所定の確認処理等の処理対象であった番地の次の番地を求めて（番地＝番地＋１）（但し、領域２５に関しては前の番地（番地＝番地−１））、これについてステップＳ６２〜Ｓ６４の処理を実行する。
【０１３３】
尚、上述した一例では、安全関連データ管理領域２１の先頭アドレスは３０００番地なので、最初はこの３０００番地の１バイトのデータ（「３０００番地における＋０」〜「３０００番地における＋７」のデータ；診断管理情報というものとする）を取得する。また、この例では反転安全関連データ管理領域２５の最終アドレスはＣＦＦＦ番地となるので、最初はこのＣＦＦＦ番地の１バイトのデータ（「ＣＦＦＦ番地における＋０」〜「ＣＦＦＦ番地における＋７」のデータ；反転診断管理情報というものとする）を取得する。但し、反転診断管理情報は、上記の通り、ビット順が逆になっているので（つまり、例えば「３０００番地における＋０」に対応するのは「ＣＦＦＦ番地における＋７」となっている）、これを元に戻す。つまり、「ＣＦＦＦ番地における＋７」のデータが先頭で「ＣＦＦＦ番地における＋０」のデータが最後になるように反転診断管理情報を並び替える。
【０１３４】
上記の例では安全関連データ領域２２の最初の８バイト分の記憶領域（７０００番地〜７００７番地）を、今回の処理対象領域として、これに関する所定の確認処理を実行し、診断未実施のアドレスがある場合には診断処理を実行するものとなる。
【０１３５】
また、ＲＡＭ時限保証診断不要ビット領域４１に関しては、上述した説明では具体的な番地例は述べていないが、ここでは仮に４０００番台であるものとする。よって、最初は４０００番地の１バイトのデータを取得する（診断要／不要情報というものとする）。これも上記３０００番地の例と同様、上記７０００〜７００７番地の８バイト分の安全関連データに関する診断要／不要情報であることになる。
【０１３６】
以下の説明では、上記具体例に基づいて説明するが、他のアドレスに関しても同様の処理が行われることになる。
まず、ステップＳ６２の処理について説明する。この処理では、まず、上述した反転診断管理情報の並び替え処理を行う。続いて、並び替えた後の反転診断管理情報を反転させる。例えば、反転診断管理情報＝「１１１１０００１」であったならば、並び替えた後の反転診断管理情報＝「１０００１１１１」となり、この反転データは「０１１１００００」となる。そして、この反転データを上記診断管理情報と比較照合し、一致することを確認する（ステップＳ６２）。異常が無ければ一致するはずであるので、もし不一致の場合には（ステップＳ６２，ＮＯ）ＲＡＭ異常アプリケーション処理を実行する（ステップＳ６７）。この処理については特に説明しないが、ＲＡＭ異常検出時に実行される所定の処理である。
【０１３７】
一方、一致する場合には（ステップＳ６２，ＹＥＳ）、続いてステップＳ６３の処理を実行する。
ステップＳ６３の処理では、まず、上記診断管理情報と上記診断要／不要情報とのＥＯＲ（排他的論理和）を求める。そして、このＥＯＲがＦＦ（１６進）となるか否かを確認する。ＥＯＲがＦＦ（１６進）であることは（ステップＳ６３，ＹＥＳ）、定義した所定時間内に（本処理が行われるまでに）処理対象の記憶領域全ての診断が実施済みであることを示す。よって、この記憶領域について再度診断処理を行う必要なく、ステップＳ６４を経て、次の記憶領域を処理対象として同様の処理を行う。
【０１３８】
尚、ここでは１バイト単位でＥＯＲチェックする例を示すが、当然、この様な例に限るものではなく、例えば適用するＣＰＵで最適に実行できるバイト数単位で確認すればよい。
【０１３９】
ステップＳ６３の処理では、上記診断管理情報と上記診断要／不要情報の各ビット毎のＥＯＲを行い、全てが‘１’（ＥＯＲ結果＝‘１１１１１１１１’）となるか否かを確認する。よく知られているように、ＥＯＲは、両方とも０または両方とも１の場合には０と
なり、どちらか一方が１で他方が０の場合には１となる。つまり、例えば図１０に示す例のように（尚、この例では簡単の為、１バイト（＝８ビット）ではなくそのうちの半分（４ビット）を示している）、上記診断管理情報＝「１１００」、上記診断要／不要情報＝「１０１０」であったならば、ＥＯＲは「０１１０」となり、ステップＳ６３の判定はＮＯとなる。
【０１４０】
図１０に示すように、“診断要”且つ“完了”の場合または“診断不要”且つ“未完了”の場合にＥＯＲは‘１’となるので、全てがこれら２つ場合の何れかである場合にはＥＯＲ結果＝ＦＦとなり、ステップＳ６３の判定はＹＥＳとなる。この場合には安全関連データ管理領域２１、反転安全関連データ管理領域２５それぞれの今回の処理対象領域のビット情報を初期化することで（ステップＳ６４）、今回の処理対象領域に関する処理は終了する。そして、上記の通り、ステップＳ６５の判定を行い、判定ＮＯならば上記ステップＳ６６の処理を行って、次の処理対象領域について上記と同様、ステップＳ６２〜Ｓ６４の処理を実行する。
【０１４１】
尚、上記初期化は、安全関連データ管理領域２１に関してはビットＯＦＦ（０）、反転安全関連データ管理領域２５に関してはビットＯＮ（１）するものである。
上記ステップＳ６４の初期化処理により、安全関連データ管理領域２１における上記処理対象領域（８バイト）に対応するビット情報群（１バイト分；本例では先頭アドレスのビット情報群）は初期値‘００’（１６進）になり、反転安全関連データ管理領域２５における上記処理対象領域（８バイト）に対応するビット情報群（１バイト分；本例では最終アドレスのビット情報群）は初期値‘ＦＦ’（１６進）になる。
【０１４２】
一方、１バイトのうち１ビットでもＥＯＲが‘０’となったならば（ＦＦにならなかったならば）、図９のステップＳ６８以降の処理を実行する。
ここで、ＥＯＲが‘０’となるのは、図１０に示す通り、“診断不要”且つ“完了”の場合または“診断要”且つ“未完了”の場合であるが、前者（“診断不要”且つ“完了”）のケースは通常あり得ないものである。つまり“診断不要”であるならば上記ステップＳ４１がＹＥＳとなるので、そのままステップＳ４２の処理が行われ、従ってステップＳ４８の処理（完了ビットＯＮ）は行われていないので、“未完了”となっているはずであり、“完了”となることは通常はあり得ない（矛盾している；処理に何らかの異常が生じていると考えられる）。
【０１４３】
よって、前者のケースになっていないかをステップＳ６８で確認する。ステップＳ６９以降の処理は、後者（“診断要”且つ“未完了”）の場合に対応して実行する処理である。
【０１４４】
ステップＳ６８では、上記診断管理情報と上記診断要／不要情報とのＡＮＤを求める。これにより、図１０に示す通り、上記ＥＯＲが‘１’となるケース、及び上記後者のケースでは、ＡＮＤ結果は０となる。一方、上記前者のケースではＡＮＤ結果は１となる。よって、異常がなければＡＮＤ結果は‘００’（１６進）となり、ステップＳ６８の判定はＹＥＳとなり、ステップＳ６９以降の処理を実行することになる。
【０１４５】
しかし、１ビットでも前者のケースがあれば、ＡＮＤ結果は‘００’（１６進）にはならないので、ステップＳ６８の判定はＮＯとなり、ステップＳ７６の処理を行う。この場合は、関数等による処理に異常があったと考えられるので、処理異常アプリケーション処理を実行する（ステップＳ７６）。この処理についてはここでは関係ないので特に説明しない。
【０１４６】
以下、ステップＳ６９以降の処理について説明する。
まず、ＲＡＭ管理テーブル１７から安全関連データ領域先頭アドレス（番号３１＝‘３’）と安全関連データ領域最終アドレス（番号３１＝‘４’）を読込む。更に、ＲＡＭ管理テーブル１７から反転安全関連データ領域先頭アドレス（番号３１＝‘７’）と反転安全関連データ領域最終アドレス（番号３１＝‘８’）を読込む（ステップＳ６９）。これらにより安全関連データ領域２２、反転安全関連データ領域２４それぞれのアドレス範囲が分かるので、これを後のステップＳ７１のアドレス範囲チェック処理の際に用いる。
【０１４７】
ステップＳ７０以降の処理は、上記「“診断要”且つ“未完了”」（ＥＯＲが０でＡＮＤが０）であるビット全てを処理対象とし、当該処理対象ビットに関して１つずつ、そのビットに対応する安全関連データ記憶領域等に関して、ステップＳ７２〜ステップＳ７４の診断処理を実行する。全ての処理対象ビットに関して上記処理を完了したならば（ステップＳ７５，ＹＥＳ）上記ステップＳ６４の処理へ移行し、上記初期化処理を行う。未だ、全ての処理対象ビットに関して処理していないならば（ステップＳ７５，ＮＯ）ステップＳ７０に戻り、次の処理対象ビットに関する処理を実行する。但し、途中でステップＳ７１のチェック処理でＮＧとなったならば、ステップＳ７６の処理を実行し、本処理は終了する。
【０１４８】
まず、ステップＳ７０では、任意の１つの処理対象ビットに関して、この処理対象ビットに対応する安全関連データ領域アドレスと反転安全関連データ領域アドレスを算出する。
【０１４９】
安全関連データ領域アドレスの算出式は、上記処理対象ビットの安全関連データ管理領域先頭アドレスからの相対アドレスをＰ、当該アドレス内相対ビット数（上記αに相当）をＱとして、以下の算出式（２）となる。
【０１５０】
安全関連データ領域先頭アドレス＋Ｐ×８＋Ｑ    （２）式
反転安全関連データ領域アドレスは、上記算出した安全関連データ領域アドレスを反転させればよい。
【０１５１】
例えば、上記処理対象ビットの位置が「３００１番地における＋３」であったならば、上記の通り本例では安全関連データ管理領域先頭アドレスは３０００番地であるので、上記相対アドレスＰは０００１となり、上記Ｑは３となる。また、上記の通り本例では安全関連データ領域先頭アドレスは７０００番地である。よって、安全関連データ領域アドレスは、７００８＋３＝「７００Ｂ番地」となる。そして、反転安全関連データ領域アドレスは、「８ＦＦ４番地」となる。
【０１５２】
そして、上記ステップＳ７０で求めた安全関連データ領域アドレス、反転安全関連データ領域アドレスが、上記ステップＳ６９で得た安全関連データ領域２２、反転安全関連データ領域２４それぞれのアドレス範囲内であるか否かをチェックする（ステップＳ７１）。
【０１５３】
もし、範囲内でない場合には（ステップＳ７１，ＮＯ）、上記ステップＳ７６の処理を実行して、本処理は終了する。
一方、範囲内であった場合には（ステップＳ７１，ＹＥＳ）、上記ステップＳ７０で求めた安全関連データ領域アドレス、反転安全関連データ領域アドレスの各記憶領域に対して、例えば、上記ダブルＲＡＭアルゴリズムによる診断を行う。尚、当該アドレスに対しダブルＲＡＭアルゴリズム以外の診断アルゴリズム適用しても良い。
【０１５４】
すなわち、まず、安全関連データ領域２２における上記ステップＳ７０で算出した安全関連データ領域アドレスのデータをレジスタに退避させ、当該アドレスに任意のテストデ
ータを書き込む。また同様に、反転安全関連データ領域２４における上記ステップＳ７０で算出した反転安全関連データ領域アドレスのデータ（反転データ）をレジスタに退避させ、当該アドレスに反転テストデータ（上記テストデータを反転したもの）を書き込む（ステップＳ７２）。
【０１５５】
次に、上記安全関連データ領域アドレスからデータ（テストデータ）を読込み、上記ステップＳ７２でレジスタに退避させていたデータを当該アドレスに復帰させる（当該アドレスに書き込む）。同様に、上記反転安全関連データ領域アドレスからデータ（反転テストデータ）を読込み、上記ステップＳ７２でレジスタに退避させていた反転データを当該アドレスに復帰させる（当該アドレスに書き込む）（ステップＳ７３）。
【０１５６】
上記ステップＳ７３で読み込んだ反転テストデータを反転させ、これが上記ステップＳ７３で読み込んだテストデータと一致するか否かをチェックする（ステップＳ７４）。不一致の場合には（ステップＳ７４，ＮＯ）、上記ステップＳ６７の処理（ＲＡＭ異常アプリケーション処理）を実行して本処理を終了する。一方、一致した場合には（ステップＳ７４，ＹＥＳ）、上記の通りステップＳ７５の判定を行い、全ての処理対象ビットについて処理完了したら（ステップＳ７５，ＹＥＳ）、上記ステップＳ６４の処理へ移行する。
【０１５７】
この様にして、ＲＡＭ２０における安全関連データに係る記憶領域において、診断未実施の記憶領域に関して診断処理を実行する。ステップＳ７５でＹｅｓになった時点では、ＲＡＭ２０における安全関連データに係る記憶領域の全てのアドレスについて、上記所定時間内に最低１回は診断処理が行われていることになる。
【０１５８】
以下、図１１、図１２、図１３を参照して、非安全関連データ読み書き部１４’の処理、安全関連アプリケーション部１５’の処理、非安全関連アプリケーション部１６’の処理について説明するが、これらの処理は本手法の特徴には直接的には関係しないので、簡単に説明するものとする。
【０１５９】
まず、図１１は、非安全関連データ読み書き部１４’（非安全関連データ読み書き関数１４）の処理フローチャート図である。
図１１の処理のパラメータ（入力）は、下記の通りである。
・データ番号（書込む／読込むデータのデータ番号）
・書込／読込データアドレス（アクセス先領域の先頭アドレス）
・書込データ（書き込み処理の場合のみ）
・書込／読込データバイト数
・書込／読込種別（これにより、書込／読込を識別する）
下記を復帰値とする。
・読込データ（読込み処理の場合のみ）
下記を関数値とする。
・正常終了／異常終了
尚、当該非安全関連データ読み書き関数１４は、非安全関連アプリケーション１６のプログラム内にインライン展開する。これによりＲＡＭ２０のスタック領域を使用しないようにする。
【０１６０】
図１１の処理では、まず、ＲＡＭ管理テーブル１７から非安全関連データ領域先頭アドレス(番号３１＝‘５’)と非安全関連データ領域最終アドレス（番号３１＝‘６’）を読込む。これにより非安全関連データ領域２３のアドレス範囲が分かる。また、上記パラメータの書込／読込データアドレスと書込／読込データバイト数とから、アクセス先領域のアドレス範囲を求める（ステップＳ８１）。これはステップＳ１１等と略同様の処理であり特に説明しない。
【０１６１】
上記アクセス先領域のアドレス範囲が、上記非安全関連データ領域２３のアドレス範囲内に入っているか否かをチェックする（ステップＳ８２）。もし、範囲内に入っていないならばチェックＮＧとし（ステップＳ８２，ＮＯ）、異常終了とする（ステップＳ８８）。例えば、何らかの異常等で非安全関連アプリケーション部１６’の処理で安全関連データ領域２２にアクセスしようとしても、上記ステップＳ８２のチェックでＮＧとなり、アクセスできない。
【０１６２】
範囲内に入っている場合にはチェックＯＫとし（ステップＳ８２，ＹＥＳ）、続いて、上記パラメータのデータ番号に対応するデータバイト数４４を上記「データ番号・データバイト数」４２から求め、これが上記パラメータの書込／読込データバイト数と一致するか否かを判定する（ステップＳ８３）。不一致の場合にはチェックＮＧとし（ステップＳ８３，ＮＯ）上記ステップＳ８８の処理を行う。
【０１６３】
一方、一致する場合にはチェックＯＫとし（ステップＳ８３，ＹＥＳ）、その後は上記パラメータの書込／読込種別に基づき処理を分岐させる。すなわち、書込みである場合には（ステップＳ８４，ＹＥＳ）ステップＳ８５の処理を実行し、正常終了とする（ステップＳ８７）。一方、読込みの場合には（ステップＳ８４，ＮＯ）ステップＳ８６の処理を実行し、正常終了とする（ステップＳ８７）。
【０１６４】
ステップＳ８５の処理では、上記パラメータの書込データを、上記パラメータの書込／読込データアドレスと書込／読込データバイト数に従ってアクセス先領域に書き込む。尚、書込中はレベルマスクなどにより排他制御をする。
【０１６５】
また、ステップＳ８６の処理では、上記パラメータの書込／読込データアドレスと書込／読込データバイト数に従ってアクセス先領域からデータを読み込む。読込中はレベルマスクなどにより排他制御をする。
【０１６６】
尚、上記ステップＳ８７は正常終了を関数値として終了するものであり、上記ステップＳ８８は異常終了を関数値として終了するものである。
次に、図１２を参照して、安全関連アプリケーション部１５’（安全関連アプリケーション１５）の処理について説明する。
【０１６７】
尚、図１２に示すステップＳ９２、Ｓ９６の処理に係る関数（安全関連データ読込関数、安全関連データ書込関数）は、当該安全関連アプリケーション１５のプログラム内にインライン展開する。これによりＲＡＭ２０のスタック領域を使用しないようにする。
【０１６８】
尚、安全関連データ書込関数１１に渡すパラメータは、下記の通りであり、定数は設計時に設計者等が任意に決定してプログラムコード内に記述する。
・データ番号（定数）
・書込アドレス（定数）
・書込データ
・書込データバイト数（定数）
関数値
・正常終了／異常終了
また、安全関連データ読込関数１２に渡すパラメータは下記の通りであり、定数は設計時に設計者等が任意に決定してプログラムコード内に記述する。
・データ番号（定数）
・読込アドレス（定数）
・読込データバイト数（定数）
・ＲＡＭ管理テーブルのＲＡＭ時限保証診断不要ビット情報（定数）
復帰データ
・読込データ
関数値
・データ正常／データ異常／異常終了
尚、これら各関数の処理に関しては、既に説明してあり、ここでは説明しない。
【０１６９】
図１２において、安全関連アプリケーション部１５’は所定のアプリケーション処理を実行し（ステップＳ９１）、このアプリケーション処理に係り安全関連データをＲＡＭ２０から読込むイベントが発生した場合には上記安全関連データ読込関数１２を呼び出す（ステップＳ９２）。これによって、上述した図６、図７の処理が実行されることになる。そして、上記の通り、データ正常／データ異常／異常終了の何れかの関数値が返されてくるので、正常終了の場合以外は（ステップＳ９３，ＮＯ）終了情報を設定し(ステップＳ９９)、所定の処理（処理異常アプリケーション処理）を実行し（この処理については特に説明しない）（ステップＳ１００）、本処理は終了する。
【０１７０】
正常終了の場合（ステップＳ９３，ＹＥＳ）上記アプリケーション処理を続行し（ステップＳ９４）、処理中に安全関連データをＲＡＭ２０に書き込むイベントが発生した場合には上記パラメータ（書込データ等）を設定して（ステップＳ９５）、上記安全関連データ書込関数１１を呼び出す（ステップＳ９６）。これにより上述した図５の処理が実行されることになる。尚、図示していないが、パラメータの設定は上記ステップＳ９２の処理の際にも行っている。
【０１７１】
そして、上記の通り、正常終了／異常終了どちらかの関数値が返されてくるので、異常終了であったならば（ステップＳ９７，ＮＯ）上記ステップＳ９９、Ｓ１００の処理を実行し、正常終了であったならば（ステップＳ９７，ＹＥＳ）上記アプリケーション処理を続行する（ステップＳ９８）。図示していないが、その後も、アプリケーション処理実行中に、ＲＡＭ２０に対する安全関連データの読込／書込イベントが発生する毎に、上述した関数呼び出しの処理が行われ、アプリケーション処理が最後まで実行されたら本処理は終了する。
【０１７２】
次に、図１３を参照して、非安全関連アプリケーション部１６’（非安全関連アプリケーション１６）の処理について説明する。
尚、図１３に示すステップＳ１１２、Ｓ１１６の処理に係る関数（非安全関連データ読み書き関数１４）は、当該非安全関連アプリケーション１６のプログラム内にインライン展開する。これによりＲＡＭ２０のスタック領域を使用しないようにする。
【０１７３】
尚、非安全関連データ読み書き関数１４へのパラメータは、下記の通りであり、定数は設計時に設計者等が任意に決定してプログラムコード内に記述する。
・データ番号（定数）
・書込／読込データアドレス（定数）
・書込データ
・書込／読込データバイト数（定数）
・書込／読込種別（定数）
復帰値
・読込データ
関数値
・正常終了／異常終了
図１３において、所定のアプリケーション処理実行し（ステップＳ１１１）、当該処理実行に係り非安全関連データをＲＡＭ２０から読込むイベントが発生した場合には、非安
全関連データ読み書き関数１４を呼び出す。その際、上記パラメータ（書込データは除く）を設定することで当該パラメータを関数１４に渡す。これより、上記図１１の処理が実行される（ステップＳ１１２）。
【０１７４】
そして、上記の通り、正常終了／異常終了どちらかの関数値が返されてくるので、異常終了であったならば（ステップＳ１１３，ＮＯ）、終了情報を設定し(ステップＳ１１９)、所定の処理（処理異常アプリケーション処理）を実行し（この処理については特に説明しない）（ステップＳ１２０）、本処理は終了する。
【０１７５】
一方、正常終了であったならば（ステップＳ１１３，ＹＥＳ）上記アプリケーション処理を続行する（ステップＳ１１４）。そして、当該処理実行に係り非安全関連データをＲＡＭ２０に書き込むイベントが発生した場合には、非安全関連データ読み書き関数１４を呼び出す。その際、上記パラメータ（書込データも含む）を設定することで当該パラメータを関数１４に渡す（ステップＳ１１５）。これより、上記図１１の処理が実行される（ステップＳ１１６）。
【０１７６】
そして、上記の通り、正常終了／異常終了どちらかの関数値が返されてくるので、異常終了であったならば（ステップＳ１１７，ＮＯ）上記ステップＳ１１９、Ｓ１２０の処理を実行し、正常終了であったならば（ステップＳ１１７，ＹＥＳ）上記アプリケーション処理を続行する（ステップＳ１１８）。図示していないが、その後も、アプリケーション処理実行中に、ＲＡＭ２０に対する非安全関連データの読込／書込イベントが発生する毎に、上述した関数呼び出しの処理が行われ、アプリケーション処理が最後まで実行されたら本処理は終了する。
【０１７７】
以上説明した処理は一例であり、この例に限るものではない。例えば、ＲＡＭ時限保証診断不要ビット領域４１はなくてもよい。この場合における診断時限保証タスク１３の処理は、安全関連データ管理領域２１において‘０’（未完了）であるビットは全て、図９のステップＳ６９〜Ｓ７５の処理の処理対象にすればよい。これにより、安全関連データ領域２２（反転安全関連データ領域２４も同様）内において、診断時限保証タスク１３の処理実行時までに自己診断処理が未実施の領域があった場合には、この領域に関して診断処理が行われるので、ＲＡＭ診断間隔の時間保証を実現できる。これによって、故障発生確率を減少させることができる。
【０１７８】
以上説明したように、本手法によれば、自己診断率の高いダブルＲＡＭアルゴリズムを用いるＲＡＭ診断装置に係り、安全関連データに係る領域内の各記憶領域（アドレス）毎に対応して診断済みか否かが記録されるＲＡＭ診断完了ビット領域４５と、故障確率を減少させる為の所定の診断間隔で処理実行する診断時限保証タスク１３とにより、処理負荷や処理時間の増大を招くことなく、ＲＡＭ診断間隔の時間保証を実現できる（故障確率を減少させることができる）。
【０１７９】
つまり、診断時限保証タスク１３は、その処理実行の際にＲＡＭ診断完了ビット領域４５を参照することで自己診断が未実施の記憶領域（アドレス）を識別できるので、この診断未実施の記憶領域（アドレス）に対してのみＲＡＭ診断処理を行うことができる。これによって、既に診断済みの記憶領域についてまでＲＡＭ診断処理を行ってしまうことはなく、無駄な処理が生じないので、処理負荷や処理時間の増大を招くことなく、故障確率を減少させる為のＲＡＭ診断間隔の時間保証を実現できる。
【０１８０】
更に、ＲＡＭ時限保証診断不要ビット領域４１を用いる場合には、予め診断時限保証タスク１３による診断処理は不要である（所定時間内に診断が行われるはずである）と考えられる記憶領域（アドレス）に対応するビット情報をＯＮ（診断不要）に設定しておき、
このアドレスに関するＲＡＭ診断完了ビット領域４５の更新処理をバイパスすることで、ＲＡＭアクセスのリスク軽減と処理負荷の軽減が可能となる。
【０１８１】
また、安全関連データのアクセスを関数化することにより、開発量を削減し（作成コード量を減少させ）、開発でのシステム故障の軽減ができる。また、関数のパラメータは設計時に決定する固定値と動作時に決定するものを明確化し（固定パラメータを明確にする）、予めプログラムコード内に展開することで、可変データを減少させることができ、ＣＰＵ演算故障やＲＡＭ故障によるリスクの軽減と処理の負荷軽減を図ることができる。
【０１８２】
また、これらのことにより、ダブルＲＡＭアルゴリズムの診断間隔が保証され、ギャルパットやアブラハムと比較して少ないＣＰＵ占有時間でＲＡＭの自己診断が可能となり、ＣＰＵのコスト削減も可能となる。
【０１８３】
また、同一ＲＡＭ上に安全関連系のデータと非安全関連系データが混在する場合、ＲＡＭ上で安全関連データ領域と非安全関連データ領域を空間的に分離し、かつ安全関連データ領域と非安全関連データ領域のアクセスを関数のみでアクセスすること、かつ安全関連データ領域をアクセスする関数と非安全関連データ領域をアクセスする関数を分離しパラメータ構成も異なるものとすること、また、それぞれの関数内でアクセスするデータ領域のチェックをアドレスの範囲とアクセスするデータバイト数によりチェックすることで、非安全関連系データに起因する安全関連系データに影響する従属故障の確率を故障確率より十分小さくすることができ、また非安全関連系を安全関連系から分離するために当該ＲＡＭを有する機器に別のＣＰＵとＲＡＭを搭載する必要がなくコストの低減を図ることができる。
【符号の説明】
【０１８４】
１  ＣＰＵ
１０  ＲＯＭ
１１  安全関連データ書込関数
１２  安全関連データ読込関数
１３  診断時限保証タスク
１４  非安全関連データ読み書き関数
１５  安全関連アプリケーション
１６  非安全関連アプリケーション
１７  ＲＡＭ管理テーブル
２０  ＲＡＭ
２１  安全関連データ管理領域
２２  安全関連データ領域
２３  非安全関連データ領域
２４  反転安全関連データ領域
２５  反転安全関連データ管理領域
３１  番号
３２  管理情報
４１  ＲＡＭ時限保証診断不要ビット領域
４２  データ番号・データバイト数
４３  データ番号
４４  データバイト数
４５  ＲＡＭ診断完了ビット領域
【図１】
0005453984.tif 000002
【図２】
0005453984.tif 000003
【図３】
0005453984.tif 000004
【図４】
0005453984.tif 000005
【図５】
0005453984.tif 000006
【図６】
0005453984.tif 000007
【図７】
0005453984.tif 000008
【図８】
0005453984.tif 000009
【図９】
0005453984.tif 000010
【図１０】
0005453984.tif 000011
【図１１】
0005453984.tif 000012
【図１２】
0005453984.tif 000013
【図１３】
0005453984.tif 000014