(57)【要約】【課題】揮発性メモリをユーザプログラムのバックアップメモリとしながらも正しくユーザプログラムの破損を修復しシステム停止を不要とするＰＬＣを提供する。【解決手段】ユーザプログラムメモリ１７（ＲＡＭ）にはスキャン周期ごとの制御演算のために読み出されるユーザプログラムＭが、システムワークメモリ１６とユーザデータメモリ１８（共にＲＡＭ）にはそれぞれプログラムＭと同一内容のバックアップユーザプログラムＢ１とＢ２が格納され、多数決メモリ診断・修復手段１５Ｂ（システムプログラムメモリ１５内）がスキャン周期ごとに各プログラムＭ、Ｂ１、Ｂ２の互いに対応する領域のデータを読み出して比較し、このデータが一致するプログラムの数がユーザプログラムおよびバックアップユーザプログラムの総数の過半数（本例では２つ以上）となるデータが正しいとして各プログラムＭ、Ｂ１、Ｂ２の破損の有無を検出し、破損プログラムを非破損プログラムによって修復する。【選択図】        図１
2008090656.tif 000002
【特許請求の範囲】
【請求項１】
スキャン周期ごとにシーケンス制御の演算処理のために読み出されるユーザプログラムおよび該ユーザプログラムと同一内容の複数のバックアップユーザプログラムが１個のメモリに共に、または複数個のメモリの各々に前記ユーザプログラムおよびバックアップユーザプログラムの各プログラムが少なくとも１または複数プログラム格納されてなるプログラマブルコントローラであって、
前記スキャン周期ごとに前記ユーザプログラムおよび全てのバックアップユーザプログラムの互いに対応する領域のデータを読み出して比較し、このデータが互いに一致するプログラムの数が前記ユーザプログラムおよび全バックアップユーザプログラムの総数の過半数となるデータが正しいデータであるとして前記各プログラムの破損の有無を検出することを特徴とするプログラマブルコントローラ。
【請求項２】
前記の検出によって破損有りとされたプログラムの該当データを前記の正しいデータで修復し、シーケンス制御を継続することを特徴とする請求項１に記載のプログラマブルコントローラ。
【請求項３】
前記の検出によって破損有りとされたプログラムが前記ユーザプログラムであるときは、前記の検出によって破損無しとされたバックアップユーザプログラムの所定の１つを前記ユーザプログラムに置き換えて前記スキャン周期ごとの演算処理に利用し、シーケンス制御を継続することを特徴とする請求項２に記載のプログラマブルコントローラ。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、シーケンス制御の運転中、演算実行するユーザプログラムの破損を検出してこれを自動的に修復し、制御運転を継続できる機能を持つプログラマブルコントローラ（以下、ＰＬＣとも略記する）に関する。
なお、以下各図において同一の符号は同一もしくは相当部分を示す。
【背景技術】
【０００２】
プログラマブルコントローラ（ＰＬＣ）は、ユーザにより作成されて格納されたアプリケーションプログラムを演算実行してＰＬＣに接続される制御対象機器を自動的にシーケンス制御する装置であり、ＦＡ（ファクトリーオートメーション）等に広く使用されている。
このＰＬＣは、複数のモジュール、すなわち、電源供給源となる電源モジュール、ＰＬＣ全体を統括制御するＣＰＵモジュール、各種の制御対象機器の適所に取り付けたスイッチやセンサの信号を入力する入力モジュール、同じく制御対象機器のアクチュエータなどに制御出力を出す出力モジュール、通信ネットワークに接続するための通信モジュールなどの各種モジュールを適宜組み合わせて構成される。
【０００３】
図４は従来のＰＬＣの要部の構成例を示すブロック回路図である。同図において１００はプログラマブルコントローラ（ＰＬＣ）、２００はユーザプログラム（ユーザアプリケーションプログラムともいう）の作成や転送用のツールとしてのプログラミングローダであり、このプログラミングローダ２００は通信線３００を介してＰＬＣ１００のローダインタフェース３０に接続されている。
【０００４】
また、ＰＬＣ１００内において、１０はＣＰＵモジュール、４０は図外の制御対象機器と接続される入出力モジュール（Ｉ／Ｏモジュールとも略記する）である。
ＣＰＵモジュール１０は、内部のシステムバス１９によって互いに接続された、以下の１１、１３〜１８の各構成部からなる。
ここでＣＰＵ１１は、システムプログラムメモリ１５に記憶されたシステムプログラムを実行し、ＣＰＵモジュール１０内の各構成部の動作制御を行うと共に、ユーザプログラムメモリ１７に記憶されたユーザプログラムを実行して図外の制御対象機器のシーケンス制御を行う。このＣＰＵ１１には通常、汎用のＭＰＵあるいはこれに代わる専用ＩＣ（ＡＳＩＣ）が用いられている。
【０００５】
ドライバ／レシーバ１３はローダインタフェース３０に接続され、通信線３００を介しプログラミングローダ２００とＣＰＵ１１との間で送受信データを受け渡す役割を持つ。
ＰＬＣ固有バスインタフェース１４は、Ｉ／Ｏモジュール４０に対してＰＬＣ固有バス１４ａを介し外部の制御対象機器の制御に関わる信号の入出力を行う。
システムプログラムを保持するシステムプログラムメモリ１５には、通常、不揮発性メモリであるＥＰＲＯＭあるいはＦＬＡＳＨメモリが使用される。なお、サムチェック・メモリ診断手段１５Ａはこのメモリ１５に格納されたシステムプログラムが保持する後述のメモリ診断用のソフトウェア手段である。
【０００６】
システムワークメモリ１６は、ＣＰＵ１１がシステムプログラムを実行する際に生ずるデータを一時記憶する役割を持ち、このメモリ１６には、通常、ＲＡＭが使用される。
ユーザプログラムメモリ１７は、プログラミングローダ２００から受信したユーザプログラムを記憶する役割を持ち、このメモリ１７には、通常、ＲＡＭが使用される。
なお、このメモリ１７には、ローダ２００からのユーザプログラムがマシンコードである命令オブジェクトコード、つまりこのユーザプログラムを高速に実行すべきＣＰＵ１１が理解できるコードに変換されて格納されている。
【０００７】
ユーザデータメモリ１８は、ユーザプログラムで使用するデータ、例えば制御対象機器との間で送受信する接点信号等の情報を記憶する役割を持ち、このメモリ１８には、通常、ＲＡＭが使用される。
図５は従来のＰＬＣのＣＰＵ１１が実行する全般的なソフトウェア処理の例を示すフローチャートで、Ｓ１〜Ｓ１３はそのステップ番号である。ここではステップＳ６のみがユーザプログラムの処理に相当し、これ以外のステップはシステムプログラムの処理に相当する。
【０００８】
図５では、ＣＰＵ１１は、電源投入に基づきリセットされたのち、予め伝送用ＩＣの設定などの初期化処理（ステップＳ１）、バスの短絡やメモリバックアップの異常などの有無を調べる自己診断処理（ステップＳ２）、メモリクリアやユーザプログラム実行のための設定などの各種システム処理（ステップＳ３）を順次行ったうえ、ステップＳ４以降のループ動作に入る。
【０００９】
ステップＳ４の状態判定分岐処理では、ＣＰＵ１１は現在の自己の状態が運転の正常な実行が可能な状態で有るか否かを判定し、それぞれの状態に応じたループ処理に分岐する。そして、運転の正常な実行が可能な状態と判定すれば「運転正常実行」の分岐に進み、ステップＳ５以降のシーケンス制御処理を実行する。
このシーケンス制御処理では、ＣＰＵ１１は、先ずＩ／Ｏモジュール４０内の図外の入力モジュールで入力した制御対象機器からの入力信号をユーザデータメモリ１８内のＩ／Ｏメモリ領域に取り込み（ステップＳ５、入力リフレッシュ）、次いでユーザプログラムメモリ１７に格納されたユーザプログラム（シーケンスプログラム）を読み出し、上記制御対象機器からの最新の入力信号を用いて論理演算を行う（ステップＳ６、ユーザプログラム演算実行）。
【００１０】
そして、その演算実行結果である制御出力信号をユーザデータメモリ１８内のＩ／Ｏメモリ領域に書き込んだのち、Ｉ／Ｏモジュール４０内の図外の出力モジュールに送出して制御対象機器側へ出力させ（ステップＳ７、出力リフレッシュ）、その後、後述のようないわゆるスキャンＥＮＤ処理、即ちメモリ診断処理（ステップＳ１０）、ローダ処理（ステップＳ１１）、基準ＳＵＭ値算出処理（ステップＳ１２）、各種システム診断処理（ステップＳ１３）を行う。そして、以上のステップＳ４〜Ｓ１３の一連の処理をスキャン周期（シーケンス演算周期ともいう）ごとに繰り返し実行して制御対象機器を制御する。
【００１１】
ところで、ＰＬＣが設置される工場内の環境としては、サーボモータ、インバータ、高圧電力装置など多種多様な装置がＰＬＣに接続され、あるいはＰＬＣの付近に配置されている。そのため、放射ノイズ、電源の瞬時停電、電磁界などにより、ＣＰＵモジュール内のメモリに格納されたデータの破壊が発生しやすくなっている。また、ＣＰＵモジュール内のメモリのデータ破壊の現象は、宇宙線によっても生じる。なお、前者の原因によるデータ破壊は、通常数ビット（複数バイト）単位で発生し、後者の宇宙線によるデータ破壊は、１ビット単位で発生することが多い。
【００１２】
当然のことながら、データ破壊が生じたユーザプログラムに基づいて制御すると正常動作しないので、ＣＰＵ１１は、運転中、この場合、スキャンＥＮＤ処理内のメモリ診断処理（ステップＳ１０）で、図６に示すようなメモリ診断サブルーチン処理によりユーザプログラムの破壊が発生していないかを確認している。
なお、スキャンＥＮＤ処理内のローダ処理（ステップＳ１１）では、プログラミングローダ２００から新規の、あるいは変更されたユーザプログラムがダウンロードされた場合、このダウンロードされたユーザプログラムをユーザプログラムメモリ１７に取り込んで従来のユーザプログラムを更新する。
【００１３】
同じくスキャンＥＮＤ処理内の基準ＳＵＭ値算出処理（ステップＳ１２）では、上記の更新後のユーザプログラムの先頭から最終までの値を加算し、得られた値を基準サム値（なお、サムをＳＵＭとも記す）としてシステムワークメモリ１６内の所定領域に格納する。
また同じくスキャンＥＮＤ処理内の各種システム診断処理（ステップＳ１３）では、Ｉ／Ｏモジュール４０のＰＬＣ固有バス１４ａからの外れチェックなどを行う。
【００１４】
ここで、図５のスキャンＥＮＤ処理内のメモリ診断処理（ステップＳ１０）で行われる、詳細処理としての図６のメモリ診断サブルーチン処理を説明する。図６中、Ｓ４１〜４６はこの処理のステップ番号である。
なお、図４のシステムプログラムメモリ１５内に示したサムチェック・メモリ診断手段１５Ａの機能は図５のメモリ診断処理（ステップＳ１０）、つまり図６のメモリ診断サブルーチン処理と、図５の基準ＳＵＭ値算出処理（ステップＳ１２）に相当する。
【００１５】
図６のメモリ診断処理を要約すれば、ＲＡＭ上にある診断対象のデータのＳＵＭ値（被診断ＳＵＭ値という）を計算して予め格納してある基準ＳＵＭ値と比較し、一致することで診断対象のデータに異常がないことを確認するというものである。
具体的には、実際の運転中（つまりスキャン周期ごとのシーケンス制御のループ処理中）、図５中のメモリ診断処理（ステップＳ１０）において、ＣＰＵ１１は、ユーザプログラムメモリのＲＡＭ１７上にあるユーザプログラムのＳＵＭ値としての被診断ＳＵＭ値をスキャン周期の複数回分に分けて算出する（ステップＳ４１）。
【００１６】
そして最終データまでのＳＵＭ値算出に達していないと判別したスキャン周期では（ステップＳ４２、分岐ＮＯ）、そのまま図６の処理を抜ける。
他方、このステップＳ４２で最終データまでのＳＵＭ値算出を終えたと判別した場合は（分岐ＹＥＳ）、この被診断ＳＵＭ値を前記のようにシステムワークメモリ１６内の所定領域に格納した基準ＳＵＭ値と比較する（ステップＳ４３、４４）。
【００１７】
ここで、ＳＵＭ値が一致した場合は（ステップＳ４４、分岐「一致」）、再度、上記と同様にユーザプログラムメモリ１７上のユーザプログラムのＳＵＭ値、つまり被診断ＳＵＭ値の算出を繰り返すこととしてその準備を行って（ステップＳ４６）、図６の処理を抜ける。
しかし、ＳＵＭ値が一致しない場合は（ステップＳ４４、分岐「不一致」）、何らかの理由でＲＡＭ１７上のユーザプログラムが破損したと判断し、暴走・不正出力を防止するためＰＬＣの運転を異常停止させる状態変更要求をセットし（ステップＳ４５）、図６の処理を抜ける。
【００１８】
このように運転異常停止の状態変更要求がセットされると、図５のループ処理の先頭ステップＳ４の状態判定分岐処理で「運転異常停止」へ分岐してステップＳ１１に飛ぶこととなり、結果としてＰＬＣによるシーケンス制御動作が停止する。
しかし、このようにＰＬＣの運転を異常停止させると、制御しているシステム全体が停止してしまい工場の操業等に重大な影響が生じる可能性がある。そこで、システムを復旧動作させるため、保守員などによりプログラミングローダ等のツールをＰＬＣに接続し、ユーザプログラムを再度転送してメモリの修正作業を実行する必要があるが、ＰＬＣは、一般に制御盤の奥に設置されているので、その接続は簡単ではなく、メモリの修復作業・システムの再起動までに多くの時間が必要となる。
【００１９】
この問題を解決するために、特許文献１には、演算処理時に読み出されるユーザプログラムが格納されるユーザメモリと、ユーザプログラムと同一内容のデータが格納されたバックアップメモリとを設け、シーケンス制御のサイクリック動作中にユーザメモリとバックアップメモリのデータとの照合を行うことでユーザメモリ破損の検出を行い、検出したユーザメモリの異常箇所のデータをバックアップメモリの該当箇所のデータで修復し、システムを停止させることなくシーケンス制御を継続できるようにするＰＬＣのメモリ自動復旧方法が開示されている。
【特許文献１】特開２００６−５９３８２号公報
【発明の開示】
【発明が解決しようとする課題】
【００２０】
しかしながら、特許文献１のメモリ自動復旧方法では、バックアップメモリのデータが安定したものであれば問題ないが現実には変化可能なものであり、メモリ破損の検出時、厳密にはユーザメモリのデータとバックアップメモリのデータとのいずれが真に正しいかが分からず、メモリ修復の信頼性に欠けるという問題がある。この問題は特にバックアップメモリが不揮発性メモリ（ＲＯＭ、ＦＬＡＳＨメモリ等）でなく揮発性メモリ（ＲＡＭ）である場合、より大きなものとなる。
【００２１】
そこで本発明の課題は、揮発性メモリ（ＲＡＭ）をユーザプログラムのバックアップメモリとしたＰＬＣであっても正しくユーザメモリの破損を修復でき、システムの停止を不要とするプログラマブルコントローラ（ＰＬＣ）を提供することにある。
【課題を解決するための手段】
【００２２】
前記の課題を解決するために請求項１のプログラマブルコントローラは、
スキャン周期ごとにシーケンス制御の演算処理のために読み出されるユーザプログラム（Ｍ）および該ユーザプログラムと同一内容の複数のバックアップユーザプログラム（Ｂ１、Ｂ２など）が１個のメモリに共に、または複数個のメモリ（それぞれＲＡＭからなるユーザプログラムメモリ１７、システムワークメモリ１６、ユーザデータメモリ１８など）の各々に前記ユーザプログラムおよびバックアップユーザプログラムの各プログラムが少なくとも１または複数プログラム格納されてなるプログラマブルコントローラ（１００）であって、
（多数決メモリ診断・修復手段１５Ｂを介し）前記スキャン周期ごとに前記ユーザプログラムおよび全てのバックアップユーザプログラムの互いに対応する領域のデータを読み出して比較し、このデータが互いに一致するプログラムの数が前記ユーザプログラムおよび全バックアップユーザプログラムの総数の過半数となるデータが正しいデータであるとして前記各プログラムの破損の有無を検出するようにする。
【００２３】
また、請求項２のプログラマブルコントローラは、請求項１に記載のプログラマブルコントローラにおいて、前記の検出によって破損有りとされたプログラムの該当データを前記の正しいデータで修復し、シーケンス制御を継続するようにする。
また請求項３のプログラマブルコントローラは、請求項２に記載のプログラマブルコントローラにおいて、前記の検出によって破損有りとされたプログラムが前記ユーザプログラムであるときは、前記の検出によって破損無しとされたバックアップユーザプログラムの所定の１つを前記ユーザプログラムに置き換えて前記スキャン周期ごとの演算処理に利用し、シーケンス制御を継続するようにする。
【００２４】
本発明の作用は次の如くである。即ち、ＰＬＣ内にシーケンス制御の演算処理のために読み出されるユーザプログラムを保持するユーザメモリ（ユーザプログラムメモリ）のほかに、ユーザプログラムと同一内容のデータ（バックアップユーザプログラム）を保持する複数のバックアップメモリ（ＲＡＭ）を設け、多数決判断処理によりメモリの破損を検出することにより、不揮発性メモリ（ＲＯＭ、ＦＬＡＳＨメモリ等）上にユーザプログラムのバックアップデータ（バックアップユーザプログラム）を保存していないＰＬＣにおいてもユーザメモリの破損を確実に検出して、破損していない他のバックアップメモリのデータからこれを直ちに修復するか、またはＣＰＵが制御演算実行のために読み込むプログラムメモリを破損していないバックアップメモリに切り替え、ＣＰＵの演算動作を停止することなく、システムの稼働を継続させるものである。
【発明の効果】
【００２５】
本発明によれば、ＰＬＣ内にシーケンス制御の演算処理のために読み出されるユーザプログラムを保持するユーザプログラムメモリ（ＲＡＭ）のほかに、それぞれユーザプログラムと同一内容のバックアップユーザプログラムを保持する複数のバックアップメモリ（ＲＡＭ）を設け、多数決判断処理によりメモリ（プログラム）の破損を検出するようにしたので、
不揮発性メモリ（ＲＯＭ、ＦＬＡＳＨメモリ等）上にバックアップユーザプログラムを保存していないＰＬＣにおいてもユーザプログラムの破損を確実に検出して、破損していないバックアップユーザプログラムのデータからこれを直ちに修復したり、またはＣＰＵが制御演算実行のために読み込むユーザプログラムを破損していないバックアップユーザプログラムに切り替えるようにして、ＰＬＣの制御運転動作を停止することなく、システムの稼働を継続させことができる。
【００２６】
なお、破損していたユーザプログラムはその破損検出箇所以降のプログラム部分にも破損を生じている可能性が高いが、上記のようにＣＰＵが制御演算実行のために読み込むユーザプログラムを破損していないバックアップユーザプログラムに切り替えた場合、破損を生じている可能性が高いプログラムを演算に使用しないため、より安全にＰＬＣの運転を継続することができる。
【発明を実施するための最良の形態】
【００２７】
次に図１ないし図３を用いて本発明の実施の形態を説明する。
図１は本発明の一実施例としてのＰＬＣの要部の構成を示すブロック回路図で図４に対応するものである。図１の図４に対する相違は、図１ではシステムプログラムメモリ１５に付加されるメモリ診断に関わるソフトウェア手段が、図４のサムチェック・メモリ診断手段１５Ａから多数決メモリ診断・修復手段１５Ｂに置き換わった点と、ユーザプログラムメモリ１７に格納されるユーザプログラム（図１ではＭとして示す）に対するバックアップ用の２つのプログラムであるバックアップ・ユーザプログラムＢ１およびＢ２の格納領域が、それぞれシステムワークメモリ１６およびユーザデータメモリ１８の各ＲＡＭに設けられている点である。
【００２８】
なお、図１における多数決メモリ診断・修復手段１５Ｂ、並びにバックアップユーザプログラムＢ１およびＢ２に関わる機能を除く各部の機能は、図４におけるサムチェック・メモリ診断手段１５Ａに関わる機能を除く各部の機能と同様である。
また、図２は図１のＣＰＵ１１が実行する全般的なソフトウェア処理の実施例を示すフローチャートで、図５に対応するものである。図２の図５に対する相違は、図５のメモリ診断処理（ステップＳ１０）が図２では後述の図３のメモリ診断修復サブルーチン処理でその具体内容を示すメモリ診断修復処理（ステップＳ１０Ａ）に置き換わった点と、図５の基準ＳＵＭ値算出処理（ステップＳ１２）が、図２ではバックアップ・ユーザプログラム格納処理（ステップＳ１２Ａ）に置き換わった点である。
【００２９】
そして、図１のシステムプログラムメモリ１５内に示した多数決メモリ診断・修復手段１５Ｂの機能は図２のメモリ診断修復処理（ステップＳ１０Ａ）とバックアップ・ユーザプログラム格納処理（ステップＳ１２Ａ）に相当する。
図２のバックアップ・ユーザプログラム格納処理（ステップＳ１２Ａ）では、図２のローダ処理（ステップＳ１１）でユーザプログラムメモリ１７にユーザプログラムＭが新規あるいは従来のプログラムを更新してダウンロードされたとき、ＣＰＵ１１が、このユーザプログラムＭと同一内容の２つのプログラムであるバックアップユーザプログラムＢ１およびＢ２をそれぞれシステムワークメモリ１６およびユーザデータメモリ１８に格納する。
【００３０】
なお、システムワークメモリ１６、ユーザプログラムメモリ１７、ユーザデータメモリ１８等に使用しているＲＡＭは、ＬＳＩ技術の進歩により大容量化が進んでおり（逆に小容量のＲＡＭが入手できなくなっている）、そのため特に小／中規模用のＣＰＵモジュール１０の製品仕様を実現するために必要な容量に対し、未使用領域が多く存在する状況にある。
【００３１】
本発明では本来は別の目的で設けられているＲＡＭにバックアップユーザプログラムも格納するためＲＡＭのメモリ量を従来より多く使用することになるが、上記のように存在するＲＡＭの未使用領域を利用できるため製品コストには影響を与えない。
図３は図２のメモリ診断修復処理（ステップＳ１０Ａ）の詳細処理としてのサブルーチン処理の実施例を示すフローチャートで、ステップＳ２１〜Ｓ３２はそのステップ番号である。なお本実施例では、図３の後述するステップＳ２１、Ｓ２２、Ｓ２３に定義する〔データＭ〕、〔データＢ１〕、〔データＢ２〕は、図２の正常運転時におけるスキャン周期での毎回のループ処理ごとに、順次、１命令文ずつ、それぞれユーザプログラムＭ、バックアップユーザプログラムＢ１、バックアップユーザプログラムＢ２から読み出される、相対アドレスが共通の命令データであるものとする。
【００３２】
次に図３を説明する。先ずステップＳ２１では、運転に使用しているユーザプログラム（本例ではユーザプログラムメモリ１７に格納したユーザプログラムＭとする）内の該当するアドレスの命令文のデータを読み出し〔データＭ〕とする。
次のステップＳ２２では、運転に使用していない一つ目のバックアップユーザプログラム（本例ではシステムワークメモリ１６に格納したバックアップユーザプログラムＢ１とする）内の前記〔データＭ〕と共通の相対アドレスの命令文のデータを読み出し〔データＢ１〕とする。
【００３３】
さらに次のステップＳ２３では、運転に使用していない二つ目のバックアップユーザプログラム（本例ではユーザデータメモリ１８に格納したバックアップユーザプログラムＢ２とする）の前記〔データＭ〕と共通の相対アドレスの命令文のデータを読み出し〔データＢ２〕とする。
次のステップＳ２４（メモリ破損検出）では、〔データＭ〕と〔データＢ１〕を比較する。ここで両者が一致した場合（分岐「一致」）、さらにステップＳ２５（メモリ破損検出）に進み〔データＭ〕と〔データＢ２〕を比較する。
【００３４】
このステップＳ２５の比較で〔データＭ〕と〔データＢ２〕が一致した場合（分岐「一致」）、〔データＭ〕、〔データＢ１〕、〔データＢ１〕の３者のデータが一致したこととなり、データの破損なしとして図３の処理を抜ける。
他方、前記ステップＳ２５の比較結果が不一致の場合（分岐「不一致」）、〔データＢ２〕に破損ありとして、次のステップＳ２６（破損メモリ修復）で〔データＢ２〕のアドレスに〔データＭ〕を書き込んで〔データＢ２〕を修復し図３の処理を抜ける。なお、この〔データＢ２〕の修復は、以後も継続して図３の処理によるメモリの破損検出を実施できるようにするためである。
【００３５】
次に前記ステップＳ２４の比較結果で〔データＭ〕と〔データＢ１〕が不一致の場合（分岐「不一致」）、さらにステップＳ２７（メモリ破損検出）に進み〔データＭ〕と〔データＢ２〕を比較する。
このステップＳ２７で〔データＭ〕と〔データＢ２〕が一致した場合（分岐「一致」）、〔データＢ１〕に破損ありとして、次のステップＳ２８（破損メモリ修復）で〔データＢ１〕のアドレスに〔データＭ〕を書き込んで〔データＢ１〕を修復し図３の処理を抜ける。なお、この〔データＢ１〕の修復も、以後の図３の処理によるメモリの破損検出を実施可能にするためである。
【００３６】
他方、前記ステップＳ２７の比較結果で〔データＭ〕と〔データＢ２〕が不一致の場合（分岐「不一致」）、さらにステップＳ２９で〔データＢ１〕と〔データＢ２〕を比較する。ここで両者が一致した場合（分岐「一致」）、〔データＭ〕に破損ありとして、次のステップＳ３０（破損メモリ修復）で〔データＭ〕のアドレスに〔データＢ１〕を書き込んで〔データＭ〕を修復する。
【００３７】
この修復によりユーザプログラムメモリ１７のユーザプログラムＭを引続きシーケンス制御の演算実行に使用できるはずであるが、同一ＲＡＭ１７上の一度破損したユーザプログラムＭは修復箇所の〔データＭ〕以外にも今後の演算実行に使用する箇所で破損している可能性が考えられる。
そこで本実施例では安全のため、次のステップＳ３１（未破損メモリへの切り替え）でシーケンス制御の演算実行に使用するユーザプログラムのアドレスを、破損のあったユーザプログラムＭのアドレスからバックアップユーザプログラムＢ１のアドレスに切り替える（つまり、今までのバックアップユーザプログラムＢ１を今までのユーザプログラムＭに置き換える）と共に、ステップＳ３０の処理で破損が修復された今までのユーザプログラムＭを今までのバックアップユーザプログラムＢ１に置き換えた形で図３の処理が継続できるようにし、図３の処理を抜ける。
【００３８】
なお、上記のアドレス変更方法は、本発明を適用するＣＰＵの機能に合わせ適宜実現することができる。例えば８０８６系の汎用ＣＰＵのように、セグメントのようなべースアドレスの概念を持つものであれば、ベースアドレスを変更すれば良い。また、ベースアドレスの概念がないＣＰＵの場合でも、ユーザプログラムの格納されているアドレス管理ファイルのデータを補正することで、アドレス変更を実施することができる。
【００３９】
ところで、前記ステップＳ２９の〔データＢ１〕と〔データＢ２〕の比較で両者が不一致の場合（分岐「不一致」）、〔データＭ〕、〔データＢ１〕、〔データＢ２〕の３者のデータが不一致で、破損データは存在するがこのままではそれをを特定できないため、本実施例では次のステップＳ３２（破損あり、特定不能）にて運転異常停止をするための状態変更要求をセットし、図３の処理を抜ける。
【００４０】
上述のように図３の処理では、ユーザプログラムおよびバックアップユーザプログラムについての〔データＭ〕、〔データＢ１〕、〔データＢ２〕の３者のデータを比較し、３者一致にて破損なしとし、２者一致の多数決判断で、一致しない１者のデータを破損と検出している。
なお、３者データの不一致の場合、前記ステップＳ３２では運転の異常停止をすることとしたが、実際には、この３者のデータ内に破損していないデータが存在する可能性もある。そこで、運転異常停止をする前に、さらに従来のサムチェックを併用することとすれば、サム値が一致するユーザプログラム（またはバックアップユーザプログラム）を「破損なし」、サム値が一致しないユーザプログラム（またはバックアップユーザプログラム）を「破損あり」として正常なユーザプログラム（またはバックアップユーザプログラム）を選別することができ、ＰＬＣ異常停止の確率をさらに減少させることができる。
【００４１】
なお、本実施例では２つのバックアップユーザプログラムをＲＡＭからなるシステムワークメモリ１６とユーザデータメモリ１８にそれぞれ格納することとしたが、同じくＲＡＭからなるユーザプログラムメモリ１７にユーザプログラムと共にバックアップユーザプログラムを格納する方法も考えられる。
また、上述した図３のメモリ診断修復処理の実施例では、スキャン周期での本処理１回ごとにユーザプログラムおよびバックアップユーザプログラムの１命令文ずつを読み出して比較することとしているが、これに代わり、処理に時間がかかるものの、１回のメモリ診断修復処理でユーザプログラムおよびバックアップユーザプログラムの全命令文をいっぺんに読み出して比較する方法をとることもできる。
【００４２】
更に本実施例では、図３のメモリ診断修復処理の実行を、図２のＣＰＵのスキャンＥＮＤ処理内で実施しているが、定周期割込み処理などの他のタイミングで実行するようにしてもよい。
【図面の簡単な説明】
【００４３】
【図１】本発明の一実施例としてのＰＬＣの要部の構成を示すブロック回路図
【図２】図１のＰＬＣのＣＰＵの全般処理の手順の実施例を示すフローチャート
【図３】図２のメモリ診断修復処理の詳細手順の実施例を示すフローチャート
【図４】図１に対応する従来のＰＬＣの要部の構成例を示すブロック回路図
【図５】図４のＰＬＣのＣＰＵの全般処理の手順の例を示すフローチャート
【図６】図５のメモリ診断処理の詳細手順の例を示すフローチャート
【符号の説明】
【００４４】
１０          ＣＰＵモジュール
１１          ＣＰＵ
１３          ドライバ／レシーバ
１４          ＰＬＣ固有バスインタフェース
１４ａ        ＰＬＣ固有バス
１５          システムプログラムメモリ
１５Ｂ        多数決メモリ診断・修復手段
１６          システムワークメモリ
１７          ユーザプログラムメモリ
１８          ユーザデータメモリ
１９          システムバス
３０          ローダインタフェース
４０          Ｉ／Ｏモジュール
１００        プログラマブルコントローラ（ＰＬＣ）
２００        プログラミングローダ
３００        通信線
Ｍ            ユーザプログラム
Ｂ１、Ｂ２    バックアップユーザプログラム
【図１】
2008090656.tif 000003
【図２】
2008090656.tif 000004
【図３】
2008090656.tif 000005
【図４】
2008090656.tif 000006
【図５】
2008090656.tif 000007
【図６】
2008090656.tif 000008