(57)【要約】【課題】  メモリのデータ破壊を迅速かつ正確に検出でき、かつ、データ破壊のメモリ異常を検出した場合には、システムの運転を継続しながら自動復旧することのできるＰＬＣ用ユニットを提供すること【解決手段】  演算処理時に読み出されるユーザプログラムが格納されるユーザメモリ１４と、ユーザメモリに格納されたユーザプログラムと同一内容のデータが格納されたバックアップメモリ１５とを備える。サイクリック実行中にユーザメモリ１４とバックアップメモリ１５に格納されたユーザデータを比較し、メモリ異常の有無を判断する。メモリ異常を検出すると、検出したメモリ異常箇所のデータをバックアップメモリの該当箇所のデータで修復し、その後もサイクリック実行を継続するようにした。【選択図】        図１
2006059382.tif 000002
【特許請求の範囲】
【請求項１】
共通処理，演算処理，Ｉ／Ｏリフレッシュ処理および周辺サービス処理をサイクリックに実行するプログラマブルコントローラ用ユニットであって、
前記演算処理時に読み出されるユーザプログラムが格納されるユーザプログラムメモリと、
前記ユーザプログラムメモリに格納されたユーザプログラムと同一内容のデータが格納されたバックアップメモリと、
サイクリック実行中に前記ユーザプログラムメモリに格納されたユーザプログラムのメモリ異常を検出するメモリ異常検出機能と、
前記メモリ異常検出機能がメモリ異常を検出した際に、検出したメモリ異常箇所のデータを前記バックアップメモリの該当箇所のデータで修復する修復機能とを備え、
データ修復後もサイクリック実行を継続するようにしたものであり、
かつ、前記メモリ異常検出機能は、１サイクル毎、または、複数サイクル毎で前記バックアップメモリと前記ユーザプログラムメモリの内容を比較し、比較した結果が不一致の場合は、メモリ異常と判定するものであることを特徴とするプログラマブルコントローラ用ユニット。
【請求項２】
前記メモリ異常検出機能は、前記ユーザプログラムメモリの内容の比較を１サイクル毎に行なう場合、前記ユーザプログラムの全体またはブロック単位で比較することを特徴とする請求項１に記載のプログラマブルコントローラ用ユニット。
【請求項３】
前記サイクリックによる演算処理は、ＡＳＩＣが前記ユーザプログラムメモリに格納されたユーザプログラムを構成するオブジェクトコードを順次読み出して実行するものであり、
前記メモリ異常検出機能は、前記ＡＳＩＣが読み出した前記オブジェクトコードが予め定められたオブジェクトコードと異なる場合に、メモリ異常と判定するものであり、その判定は、前記演算処理の実行時に行うように構成されていることを特徴とする請求項１または２に記載のプログラマブルコントローラ用ユニット。
【請求項４】
請求項３に記載のメモリ異常検出機能が、前記ＡＳＩＣが読み出した前記オブジェクトコードが予め定められたオブジェクトコードと異なる場合に、メモリ異常と判定した際に、
前記ＡＳＩＣが異常を検知したオブジェクトコードが格納されたアドレス情報に基づいて、前記バックアップメモリと前記ユーザプログラムメモリの内容を比較して不一致箇所を検出することにより、メモリ異常を発生している箇所を特定する機能を備えたことを特徴とする請求項３に記載のプログラマブルコントローラ用ユニット。
【請求項５】
前記メモリ異常検出機能は、前記ユーザプログラムメモリの内容の比較を１サイクル毎に行なう場合、
その内容の比較は、前記ユーザプログラムメモリのユーザプログラム全体のチェックを行うものであり、
メモリ異常がない場合にはＩ／Ｏデータを格納するＩＯメモリの所定領域のデータを待避させ、メモリ異常が生じた場合には、前記ユーザプログラムメモリの修復とともに、前記待避したＩ／Ｏデータに基づく前記ＩＯメモリの復旧を行うようにしたことを特徴とする請求項１から４のいずれか１項に記載のプログラマブルコントローラ用ユニット。
【請求項６】
共通処理，演算処理，Ｉ／Ｏリフレッシュ処理および周辺サービス処理をサイクリックに実行するプログラマブルコントローラ用ユニットにおけるメモリ自動復旧方法であって、
前記プログラマブルコントローラ用ユニットには、前記演算処理時に読み出されるユーザプログラムが格納されるユーザプログラムメモリと、前記ユーザプログラムメモリに格納されたユーザプログラムと同一内容のデータが格納されたバックアップメモリとを備え、
サイクリック実行中に前記ユーザプログラムメモリに格納されたユーザプログラムのメモリ異常を検出するメモリ異常検出処理を行い、
前記異常検出処理を実行した結果、メモリ異常を検出した場合には、検出したメモリ異常箇所の不正データに対応するデータを前記バックアップメモリから読み出すとともに、前記ユーザプログラムメモリに書き込むことにより不正データを修復し、
不正データ修復後もサイクリック実行を継続するものであり、
前記メモリ異常検出処理は、１サイクル毎、または、複数サイクル毎で前記バックアップメモリと前記ユーザプログラムメモリの内容を比較し、
比較した結果が不一致の場合は、メモリ異常と判定する処理を含むものであることを特徴とするメモリ自動復旧方法。
【請求項７】
前記メモリ異常検出処理は、前記ユーザプログラムメモリの内容の比較を１サイクル毎に行なう場合、前記ユーザプログラムの全体またはブロック単位で比較することを特徴とする請求項６に記載のメモリ自動復旧方法。
【請求項８】
前記サイクリックによる演算処理は、ＡＳＩＣが前記ユーザプログラムメモリに格納されたユーザプログラムであるオブジェクトコードを順次読み出して実行するものであり、
前記メモリ異常検出処理は、前記ＡＳＩＣが読み出した前記オブジェクトコードが予め定められたオブジェクトコードであるか否かを判断し、異なる場合にメモリ異常と判定する処理を含むものであり、その判定は、前記演算処理の実行時に行うことを特徴とする請求項６または７に記載のメモリ自動復旧方法。
【請求項９】
請求項８に記載のメモリ異常検出処理を実行してメモリ異常が検出された場合に、
前記ＡＳＩＣが異常を検知したオブジェクトコードが格納されたアドレス情報に基づいて、前記バックアップメモリと前記ユーザプログラムメモリの内容を比較して不一致箇所を検出することにより、メモリ異常を発生している箇所を特定し、
その特定した箇所のデータを前記バックアップメモリから呼び出して前記ユーザプログラムメモリの修復を行うことを特徴とする請求項８に記載のメモリ自動復旧方法。
【請求項１０】
前記メモリ異常検出処理は、１サイクルで前記ユーザプログラムメモリのユーザプログラム全体のチェックを行い、
メモリ異常がない場合にはＩ／Ｏデータを格納するＩＯメモリの所定領域のデータを待避させ、
メモリ異常が生じた場合には、前記ユーザプログラムメモリの修復とともに、前記待避したＩ／Ｏデータに基づく前記ＩＯメモリの復旧を行うようにしたことを特徴とする請求項６から９のいずれか１項に記載のメモリ自動復旧方法。
【請求項１１】
前記ユーザプログラムメモリには、同一内容の２つユーザプログラムが格納されており、
前記サイクリックによる演算処理は、ＡＳＩＣが前記ユーザプログラムメモリに格納されている２つのユーザプログラムを構成するオブジェクトコードのいずれか一方を順次読み出して実行するものであり、
前記メモリ異常処理は、前記ＡＳＩＣがオブジェクトコードを読み出して実行するに先立って、前記２つのユーザプログラムを構成するオブジェクトコードを比較し、
比較した結果が不一致の場合は、メモリ異常と判定する処理を含むものであることを特徴とする請求項６に記載のメモリ自動復旧方法。
【請求項１２】
前記修復機能を実行する動作モードと前記修復機能を実行しない動作モードとを備え、該修復機能を実行しない動作モードが設定された場合は、前記メモリ異常検出機能がメモリ異常を検出した際に、前記サイクリック実行を停止することを特徴とする請求項１に記載のプログラマブルコントローラ用ユニット。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、プログラマブルコントローラ用ユニット及びメモリ自動復旧方法に関するものである。
【背景技術】
【０００２】
ファクトリーオートメーション（ＦＡ）の制御装置として、プログラマブルコントローラ（ＰＬＣ）が用いられている。このＰＬＣは、複数のユニットから構成される。すなわち、電源供給源の電源ユニット，ＰＬＣ全体の制御を統率するＣＰＵユニット，ＦＡの生産装置や設備装置の適所に取り付けたスイッチやセンサの信号を入力する入力ユニット，アクチュエータなどに制御出力を出す出力ユニット，通信ネットワークに接続するための通信ユニットなどの各種のユニットを適宜組み合わせて構成される。
【０００３】
ＰＬＣ（ＣＰＵユニット）は、入力ユニットで入力した信号をＣＰＵユニットのＩ／Ｏメモリに取り込み（ＩＮリフレッシュ）、予め登録されたユーザプログラムに基づき論理演算をし（演算実行）、その演算実行結果をＩ／Ｏメモリに書き込んで出力ユニットに送り出し（ＯＵＴリフレッシュ）、その後、いわゆる周辺処理を行うと言うことを繰り返し処理する。ＰＬＣは、この繰り返し処理をすることで非制御対象を制御する。
【０００４】
そして、上記したユーザプログラムや、設定データ（以下、「ユーザデータ」と称する）は、ＲＡＭと呼ばれるメモリに格納されており、演算実行時に逐次読み書きするようになっている。
【０００５】
一方、ＰＬＣが設置される工場内の環境は、サーボモータ，インバータ，高圧電力装置など多種多様な装置がＰＬＣに接続され、あるいはＰＬＣの付近に配置されている。そのため、放射ノイズ，電源の瞬時停電，電磁界などにより、ＰＬＣ内のメモリに格納されたデータの破壊が発生しやすくなっている。また、ＰＬＣ内のメモリのデータ破壊の現象は、宇宙線によっても生じる。なお、前者の原因によるデータ破壊は、通常数ビット単位で発生し、後者の宇宙線によるデータ破壊は、１ビット単位で発生することが多い。
【０００６】
当然のことながら、係るデータ破壊が生じたユーザデータに基づいて制御すると正常動作しないので、ＰＬＣは、運転中に係るデータ破壊が発生していないか確認している。具体的には、ＰＬＣは、ＲＡＭ上にあるデータのサム値を計算し、予め格納してあるサム値と比較し、一致することで異常がないことを確認している。
【０００７】
つまり、ＰＬＣは、ユーザデータが新規にダウンロードされたり、変更された際に、そのユーザデータの先頭から最終までの値を加算し、得られた値を「サム値」として別エリアに格納する。そして、実際の運転中は、ＲＡＭ上にあるユーザデータのサム値を複数回に分けて算出し、最終データのサム値算出までを終えると、別エリアに格納しているサム値と比較する。このとき、サム値が一致しない場合は、何らかの理由でＲＡＭ上のデータが壊れた（メモリ異常）と判断し、暴走・不正出力を防止するためＰＬＣを停止させていた。
【０００８】
また、ユーザプログラムは、命令オブジェクトコードというユーザプログラムを高速に実行可能な専用ＩＣ（ＡＳＩＣ）や汎用のＭＰＵが理解するためのコードで構成されており、使用されるコードは予め決められている。
【０００９】
通常は、まずＡＳＩＣが命令オブジェクトコードを解釈し、ＡＳＩＣ自身で実行すべき命令か、ＭＰＵで実行すべき命令かを判断する。このとき、ＡＳＩＣがＡＳＩＣ自身でもＭＰＵでも実行できないコードを検出した場合は、異常をＭＰＵに通知する。この通知を受けて、ＭＰＵ処理内で「オブジェクトコードを格納しているＲＡＭが壊れた」と判断し、ＰＬＣを停止する方法もとられている。
【００１０】
上記のようにＰＬＣを停止した後、メモリの修復作業を実行する。しかし、この修復作業を実行するには、ユーザプログラム転送，送信をするパソコン等のツールをＰＬＣに接続する必要があるが、ＰＬＣは、一般に制御盤の奥に設置されているので、その接続は簡単ではない。
【００１１】
さらに、サム値の照合の場合、データ破壊を起こしていても、偶然にサム値が一致してしまうおそれがあり、また、データ破壊によってオブジェクトコードが変更されても、変更後のコードもＡＳＩＣやＭＰＵが実行可能なものになっていると正常と判断してしまう。従って、確実にデータ破壊を検出することは困難である。
【００１２】
係る問題を解決するため、例えば特許文献１に記載のプログラマブルコントローラ用表示装置がある。この特許文献１は、ＰＬＣのメモリに格納されたユーザデータと同一内容のデータをバックアップデータとして表示装置に格納しておき、電源投入時と、その後所定の時間を経過したときに、ＰＬＣのメモリに格納されているデータの破壊の有無を検査し、破壊されている場合には、表示装置に格納されたバックアップデータを基に、ＰＬＣのメモリの復旧作業を行うようにしている。また、不一致情報をロギングしておき、その内容を表示する機能も有する。そして、破壊の有無の検査は、表示装置内のＰＬＣバックアップ用メモリに格納されたバックアップデータと、ＰＬＣのメモリ中のＰＬＣデータとを順次吸い上げ、表示装置内のワークメモリを使って比較照合し、ＰＬＣバックアップデータとＰＬＣデータとが不一致となったとき、データ破壊があったと判断する。そして、データ破壊があった部分を、ＰＬＣにダウンロードすることにより復旧作業を行う。
【００１３】
【特許文献１】特開平１１−１４３７８４の明細書の段落［００２２］，［０００２３］，［００３４］，図面の図１から図３など参照
【発明の開示】
【発明が解決しようとする課題】
【００１４】
しかしながら、上記した特許文献１に示した発明では、以下に示す問題がある。すなわち、表示装置はＰＬＣから比較的離れた位置に設置され、ネットワークを介して接続されている。従って、ＰＬＣのメモリの読み出しは、ネットワークを介して行うことになり、頻繁に行うことができない。そのため、特許文献１では、電源投入時の後は、一定時間経過毎に行うとしている。この一定時間が具体的などれくらいの期間かは明記されていないが、明細書全体の記載から判断しても、比較的長い間隔であるといえる。従って、従来のサム値によるチェックに比べ、検査する間隔が長く、データ破壊が生じても直ぐに検知することは困難である。
【００１５】
さらに、異常発生を表示装置で検知し、それに基づいて正しいデータをＰＬＣにダウンロードする方式では、ＰＬＣに対して異常を通知するのが遅れるばかりでなく、係る表示装置からのダウンロードによる修復処理では、通常、ＰＬＣを一旦停止させる必要があり、リアルタイムでのメモリ復旧をすることが困難となる。
【００１６】
さらに、サム値によるチェックでも、サイクリックに動作するＰＬＣの１サイクル毎にユーザプログラム全体をチェックすることはできず、一部分を順次計算し、その計算結果の合計によりサム値を求める。よって、データ破壊を生じてから実際に検出されるまでのタイムラグが大きくなる。
【００１７】
本発明は、メモリのデータ破壊を迅速かつ正確に検出でき、かつ、データ破壊のメモリ異常を検出した場合には、ＰＬＣの運転を継続しながら自動復旧することのできるＰＬＣ用ユニット及びメモリ自動復旧方法を提供することを目的とする。
【課題を解決するための手段】
【００１８】
この発明によるＰＬＣ用ユニットは、共通処理，演算処理，Ｉ／Ｏリフレッシュ処理および周辺サービス処理をサイクリックに実行するＰＬＣ用ユニットであって、前記演算処理時に読み出されるユーザプログラムが格納されるユーザプログラムメモリと、前記ユーザプログラムメモリに格納されたユーザプログラムと同一内容のデータが格納されたバックアップメモリと、サイクリック実行中に前記ユーザプログラムメモリに格納されたユーザプログラムのメモリ異常を検出するメモリ異常検出機能と、前記メモリ異常検出機能がメモリ異常を検出した際に、検出したメモリ異常箇所のデータを前記バックアップメモリの該当箇所のデータで修復する修復機能とを備え、データ修復後もサイクリック実行を継続するようにしたものであり、かつ、前記メモリ異常検出機能は、１サイクル毎、または、複数サイクル毎で前記バックアップメモリと前記ユーザプログラムメモリの内容を比較し、比較した結果が不一致の場合は、メモリ異常と判定するもようにした。
【００１９】
ユーザプログラムメモリは、実施の形態では、ユーザメモリに対応する。そして、比較する内容には、ユーザプログラムやパラメータエリア等を含ませることができる。
【００２０】
ここで、比較する内容のユーザプログラムの代表的な例としては、ユーザがパソコン等のツールを用いてラダー言語等の制御プログラム記述言語で作成したプログラムがＰＬＣで実行可能なコード（オブジェクトコード）に変換されたものである。また、パラメータエリアに格納されるデータとしては、ＰＬＣのシステム設定に関するデータや、ネットワーク通信の設定に関するデータ等、ユーザプログラムの実行モードでは変更されないデータが該当する。
【００２１】
なお、必ずしも１回のサイクルの際に、比較対象（ユーザプログラムやパラメータエリア等）の全てのデータを比較する必要はなく、一部ずつ比較し、複数サイクル実行することにより比較対象の全てのメモリ異常チェックを完了するようにしてもよい。
【００２２】
さらに別の手段としては、前記サイクリックによる演算処理は、ＡＳＩＣが前記ユーザプログラムメモリに格納されたユーザプログラムであるオブジェクトコードを順次読み出して実行するものであり、前記メモリ異常検出機能は、前記ＡＳＩＣが読み出した前記オブジェクトコードが予め定められたオブジェクトコードと異なる場合に、メモリ異常と判定するものであり、その判定は、前記演算処理の実行時に行うように構成されていることである。
【００２３】
この場合に、上記メモリ異常検出機能が、前記ＡＳＩＣが読み出した前記オブジェクトコードが予め定められたオブジェクトコードと異なってメモリ異常と判定した際に、前記ＡＳＩＣが異常を検知したオブジェクトコードが格納されたアドレス情報に基づいて、前記バックアップメモリと前記ユーザプログラムメモリの内容を比較して不一致箇所を検出することにより、メモリ異常を発生している箇所を特定する機能を備えると好ましい。
【００２４】
さらに別の手段としては、前記メモリ異常検出機能は、前記ユーザプログラムメモリの内容の比較を１サイクル毎に行なう場合、その内容の比較は、前記ユーザプログラムメモリのユーザプログラム全体のチェックを行うものであり、メモリ異常がない場合にはＩ／Ｏデータを格納するＩＯメモリの所定領域を待避させ、メモリ異常が生じた場合には、前記ユーザプログラムメモリの修復とともに、前記待避したＩ／Ｏデータに基づく前記ＩＯメモリの復旧を行うようにするとよい。
【００２５】
もちろん、１サイクルでユーザプログラムメモリのユーザプログラム全体をチェックするようにした場合でも、本発明のようにＩ／Ｏデータの待避，復旧をすることなく、ユーザプログラムのメモリ復旧をするようにしてももちろんよい。このメモリのチェックとしては、例えばサム値チェックやメモリとバックアップメモリの比較等各種のものにより実現できる。
【００２６】
一方、本発明に係るメモリ自動復旧方法は、共通処理，演算処理，Ｉ／Ｏリフレッシュ処理および周辺サービス処理をサイクリックに実行するＰＬＣ用ユニットにおけるメモリ自動復旧方法であって、前記ＰＬＣ用ユニットには、前記演算処理時に読み出されるユーザプログラムが格納されるユーザプログラムメモリと、前記ユーザプログラムメモリに格納されたユーザプログラムと同一内容のデータが格納されたバックアップメモリとを備えたものを前提とする。そして、サイクリック実行中に前記ユーザプログラムメモリに格納されたユーザプログラムのメモリ異常を検出するメモリ異常検出処理を行い、次いで、前記異常検出処理を実行した結果、メモリ異常を検出した場合には、検出したメモリ異常箇所のデータに対応するデータを前記バックアップメモリから読み出すとともに、前記ユーザプログラムメモリに書き込むことによりデータを修復する。そして、データ修復後もサイクリック実行を継続することである。そして、前記メモリ異常検出処理は、１サイクル毎、または、複数サイクル毎で前記バックアップメモリと前記ユーザプログラムメモリの内容を比較し、比較した結果が不一致の場合は、メモリ異常と判定する処理を含むようにした。
【００２７】
そして、好ましくは、前記メモリ異常検出処理は、前記ユーザプログラムメモリの内容の比較を１サイクル毎に行なう場合、前記ユーザプログラムの全体またはブロック単位で比較することである。
【００２８】
また、前記サイクリックによる演算処理は、ＡＳＩＣが前記ユーザプログラムメモリに格納されたユーザプログラムであるオブジェクトコードを順次読み出して実行するものであり、前記メモリ異常検出処理は、前記ＡＳＩＣが読み出した前記オブジェクトコードが予め定められたオブジェクトコードであるか否かを判断し、異なる場合にメモリ異常と判定する処理を含むものであり、その判定は、前記演算処理の実行時に行うこととしてもよい。そして、前記メモリ異常検出処理を実行してメモリ異常が検出された場合に、前記ＡＳＩＣが異常を検知したオブジェクトコードが格納されたアドレス情報に基づいて、前記バックアップメモリと前記ユーザプログラムメモリの内容を比較して不一致箇所を検出することにより、メモリ異常を発生している箇所を特定し、その特定した箇所のデータを前記バックアップメモリから呼び出して前記ユーザプログラムメモリの修復，復旧を行うことができる。
【００２９】
さらに別のメモリ異常検出処理としては、１サイクルで前記ユーザプログラムメモリの全領域のチェックを行い、メモリ異常がない場合にはＩ／Ｏデータを格納するＩＯメモリの所定領域のデータを待避させ、メモリ異常が生じた場合には、前記ユーザプログラムメモリの修復とともに、前記待避したＩ／Ｏデータに基づく前記ＩＯメモリの復旧を行うようにすることもできる。
【００３０】
ＰＬＣによる制御（上記演算処理）は速度が要求されるため、演算実行時には高速処理可能なメモリを使用している。ユーザプログラムメモリをこの種のメモリで構成することにより、演算処理の速度向上が図れる。ところで、この種のメモリは、電源ＯＦＦ時にデータを保持できないため（この種のメモリはスタンバイ電流が大きく、ユーザプログラムを格納するサイズ分のメモリのデータを長期間保持するためには大量の電池等が必要となり、ＰＬＣ用ユニットに実装することは構造的にも価格的にも現実的でない）、ユーザプログラムは別途不揮発性のバックアップメモリに保存しておき、電源投入の際にバックアップメモリからユーザプログラムメモリに転送し、サイクリックな処理を実行するようになっている。従って、電源ＯＮ時においては、ユーザプログラム等のデータは、同一内容がユーザプログラムメモリとバックアップメモリに格納されることになる。
【００３１】
そこで本発明では、メモリ異常のチェックをＰＬＣ用ユニット側で行い、ユーザプログラムメモリのデータが破壊されたメモリ異常を生じた場合には、バックアップメモリに格納された対応するデータを用いて正しい内容に書き換え、ユーザプログラムメモリの復旧をする。これにより、ユーザプログラムメモリ上のユーザプログラムデータは正常となり、ＰＬＣは運転を続けることができる。係るバックアップメモリに格納されたユーザプログラムをユーザプログラムメモリへ格納する処理は、内部メモリの転送であり、サイクリックな処理中にリアルタイムで瞬時にユーザプログラムメモリを復旧することができ、データ修復後もサイクリック実行を継続することができる。よって、ＰＬＣを停止することなく、ユーザプログラムメモリの自動復旧を行うことが可能となる。
【００３２】
また、メモリ異常を検知する手法として、（１）ユーザプログラムメモリとバックアップメモリのユーザプログラム格納領域のデータを比較し、一致するかどうか判定する方法と、（２）ＡＳＩＣが理解できるオブジェクトコードか否か判定する方法と、（３）サム値チェックで判定する方法の３種類を示したが、これらは何れか一つを組み込んでも良いし、任意の複数の方法を組み込んでも良い。もちろん他の方法が有ればそれを組み込むこともできる。
【００３３】
そして、上記（１），（２）の両方を組み込むとより好ましい。すなわち、サイクルタイムをむやみに延ばさないためには、（１）のデータの比較は１サイクルで数バイト程度（このサイズはＰＬＣの性能により適宜決定すれば良い）しか実行できない。したがって、このデータの比較によりあるアドレスのデータが正常と判断されたのち、該当アドレスでデータ化けが発生した場合は、次回の該当アドレスのデータ比較まで、メモリ異常を検出できずにＰＬＣの運転上好ましくない状態が続くことになる。しかし、（２）を併用することにより、データ化け発生箇所がユーザプログラム記憶エリアのオブジェクトコード格納部分である場合は、ＡＳＩＣによるユーザプログラム実行時（具体的には、オブジェクトコード読み出し時）にデータ化け検出が可能となるため、早期にメモリ異常を認識できるので、ＰＬＣの信頼性が向上する。
【００３４】
なお、（１）による数バイト単位での検査では、全てのデータに対してチェックが完了するまでに複数サイクル分がかかるものの、メモリ異常が存在する部分を検査すると、そのサイクル中に異常を検知することができる。
【００３５】
なおまた、本発明では、１サイクルでユーザプログラムメモリのユーザプログラム全体をチェックするものももちろん含む。この場合に、上記した（１），（２）の何れも利用できるし、（３）のサム値チェックも有効な機能の１つとなる。
【発明の効果】
【００３６】
以上のように、この発明では、メモリのデータ破壊を迅速かつ正確に検出でき、かつ、データ破壊のメモリ異常を検出した場合には、ＰＬＣの運転を継続しながら自動復旧することができる。
【発明を実施するための最良の形態】
【００３７】
図１は、本発明の好適な一実施の形態を示すＰＬＣ用のＣＰＵユニット１０の構成図である。図１に示すように、システムプログラム（ファームウェア）はフラッシュメモリからなるシステムメモリ（ＳＲＯＭ）１１に格納されており、このシステムプロクラムは、ＭＰＵ１２に呼び出され、ＭＰＵ１２は、ワークメモリ（ＷＲＡＭ）１３を適宜使用しながらプログラムに従った所定の処理を実行する。
【００３８】
また、運転時において、ユーザデータの１つであるユーザプログラムは、ユーザプログラムメモリであるユーザメモリ１４に格納されている。このユーザメモリ１４は、高速ＲＡＭであるＳＲＡＭにより構成され、電源ＯＦＦ時には内容を保持することができない。従って、同一内容のユーザプログラムを、電源ＯＦＦ時にも内容を保持するフラッシュメモリから構成されるバックアップメモリ１５に格納しておく。そして、電源ＯＮ時にバックアップメモリ１５に格納されたユーザプログラムをユーザメモリ１４に転送するようにしている。
【００３９】
また、Ｉ／Ｏデータやパラメータは、ＩＯメモリ１６に格納されている。このＩＯメモリ１６もユーザメモリ１４と同様にＳＲＡＭで構成されているが、本実施の形態では、電源ＯＦＦ時でも内部バッテリにより通電される構成を採っているため、記憶内容は保持される。
【００４０】
ＡＳＩＣ１７は、ユーザメモリ１４に格納されたユーザプログラム（命令オブジェクトコード）を順次呼び出し、呼び出した命令オブジェクトコードを解析し、命令実行をする。また、この命令実行時に、適宜ＩＯメモリ１６にアクセスし、Ｉ／Ｏデータを読み書きしたり、パラメータを取得する。さらに、Ｉ／Ｏデータは、Ｉ／Ｏバス１８を介して他のユニットひいては、入出力機器との間で送受される。
【００４１】
また、ＡＳＩＣ１７は、命令オブジェクトコードを解析した際に、自己が理解できない不正なコードになっている場合には、異常と判断し、ＭＰＵ１２に対して異常通知をする。なお、上記した構成並びに作用は、基本的に従来公知のものと同様であるので詳細な説明を省略する。なおまた、ＰＬＣは、このＣＰＵユニット１０以外に、電源ユニットやＩ／Ｏユニットなど各種のユニットをバス接続して連結して構成される。
【００４２】
ここで本発明では、図２に示すように、ＭＰＵ１２が、ユーザメモリ１４に格納されたユーザプログラムのデータと、バックアップメモリ１５のユーザプログラムのデータを照合し（１）、内容が一致しているか否かを判断する。そして、一致している場合には、ユーザメモリ１４はデータ破壊されていないと判断し、そのままユーザメモリ１４に格納されたユーザプログラムの実行を継続する。一方、図２に示す「アドレス３」のように不一致の場合には、ユーザメモリ１４のデータ破壊が発生したと判断し、バックアップメモリ１５に格納された該当するデータ（アドレス３のデータ）をユーザメモリ１４に上書きする（２）ことによってユーザメモリ１４上のデータを正しいものに修正する。これにより、ＰＬＣは運転を続けることができる。なお、両メモリの比較処理は、例えば比較対照のデータを読み出してワークメモリ（ＷＲＡＭ）１３に格納し、そこにおいて比較するなどの他、各種の方法をとることができる。
【００４３】
また、ＡＳＩＣ１７は、命令実行時に理解できないコード（ＡＳＩＣ１７もＭＰＵ１２も共に実行できない命令のコード）を検出した場合は、異常をＭＰＵ１２に通知する機能を持っている。係る理解できないコードの検出に基づく通知をＭＰＵ１２が認識すると、バックアップメモリ１５にある該当するデータに基づいてユーザメモリ１４を修復し、その修復したコードを再度ＡＳＩＣ１７に読み込ませる。これにより、ＡＳＩＣ１７は、正しいコードを読み取り実行する。よって、ＰＬＣを停止することなくメモリの自動復旧を行える。
【００４４】
一例を示すと、例えば図２においてアドレス３の命令オブジェクトが理解できないコードとすると、ＡＳＩＣ１７の動作は以下のようになる。つまり、ＡＳＩＣ１７は、命令オブジェクトコードをアドレス順に順次読み取り、その命令内容を解析し、実行する。従って、まずアドレス１に格納された命令オブジェクトコードに基づく命令を実行し、次いでアドレス２に格納された命令オブジェクトコードの命令を実行する。そして、次の命令を実行すべくアドレス３の命令オブジェクトコードを読み取ると、理解できない命令コードであるため、その命令を実行することなく、ＭＰＵ１２に異常を通知する。
【００４５】
これを受けて、ＭＰＵ１２は、バックアップメモリ１５中に格納された該当するアドレス３の内容でユーザメモリ１４のアドレス３の内容を修正する。そして、ＡＳＩＣ１７に再度アドレス３の命令オブジェクトコードを読み取らせることによって、ＡＳＩＣ１７は、修復後のアドレス３の命令を実行する。その後、通常通り、アドレス４の命令オブジェクトコードを読み取り、その命令を実行する。このように、ユーザプログラムの演算実行中に、異常を発見した場合、ＰＬＣを停止することなく自動的にユーザプログラムの内容を修復し、正しい内容で演算実行を継続することができる。
【００４６】
次に、上記した各種のメモリ異常検出並びにそれに伴うメモリ自動復旧を行うための具体的な処理機能を説明する。まず、ＰＬＣ（ＣＰＵユニット１０）は、共通処理，演算処理（ユーザプログラムの実行），Ｉ／Ｏリフレッシュ処理および周辺サービス処理をサイクリックに繰り返し実行するようになっている。そこで、上記したユーザメモリ１４の異常チェックもサイクリックに行うことになるが、ユーザメモリ１４のユーザプログラム全体を１サイクルでチェックする方法と、複数サイクルに分けてチェックする方法がある。
【００４７】
複数サイクルに分けてチェックする場合は、ユーザメモリ１４のユーザプログラムを複数（Ｎ個）のブロックに分割し、１サイクルで１つのブロックに対してチェックを行い、Ｎサイクルでユーザプログラム全体のチェックが完了するようになる。そして、あるサイクルで異常が検知されたならば、そのサイクルで検査中のブロックのみをメモリ自動復旧することになる。そして、複数回に分けてチェックする場合のＭＰＵの機能は、図３に示すようになる。
【００４８】
すなわち、複数に分けたユーザメモリ１４のユーザプログラムの１ブロック分に対し、メモリチェックをする（ＳＴ１）。具体的には、ユーザメモリ１４とバックアップメモリ１５を比較する。そして、不一致があるか否かを判断する（ＳＴ２）。そして一致している場合には正常で、不一致の場合にはユーザメモリ１４のデータ破壊（メモリ異常）を生じていると判断する。
【００４９】
そこで、不一致が検出された場合は、現在処理中の１ブロック内の不一致箇所のメモリの自動復旧を行う（ＳＴ３）。つまり、両メモリの内容に不一致が生じた場合、メモリの安定性等の原因からユーザメモリ１４側にデータ破壊が生じたと推定できるため、上記した如く不一致の場合には該当するデータをバックアップメモリ１５から読み出してユーザメモリ１４に上書きするようにした。
【００５０】
但し、本発明はこれに限ることはなく、バックアップメモリ１５のユーザプログラムのサム値チェックを行い、バックアップメモリ１５の内容が正しいことを確認の上、ユーザメモリ１４への上書き処理を行うようにするとなお良い。バックアップメモリ１５のユーザプログラムのサム値チェックを行う理由は、バックアップメモリを構成する不揮発性メモリにおいてもデータ化けが発生する可能性が０ではないためである。
【００５１】
このようにして、メモリ異常があった箇所を正しいデータに修正後、或いはメモリが一致している場合に、通常のサイクリックな処理を実行する。つまり、ＡＳＩＣ１７が、ユーザメモリ１４に格納されたユーザプログラム（命令オブジェクトコード）を順次読み出し、コードを解析して命令を実行する（ＳＴ４）。次いで、Ｉ／Ｏリフレッシュを行う（ＳＴ５）。
【００５２】
従って、メモリ異常があった場合には、プログラム実行前にＣＰＵユニット１０内のバックアップメモリ１５に格納されたバックアップデータに基づいて自動的に修復された後、プログラムが実行される。よって、従来のようにＰＬＣを一旦停止することなく、継続運転が可能となる。
【００５３】
さらに、本実施の形態では、ステップ４のユーザプログラム実行時においてもメモリ異常（データ破壊）の有無を監視し、異常を検知した場合には自動復旧するようにしている。つまり、ＡＳＩＣ１７が読み出した命令オブジェクトコードが理解できないコードの場合には、異常と判断し、通知する。これに基づき、ＭＰＵ１２がユーザメモリ１４とバックアップメモリ１５を比較し、異常箇所を特定後、該当する部分のデータを修復させる。このため、ＡＳＩＣ１７が理解できないコードは実行されず、修復後にＡＳＩＣ１７が実行することにより、ＰＬＣを停止することなく、データ破壊が生じたメモリを自動復旧することが可能となる。また、ＭＰＵ１２は、ＡＳＩＣ１７が異常を通知してきた時のＡＳＩＣ１７が示すアドレスを知ることができる。したがって、ＭＰＵ１２は、そのアドレスの周囲の所定のサイズのデータを検査すればよいので、短時間で異常箇所を発見できる。なお、この処理の詳細は後述する。
【００５４】
なお、両メモリのユーザプログラムの比較であるが、この例では各サイクリックごとに、ユーザプログラム（データ）の一部について順次実行しているため、ユーザプログラム全体のチェックが完了するのは複数サイクルごとになる。但し、従来のようにサム値のチェックではないので、メモリ異常が生じている場合には、その異常箇所のブロックを検査することにより異常を検知できるので、異常箇所の発見は早期に行えるとともに、メモリ復旧も、当該異常を発生している箇所のみ行えば良く、さらに自動的に復旧されるので、従来のものよりも早期に修正処理を行うことができる。
【００５５】
つまり、ユーザメモリ１４のユーザプログラムをＮ個にブロックに分割した場合、Ｎサイクルでユーザプログラム全体のチェックが完了するが、ｎ番目（ｎ＜Ｎ）にメモリ異常が生じている場合、従来のサム値チェックではＮサイクルごとに初めて異常を検知することができ、しかも、異常があったことを知ることはできるものの異常箇所の特定まではできないので、ユーザプログラム全体を更新する必要がある。そこで、一旦ＰＬＣを停止し、修正処理を行うことになる。
【００５６】
これに対し、本実施の形態では、図４に示すように、分割したブロック単位で検査し、（ｎ−１）サイクルまでは、メモリ異常無しなのでそのまま通常のサイクリックな処理を行い、ｎ番目のサイクル実行時にメモリの不一致を検知すると、自動的に当該部分（ブロックｎ）のメモリを自動復旧させ、そのままＰＬＣを停止することなくユーザプログラムの実行を行うことになる。このように、本実施の形態では、ｎ回（Ｎ回未満）目でメモリ異常を発見でき、しかもＰＬＣを停止することなく自動復旧させるとともに、正しい内容でＰＬＣは運転を続行することができる。
【００５７】
なお、図３に示したフローチャートでは、上記したステップ１から５までの処理を繰り返し実行するようにしているが、本発明はこれに限ることはなく、例えばメモリチェックを毎サイクル行うのではなく、所定サイクルごとに行うようにしてもよい。さらには、従来のサム値チェックによるメモリチェック機能（異常検出時はＰＬＣを停止）を組み込むようにしてもよい。その場合には、係る従来方式と、上記した実施の形態によるユーザメモリ１４とバックアップメモリ１５のデータ内容の比較によるチェックのいずれかを切り替えて実行することになる。
【００５８】
次に、メモリチェック並びにそれに伴う自動復旧処理について説明する。まず、ステップ２は、具体的には図５に示す処理を実行する。すなわち、ユーザメモリ（ＲＡＭ）１４とバックアップメモリ（ＢＲＯＭ）１５を比較する（ＳＴ１１）。このとき比較するデータは、ユーザデータの一部であり、例えば４バイト分とする。そして、一致しているか否かを判断し（ＳＴ１２）、一致している場合には、そのまま正常終了する。また、一致していない場合には、バックアップメモリ１５中の該当箇所（不一致だった部分）のデータをユーザメモリ１４の該当箇所に上書きする（ＳＴ１３）。つまり、データの一部であっても、対応する部分同士を対比するので、比較した部分についての異常の有無を判定することができる。
【００５９】
これによりメモリの復旧が行われるが、本実施の形態では、さらに確実に復旧処理を行うために、ユーザメモリ１４のデータを再度読み出し（ＳＴ１４）、バックアップメモリ（ＢＲＯＭ）１５の内容と比較する（ＳＴ１５）。すると、通常であれば、ステップ１３の処理により正しい内容に復旧されているためこの判定処理はＹＥＳとなって正常終了する。但し、書き込みエラーなどにより正しく復旧できなかった場合には、ステップ１５の分岐判断はＮｏとなるので、ステップ１６に進み、バックアップメモリ１５中の該当箇所（不一致だった部分）のデータをユーザメモリ１４の該当箇所に上書きする。
【００６０】
そして、ユーザメモリ１４のデータを再度読み出し（ＳＴ１７）、バックアップメモリ（ＢＲＯＭ）１５の内容と比較する（ＳＴ１８）。なお、この２回の書き込み処理でもメモリの不一致が認められる場合には、メモリのハード的な故障の恐れがあるので、メモリ異常として処理を終了する。つまり、この場合には、ＰＬＣを停止することになる。
【００６１】
例えば、ユーザメモリ（ＲＡＭ）１４並びにバックアップメモリ（ＢＲＯＭ）１５に格納されたデータが、それぞれ図５のフローチャートの横に記載されたようになっているとすると、４番目のデータが不一致であるため、ステップ１３或いはステップ１６の処理により、ユーザメモリの内容が正しいものに修正される。なお、ステップ２で説明したように、バックアップメモリのサム値チェックをする場合には、図５に示すフローチャートでは、ステップ１１を実行する前に行うとよい。
【００６２】
一方、ステップ４のユーザプログラム実行時に行うチェックは、図６に示すようなフローチャート実行することになる。従来と同様にＡＳＩＣ１７が持つ異常検知機能により、自己が理解できないコードを取得した場合には、異常と判定し、ＭＰＵ１２に通知するので、ＭＰＵ１２は係る通知を受信するのを待つ（ＳＴ２１）。この通知を受け取ったＭＰＵ１２は、異常発生の事実を知り、ＡＳＩＣ１７のもつアドレスを取得する。ＭＰＵ１２は、取得したアドレスから上下所定の長さ分のデータに対し、ユーザメモリ（ＲＡＭ）１４とバックアップメモリ（ＢＲＯＭ）１５を比較する。そして、一致しないデータの箇所を検出すると、その位置を異常データ位置と特定し、検出処理を終了する（ＳＴ２２からＳＴ２４）。ここで前記「上下所定の長さ分」とは、各命令オブジェクトコードの先頭を現すフラグが化けることを想定すると命令オブジェクトコードの最大長とすれば良い。
【００６３】
そして、異常データ位置のデータを、バックアップメモリ１５から読み出してユーザメモリ１４に上書きし、復旧を行う（ＳＴ２５）。なお、この復旧処理も、図５で説明したように、正しく書き込めたかを複数回確認するようにするとよい。これにより、自動復旧が完了する。
【００６４】
そして、ＡＳＩＣ１７に対し、異常データを含む命令の先頭アドレスをセットする（ＳＴ２６）。これにより、ＡＳＩＣ１７は、異常検出に伴い完了できなかった命令を、当該異常データが正しい内容に復旧された正しい命令のもとで実行することができる。
【００６５】
さらに上記した命令実行時の処理の詳細は、図７に示すようになる。まず、命令実行時のＡＳＩＣは、正しいＡＳＩＣ命令（ＡＳＩＣで実行可能な命令コード）を受けている場合には、その命令を実行し、正しいＡＳＩＣ命令でない場合（正常なＭＰＵ実行可能命令或いは不正命令）には、ＡＳＩＣを停止し、ＭＦＮ＿ＳＴＰフラグをＯＮにする（ＳＴ３１，ＳＴ３２）。
【００６６】
そして、命令の種類が正常命令か不正命令かを判断する（ＳＴ３３）。そして、正常命令の場合には、ＭＦＮレジスタ（命令を格納するレジスタ）に命令番号をセットする（ＳＴ３５）。また、不正命令の場合にはＭＦＮレジスタに不正命令番号をセットする（ＳＴ３６）。
【００６７】
一方、ＭＰＵ１２は、ＭＦＮ＿ＳＴＰがＯＮになっているか否かを監視し（ＳＴ３７）、ＯＮの場合にはＡＳＩＣが停止したと判断し、ＭＰＵが命令実行する（ＳＴ３８）。すなわち、ステップ３３の分岐判断で正常命令の場合には、正常なＭＰＵ実行可能命令であるので、指定された位置で命令実行を行う。つまり、ＭＦＮレジスタにセットされた命令番号を実行する。また、不正命令（ＭＦＮレジスタの内容が不正命令番号、例えば０ｘ３ＦＦＣ）の場合には、メモリの自動復旧を行う。具体的には、図５に示したフローチャートを実行する。その後、ＡＳＩＣ１７を再起動し（ＳＴ３９）、ステップ３１に戻りユーザプログラムの処理を実行する。
【００６８】
上記した実施の形態では、複数回に分けてユーザメモリ１４のユーザプログラムとバックアップメモリ１５のユーザプログラムとの比較チェックを行うようにしたが、本発明はこれに限ることはなく、１サイクルでユーザメモリ１４のユーザプログラム全体のチェックを行うようにすることもできる。この場合に、図３に示すステップ１のメモリ異常のチェックをユーザメモリ１４のユーザプログラム全体に対して行うこともできる。また、１サイクルでユーザプログラム全体を比較チェックするかわりに、１サイクルでユーザプログラム全体のサム値チェックを行うようにしても良い。その場合には、例えば図８に示すフローチャートのようにサム値チェックを行うことになる。
【００６９】
すなわち、ユーザプログラムを実行する（ＳＴ４１）。この演算実行時に、上記した実施の形態のようにコードチェックをしてももちろん良い。次いで、ユーザメモリ１４のユーザプログラム全体のサム値チェックを行う（ＳＴ４２）。そして、異常の有無を判断し（ＳＴ４３）、異常が生じていない場合には、現在のＩＯメモリ１６上のＩ／Ｏデータを読み出して、バックアップメモリ（例えば、ＷＲＡＭ１３上に設ける）に待避する（ＳＴ４４）。その後、Ｉ／Ｏリフレッシュ処理をする（ＳＴ４７）。
【００７０】
また、異常が発生した場合には、ユーザメモリ１４のユーザプログラム全体のメモリ自動復旧を行う（ＳＴ４５）。具体的には、ＭＰＵ１２またはＡＳＩＣ１７は、ユーザメモリ１４のユーザプログラムとバックアップメモリ１５のユーザプログラムを比較し、この比較で不一致箇所を検出すると、当該不一致箇所のユーザメモリ１４上の不正データを該当するバックアップメモリ１５上のデータで書き換える。別の方法としては、バックアップメモリ１５に格納されたユーザプログラム等を読み出してユーザメモリ１４に書き込むことによりユーザプログラム全体を復旧するようにしても良い。サム値チェックにより異常を検知した場合には、メモリ異常箇所の特定はできないため、ユーザプログラム全体の復旧を行う。
【００７１】
ついで、Ｉ／Ｏデータの復旧処理を行う（ＳＴ４６）。つまり、正常であった前回にバックアップメモリ１５に待避しておいたＩ／Ｏデータを読み出して、ＩＯメモリ１６に書き込む。そして、その後、Ｉ／Ｏリフレッシュ処理をする（ＳＴ４７）。
【００７２】
なお、待避並びに復旧するデータとしては、Ｉ／Ｏデータの他に、ＩＯメモリ１６の他のデータ（例えば、パラメータ等のＩ／Ｏリフレッシュ処理の対象とならないデータ）を含めても良い。
【００７３】
そして、上記した１サイクルでユーザメモリ１４のユーザプログラム全体に対してチェックを行う方法の実際の動作は、図９に示すように、ユーザプログラム実行後にユーザメモリ１４のユーザプログラム全体をチェックし、異常がない場合には、Ｉ／Ｏデータを待避後、Ｉ／Ｏリフレッシュを行う。そして、メモリ異常が生じた場合には、ユーザメモリ１４の復旧と前回待避したＩ／Ｏデータに基づいてＩ／Ｏメモリの復旧を行うことになる。
【００７４】
なお、上記した実施の形態では、ユーザメモリ１４とバックアップメモリ１５のユーザプログラムとを比較するなど、チェック対象はユーザプログラムであったが、例えば、ＩＯメモリ１６に格納されたパラメータなどの設定値もバックアップメモリ１５に格納しておき、メモリチェックの際にＩＯメモリ１６に対してもデータ破壊（メモリ異常）の有無のチェック並びに異常時のメモリ自動復旧をすると良い。
【００７５】
上記した実施の形態で、ユーザメモリ１４のユーザプログラムとバックアップメモリ１５のユーザプログラムとを比較するとは、それぞれのユーザプログラム格納領域のデータを比較することで実行する。具体的には、ユーザプログラムが、ユーザメモリ１４またはバックアップメモリ１５に格納される際に予め計算されたユーザプログラムの格納領域のエリアサイズも一緒に格納しておき、比較時は、そのエリアサイズ分のデータ比較をすれば良い。
【００７６】
なお、上記した実施の形態においてバックアップメモリ１５は、予めユニットに内蔵されたメモリで構成しても良いし、メモリカードのようにユニットに着脱可能なメモリで構成しても良い。
【００７７】
他の実施形態として、ユーザメモリ１４内の異なる領域に同じオブジェクトコードの２つのユーザプログラム（どちらか一方を第1ユーザプログラムと呼び、他方を第２ユーザプログラムと呼ぶ）を格納した場合のメモリ自動復旧方法を示す。この実施形態では、ＰＬＣがプログラムの実行を開始すると、ＡＳＩＣ１７は命令実行する前に第1ユーザプログラムと第２ユーザプログラムを命令単位で読み出して比較する。比較結果が一致の場合は、命令実行を行う。また、比較結果が不一致となった場合は、ＡＳＩＣ１７はＭＰＵ１２に異常を通知する。この通知を受けたＭＰＵ１２は、不一致箇所のアドレスに該当するバックアップメモリ１５上のアドレスのデータで第１ユーザプログラムと第2ユーザプログラムの不正データを書き換えることによりユーザプログラムを復旧する。ユーザプログラムを復旧した後、ＭＰＵ１２は、ＡＳＩＣ１７の第１ユーザプログラムと第２ユーザプログラムの比較処理に制御を戻す。これらの処理をＡＳＩＣ１７とＭＰＵ１２は、ユーザプログラムの先頭から最後まで行なう。このような実施の形態とすることで、データ化けの発生していないオブジェクトコードでユーザプログラムの実行が可能となる。なお、この実施形態では、第１ユーザプログラムと第２ユーザプログラムをユーザメモリ１４内の異なる領域に格納するものとしたが、これに限ることはなく、ＡＳＩＣ１７がアクセス可能な別々のメモリ上にそれぞれ第１ユーザプログラム、第2ユーザプログラムを格納するようにしても良い。
【００７８】
更に、他の実施形態として、上記した複数のメモリ自動復旧の機能を実行するかどうかを選択可能なＰＬＣ用ユニットを示す。一般に、ＰＬＣ用ユニットは、その動作を設定するためのメモリを備えている。そのメモリの所定領域に、メモリ自動復旧を実行しないモード、メモリ自動復旧を実行するモード（この場合は、複数あるメモリ自動復旧機能からどの機能を実行するかを指定可能に構成する）を指定するためのメモリ自動復旧動作モード指定領域を新たに設ける。ＰＬＣ用ユニットの利用者は、ＰＬＣ用ユニットを運転させる前に所定のツールを用いてこのメモリ自動復旧動作モード指定領域に所定のデータを設定することでメモリ自動復旧するかどうか、メモリ自動復旧するとした場合は、どのメモリ自動復旧機能を実行させるかどうかを指定する。ＰＬＣ用ユニットは、ユーザプログラムの実行に先立って、メモリ自動復旧動作モード指定領域のデータを参照し、メモリ自動復旧に関する動作モードを取得する。この取得した動作モードがメモリ自動復旧を実行しない動作モードの場合は、ＰＬＣ用ユニットは、運転中にメモリ異常が発生するとメモリ自動復旧動作は行わず、メモリ異常が発生したことを報知し、運転を停止する。一方、取得した動作モードがメモリ自動復旧を実行するモードの場合は、ＰＬＣ用ユニットは、運転中にメモリ異常が発生すると指定されたメモリ自動復旧動作を行う。このメモリ自動復旧動作については、上記したいづれの実施形態でも良いため説明は省略する。この実施形態では、メモリ自動復旧動作モードを指定する方法としてＰＬＣ用ユニット内のメモリの所定領域にデータを設定する方法を示した。メモリ自動復旧動作モードを指定する他の方法として、メモリ自動復旧動作モードを指定する専用命令をユーザプログラムの先頭に記述し、この専用命令を実行することで動作モードを決定するように構成しても良い。この実施形態のＰＬＣ用ユニットは、メモリ自動復旧動作に伴う１サイクルに要する時間の延びが許容されるシステムではメモリ自動復旧動作を行い、メモリ自動復旧動作に伴う１サイクルに要する時間の延びが許容されないシステムではメモリ自動復旧動作を行わないように動作させることができる。つまり、この実施形態のＰＬＣ用ユニットは、メモリ自動復旧動作に伴う１サイクルに要する時間の延びが許容されるシステムおよびメモリ自動復旧動作に伴う１サイクルに要する時間の延びが許容されないシステムの両方に使用可能である。
【図面の簡単な説明】
【００７９】
【図１】本発明に係るユニットの内部構成の一例を示す図である。
【図２】動作原理を説明する図である。
【図３】機能を説明するフローチャートである。
【図４】機能を説明するフローチャートである。
【図５】第１の機能（データ比較）を説明するフローチャートである。
【図６】第２の機能（コードチェック）を説明するフローチャートである。
【図７】第２の機能（コードチェック）を説明するフローチャートである。
【図８】メモリチェックの別の方法を説明するフローチャートである。
【図９】メモリチェックの別の方法を説明するフローチャートである。
【符号の説明】
【００８０】
１０  ＣＰＵユニット（ＰＬＣ用ユニット）
１１  システムメモリ
１２  ＭＰＵ
１３  ワークメモリ（ＷＲＡＭ）
１４  ユーザメモリ（ＲＡＭ）
１５  バックアップメモリ（ＢＲＯＭ）
１６  ＩＯメモリ
１７  ＡＳＩＣ
１８  Ｉ／Ｏバス
【図１】
2006059382.tif 000003
【図２】
2006059382.tif 000004
【図３】
2006059382.tif 000005
【図４】
2006059382.tif 000006
【図５】
2006059382.tif 000007
【図６】
2006059382.tif 000008
【図７】
2006059382.tif 000009
【図８】
2006059382.tif 000010
【図９】
2006059382.tif 000011