(57)【要約】      （修正有）【課題】二重化されるＣＰＵユニットの処理能力が互いに異なる場合であっても、同期に係る誤判定を防ぐことができるＰＬＣを提供する。【解決手段】第１ＣＰＵユニット１００Ａは、自ユニットの性能と、第２ＣＰＵユニット１００Ｂの性能との比を考慮して、同期チェック処理のための待ち時間を設定する。【選択図】図１
2020052550.tif 000002
【特許請求の範囲】
【請求項１】
コントローラにおいて二重化されるＣＰＵユニットであって、
自ユニットの処理能力と、二重化される相手方のＣＰＵユニットの処理能力との比を考慮して、待ち時間を設定する設定部と、
自ユニットにおける処理の実行完了時点から、前記設定部によって設定された前記待ち時間を経過するまでに、前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できないと、前記相手方のＣＰＵユニットに異常が発生したと判定する判定部と、
を備えるＣＰＵユニット。
【請求項２】
前記処理は、自ユニットのハードウェアに異常がないかを診断する自己診断処理、前記相手方のＣＰＵユニット以外の外部装置を制御する信号を生成する命令実行処理、および、前記相手方のＣＰＵユニット以外の外部装置との間でデータを交換するＩ／Ｏリフレッシュ処理を含み、
前記設定部は、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々について、前記待ち時間を設定し、
前記判定部は、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々について、前記判定を実行する
請求項１に記載のＣＰＵユニット。
【請求項３】
前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に、前記相手方のＣＰＵユニットの処理能力を、前記相手方のＣＰＵユニットから取得する二重化処理を、１回実行する
請求項２に記載のＣＰＵユニット。
【請求項４】
前記設定部は、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々の前記待ち時間を、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々の実行に係る、自ユニットの処理能力と、前記相手方のＣＰＵユニットの処理能力との比を考慮して設定する
請求項２または３に記載のＣＰＵユニット。
【請求項５】
コントローラにおいて二重化されるＣＰＵユニットの制御方法であって、
自ユニットの処理能力と、二重化される相手方のＣＰＵユニットの処理能力との比を考慮して、待ち時間を設定する設定ステップと、
自ユニットにおける処理の実行完了時点から、前記設定ステップにて設定された前記待ち時間を経過するまでに、前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できないと、前記相手方のＣＰＵユニットに異常が発生したと判定する判定ステップと、
を含む制御方法。
【請求項６】
請求項１から４のいずれか一項に記載のＣＰＵユニットとしてコンピュータを機能させるための情報処理プログラムであって、前記各部としてコンピュータを機能させるための情報処理プログラム。
【請求項７】
請求項６に記載の情報処理プログラムを記録したコンピュータ読み取り可能な記録媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、コントローラにおいて二重化されるＣＰＵユニット等に関する。
【背景技術】
【０００２】
従来、ＰＬＣ（プログラマブル・ロジック・コントローラ、Programmable Logic Controller）について、システムの安全性、信頼性を向上すること等を目的として、ＣＰＵユニットを二重化する構成が知られている。例えば、下掲の特許文献１には、二重化運転開始に先立ち、実行系のＣＰＵユニットが、待機系のＣＰＵユニットのユニットバージョンを取得し、自己が記憶保持する機能バージョンと比較して、ユニットバージョンが機能バージョン以上である場合に二重化運転可能と判断する構成が開示されている。以下、図８および図９を参照して、ＰＬＣにおけるＣＰＵユニットの、従来までの二重化について説明する。
【０００３】
図８は、ＰＬＣにおいて二重化されたＣＰＵユニットの、従来までの処理の概要を説明する図である。図８に例示するように、ＰＬＣにおいて二重化されたＣＰＵユニットの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順に繰り返し実行する。Ｉ／Ｏリフレッシュ処理が実行されてから、次のＩ／Ｏリフレッシュ処理が実行されるまでを「１サイクル（１周期）」とも称する。つまり、ＰＬＣにおいて二重化されたＣＰＵユニットの各々は、「１サイクル（１周期）」において、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で実行する。「１サイクル」に要する期間（つまり、Ｉ／Ｏリフレッシュ処理が実行されてから、次のＩ／Ｏリフレッシュが実行されるまでの期間）を、「サイクルタイム」とも称する。
【０００４】
自己診断処理は、自ユニットのハードウェアが正常に動作しているか、特にメモリおよびハードディスク等に異常がないかを診断する処理である。命令実行処理は、ユーザプログラム等を実行する処理であり、前の周期において実行されたＩ／Ｏリフレッシュ処理で取得したデータを用いて各種の演算を実行し、現在の周期におけるＩ／Ｏリフレッシュ処理で出力するデータを生成する処理である。Ｉ／Ｏリフレッシュ処理は、二重化された相手方のＣＰＵユニット以外の、外部装置および外部ユニットとのデータ交換を実行する処理であり、直前の命令実行処理で生成されたデータを出力し、次の周期の命令実行処理に用いるデータを取得する処理である。
【０００５】
ＰＬＣにおいて二重化されるＣＰＵユニットは、一方が実行系とされ、他方が待機系（ＳＴＢ）とされ、互いに、二重化された相手方のＣＰＵユニットの状態を確認する。そして、前記実行系のＣＰＵユニットがダウンした場合、前記待機系のＣＰＵユニットが、ダウンした前記実行系のＣＰＵユニットに切り替わって、運転を継続する。以下、実行系とされたＣＰＵユニットを「ＡＣＴ」と略記し、待機系とされたＣＰＵユニットを「ＳＴＢ」と略記することがある。
【０００６】
ＡＣＴがダウンした場合のＡＣＴからＳＴＢへの切替をスムーズに行なうため、ＡＣＴとＳＴＢとは、図８に示すように、各ＣＰＵユニットの内部処理の途中で、同期をとっている。すなわち、ＡＣＴとＳＴＢとの各々は、自ユニットが、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了したタイミングで、二重化される相手方のユニットに異常が発生していないことを確認する。自ユニットが、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了したタイミングで実行する、「二重化される相手方のユニットに異常が発生していないことの確認処理」を、「同期チェック処理」とも称する。
【０００７】
内部処理の途中で同期をとることによって、各ＣＰＵユニットのサイクル（より正確には、各ＣＰＵユニットの内部処理の開始時刻）はずれることがなく、二重化されるＣＰＵユニットは、同一の処理を同じタイミングで実行することができる。ＡＣＴとＳＴＢとの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行完了時点で、同期チェック処理を実行し、同期（つまり、相手方のユニットに異常が発生していないこと）を確認してから、次の処理の実行を開始する。したがって、ＡＣＴとＳＴＢとの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を、同じタイミングで開始することができる。
【０００８】
ＡＣＴおよびＳＴＢの各々は、基本的に、この同期チェック処理において、互いに相手の状態を監視し（言い換えれば、確認し）、ＡＣＴが異常停止していれば、ＳＴＢが、異常停止したＡＣＴに代わって、運転を引き継ぐ。
【０００９】
ここで、「ＡＣＴまたはＳＴＢが、同期対象（つまり、二重化された相手方のＣＰＵユニット）の異常を検知できない（特に、ＡＣＴがＳＴＢの異常を検知できない）」場合を想定して、ＡＣＴおよびＳＴＢの各々は、以下のように同期チェック処理を実行する。すなわち、ＡＣＴおよびＳＴＢの各々は、各同期チェック処理において、相手方のＣＰＵユニットの応答を所定期間内に取得できなかった場合、「二重化された相手方のＣＰＵユニットに異常が発生した（つまり、同期エラーが発生した）」と判定する。具体的には、ＡＣＴおよびＳＴＢの各々は、各同期チェック処理において、相手方のＣＰＵユニットから「対応する処理の実行を完了した」旨の通知を、判定期間内に取得できなかった場合、「二重化された相手方のＣＰＵユニットに異常が発生した」と判定する。
【００１０】
「二重化された相手方のＣＰＵユニットに異常が発生した」と判定すると、ＡＣＴおよびＳＴＢの各々は、「二重化を解除する」処理を実行する。「二重化を解除する」ことによって、ＡＣＴおよびＳＴＢの各々は、「異常が発生した相手方のＣＰＵユニットとの同期を維持することによって、サイクルタイムが極端に長くなる」ことを防止している。二重化を解除しない場合、つまり、「相手方のユニットに異常が発生していないことを確認できるまで、次の処理の実行を開始しない」場合、相手方のＣＰＵユニットに異常が発生すると、「相手方のユニットに異常が発生していないこと」の確認ができない。そのため、次の処理の実行を開始できず、サイクルタイムが極端に長くなる。
【００１１】
図９は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行完了時点で実行される同期チェック処理の詳細を説明する図である。前述の通り、同期チェック処理において、ＡＣＴおよびＳＴＢの各々は、相手方のＣＰＵユニットから「対応する処理の実行を完了した」旨の通知を、判定期間内に取得できたかを確認する。
【００１２】
同期チェック処理は、例えば、ＰＬＣにおいて二重化されるＣＰＵユニット（つまり、ＡＣＴおよびＳＴＢ）の各々の内部、または、外部に、各ＣＰＵユニットが互いに読み書きすることのできるレジスタ（共通レジスタ）を設けることにより、実現できる。各ＣＰＵユニットは、同期チェック処理までの処理が完了した時点で、つまり、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行完了時点で、「自ユニットが、処理の実行を完了した」旨を、共通レジスタに書き込む。各ＣＰＵユニットは、相手方のＣＰＵユニットによって共通レジスタに書き込まれた、「自ユニットが、処理の実行を完了した」旨を読込むことによって、相手方のＣＰＵユニットが、処理の実行を完了したことを確認する。
【００１３】
すなわち、図９に例示するように、ＣＰＵユニット９９Ｐは、処理を完了すると、つまり、処理の実行を完了すると、共通レジスタ９８のＲＥＧ１に、処理が完了したこと（つまり、「自ユニットが、処理の実行を完了した」旨）を書き込む。ＣＰＵユニット９９Ｑは、ＲＥＧ１を読み出すことで、ＣＰＵユニット９９Ｐが処理を完了したことを認識する。また、ＣＰＵユニット９９Ｑは、処理を完了すると、つまり、処理の実行を完了すると、共通レジスタ９８のＲＥＧ２に、処理が完了したこと（つまり、「自ユニットが、処理の実行を完了した」旨）を書き込む。ＣＰＵユニット９９Ｐは、ＲＥＧ２を読み出すことで、ＣＰＵユニット９９Ｑが処理を完了したことを認識する。ＣＰＵユニット９９ＰとＣＰＵユニット９９Ｑとが互いに処理完了を認識したら、ＣＰＵユニット９９ＰとＣＰＵユニット９９Ｑとは各々、次の処理に移行する。
【００１４】
共通レジスタ９８を利用する同期チェック処理を採用した場合、相手方のＣＰＵユニットに異常が発生すると、相手方のＣＰＵユニットによる「自ユニットが、処理の実行を完了した」旨は、共通レジスタ９８に書き込まれない。そこで、各ＣＰＵユニットは、自ユニットによる処理の実行完了の時点から所定期間待機した後に、共通レジスタ９８への、相手方のＣＰＵユニットによる「自ユニットが、処理の実行を完了した」旨の書込みの有無を判定する。例えば、ＣＰＵユニット９９Ｐは、ＣＰＵユニット９９Ｐが処理の実行を完了した時点から所定期間経過しても、ＲＥＧ２に、「自ユニットが、処理の実行を完了した」旨が書き込まれないと、ＣＰＵユニット９９Ｑに異常が発生したと判定する。ＣＰＵユニット９９Ｑは、ＣＰＵユニット９９Ｑが処理の実行を完了した時点から所定期間経過しても、ＲＥＧ１に、「自ユニットが、処理の実行を完了した」旨が書き込まれないと、ＣＰＵユニット９９Ｐに異常が発生したと判定する。以下の説明においては、各ＣＰＵユニットが、自ユニットによる処理の実行完了の時点から、相手方のＣＰＵユニットによる「自ユニットが、処理の実行を完了した」旨の書込みの有無を判定するまでの、前記所定期間を、「待ち時間」とも称する。
【先行技術文献】
【特許文献】
【００１５】
【特許文献１】特開２００５−１２２７１６号公報
【発明の概要】
【発明が解決しようとする課題】
【００１６】
上述のような従来技術には、ＰＬＣにおいて二重化されるＣＰＵユニットのハードウェアがほぼ同一であることを、つまり、両者がほぼ同一の処理能力を備えていることを前提としており、両者の処理能力が異なる場合を想定できていないという問題がある。
【００１７】
従来、二重化されるＣＰＵユニットの処理能力はほぼ同一であるとの前提の下、各ＣＰＵユニットは、自ユニットによる処理の実行完了の時点から、二重化されるＣＰＵユニットで共通の「待ち時間」が経過した後に、相手方のＣＰＵユニットの異常を判定する。
【００１８】
二重化される従来までのＣＰＵユニットが、共通の「待ち時間」を用いて、同期チェック処理を行なうのは、以下の理由からである。すなわち、二重化されるＣＰＵユニットの処理能力が同一であるとの前提の下では、二重化されるＣＰＵユニットによる処理の実行完了の時点は、ほぼ同じタイミングとなるはずである。言い換えれば、自ユニットと、二重化される相手方のＣＰＵユニットとの処理能力が同一であるとの前提の下では、自ユニットによる処理の実行完了の時点と、相手方のＣＰＵユニットによる処理の実行完了の時点とは、ほぼ同じタイミングとなるはずである。そのため、二重化されるＣＰＵユニットの各々において、相手方のＣＰＵユニットの異常を判定するのに用いられる、つまり、同期チェック処理に用いられる、「待ち時間」は、従来、二重化されるＣＰＵユニットで共通の、長さの固定された期間であった。
【００１９】
しかしながら、ＣＰＵユニットは、例えば約２０年以上の長期間にわたって使用されるケースが多く、その間に、ＣＰＵユニットに用いられている部品が生産中止されるなどして、ＣＰＵユニットについて大幅なリニューアルが実施されることがある。そして、例えばＣＰＵユニットのハードウェアを大幅にリニューアルした場合、リニューアルの前後でＣＰＵユニットの性能が、つまり、処理能力が、大きく変化することが考えられる。
【００２０】
そして、リニューアル前のＣＰＵユニットと、リニューアル後のＣＰＵユニットとを二重化した場合、同期チェック処理に用いられる「待ち時間」を、二重化されるＣＰＵユニットで共通とすると、同期チェック処理を正しく実行できない等の問題が発生する。
【００２１】
（誤判定の発生）
すなわち、同じ処理であっても、リニューアル前のＣＰＵユニットと、リニューアル後のＣＰＵユニットとでは実行完了の時点が異なるため、共通の「待ち時間」後に判定を実行すると、相手方のＣＰＵユニットが正常に動作していても、異常と誤判定してしまう。
【００２２】
例えば、リニューアルによってリニューアル前に比べ処理能力が４倍に増加した場合、或る処理の実行に要する期間は、リニューアル後のＣＰＵユニットが約「１０ｍｓ（ミリ秒）」であれば、リニューアル前のＣＰＵユニットは約「４０ｍｓ」となる。そして、リニューアル前のＣＰＵユニットと、リニューアル後のＣＰＵユニットとで、同期チェック処理に用いる「待ち時間」を、両ユニットに共通の、「５ｍｓ」に固定すると、リニューアル後のＣＰＵユニットは、以下の判定を行ってしまう。
【００２３】
すなわち、リニューアル後のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から「５ｍｓ」経過した時点で、同期を、つまり、リニューアル前のＣＰＵユニットが、前記或る処理の実行を完了しているかを、判定する。しかしながら、リニューアル前のＣＰＵユニットは、「リニューアル後のＣＰＵユニットが前記或る処理の実行を完了した時点」から「３０ｍｓ」経過した後でないと、前記或る処理の実行を完了することができない。そのため、リニューアル後のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から５ｍｓ経過した時点では、リニューアル前のＣＰＵユニットから、「リニューアル前のＣＰＵユニットが前記或る処理の実行を完了した」旨の通知を取得できない。したがって、リニューアル後のＣＰＵユニットは、リニューアル前のＣＰＵユニットが正常に動作している場合であっても、「リニューアル前のＣＰＵユニットに異常が発生した（つまり、同期エラーが発生した）」と誤って判定してしまう。
【００２４】
（判定の遅延の発生）
上述の例で、リニューアル前のＣＰＵユニットと、リニューアル後のＣＰＵユニットとに共通の「待ち時間」を、例えば「３０ｍｓ」に固定することによって、リニューアル後のＣＰＵユニットによる誤判定は防ぐことができる。
【００２５】
すなわち、リニューアル前のＣＰＵユニットは、「リニューアル後のＣＰＵユニットが前記或る処理の実行を完了した時点」から「３０ｍｓ」経過した後であれば、前記或る処理の実行を完了することができる。したがって、リニューアル後のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から「３０ｍｓ」経過した後であれば、「リニューアル前のＣＰＵユニットに異常が発生したか否か」を、正しく判定することができる。
【００２６】
ただし、「３０ｍｓ」の待ち時間は、リニューアル前のＣＰＵユニットと、リニューアル後のＣＰＵユニットとで共通であるため、リニューアル前のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から「３０ｍｓ」経過した後に判定を行なう。つまり、リニューアル前のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から「３０ｍｓ」経過した後に、「リニューアル後のＣＰＵユニットに異常が発生したか否か」を、判定する。
【００２７】
リニューアル前のＣＰＵユニットと、リニューアル後のＣＰＵユニットとは、互いに相手方のＣＰＵユニットの処理完了を認識してから、次の処理に移行するため、両者の待ち時間を、両者に共通の「３０ｍｓ」とすると、次の処理の実行開始が遅れる。リニューアル後のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から「３０ｍｓ」経過した後に相手方のＣＰＵユニットの異常を判定し、さらに、その「３０ｍｓ」後に、リニューアル前のＣＰＵユニットによる異常判定が実行される。つまり、リニューアル後のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から「６０ｍｓ」した後でなければ、次の処理の実行を開始することができない。すなわち、リニューアル前のＣＰＵユニットに合わせて、リニューアル前のＣＰＵユニットと、リニューアル後のＣＰＵユニットとが用いる待ち時間を両者に共通の「３０ｍｓ」とすると、両者の判定が完了するのが遅くなる。
【００２８】
リニューアル前のＣＰＵユニットは、自ユニットが前記或る処理の実行を完了した時点から「３０ｍｓ」経過した後でなければ判定を実行しないため、リニューアル後のＣＰＵユニットに異常が発生した場合、運転継続のためのＡＣＴからＳＴＢへの切替が遅れる。
【００２９】
以上の通り、ＰＬＣにおいて二重化されるＣＰＵユニットがほぼ同一の処理能力を備えることを前提とする従来技術には、二重化されるＣＰＵユニットの処理能力が互いに異なる場合に、誤判定およびＡＣＴからＳＴＢへの切替の遅延が発生するという問題がある。
【課題を解決するための手段】
【００３０】
上記の課題を解決するために、本発明の一態様に係るＣＰＵユニットは、コントローラにおいて二重化されるＣＰＵユニットであって、自ユニットの処理能力と、二重化される相手方のＣＰＵユニットの処理能力との比を考慮して、待ち時間を設定する設定部と、自ユニットにおける処理の実行完了時点から、前記設定部によって設定された前記待ち時間を経過するまでに、前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できないと、前記相手方のＣＰＵユニットに異常が発生したと判定する判定部と、を備えている。
【００３１】
前記の構成によれば、前記ＣＰＵユニットは、自ユニットと前記相手方のＣＰＵユニットとの前記処理能力の比を考慮して設定した前記待ち時間を用いて、自ユニットと前記相手方のＣＰＵユニットとの同期（つまり、実行完了した処理の一致）を判定する。
【００３２】
例えば、前記相手方のＣＰＵユニットの方が自ユニットより性能が高い（つまり、処理の実行速度が早い）場合、前記ＣＰＵユニットは、前記待ち時間として、予め決められた「通常の待ち時間」を設定する。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、前記制御方法は、待ち時間Ｔｗとして、予め決められた「通常の待ち時間」を設定する。
【００３３】
前記相手方のＣＰＵユニットの方が自ユニットより性能が高い場合、自ユニットが或る処理の実行を完了した時点では既に前記相手方のＣＰＵユニットは前記或る処理の実行を完了しているはずである。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、自ユニットが或る処理の実行を完了した時点で、相手方のＣＰＵユニットは前記或る処理の実行を完了するはずである。
【００３４】
したがって、前記相手方のＣＰＵユニットの方が自ユニットより性能が高い場合でも、前記ＣＰＵユニットは、前記待ち時間として、前記「通常の待ち時間」を設定することで、前記相手方のＣＰＵユニットに異常が発生したか否かを正確に判定することができる。
【００３５】
例えば、前記相手方のＣＰＵユニットの方が自ユニットより性能が低い（つまり、処理の実行速度が遅い）場合、前記ＣＰＵユニットは、前記待ち時間として、「前記通常の待ち時間に、性能差を考慮した調整待ち時間を加えた期間」を設定する。具体的には、「自ユニットにおける前記処理の実行完了時点と、前記相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点との差」を、前記調整待ち時間とする。
【００３６】
前記相手方のＣＰＵユニットの方が自ユニットより性能が低い場合、自ユニットが或る処理の実行を完了した時点では、前記相手方のＣＰＵユニットは、未だ前記或る処理の実行を完了していない。そこで、前記ＣＰＵユニットは、「前記相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点」まで待機し、その後、「通常の待ち時間」が経過するまでに前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。つまり、前記ＣＰＵユニットは、自ユニットにおける前記処理の実行完了時点から、「前記調整待ち時間を、前記通常の待ち時間に加えた期間」が経過するまでに、前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。
【００３７】
したがって、前記相手方のＣＰＵユニットの方が自ユニットより性能が低い場合でも、前記ＣＰＵユニットは、前記待ち時間として、「前記調整待ち時間を、前記通常の待ち時間に加えた期間」を設定することで、前記の判定を正確に実行できる。
【００３８】
以上の通り、前記ＣＰＵユニットは、自ユニットと前記相手方のＣＰＵユニットとで前記処理能力が一致しない場合であっても、自ユニットと前記相手方のＣＰＵユニットとの前記処理能力の違いを考慮した、適切な前記待ち時間を設定できるとの効果を奏する。すなわち、前記ＣＰＵユニットは、二重化される相手方のＣＰＵユニットと自ユニットとの処理能力の違いを考慮して、不要な待ち時間を設けずに、同期チェック処理を正確に行なうことができるとの効果を奏する。
【００３９】
本発明の一態様に係るＣＰＵユニットにおいて、前記処理は、自ユニットのハードウェアに異常がないかを診断する自己診断処理、前記相手方のＣＰＵユニット以外の外部装置を制御する信号を生成する命令実行処理、および、前記相手方のＣＰＵユニット以外の外部装置との間でデータを交換するＩ／Ｏリフレッシュ処理を含み、前記設定部は、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々について、前記待ち時間を設定し、前記判定部は、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々について、前記判定を実行してもよい。
【００４０】
前記の構成によれば、前記ＣＰＵユニットは、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々について、自ユニットと前記相手方のＣＰＵユニットとの同期（つまり、実行完了した処理の一致）を判定する。
【００４１】
したがって、前記ＣＰＵユニットは、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々の実行完了のタイミングで、自ユニットと前記相手方のＣＰＵユニットとの同期を判定することができるとの効果を奏する。
【００４２】
本発明の一態様に係るＣＰＵユニットは、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に、前記相手方のＣＰＵユニットの処理能力を、前記相手方のＣＰＵユニットから取得する二重化処理を、１回実行してもよい。
【００４３】
前記の構成によれば、前記ＣＰＵユニットは、前記相手方のＣＰＵユニットの処理能力を、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に、１回取得する。そして、前記ＣＰＵユニットは、取得した前記相手方のＣＰＵユニットの処理能力と、自ユニットの前記処理能力との比を考慮して、前記各処理についての前記判定に用いる前記待ち時間を設定する。
【００４４】
したがって、前記ＣＰＵユニットは、前記各処理を繰り返し実行する前に予め取得しておいた前記相手方のＣＰＵユニットの処理能力を考慮して、前記各処理についての前記判定に用いる前記待ち時間を、設定することができるとの効果を奏する。
【００４５】
本発明の一態様に係るＣＰＵユニットにおいて、前記設定部は、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々の前記待ち時間を、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々の実行に係る、自ユニットの処理能力と、前記相手方のＣＰＵユニットの処理能力との比を考慮して設定してもよい。
【００４６】
前記の構成によれば、前記ＣＰＵユニットは、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々の実行に係る、自ユニットと前記相手方のＣＰＵユニットとの処理能力における違いを考慮して、各処理の前記待ち時間を設定する。
【００４７】
したがって、前記ＣＰＵユニットは、前記自己診断処理、前記命令実行処理、および、前記Ｉ／Ｏリフレッシュ処理の各々の前記待ち時間を、各処理に係る自ユニットおよび前記相手方のＣＰＵユニットの各々の処理能力に応じて設定できるとの効果を奏する。
【００４８】
上記の課題を解決するために、本発明の一態様に係る制御方法は、コントローラにおいて二重化されるＣＰＵユニットの制御方法であって、自ユニットの処理能力と、二重化される相手方のＣＰＵユニットの処理能力との比を考慮して、待ち時間を設定する設定ステップと、自ユニットにおける処理の実行完了時点から、前記設定ステップにて設定された前記待ち時間を経過するまでに、前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できないと、前記相手方のＣＰＵユニットに異常が発生したと判定する判定ステップと、を含んでいる。
【００４９】
前記の方法によれば、前記制御方法は、自ユニットと前記相手方のＣＰＵユニットとの前記処理能力の比を考慮して設定した前記待ち時間を用いて、自ユニットと前記相手方のＣＰＵユニットとの同期（つまり、実行完了した処理の一致）を判定する。
【００５０】
例えば、前記相手方のＣＰＵユニットの方が自ユニットより性能が高い（つまり、処理の実行速度が早い）場合、前記制御方法は、前記待ち時間として、予め決められた「通常の待ち時間」を設定する。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、前記制御方法は、待ち時間Ｔｗとして、予め決められた「通常の待ち時間」を設定する。
【００５１】
前記相手方のＣＰＵユニットの方が自ユニットより性能が高い場合、自ユニットが或る処理の実行を完了した時点では既に前記相手方のＣＰＵユニットは前記或る処理の実行を完了しているはずである。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、自ユニットが或る処理の実行を完了した時点で、相手方のＣＰＵユニットは前記或る処理の実行を完了するはずである。
【００５２】
したがって、前記相手方のＣＰＵユニットの方が自ユニットより性能が高い場合でも、前記制御方法は、前記待ち時間として、前記「通常の待ち時間」を設定することで、前記相手方のＣＰＵユニットに異常が発生したか否かを正確に判定することができる。
【００５３】
例えば、前記相手方のＣＰＵユニットの方が自ユニットより性能が低い（つまり、処理の実行速度が遅い）場合、前記制御方法は、前記待ち時間として、「前記通常の待ち時間に、性能差を考慮した調整待ち時間を加えた期間」を設定する。具体的には、「自ユニットにおける前記処理の実行完了時点と、前記相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点との差」を、前記調整待ち時間とする。
【００５４】
前記相手方のＣＰＵユニットの方が自ユニットより性能が低い場合、自ユニットが或る処理の実行を完了した時点では、前記相手方のＣＰＵユニットは、未だ前記或る処理の実行を完了していない。そこで、前記制御方法は、「前記相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点」まで待機し、その後、「通常の待ち時間」が経過するまでに前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。つまり、前記制御方法は、自ユニットにおける前記処理の実行完了時点から、「前記調整待ち時間を、前記通常の待ち時間に加えた期間」が経過するまでに、前記相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。
【００５５】
したがって、前記相手方のＣＰＵユニットの方が自ユニットより性能が低い場合でも、前記制御方法は、前記待ち時間として、「前記調整待ち時間を、前記通常の待ち時間に加えた期間」を設定することで、前記の判定を正確に実行できる。
【００５６】
以上の通り、前記制御方法は、自ユニットと前記相手方のＣＰＵユニットとで前記処理能力が一致しない場合であっても、自ユニットと前記相手方のＣＰＵユニットとの前記処理能力の違いを考慮した、適切な前記待ち時間を設定できるとの効果を奏する。すなわち、前記制御方法は、二重化される相手方のＣＰＵユニットと自ユニットとの処理能力の違いを考慮して、不要な待ち時間を設けずに、同期チェック処理を正確に行なうことができるとの効果を奏する。
【発明の効果】
【００５７】
本発明の一態様によれば、ＰＬＣにおいて二重化されるＣＰＵユニットについて、二重化される相手方のＣＰＵユニットと自ユニットとの処理能力の違いを考慮して、不要な待ち時間を設けずに、同期チェック処理を正確に行なうことができるとの効果を奏する。
【図面の簡単な説明】
【００５８】
【図１】本発明の実施形態１に係るＣＰＵユニット等の要部構成を示すブロック図である。
【図２】図１に示す２つのＣＰＵユニットの各々が実行する処理の概要を説明する図である。
【図３】図１に示す２つのＣＰＵユニットの各々が、二重化される相手方のＣＰＵユニットの性能を示す性能情報を取得する処理の具体例を説明する図である。
【図４】本発明の実施形態２に係るＣＰＵユニット等の要部構成を示すブロック図である。
【図５】図４に示すＣＰＵユニットを実現するハードウェア構成の一例を示す図である。
【図６】図４に示す２つのＣＰＵユニットの各々が実行する処理の概要を説明する図である。
【図７】図４に示す２つのＣＰＵユニットの各々が、二重化される相手方のＣＰＵユニットの性能を示す性能情報を取得する処理の具体例を説明する図である。
【図８】ＰＬＣにおいて二重化されたＣＰＵユニットの、従来までの処理の概要を説明する図である。
【図９】自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行完了時点で実行される同期チェック処理の詳細を説明する図である。
【発明を実施するための形態】
【００５９】
〔実施形態１〕
以下、本発明の一側面に係る実施の形態（以下、「本実施形態」とも表記する）を、図面に基づいて説明する。なお、図中同一または相当部分には同一符号を付してその説明は繰返さない。以下の各実施形態においては、機械および設備等の制御対象を制御するＰＬＣ（プログラマブル・ロジック・コントローラ、Programmable Logic Controller）１０を、２つのＣＰＵユニットが二重化されるコントローラの典型例として説明を行なう。
【００６０】
以下では先ず、ＰＬＣ１０において二重化される第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々についての理解を容易にするために、両者が各々実行する処理の概要を、図２を用いて説明する。
【００６１】
§１．適用例
図２は、図１を用いて後述する２つのＣＰＵユニット（すなわち、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂ）の各々が実行する処理の概要を説明する図である。第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとは、ＰＬＣ１０において二重化され、一方が実行系（ＡＣＴ）となるとともに、他方が待機系（ＳＴＢ）となり、互いに相手方のＣＰＵユニットの状態を確認する。第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとは、実行系のＣＰＵユニット（ＡＣＴ）がダウンした場合には、待機系のＣＰＵユニット（ＳＴＢ）がＡＣＴに切り替わって運転を継続する。以下では、理解を容易にするため、第１ＣＰＵユニット１００ＡがＡＣＴであり、第２ＣＰＵユニット１００ＢがＳＴＢである例を説明する。
【００６２】
（待ち時間の概要）
図２に示すように、ＡＣＴおよびＳＴＢの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する。以下では、繰り返しこの順に実行される「自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理」のセットを、「１サイクル（１周期）」と称する。
【００６３】
自己診断処理は、自ユニットのハードウェアが正常に動作しているかを診断する処理である。命令実行処理は、ユーザプログラム等を実行する処理であり、前の周期において実行されたＩ／Ｏリフレッシュ処理で取得したデータを用いて各種の演算を実行し、現在の周期におけるＩ／Ｏリフレッシュ処理で出力するデータを生成する処理である。命令実行処理において、ＰＬＣ１０（より正確には、第１ＣＰＵユニット１００Ａまたは第２ＣＰＵユニット１００Ｂ）の制御対象である、相手方のＣＰＵユニット以外の外部装置に対する、制御信号が生成される。Ｉ／Ｏリフレッシュ処理は、二重化された相手方のＣＰＵユニット以外の、外部装置および外部ユニットとのデータ交換を実行する処理であり、現在の周期の命令実行処理で生成されたデータを出力し、次の周期の命令実行処理に用いるデータを取得する処理である。命令実行処理において生成された制御信号は、Ｉ／Ｏリフレッシュ処理において、制御対象へと出力される。
【００６４】
図２に示すように、ＡＣＴ（第１ＣＰＵユニット１００Ａ）とＳＴＢ（第２ＣＰＵユニット１００Ｂ）との各々は、自ユニットが、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了した後に、「同期チェック処理」を実行する。ＡＣＴおよびＳＴＢの各々は、この同期チェック処理において、互いに相手方のＣＰＵユニットの状態を監視し（言い換えれば、確認し）、ＡＣＴが異常停止していれば、ＳＴＢが、異常停止したＡＣＴに代わって、運転を引き継ぐ。
【００６５】
「同期チェック処理」は、自ユニットが実行を完了した処理について、相手方のＣＰＵユニットも自ユニットと同様に実行を完了しているかを確認する処理であり、相手方のＣＰＵユニットの処理完了が確認できない場合、異常が発生したと判定される。例えば、ＡＣＴは、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了した後、ＳＴＢが自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了しているかを確認する（判定する）。例えば、ＳＴＢは、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了した後、ＡＣＴが自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了しているかを確認する（判定する）。
【００６６】
「同期チェック処理」において、ＡＣＴおよびＳＴＢの各々は、自ユニットが或る処理の実行を完了してから所定時間（＝待ち時間Ｔｗ）が経過した後、相手方のＣＰＵユニットから「その或る処理の実行を完了した」旨の通知を取得したかを確認する。ＡＣＴおよびＳＴＢの各々は、自ユニットが或る処理の実行を完了してから待ち時間Ｔｗが経過した後、相手方のＣＰＵユニットの「その或る処理の実行を完了した」旨の通知を取得できないと、「二重化された相手方のＣＰＵユニットに異常が発生した」と判定する。第１ＣＰＵユニット１００ＡがＡＣＴであり、第２ＣＰＵユニット１００ＢがＳＴＢである場合、第１ＣＰＵユニット１００Ａに異常が発生したと判定すると、第２ＣＰＵユニット１００Ｂは、自ユニットがＡＣＴへと切り替わって、運転を継続する。
【００６７】
前述の通り、ＡＣＴ（第１ＣＰＵユニット１００Ａ）とＳＴＢ（第２ＣＰＵユニット１００Ｂ）とで「待ち時間Ｔｗ」の長さを同じにした場合、ＡＣＴとＳＴＢとで性能Ａｂが異なると、誤判定およびＡＣＴからＳＴＢへの切替の遅延が発生するという問題がある。そこで、ＡＣＴとＳＴＢとの各々は、以下の処理を実行することにより、両者の性能Ａｂが異なる場合であっても、不要な待ち時間Ｔｗを設けずに、正確な同期チェック処理を実行する。
【００６８】
すなわち、先ず「基準となるハードウェアのＣＰＵユニット（基準ＣＰＵユニット）」を予め想定しておき、この基準ＣＰＵユニットについて、予め性能Ａｂ（処理能力）および処理時間を定義しておく。以下の説明においては、基準ＣＰＵユニットの性能Ａｂを「性能Ａｂｂ」と表すことがある。
【００６９】
そして、ＡＣＴとＳＴＢとの各々に、自ユニットの性能Ａｂを示す情報を、例えば「自ユニットが、基準ＣＰＵユニットと比較して、どの程度の性能Ａｂを備えているのか」を示す情報（自機性能情報）を、保有させておく。ＡＣＴとＳＴＢとがＰＬＣ１０において二重化される際、ＡＣＴとＳＴＢとの各々は、互いの性能Ａｂ（相手方のＣＰＵユニットの、基準ＣＰＵユニットの性能Ａｂｂに対する相対的な性能Ａｂ）を把握する。そして、ＡＣＴとＳＴＢとの各々は、把握した互いの性能Ａｂに基づいて、同期チェック処理のための待ち時間Ｔｗを柔軟に設定する。以下の説明においては、自ユニットの性能Ａｂ（自ユニットの、基準ＣＰＵユニットの性能Ａｂｂに対する相対的な性能Ａｂ）を、「性能Ａｂｍ」と表すことがある。同様に、相手方のＣＰＵユニットの性能Ａｂ（相手方のＣＰＵユニットの、基準ＣＰＵユニットの性能Ａｂｂに対する相対的な性能Ａｂ）を、「性能Ａｂｙ」と表すことがある。
【００７０】
具体的には、ＡＣＴとＳＴＢとの各々は、ＰＬＣ１０において二重化される際、同期チェック処理のための待ち時間Ｔｗについて、以下のように設定を行なう。すなわち、二重化される相手方のＣＰＵユニットの性能Ａｂｙが、自ユニットの性能Ａｂｍより高い場合、つまり、二重化される相手方のＣＰＵユニットの方が自ユニットより処理の実行速度が早い場合、通常の待ち時間Ｔｗｏを待ち時間Ｔｗに設定する。二重化される相手方のＣＰＵユニットの性能Ａｂｙと、自ユニットの性能Ａｂｍとが等しい場合、つまり、二重化される相手方のＣＰＵユニットと自ユニットとで処理の実行速度が等しい場合、通常の待ち時間Ｔｗｏを待ち時間Ｔｗに設定する。二重化される相手方のＣＰＵユニットの性能Ａｂｙが、自ユニットの性能Ａｂｍより低い場合、つまり、二重化される相手方のＣＰＵユニットの方が自ユニットより処理の実行速度が遅い場合、待ち時間Ｔｗを、相手方のＣＰＵユニットの性能Ａｂｙに合わせて設定する。
【００７１】
例えば、自ユニットの性能Ａｂｍが基準ＣＰＵユニットの性能Ａｂｂの２倍であり、二重化される相手方のＣＰＵユニットの性能Ａｂｙが基準ＣＰＵユニットの性能Ａｂｂの１／２倍であれば、性能Ａｂｍは性能Ａｂｙの４倍である。その場合、同期チェック処理の対象である或る処理を実行するのに、自ユニットが「１０ｍｓ（ミリ秒）」要したならば、相手方のＣＰＵユニットは「４０ｍｓ」要することになるので、自ユニットの待ち時間Ｔｗを「３０ｍｓ＋通常の待ち時間Ｔｗｏ」に設定する。
【００７２】
例えば、自ユニットの性能Ａｂｍが基準ＣＰＵユニットの性能Ａｂｂの１／２倍であり、二重化される相手方のＣＰＵユニットの性能Ａｂｙが基準ＣＰＵユニットの性能Ａｂｂの２倍であれば、性能Ａｂｍは性能Ａｂｙの１／４倍である。その場合、同期チェック処理の対象である或る処理を実行するのに、自ユニットが「４０ｍｓ」要したならば、相手方のＣＰＵユニットは「１０ｍｓ」要することになるから、自ユニットの待ち時間Ｔｗを「通常の待ち時間Ｔｗｏ」に設定する。
【００７３】
ＡＣＴ（第１ＣＰＵユニット１００Ａ）とＳＴＢ（第２ＣＰＵユニット１００Ｂ）との各々は、自ユニットの待ち時間Ｔｗを、自ユニットと二重化される相手方のＣＰＵユニットとの性能Ａｂの差によって、柔軟に設定する。
【００７４】
（処理の具体例）
図２に示すように、ＰＬＣ１０において第１ＣＰＵユニット１００Ａ（ＡＣＴ）と第２ＣＰＵユニット１００Ｂ（ＳＴＢ）とを二重化する場合、ＡＣＴとＳＴＢとは各々、通常のサイクルとは別に、「二重化処理」を実行する。すなわち、ＡＣＴおよびＳＴＢの各々は、サイクリック（周期的）に繰り返し実行する、「自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理」の前に、「二重化処理」を実行する。
【００７５】
ＡＣＴおよびＳＴＢの各々は、「二重化処理」において、互いの性能Ａｂを把握し、二重化状態となる。ＡＣＴおよびＳＴＢの各々の性能情報（自機性能情報）は、例えば各ＣＰＵユニットの生産時に、各ＣＰＵユニットの備える不揮発性メモリに書き込まれる。この自機性能情報は、例えば、「特定のハードウェアの仕様のＣＰＵユニット（前述の「基準ＣＰＵユニット」）の性能Ａｂｂを基準として、この基準ＣＰＵユニットの性能Ａｂｂに対して、自ユニットの性能Ａｂｍは、何％の性能ＵＰ／ＤＯＷＮか」を示す。
【００７６】
ＡＣＴおよびＳＴＢの各々は、自ユニットの性能情報を、各ＣＰＵユニットの不揮発性メモリに、「自機性能情報」として格納している。ＡＣＴおよびＳＴＢの各々は、この自機性能情報を二重化処理の中で互いに転送し合い、相手方のＣＰＵユニットの自機性能情報を、「他機性能情報」として、各ＣＰＵユニットの不揮発性メモリに格納する。
【００７７】
例えば、自機性能情報が１５０％（つまり、処理の実行速度（処理速度）が、基準ＣＰＵユニットの１．５倍）であり、他機性能情報が７５％（処理速度が、基準ＣＰＵユニットの０．７５倍）である場合、ＡＣＴは以下の情報を把握する。すなわち、ＡＣＴは、自ユニット（ＡＣＴ）の処理速度は、相手方のＣＰＵユニット（ＳＴＢ）の処理速度の「２倍（＝１．５倍／０．７５倍）」であることを把握する。
【００７８】
例えば、自機性能情報が７５％（処理速度が、基準ＣＰＵユニットの０．７５倍）であり、他機性能情報が１５０％（つまり、処理の実行速度（処理速度）が、基準ＣＰＵユニットの１．５倍）である場合、ＳＴＢは以下の情報を把握する。すなわち、自ユニット（ＳＴＢ）の処理速度は、相手方のＣＰＵユニット（ＡＣＴ）の処理速度の「１／２倍（＝０．７５倍／１．５倍）」であることを把握する。
【００７９】
「二重化処理」において、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの差を把握して、二重化状態になると、ＡＣＴおよびＳＴＢの各々は、この性能Ａｂの差を用いて、自ユニットの待ち時間Ｔｗを設定する。
【００８０】
ＡＣＴおよびＳＴＢの各々は、例えば、図２の「命令実行」処理の実行開始から実行完了までの実行時間を、各ＣＰＵユニットの備える内部タイマを用いて、各ＣＰＵユニットにおいて計測する。ここで、「命令実行」処理について、ＡＣＴの実行時間が「１００ｍｓ」だとすると、前述の通り、ＳＴＢとの性能Ａｂの差は「２倍」だったので、相手方のＣＰＵユニット（ＳＴＢ）は「２００ｍｓ」かかることになる。
【００８１】
そのため、ＡＣＴは、通常の待ち時間Ｔｗｏに、「１００ｍｓ（＝２００ｍｓ−１００ｍｓ）」を加えた期間を、自ユニットの「命令実行」処理に係る同期チェック処理の待ち時間Ｔｗとして設定する。図２に示す例では、ＡＣＴは、自ユニットでの「命令実行」処理の実行完了時点から、「１００ｍｓ」の期間、待機処理を実行し、その後に、「命令実行」処理に係る同期チェック処理を実行している。つまり、ＡＣＴは、自ユニットでの「命令実行」処理の実行完了時点から、「１００ｍｓ＋通常の待ち時間Ｔｗｏ」が経過するまでの間に、相手方のＣＰＵユニット（ＳＴＢ）から、「命令実行」処理の実行完了の通知を取得するか否かを判定する。そして、ＡＣＴは、自ユニットでの「命令実行」処理の実行完了時点から、「１００ｍｓ＋通常の待ち時間Ｔｗｏ」が経過するまでの間に、ＳＴＢから、「命令実行」処理の実行完了の通知を取得できないと、ＳＴＢに異常が発生したと判定する。
【００８２】
「相手方のＣＰＵユニット（ＡＣＴ）の方が、性能Ａｂが高く、または、性能Ａｂが等しい（つまり、処理速度が速く、または、同じ）」ことを把握したＳＴＢは、通常の待ち時間Ｔｗｏをそのまま、自ユニットの「命令実行」処理に係る同期チェック処理の待ち時間Ｔｗとして設定する。図２に示す例では、ＳＴＢは、自ユニットでの「命令実行」処理の実行を完了すると直ぐに、「命令実行」処理に係る同期チェック処理を実行している。つまり、ＳＴＢは、自ユニットでの「命令実行」処理の実行完了時点から、通常の待ち時間Ｔｗｏが経過するまでの間に、相手方のＣＰＵユニット（ＡＣＴ）から、「命令実行」処理の実行完了の通知を取得するか否かを判定する。そして、ＳＴＢは、自ユニットでの「命令実行」処理の実行完了時点から、通常の待ち時間Ｔｗｏが経過するまでの間に、ＡＣＴから、「命令実行」処理の実行完了の通知を取得できないと、ＡＣＴに異常が発生したと判定する。ＡＣＴ（第１ＣＰＵユニット１００Ａ）に異常が発生したと判定すると、ＳＴＢ（第２ＣＰＵユニット１００Ｂ）は、自ユニットがＡＣＴへと切り替わって、運転を継続する。
【００８３】
§２．構成例
これまでに図２を用いて概要を説明してきた第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂについて、次に、図１を参照してその詳細を説明していく。
【００８４】
図１は、本発明の実施形態１に係る第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００ＢＣＰＵユニットを含むＰＬＣ１０の要部構成を示すブロック図である。図１に例示するように、ＰＬＣ１０は、ＰＬＣ１０において二重化される第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとを含んでいる。第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、ＰＬＣ１０全体の制御を統括する機能ユニットである。
【００８５】
ＰＬＣ１０は、図１に図示していない機能ユニットをさらに備えていてもよい。ＰＬＣ１０は、例えば、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂを含むＰＬＣ１０の全体に電源を供給する、不図示の電源ユニットをさらに含んでいる。ＰＬＣ１０は、また、生産装置および設備装置の適所に取り付けたスイッチおよびセンサの信号を入力する入力ユニット、アクチュエータ等に制御信号を出す出力ユニット、通信ネットワークに接続するための通信ユニット等の不図示の機能ユニットを含んでいてもよい。
【００８６】
前述の通り、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順に繰り返し実行する。Ｉ／Ｏリフレッシュ処理は、入力ユニット等が取得した各種の入力信号を、各ＣＰＵユニットのＩ／Ｏメモリに取り込む処理（ＩＮリフレッシュ）と、命令実行処理の処理結果をＩ／Ｏメモリに書き込んで出力ユニット等へ出力する処理（ＯＵＴリフレッシュ）と、を含んでいる。つまり、Ｉ／Ｏリフレッシュ処理は、「第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々」と、「第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂ以外の、外部のユニット、外部の装置」との、サイクリックなデータ交換である。命令実行処理では、コントローラであるＰＬＣ１０が制御対象に対して出力する各種の制御信号が生成され、例えば、ユーザプログラムに基づいて、ＩＮリフレッシュでＩ／Ｏメモリに取り込んだ入力信号を用いた論理演算が実行され、制御信号が生成される。
【００８７】
ＰＬＣ１０においては、ＰＬＣ１０によって制御される制御システムの安全性、信頼性を向上するため、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとが二重化され、両者は、例えばＣＰＵ間バスにより接続される。第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとは、両者に異常がなければ、同じタイミングで、同じ処理（自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々）の実行を開始する。例えば、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとは、両者に異常がなければ、同じ入力信号を用いた、同じユーザプログラムの実行を、同じタイミングで、開始する。
【００８８】
第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂのうち、一方が実行系のＣＰＵユニット（ＡＣＴ）となり、他方が待機系のＣＰＵユニット（ＳＴＢ）となる。前述の通り、本明細書においては、「第１ＣＰＵユニット１００ＡがＡＣＴであり、第２ＣＰＵユニット１００ＢがＳＴＢである」例を説明するが、「第１ＣＰＵユニット１００ＡがＳＴＢであり、第２ＣＰＵユニット１００ＢがＡＣＴである」場合も同様である。
【００８９】
ＡＣＴである第１ＣＰＵユニット１００Ａは、実際にサイクリックな処理を行い、メモリに対して読み書きを行ない、また、外部のＩ／Ｏ機器等との間で制御データ（Ｉ／Ｏデータ）の送受を行い、ＰＬＣ１０によって制御される制御システムの制御を司る。ＳＴＢである第２ＣＰＵユニット１００Ｂは、待機中（すなわち、ＡＣＴである第１ＣＰＵユニット１００Ａに異常が発生していない間）は、ＡＣＴである第１ＣＰＵユニット１００Ａが実行するのと同一のユーザプログラムを実行する。ただし、ＳＴＢである第２ＣＰＵユニット１００Ｂは、実行したユーザプログラムの実行結果（演算実行結果）を、外部のＩ／Ｏ機器等へ出力することはしない。また、ＳＴＢである第２ＣＰＵユニット１００Ｂは、ＡＣＴである第１ＣＰＵユニット１００Ａから処理結果（演算実行結果、および、ＡＣＴである第１ＣＰＵユニット１００Ａの取得した各種の入力信号）等を受信する。そして、ＳＴＢである第２ＣＰＵユニット１００Ｂは、ＡＣＴである第１ＣＰＵユニット１００Ａから受信した処理結果等により、自ユニットのメモリの内容を更新する。これにより、ＳＴＢである第２ＣＰＵユニット１００ＢとＡＣＴである第１ＣＰＵユニット１００Ａのメモリの内容の同一性が確保される。
【００９０】
ＡＣＴである第１ＣＰＵユニット１００Ａが故障した場合、ＳＴＢである第２ＣＰＵユニット１００ＢがＡＣＴである第１ＣＰＵユニット１００Ａに切り替わって実際の制御等の動作を行う。ＰＬＣ１０において第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとを二重化しておくことにより、ＡＣＴである第１ＣＰＵユニット１００Ａが故障しても、ＰＬＣ１０の全体が直ぐに停止することはなく、継続して運転できるので、信頼性が向上する。
【００９１】
（ＣＰＵユニットの詳細）
図１に示すように、ＰＬＣ１０は、ＰＬＣ１０において二重化される第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとに加え、両者が各々、書込および読込を実行することのできる共通レジスタ２００を備えている。記載の簡潔性を担保するため、本実施の形態に直接関係のない構成は、説明およびブロック図から省略している。ただし、実施の実情に則して、ＰＬＣ１０は、当該省略された構成を備えてもよい。
【００９２】
共通レジスタ２００は、第１レジスタ２１０および第２レジスタ２２０を含む。
【００９３】
第１レジスタ２１０は、第１ＣＰＵユニット１００Ａにより、「自ユニット（つまり、第１ＣＰＵユニット１００）が、或る処理（自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々）の実行を完了した」旨の情報が書き込まれる。第１ＣＰＵユニット１００Ａによって第１レジスタ２１０に書き込まれた情報は、第２ＣＰＵユニット１００Ｂによって読み込まれる。
【００９４】
第２レジスタ２２０は、第２ＣＰＵユニット１００Ｂにより、「自ユニット（つまり、第２ＣＰＵユニット１００Ｂ）が、或る処理（自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々）の実行を完了した」旨の情報が書き込まれる。第２ＣＰＵユニット１００Ｂによって第２レジスタ２２０に書き込まれた情報は、第１ＣＰＵユニット１００Ａによって読み込まれる。
【００９５】
第１ＣＰＵユニット１００Ａは、記憶部１３０Ａに加えて、機能ブロックとして、能力取得部１１０Ａ、処理実行部１２０Ａ、待ち時間設定部１６０Ａ、および、判定部１７０Ａを備えている。記憶部１３０Ａは、他機能力テーブル１４０Ａおよび自機能力テーブル１５０Ａを格納している。
【００９６】
第２ＣＰＵユニット１００Ｂは、記憶部１３０Ｂに加えて、機能ブロックとして、能力取得部１１０Ｂ、処理実行部１２０Ｂ、待ち時間設定部１６０Ｂ、および、判定部１７０Ｂを備えている。記憶部１３０Ｂは、他機能力テーブル１４０Ｂおよび自機能力テーブル１５０Ｂを格納している。
【００９７】
以下では、能力取得部１１０Ａと能力取得部１１０Ｂとの各々を特に区別する必要がない場合は単に「能力取得部１１０」と称する。同様に、処理実行部１２０Ａと処理実行部１２０Ｂとの各々を特に区別する必要がない場合は単に「処理実行部１２０」と称する。記憶部１３０Ａと記憶部１３０Ｂとの各々を特に区別する必要がない場合は単に「記憶部１３０」と称する。他機能力テーブル１４０Ａと他機能力テーブル１４０Ｂとの各々を特に区別する必要がない場合は単に「他機能力テーブル１４０」と称する。自機能力テーブル１５０Ａと自機能力テーブル１５０Ｂとの各々を特に区別する必要がない場合は単に「自機能力テーブル１５０」と称する。待ち時間設定部１６０Ａと待ち時間設定部１６０Ｂとの各々を特に区別する必要がない場合は単に「待ち時間設定部１６０」と称する。判定部１７０Ａと判定部１７０Ｂとの各々を特に区別する必要がない場合は単に「判定部１７０」と称する。
【００９８】
能力取得部１１０、処理実行部１２０、待ち時間設定部１６０、および、判定部１７０等の各機能ブロックは、例えば、ＣＰＵ（central processing unit）等が、ＲＯＭ（read only memory）、ＮＶＲＡＭ（non-Volatile random access memory）等で実現された記憶装置（記憶部１３０）に記憶されているプログラムを不図示のＲＡＭ（random access memory）等に読み出して実行することで実現できる。
【００９９】
（機能ブロックの詳細）
能力取得部１１０は、二重化される相手方のＣＰＵユニットの性能Ａｂｙ（処理能力）を示す情報（「性能情報」）を、相手方のＣＰＵユニットの自機能力テーブル１５０を参照して取得する。能力取得部１１０は、取得した相手方のＣＰＵユニットの性能情報（他機性能情報）を、自ユニットの他機能力テーブル１４０に格納する。
【０１００】
特に、能力取得部１１０は、処理実行部１２０が自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に１回、図２に例示した「二重化処理」において、他機性能情報を取得する。
【０１０１】
図３は、「二重化処理」において１回実行される、「二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報を取得する」処理の具体例を説明する図である。図３に示すように、能力取得部１１０Ａは、第２ＣＰＵユニット１００Ｂの性能Ａｂｙを示す性能情報を、自機能力テーブル１５０Ｂを参照して取得し、取得した第２ＣＰＵユニット１００Ｂの性能情報（他機性能情報）を、他機能力テーブル１４０Ａに格納する。また、能力取得部１１０Ｂは、第１ＣＰＵユニット１００Ａの性能Ａｂｙを示す性能情報を、自機能力テーブル１５０Ａを参照して取得し、取得した第１ＣＰＵユニット１００Ａの性能情報（他機性能情報）を、他機能力テーブル１４０Ｂに格納する。
【０１０２】
処理実行部１２０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行し、各処理の実行を完了すると、「自ユニットが各処理の実行を完了した」旨を、共通レジスタ２００に書き込む。
【０１０３】
また、処理実行部１２０は、各処理の実行を完了すると、「自ユニットが各処理の実行を完了した」旨を、待ち時間設定部１６０および判定部１７０に通知する。処理実行部１２０は、待ち時間設定部１６０に、「自ユニットが各処理の実行を完了した」旨と共に、「各処理の実行時間（各処理について、実行開始から実行完了までの時間）」を通知してもよい。すなわち、処理実行部１２０は、内部タイマを用いて「各処理の実行時間」を計時し、計時した「各処理の実行時間」を待ち時間設定部１６０に通知してもよい。
【０１０４】
＜処理の実行完了の書込＞処理実行部１２０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を完了すると、その旨（つまり、「自ユニットが、その処理の実行を完了した」旨）を、共通レジスタ２００に書き込む。すなわち、自己診断処理の実行を完了した処理実行部１２０Ａは、「自ユニットが、自己診断処理の実行を完了した」旨を第１レジスタ２１０に書き込み、自己診断処理の実行を完了した処理実行部１２０は、「自ユニットが、自己診断処理の実行を完了した」旨を第２レジスタ２２０に書き込む。命令実行処理の実行を完了した処理実行部１２０Ａは、「自ユニットが、命令実行処理の実行を完了した」旨を第１レジスタ２１０に書き込み、命令実行処理の実行を完了した処理実行部１２０Ｂは、「自ユニットが、命令実行処理の実行を完了した」旨を第２レジスタ２２０に書き込む。Ｉ／Ｏリフレッシュ処理の実行を完了した処理実行部１２０Ａは、「自ユニットが、Ｉ／Ｏリフレッシュ処理の実行を完了した」旨を第１レジスタ２１０に書き込み、Ｉ／Ｏリフレッシュ処理の実行を完了した処理実行部１２０Ｂは、「自ユニットが、Ｉ／Ｏリフレッシュ処理の実行を完了した」旨を第２レジスタ２２０に書き込む。
【０１０５】
＜処理の実行開始のタイミング＞第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとが二重化されている間、処理実行部１２０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を、以下のタイミングで開始する。言い換えれば、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々について異常が発生したと判定されない間、処理実行部１２０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を、以下のタイミングで開始する。
【０１０６】
すなわち、処理実行部１２０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行を、前の処理の実行完了後の同期チェック処理で、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの正常が確認されてから、開始する。
【０１０７】
具体的には、自己診断処理の実行完了後の同期チェック処理において、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの正常が確認されてから、処理実行部１２０は、命令実行処理の実行を開始する。命令実行処理の実行完了後の同期チェック処理において、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの正常が確認されてから、処理実行部１２０は、Ｉ／Ｏリフレッシュ処理の実行を開始する。Ｉ／Ｏリフレッシュ処理の実行完了後の同期チェック処理において、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの正常が確認されてから、処理実行部１２０は、次の周期における自己診断処理の実行を開始する。
【０１０８】
待ち時間設定部１６０は、他機能力テーブル１４０を参照して他機性能情報を取得し、自機能力テーブル１５０を参照して自機性能情報を取得する。また、待ち時間設定部１６０は、処理実行部１２０から、「自ユニットが各処理の実行を完了した」旨を取得する。待ち時間設定部１６０は、「自ユニットが各処理の実行を完了した」旨を取得する前に処理実行部１２０から取得していた「自ユニットが各処理の実行を開始した」旨と併せて、各処理の実行時間を演算する。すなわち、待ち時間設定部１６０は、内部タイマにより計時した「自ユニットが各処理の実行を開始した」時刻と、内部タイマにより計時した「自ユニットが各処理の実行を完了した」時刻とから、各処理の実行時間を演算する。なお、各処理の実行時間は、処理実行部１２０が内部タイマを用いて計時し、処理実行部１２０から待ち時間設定部１６０へと通知されてもよい。
【０１０９】
待ち時間設定部１６０は、取得した他機性能情報、自機性能情報、および、各処理の実行時間から、各処理についての同期チェック処理のための「待ち時間Ｔｗ」を算出し、算出した待ち時間Ｔｗを、判定部１７０へ通知する。具体的には、待ち時間設定部１６０は、他機性能情報、自機性能情報、および、各処理の実行時間を用いて、以下のように、各処理についての同期チェック処理のための「待ち時間Ｔｗ」を算出する。
【０１１０】
すなわち、他機性能情報に示される「二重化される相手方のＣＰＵユニットの性能Ａｂｙ」が、自機性能情報に示される「自ユニットの性能Ａｂｍ」より高い場合、待ち時間設定部１６０は、「通常の待ち時間Ｔｗｏ」を「待ち時間Ｔｗ」とする。また、二重化される相手方のＣＰＵユニットの性能Ａｂｙが自ユニットの性能Ａｂｍに等しい場合、待ち時間設定部１６０は、「通常の待ち時間Ｔｗｏ」を「待ち時間Ｔｗ」とする。
【０１１１】
「通常の待ち時間Ｔｗｏ」は、予め長さの決められている、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとで共通の期間であり、例えば、各ユニットの工場出荷時に設定され、ユーザによって更新可能な期間である。「通常の待ち時間Ｔｗｏ」は、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとで性能Ａｂが等しいとの前提で設定される期間である。
【０１１２】
二重化される相手方のＣＰＵユニットの性能Ａｂｙが自ユニットの性能Ａｂｍより低い場合、待ち時間設定部１６０は、自ユニットの性能Ａｂｍを相手方のＣＰＵユニットの性能Ａｂｙで除した値に、各処理の実行時間を乗じた期間を、調整待ち時間Ｔａとする。そして、待ち時間設定部１６０は、「通常の待ち時間Ｔｗｏに調整待ち時間Ｔａを加えた期間（つまり、「通常の待ち時間Ｔｗｏ＋調整待ち時間Ｔａ」）」を、「待ち時間Ｔｗ」とする。
【０１１３】
判定部１７０は、処理実行部１２０による各処理の実行完了時点から、待ち時間設定部１６０から通知された待ち時間Ｔｗが経過するまでに、処理実行部１２０が実行完了した処理について、相手方のＣＰＵユニットが実行を完了するかを判定する（同期チェック処理）。例えば、判定部１７０は、「自ユニットが各処理の実行を完了した」時点から待ち時間Ｔｗが経過した時点で、共通レジスタ２００を参照し、自ユニットが実行を完了した或る処理について、二重化される相手方のＣＰＵユニットの実行が完了しているかを確認する。
【０１１４】
待ち時間Ｔｗとして「通常の待ち時間Ｔｗｏ＋調整待ち時間Ｔａ」を通知された判定部１７０は、「自ユニットが各処理の実行を完了した」時点から調整待ち時間Ｔａがするまで待機処理を実行する。そして、判定部１７０は、待機処理の実行完了後（つまり、「自ユニットが各処理の実行を完了した」時点から調整待ち時間Ｔａが経過した後）に、同期チェック処理を実行する。すなわち、判定部１７０は、待機処理の実行完了後に、「通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理の実行を、相手方のＣＰＵユニットが完了していることを確認できるか」を判定する。言い換えれば、判定部１７０は、待機処理の実行完了時点から通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理について、相手方のＣＰＵユニットによる実行完了を確認できるかを判定する。「待機処理の実行完了時点」は、「自ユニットが実行完了した或る処理の、相手方のＣＰＵユニットにおける実行が完了すると予想される時点」である。
【０１１５】
待ち時間Ｔｗとして「通常の待ち時間Ｔｗｏ」を通知された判定部１７０は、「自ユニットが各処理の実行を完了した」時点で直ぐに、同期チェック処理を実行する。すなわち、判定部１７０は、「通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理の実行を、相手方のＣＰＵユニットが完了していることを確認できるか」を判定する。言い換えれば、判定部１７０は、自ユニットの実行完了時点から通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理について、相手方のＣＰＵユニットによる実行完了を確認できるかを判定する。
【０１１６】
判定部１７０Ａは、共通レジスタ２００の第２レジスタ２２０を参照し、処理実行部１２０Ａが実行を完了した或る処理について、「処理実行部１２０Ｂによる実行が完了した」旨の書込があるかを確認する。判定部１７０Ａは、処理実行部１２０Ａが実行を完了した或る処理について、第２レジスタ２２０に「処理実行部１２０Ｂによる実行が完了した」旨の書込がないと、第２ＣＰＵユニット１００Ｂに異常が発生したと判定する。
【０１１７】
判定部１７０Ｂは、共通レジスタ２００の第１レジスタ２１０を参照し、処理実行部１２０Ｂが実行を完了した或る処理について、「処理実行部１２０Ａによる実行が完了した」旨の書込があるかを確認する。判定部１７０Ｂは、処理実行部１２０Ｂが実行を完了した或る処理について、第１レジスタ２１０に「処理実行部１２０Ａによる実行が完了した」旨の書込がないと、第１ＣＰＵユニット１００Ａに異常が発生したと判定する。
【０１１８】
（記憶部の詳細）
記憶部１３０は、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々が使用する各種データを格納する記憶装置である。なお、記憶部１３０は、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々が実行する（１）制御プログラム、（２）ＯＳプログラム、（３）第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々が有する各種機能を実行するためのアプリケーションプログラム、および、（４）該アプリケーションプログラムを実行するときに読み出す各種データを非一時的に記憶してもよい。上記の（１）〜（４）のデータは、例えば、ＲＯＭ（read only memory）、フラッシュメモリ、ＥＰＲＯＭ（Erasable Programmable ROM）、ＥＥＰＲＯＭ（登録商標）（Electrically EPROM）、ＨＤＤ（Hard Disc Drive）等の不揮発性記憶装置に記憶される。第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々は、図示しない一時記憶部を備えていてもよい。一時記憶部は、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々が実行する各種処理の過程で、演算に使用するデータおよび演算結果等を一時的に記憶するいわゆるワーキングメモリであり、ＲＡＭ（Random Access Memory）等の揮発性記憶装置で構成される。どのデータをどの記憶装置に記憶するのかについては、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々の使用目的、利便性、コスト、または、物理的な制約等から適宜決定される。記憶部１３０はさらに、他機能力テーブル１４０および自機能力テーブル１５０を格納している。
【０１１９】
他機能力テーブル１４０には、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す情報である他機性能情報が格納される。図３を用いて説明したように、能力取得部１１０は、二重化される相手方のＣＰＵユニットの自機能力テーブル１５０を参照して取得した他機性能情報を、自ユニットの他機能力テーブル１４０に格納する。
【０１２０】
自機能力テーブル１５０には、自ユニットの性能Ａｂｍを示す情報である自機性能情報が格納され、例えば、「自ユニットが、基準ＣＰＵユニットと比較して、どの程度の性能Ａｂ（処理能力）を備えているのか」を示す自機性能情報が格納されている。自機性能情報は、例えば第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとの各々の工場出荷時に、自機能力テーブル１５０に格納される。
【０１２１】
（ＣＰＵユニットについての整理）
これまでに図１を用いて構成を説明してきた第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々について、その理解を容易にするため、以下のように整理しておく。すなわち、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、ＰＬＣ１０（コントローラ）において二重化されるＣＰＵユニットであって、待ち時間設定部１６０（設定部）と判定部１７０とを備えている。待ち時間設定部１６０は、自ユニットの性能Ａｂｍ（処理能力）と、二重化される相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、待ち時間Ｔｗを設定する。判定部１７０は、自ユニットにおける処理の実行完了時点から、待ち時間設定部１６０によって設定された待ち時間Ｔｗを経過するまでに、相手方のＣＰＵユニットの前記処理の実行完了を確認できないと、相手方のＣＰＵユニットに異常が発生したと判定する。
【０１２２】
前記の構成によれば、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自ユニットと相手方のＣＰＵユニットとの性能Ａｂ（処理能力）の比を考慮して待ち時間Ｔｗを設定する。そして、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、設定した待ち時間Ｔｗを利用して、自ユニットと相手方のＣＰＵユニットとの同期（つまり、実行完了した処理の一致）を判定する。
【０１２３】
例えば、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが高い（つまり、処理の実行速度が早い）場合、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、待ち時間Ｔｗとして、予め決められた通常の待ち時間Ｔｗｏを設定する。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、待ち時間Ｔｗとして、予め決められた「通常の待ち時間Ｔｗｏ」を設定する。
【０１２４】
相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが高い場合、自ユニットが或る処理の実行を完了した時点では既に相手方のＣＰＵユニットはその或る処理の実行を完了しているはずである。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、自ユニットが或る処理の実行を完了した時点で、相手方のＣＰＵユニットは前記或る処理の実行を完了するはずである。
【０１２５】
したがって、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが高い場合でも、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、待ち時間Ｔｗとして、通常の待ち時間Ｔｗｏを設定することで、相手方のＣＰＵユニットに異常が発生したか否かを正確に判定することができる。
【０１２６】
例えば、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが低い場合、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、待ち時間Ｔｗとして、「通常の待ち時間Ｔｗｏに、調整待ち時間Ｔａを加えた期間」を設定する。調整待ち時間Ｔａは、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの差を考慮して設定される。例えば、「自ユニットにおける前記処理の実行完了時点と、相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点との差」が、調整待ち時間Ｔａとされる。
【０１２７】
相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが低い場合、自ユニットが或る処理の実行を完了した時点では、相手方のＣＰＵユニットは、未だ前記或る処理の実行を完了していない。そこで、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、「相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点（実行完了予想時点）」まで待機する。そして、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、実行完了予想時点から、通常の待ち時間Ｔｗｏが経過するまでに、相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。つまり、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自ユニットにおける前記処理の実行完了時点から、「調整待ち時間Ｔａを、通常の待ち時間Ｔｗｏに加えた期間」が経過するまでに、相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。
【０１２８】
したがって、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが低い場合でも、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、待ち時間Ｔｗとして、「調整待ち時間Ｔａを、通常の待ち時間Ｔｗｏに加えた期間」を設定することで、前記の判定を正確に実行できる。
【０１２９】
以上の通り、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自ユニットと相手方のＣＰＵユニットとで性能Ａｂが一致しない場合であっても、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの違いを考慮した、適切な待ち時間Ｔｗを設定できるとの効果を奏する。すなわち、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、二重化される相手方のＣＰＵユニットと自ユニットとの性能Ａｂの違いを考慮して、不要な待ち時間Ｔｗを設けずに、同期チェック処理を正確に行なうことができるとの効果を奏する。
【０１３０】
第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々において、前記処理（同期チェック処理の対象となる処理）は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を含む。自己診断処理は、自ユニットのハードウェアに異常がないかを診断する処理である。命令実行処理は、「相手方のＣＰＵユニット以外の、外部装置および外部ユニット」を制御する信号を生成する処理である。Ｉ／Ｏリフレッシュ処理は、「相手方のＣＰＵユニット以外の、外部装置および外部ユニット」との間でデータを交換する処理である。待ち時間設定部１６０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々について、待ち時間Ｔｗを設定する。判定部１７０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々について、前記判定を、つまり、同期チェック処理を実行する。
【０１３１】
第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々について、自ユニットと相手方のＣＰＵユニットとの同期（つまり、実行完了した処理の一致）を判定する。
【０１３２】
第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行完了のタイミングで、自ユニットと相手方のＣＰＵユニットとの同期を判定することができるとの効果を奏する。
【０１３３】
第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に、二重化処理を１回実行する。第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、二重化処理において、相手方のＣＰＵユニットの性能Ａｂｙを、相手方のＣＰＵユニットから取得する。
【０１３４】
前記の構成によれば、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、相手方のＣＰＵユニットの性能Ａｂｙを、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に、１回取得する。そして、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、取得した相手方のＣＰＵユニットの性能Ａｂｙと、自ユニットの性能Ａｂｍとの比を考慮して、前記各処理についての前記判定に用いる待ち時間Ｔｗを設定する。
【０１３５】
第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、前記各処理を繰り返し実行する前に取得しておいた相手方のＣＰＵユニットの性能Ａｂｙを考慮して、前記各処理についての前記判定に用いる待ち時間Ｔｗを、設定できるとの効果を奏する。
【０１３６】
§３．動作例
第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、図２に示すように、以下の処理を実行する。すなわち、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する。具体的には、各ユニットの処理実行部１２０が、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する。また、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々（特に、各ユニットの能力取得部１１０）は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に二重化処理を１回実行する。第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、二重化処理において、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す他機性能情報を取得する。
【０１３７】
各ユニット（特に、各ユニットの処理実行部１２０）は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各処理の実行を完了すると、「自ユニットが各処理の実行を完了した」旨を、共通レジスタ２００に書き込む。
【０１３８】
各ユニット（特に、各ユニットの待ち時間設定部１６０）は、他機性能情報、自機性能情報、および、自ユニットが実行完了した各処理の実行時間から、各処理についての同期チェック処理のための「待ち時間Ｔｗ」を設定する。
【０１３９】
具体的には、待ち時間設定部１６０は、各処理について、「自ユニットの性能Ａｂｍと二重化される相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して算出する調整待ち時間Ｔａ」を算出する。そして、待ち時間設定部１６０は、「各処理について算出した、調整待ち時間Ｔａ」を、「各処理の、通常の待ち時間Ｔｗｏ」に追加した期間を、各処理についての同期チェック処理のための「待ち時間Ｔｗ」として設定する。
【０１４０】
「Ａｂｍ／Ａｂｙ」が「１」以下である場合、待ち時間設定部１６０は、各処理の「調整待ち時間Ｔａ＝０」とする。「Ａｂｍ／Ａｂｙ」が「１」より大きい場合、待ち時間設定部１６０は、各処理の「調整待ち時間Ｔａ」を、各処理の実行時間に「Ａｂｍ／Ａｂｙ」を乗じた値とする。
【０１４１】
各ユニット（特に、各ユニットの判定部１７０）は、自ユニットによる自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行完了後に、同期チェック処理を実行する。すなわち、判定部１７０は、共通レジスタ２００を参照し、自ユニットによる各処理の実行完了時点から、待ち時間Ｔｗが経過するまでに、自ユニットが実行完了した処理について、相手方のＣＰＵユニットが実行を完了するかを判定する。
【０１４２】
同期チェック処理は、二重化される相手方のＣＰＵユニットの状態を互いに監視する処理である。具体的には、同期チェック処理は、自ユニットにおいて実行の完了した処理について、二重化される相手方のＣＰＵユニットにおいても、その処理の実行を完了しているかを確認する（判定する）処理である。
【０１４３】
同期チェック処理において、同期が確認できないと、つまり、自ユニットで実行完了した処理について、相手方のＣＰＵユニットにおける実行完了が確認できないと、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとは二重化を解消する。そして、例えばＡＣＴに異常が発生したと判定したＳＴＢは、ＡＣＴに代わって自ユニットが運転を継続する。
【０１４４】
同期チェック処理において同期が確認できると、各ユニット（特に、各ユニットの処理実行部１２０）は、「同期チェック処理において自ユニットおよび相手方のＣＰＵユニットによる実行完了が確認できた処理」の次の処理の実行を開始する。同期チェック処理は、具体的には、以下に示すように実行される。
【０１４５】
すなわち、処理実行部１２０Ａは、或る処理の実行を完了すると、共通レジスタ２００の第１レジスタ２１０に、「自ユニット（つまり、処理実行部１２０Ａ）が、或る処理の実行を完了した」旨を書き込む。判定部１７０Ｂは、第１レジスタ２１０を読み出すことで、第１ＣＰＵユニット１００Ａが或る処理の実行を完了したことを認識する。また、処理実行部１２０Ｂは、或る処理の実行を完了すると、共通レジスタ２００の第２レジスタ２２０に、「自ユニット（つまり、処理実行部１２０Ｂ）が、或る処理の実行を完了した」旨を書き込む。判定部１７０Ａは、第２レジスタ２２０を読み出すことで、第２ＣＰＵユニット１００Ｂが或る処理の実行を完了したことを認識する。判定部１７０Ａと判定部１７０Ｂとが各々、「相手方のＣＰＵユニットによる、或る処理の実行完了」を認識したら、処理実行部１２０Ａと処理実行部１２０Ｂとは各々、その或る処理の次の処理の実行を開始する。
【０１４６】
これまで説明してきた「第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々が実行する処理」は、以下のように整理することができる。すなわち、「第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々が実行する処理」は、ＰＬＣ１０（コントローラ）において二重化されるＣＰＵユニットの制御方法であって、設定ステップと、判定ステップとを含んでいる。設定ステップは、自ユニットの性能Ａｂｍと、二重化される相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、待ち時間Ｔｗを設定する。判定ステップは、自ユニットにおける処理の実行完了時点から、設定ステップにて設定された待ち時間Ｔｗを経過するまでに、相手方のＣＰＵユニットにおける前記処理の実行完了を確認できないと、相手方のＣＰＵユニットに異常が発生したと判定する。
【０１４７】
前記の方法によれば、前記制御方法は、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの比を考慮して設定した待ち時間Ｔｗを利用して、自ユニットと相手方のＣＰＵユニットとの同期（つまり、実行完了した処理の一致）を判定する。
【０１４８】
例えば、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが高い（つまり、処理の実行速度が早い）場合、前記制御方法は、待ち時間Ｔｗとして、予め決められた「通常の待ち時間Ｔｗｏ」を設定する。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、前記制御方法は、待ち時間Ｔｗとして、予め決められた「通常の待ち時間Ｔｗｏ」を設定する。
【０１４９】
相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが高い場合、自ユニットが或る処理の実行を完了した時点では既に相手方のＣＰＵユニットは前記或る処理の実行を完了しているはずである。また、相手方のＣＰＵユニットと自ユニットとで性能Ａｂが等しい場合、自ユニットが或る処理の実行を完了した時点で、相手方のＣＰＵユニットは前記或る処理の実行を完了するはずである。
【０１５０】
したがって、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが高い場合でも、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、待ち時間Ｔｗとして、通常の待ち時間Ｔｗｏを設定することで、相手方のＣＰＵユニットに異常が発生したか否かを正確に判定することができる。
【０１５１】
例えば、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが低い（つまり、処理の実行速度が遅い）場合、前記制御方法は、待ち時間Ｔｗとして、「通常の待ち時間Ｔｗｏに、性能Ａｂの差を考慮した調整待ち時間Ｔａを加えた期間」を設定する。具体的には、「自ユニットにおける前記処理の実行完了時点と、相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点との差」を、調整待ち時間Ｔａとする。
【０１５２】
相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが低い場合、自ユニットが或る処理の実行を完了した時点では、相手方のＣＰＵユニットは、未だ前記或る処理の実行を完了していない。そこで、前記制御方法は、「相手方のＣＰＵユニットにおける前記処理の実行が完了すると予想される時点」まで待機し、その後、「通常の待ち時間Ｔｗｏ」が経過するまでに相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。つまり、前記制御方法は、自ユニットにおける前記処理の実行完了時点から、「調整待ち時間Ｔａを、通常の待ち時間Ｔｗｏに加えた期間」が経過するまでに、相手方のＣＰＵユニットにおける前記処理の実行完了を確認できるかを判定する。
【０１５３】
したがって、相手方のＣＰＵユニットの方が自ユニットより性能Ａｂが低い場合でも、前記制御方法は、待ち時間Ｔｗとして、「調整待ち時間Ｔａを、通常の待ち時間Ｔｗｏに加えた期間」を設定することで、前記の判定を正確に実行できる。
【０１５４】
以上の通り、前記制御方法は、自ユニットと相手方のＣＰＵユニットとで性能Ａｂが一致しない場合であっても、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの違いを考慮した、適切な待ち時間Ｔｗを設定できるとの効果を奏する。すなわち、前記制御方法は、二重化される相手方のＣＰＵユニットと自ユニットとの性能Ａｂの違いを考慮して、不要な待ち時間Ｔｗを設けずに、同期チェック処理を正確に行なうことができるとの効果を奏する。
【０１５５】
〔実施形態２〕
本発明の他の実施形態について、図４から図７に基づいて説明すれば、以下のとおりである。なお記載の簡潔性を担保するため、実施形態１とは異なる構成（処理の手順および処理の内容）のみについて説明する。すなわち、実施形態１で記載された構成等は、本実施形態にもすべて含まれ得る。また、実施形態１で記載した用語の定義も同じである。
【０１５６】
実施形態１において、ＰＬＣ１０において二重化される第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとが、自ユニットの「待ち時間Ｔｗ」を設定するのに用いた相手方のＣＰＵユニットの性能Ａｂｙは１種類であった。
【０１５７】
これに対し、本実施形態に係る、ＰＬＣ２０において二重化される第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとが、自ユニットの「待ち時間Ｔｗ」を設定するのに用いる相手方のＣＰＵユニットの性能Ａｂｙは複数である。以下、詳細を説明する。
【０１５８】
図５は、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々を実現するハードウェア構成の一例を示す図である。すなわち、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、メモリ４１０と、ＣＰＵ４２０（マイコン）と、専用ＬＳＩ（Large Scale Integration）４３０とを用いて実現される。専用ＬＳＩは、「ＡＳＩＣ（Application Specific Integrated Circuit）」とも呼ばれ、専用ＬＳＩの代わりに、ＦＰＧＡ（Field Programmable Gate Array）が用いられてもよい。
【０１５９】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々と同様に、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順に繰り返し実行する。例えば、自己診断処理は主にＣＰＵ４２０で実行され、命令実行処理は主に専用ＬＳＩ４３０で実行され、Ｉ／Ｏリフレッシュ処理は主に専用ＬＳＩ４３０を経由してＣＰＵ４２０で実行される。
【０１６０】
自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々が主として実行されるハードウェアが異なる場合、各処理について、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとで性能Ａｂが異なる場合がある。例えば、第１ＣＰＵユニット３００ＡのＣＰＵ４２０は、第２ＣＰＵユニット３００ＢのＣＰＵ４２０より性能Ａｂが高く、第１ＣＰＵユニット３００Ａの専用ＬＳＩ４３０は、第２ＣＰＵユニット３００Ｂの専用ＬＳＩ４３０より性能Ａｂが低いことがあり得る。この場合、自己診断処理については、第１ＣＰＵユニット３００Ａの方が第２ＣＰＵユニット３００Ｂより早く実行完了し、命令実行処理については、第１ＣＰＵユニット３００Ａの方が第２ＣＰＵユニット３００Ｂより遅く実行完了する。
【０１６１】
そこで、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、繰り返し実行する自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々について、自ユニットおよび相手方のＣＰＵユニットの性能Ａｂを把握する。そして、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、各処理に係る自ユニットおよび相手方のＣＰＵユニットの性能Ａｂを用いて、各処理についての同期チェック処理の際の「待ち時間Ｔｗ」を設定する。以下、詳細を説明する。
【０１６２】
（ＣＰＵユニットの詳細）
図４は、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂを含むＰＬＣ２０の要部構成を示すブロック図である。ＰＬＣ２０は、ＰＬＣ１０と同様に、電源ユニット、入力ユニット、出力ユニット、および、通信ユニット等の不図示の機能ユニットを含んでいてもよい。
【０１６３】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々と同様に、ＰＬＣ１０全体の制御を統括する機能ユニットである。第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとは、ＰＬＣ２０において二重化される。すなわち、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとは、一方が実行系のＣＰＵユニット（ＡＣＴ）となり、他方が待機系のＣＰＵユニット（ＳＴＢ）となって、互いに相手の状態を監視する。同期チェック処理においてＡＣＴに異常が発生したと判定すると、ＳＴＢは、それまでＡＣＴであったＣＰＵユニットに代わって自ユニットがＡＣＴへと切り替わって、運転を継続する。本実施形態においては、「第１ＣＰＵユニット３００ＡがＡＣＴであり、第２ＣＰＵユニット３００ＢがＳＴＢである」例を説明するが、「第１ＣＰＵユニット３００ＡがＳＴＢであり、第２ＣＰＵユニット３００ＢがＡＣＴである」場合も同様である。
【０１６４】
図４に示すように、ＰＬＣ２０は、ＰＬＣ２０において二重化される第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとに加え、両者が各々、書込および読込を実行することのできる共通レジスタ２００を備えている。共通レジスタ２００については既に説明しているので、ここでは詳細は略記する。
【０１６５】
記載の簡潔性を担保するため、本実施の形態に直接関係のない構成は、説明およびブロック図から省略している。ただし、実施の実情に則して、ＰＬＣ１０は、当該省略された構成を備えてもよい。
【０１６６】
第１ＣＰＵユニット３００Ａは、記憶部３３０Ａに加えて、機能ブロックとして、能力取得部３１０Ａ、処理実行部１２０Ａ、待ち時間設定部３６０Ａ、および、判定部３７０Ａを備えている。記憶部３３０Ａは、他機能力テーブル３４０Ａおよび自機能力テーブル３５０Ａを格納している。
【０１６７】
待ち時間設定部３６０Ａは、第１待ち時間設定部３６１Ａ、第２待ち時間設定部３６２Ａ、第３待ち時間設定部３６３Ａを含み、判定部３７０Ａは、第１判定部３７１Ａ、第２判定部３７２Ａ、第３判定部３７３Ａを含む。他機能力テーブル３４０Ａは、第１他機能力テーブル３４１Ａ、第２他機能力テーブル３４２Ａ、第３他機能力テーブル３４３Ａを含む。自機能力テーブル３５０Ａは、第１自機能力テーブル３５１Ａ、第２自機能力テーブル３５２Ａ、第３自機能力テーブル３５３Ａを含む。
【０１６８】
第２ＣＰＵユニット３００Ｂは、記憶部３３０Ｂに加えて、機能ブロックとして、能力取得部３１０Ｂ、処理実行部１２０Ｂ、待ち時間設定部３６０Ｂ、および、判定部３７０Ｂを備えている。記憶部３３０Ｂは、他機能力テーブル３４０Ｂおよび自機能力テーブル３５０Ｂを格納している。
【０１６９】
待ち時間設定部３６０Ｂは、第１待ち時間設定部３６１Ｂ、第２待ち時間設定部３６２Ｂ、第３待ち時間設定部３６３Ｂを含み、判定部３７０Ｂは、第１判定部３７１Ｂ、第２判定部３７２Ｂ、第３判定部３７３Ｂを含む。他機能力テーブル３４０Ｂは、第１他機能力テーブル３４１Ｂ、第２他機能力テーブル３４２Ｂ、第３他機能力テーブル３４３Ｂを含む。自機能力テーブル３５０Ｂは、第１自機能力テーブル３５１Ｂ、第２自機能力テーブル３５２Ｂ、第３自機能力テーブル３５３Ｂを含む。
【０１７０】
実施形態１における第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂと同様、図４に示す第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂは、互いに同様の構成を備えている。第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が共通して備える構成を特に区別する必要がある場合、第１ＣＰＵユニット３００Ａの構成である場合には「Ａ」を、第２ＣＰＵユニット３００Ｂの構成である場合には「Ｂ」を付す。第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が共通して備える構成について、どちらが備える構成であるかを特に区別する必要がない場合、「Ａ」または「Ｂ」の添え字は略記する。
【０１７１】
能力取得部３１０、処理実行部１２０、待ち時間設定部３６０、および、判定部３７０等の各機能ブロックは、例えば、ＣＰＵ（central processing unit）等が、ＲＯＭ（read only memory）、ＮＶＲＡＭ（non-Volatile random access memory）等で実現された記憶装置（記憶部３３０）に記憶されているプログラムを不図示のＲＡＭ（random access memory）等に読み出して実行することで実現できる。
【０１７２】
（機能ブロックの詳細）
能力取得部３１０は、処理実行部１２０によって繰り返し実行される自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙ（処理能力）を示す情報（「性能情報」）を取得する。具体的には、能力取得部３１０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々に係る相手方のＣＰＵユニットの性能情報を、相手方のＣＰＵユニットの自機能力テーブル３５０を参照して取得する。能力取得部３１０は、取得した「自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々に係る、相手方のＣＰＵユニットの性能情報（他機性能情報）」を、自ユニットの他機能力テーブル３４０に格納する。
【０１７３】
特に、能力取得部３１０は、処理実行部１２０が自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に１回、図６に例示する「二重化処理」において、各処理に係る他機性能情報を取得する。
【０１７４】
能力取得部３１０は、二重化される相手方のＣＰＵユニットの第１自機能力テーブル３５１を参照し、「自己診断処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報（自己診断用他機性能情報）」を取得する。能力取得部３１０は、取得した自己診断用他機性能情報を、自ユニットの第１他機能力テーブル３４１に格納する。
【０１７５】
能力取得部３１０は、二重化される相手方のＣＰＵユニットの第２自機能力テーブル３５２を参照し、「命令実行処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報（命令実行用他機性能情報）」を取得する。能力取得部３１０は、取得した命令実行用他機性能情報を、自ユニットの第２他機能力テーブル３４２に格納する。
【０１７６】
能力取得部３１０は、二重化される相手方のＣＰＵユニットの第３自機能力テーブル３５３を参照し、「Ｉ／Ｏリフレッシュ処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報（Ｉ/Ｏリフレッシュ用他機性能情報）」を取得する。能力取得部３１０は、取得したＩ/Ｏリフレッシュ用他機性能情報を、自ユニットの第３他機能力テーブル３４３に格納する。
【０１７７】
図７は、「二重化処理」において１回実行される、「二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報を取得する」処理の具体例を説明する図である。図７に示すように、能力取得部３１０Ａは、「自己診断処理に係る、第２ＣＰＵユニット３００Ｂの性能Ａｂｙを示す性能情報（自己診断用他機性能情報）」を、第２ＣＰＵユニット３００Ｂの第１自機能力テーブル３５１Ｂを参照して取得する。能力取得部３１０Ａは、取得した自己診断用他機性能情報を、自ユニットの第１他機能力テーブル３４１Ａに格納する。
【０１７８】
能力取得部３１０Ｂは、「自己診断処理に係る、第１ＣＰＵユニット３００Ａの性能Ａｂｙを示す性能情報（自己診断用他機性能情報）」を、第１ＣＰＵユニット３００Ａの第１自機能力テーブル３５１Ａを参照して取得する。能力取得部３１０Ｂは、取得した自己診断用他機性能情報を、自ユニットの第１他機能力テーブル３４１Ｂに格納する。
【０１７９】
能力取得部３１０Ａは、「命令実行処理に係る、第２ＣＰＵユニット３００Ｂの性能Ａｂｙを示す性能情報（命令実行用他機性能情報）」を、第２ＣＰＵユニット３００Ｂの第２自機能力テーブル３５２Ｂを参照して取得する。能力取得部３１０Ａは、取得した命令実行用他機性能情報を、自ユニットの第２他機能力テーブル３４２Ａに格納する。
【０１８０】
能力取得部３１０Ｂは、「命令実行処理に係る、第１ＣＰＵユニット３００Ａの性能Ａｂｙを示す性能情報（命令実行用他機性能情報）」を、第１ＣＰＵユニット３００Ａの第２自機能力テーブル３５２Ａを参照して取得する。能力取得部３１０Ｂは、取得した命令実行用他機性能情報を、自ユニットの第２他機能力テーブル３４２Ｂに格納する。
【０１８１】
能力取得部３１０Ａは、「Ｉ／Ｏリフレッシュ処理に係る、第２ＣＰＵユニット３００Ｂの性能Ａｂｙを示す性能情報（Ｉ／Ｏリフレッシュ処理用他機性能情報）」を、第２ＣＰＵユニット３００Ｂの第３自機能力テーブル３５３Ｂを参照して取得する。能力取得部３１０Ａは、取得したＩ／Ｏリフレッシュ処理用他機性能情報を、自ユニットの第３他機能力テーブル３４３Ａに格納する。
【０１８２】
能力取得部３１０Ｂは、「Ｉ／Ｏリフレッシュ処理に係る、第１ＣＰＵユニット３００Ａの性能Ａｂｙを示す性能情報（Ｉ／Ｏリフレッシュ処理用他機性能情報）」を、第１ＣＰＵユニット３００Ａの第３自機能力テーブル３５３Ａを参照して取得する。能力取得部３１０Ｂは、取得したＩ／Ｏリフレッシュ処理用他機性能情報を、自ユニットの第３他機能力テーブル３４３Ｂに格納する。
【０１８３】
処理実行部１２０は、実施形態１で説明したように、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行し、各処理の実行を完了すると、「自ユニットが各処理の実行を完了した」旨を、共通レジスタ２００に書き込む。
【０１８４】
また、処理実行部１２０は、各処理の実行を完了すると、「自ユニットが各処理の実行を完了した」旨を、待ち時間設定部３６０および判定部３７０に通知する。処理実行部１２０は、待ち時間設定部３６０に、「自ユニットが各処理の実行を完了した」旨と共に、「各処理の実行時間（各処理について、実行開始から実行完了までの時間）」を通知してもよい。すなわち、処理実行部１２０は、内部タイマを用いて「各処理の実行時間」を計時し、計時した「各処理の実行時間」を待ち時間設定部３６０に通知してもよい。
【０１８５】
待ち時間設定部３６０は、他機能力テーブル３４０を参照して他機性能情報を取得し、自機能力テーブル３５０を参照して自機性能情報を取得する。また、待ち時間設定部３６０は、処理実行部１２０から、「自ユニットが各処理の実行を完了した」旨を取得する。待ち時間設定部３６０は、「自ユニットが各処理の実行を完了した」旨を取得する前に処理実行部１２０から取得していた「自ユニットが各処理の実行を開始した」旨と併せて、各処理の実行時間を演算する。すなわち、待ち時間設定部３６０は、内部タイマにより計時した「自ユニットが各処理の実行を開始した」時刻と、内部タイマにより計時した「自ユニットが各処理の実行を完了した」時刻とから、各処理の実行時間を演算する。なお、各処理の実行時間は、処理実行部１２０が内部タイマを用いて計時し、処理実行部１２０から待ち時間設定部３６０へと通知されてもよい。
【０１８６】
待ち時間設定部３６０は、取得した他機性能情報、自機性能情報、および、各処理の実行時間から、各処理についての同期チェック処理のための「待ち時間Ｔｗ」を算出し、算出した待ち時間Ｔｗを、判定部３７０へ通知する。具体的には、待ち時間設定部３６０は、他機性能情報、自機性能情報、および、各処理の実行時間を用いて、以下のように、各処理についての同期チェック処理のための「待ち時間Ｔｗ」を算出する。
【０１８７】
すなわち、他機性能情報に示される「二重化される相手方のＣＰＵユニットの性能Ａｂｙ」が、自機性能情報に示される「自ユニットの性能Ａｂｍ」より高い場合、待ち時間設定部３６０は、「通常の待ち時間Ｔｗｏ」を「待ち時間Ｔｗ」とする。二重化される相手方のＣＰＵユニットの性能Ａｂｙと自ユニットの性能Ａｂｍとが等しい場合、待ち時間設定部３６０は、「通常の待ち時間Ｔｗｏ」を「待ち時間Ｔｗ」とする。
【０１８８】
「通常の待ち時間Ｔｗｏ」は、予め長さの決められている、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとで共通の期間であり、例えば、各ユニットの工場出荷時に設定され、ユーザによって更新可能な期間である。「通常の待ち時間Ｔｗｏ」は、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとで性能Ａｂ（特に、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々に係る性能Ａｂ）が等しいとの前提で設定される期間である。
【０１８９】
二重化される相手方のＣＰＵユニットの性能Ａｂｙが自ユニットの性能Ａｂｍより低い場合、待ち時間設定部３６０は、自ユニットの性能Ａｂｍを相手方のＣＰＵユニットの性能Ａｂｙで除した値に、各処理の実行時間を乗じた期間を、「調整待ち時間Ｔａ」とする。二重化される相手方のＣＰＵユニットの性能Ａｂｙが自ユニットの性能Ａｂｍより低い場合、待ち時間設定部３６０は、「通常の待ち時間Ｔｗｏに調整待ち時間Ｔａを加えた期間（つまり、「通常の待ち時間Ｔｗｏ＋調整待ち時間Ｔａ」）」を「待ち時間Ｔｗ」とする。
【０１９０】
＜「自己診断処理」に係る同期チェック処理のための「待ち時間」＞「自己診断処理」に係る同期チェック処理のための「待ち時間Ｔｗ」は、第１待ち時間設定部３６１によって設定される。
【０１９１】
第１待ち時間設定部３６１は、第１他機能力テーブル３４１を参照して自己診断用他機性能情報を取得し、第１自機能力テーブル３５１を参照して自己診断用自機性能情報を取得する。また、第１待ち時間設定部３６１は、処理実行部１２０からの、「自ユニットが自己診断処理の実行を開始した」旨、および、「自ユニットが自己診断処理の実行を完了した」旨の通知から、自己診断処理の実行時間を演算する。
【０１９２】
第１待ち時間設定部３６１は、取得した自己診断用他機性能情報および自己診断用自機性能情報と、演算して求めた「自己診断処理の実行時間」とから、自己診断処理についての同期チェック処理のための「待ち時間Ｔｗ」を算出する。
【０１９３】
具体的には、第１待ち時間設定部３６１は、「自己診断処理に係る、自ユニットの性能Ａｂｍ」と、「自己診断処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙ」との比を考慮して、「自己診断処理に係る、調整待ち時間Ｔａ」を算出する。そして、第１待ち時間設定部３６１は、算出した「自己診断処理に係る、調整待ち時間Ｔａ」を、「自己診断処理に係る、通常の待ち時間Ｔｗｏ」に追加した期間を、自己診断処理についての同期チェック処理のための「待ち時間Ｔｗ」として設定する。「Ａｂｍ／Ａｂｙ」が「１」以下である場合、第１待ち時間設定部３６１は、「自己診断処理に係る、調整待ち時間Ｔａ」を「０」とする。「Ａｂｍ／Ａｂｙ」が「１」より大きい場合、第１待ち時間設定部３６１は、「自己診断処理に係る、調整待ち時間Ｔａ」を、「自ユニットの自己診断処理の実行時間に、『Ａｂｍ／Ａｂｙ』を乗じた値」とする。
【０１９４】
第１待ち時間設定部３６１は、上述の方法により算出した「自己診断処理についての同期チェック処理のための『待ち時間Ｔｗ』」を、判定部３７０へ通知する。
【０１９５】
＜「命令実行処理」に係る同期チェック処理のための「待ち時間」＞「命令実行処理」に係る同期チェック処理のための「待ち時間Ｔｗ」は、第２待ち時間設定部３６２によって設定される。
【０１９６】
第２待ち時間設定部３６２は、第２他機能力テーブル３４２を参照して命令実行用他機性能情報を取得し、第２自機能力テーブル３５２を参照して命令実行用自機性能情報を取得する。また、第２待ち時間設定部３６２は、処理実行部１２０からの、「自ユニットが命令実行処理の実行を開始した」旨、および、「自ユニットが命令実行処理の実行を完了した」旨の通知から、命令実行処理の実行時間を演算する。
【０１９７】
第２待ち時間設定部３６２は、取得した命令実行用他機性能情報および命令実行用自機性能情報と、演算して求めた「命令実行処理の実行時間」とから、命令実行処理についての同期チェック処理のための「待ち時間Ｔｗ」を算出する。
【０１９８】
具体的には、第２待ち時間設定部３６２は、「命令実行処理に係る、自ユニットの性能Ａｂｍ」と、「命令実行処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙ」との比を考慮して、「命令実行処理に係る、調整待ち時間Ｔａ」を算出する。そして、第２待ち時間設定部３６２は、算出した「命令実行処理に係る、調整待ち時間Ｔａ」を、「命令実行処理に係る、通常の待ち時間Ｔｗｏ」に追加した期間を、命令実行処理についての同期チェック処理のための「待ち時間Ｔｗ」として設定する。「Ａｂｍ／Ａｂｙ」が「１」以下である場合、第２待ち時間設定部３６２は、「命令実行処理に係る、調整待ち時間Ｔａ」を「０」とする。「Ａｂｍ／Ａｂｙ」が「１」より大きい場合、第２待ち時間設定部３６２は、「命令実行処理に係る、調整待ち時間Ｔａ」を、「自ユニットの命令実行処理の実行時間に、『Ａｂｍ／Ａｂｙ』を乗じた値」とする。
【０１９９】
第１待ち時間設定部３６１は、上述の方法により算出した「命令実行処理についての同期チェック処理のための『待ち時間Ｔｗ』」を、判定部３７０へ通知する。
【０２００】
＜「Ｉ/Ｏリフレッシュ処理」に係る同期チェック処理のための「待ち時間」＞「Ｉ/Ｏリフレッシュ処理」に係る同期チェック処理のための「待ち時間Ｔｗ」は、第３待ち時間設定部３６３によって設定される。
【０２０１】
第３待ち時間設定部３６３は、第３他機能力テーブル３４３を参照してＩ/Ｏリフレッシュ用他機性能情報を取得し、第３自機能力テーブル３５３を参照してＩ/Ｏリフレッシュ用自機性能情報を取得する。また、第３待ち時間設定部３６３は、処理実行部１２０からの、「自ユニットがＩ/Ｏリフレッシュ処理の実行を開始した」旨、および、「自ユニットがＩ/Ｏリフレッシュ処理の実行を完了した」旨の通知から、Ｉ/Ｏリフレッシュ処理の実行時間を演算する。
【０２０２】
第３待ち時間設定部３６３は、取得したＩ/Ｏリフレッシュ用他機性能情報およびＩ/Ｏリフレッシュ用自機性能情報と、演算して求めた「Ｉ/Ｏリフレッシュ処理の実行時間」とから、Ｉ/Ｏリフレッシュ処理についての同期チェック処理のための「待ち時間Ｔｗ」を算出する。
【０２０３】
具体的には、第３待ち時間設定部３６３は、「Ｉ/Ｏリフレッシュ処理に係る、自ユニットの性能Ａｂｍ」と、「Ｉ/Ｏリフレッシュ処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙ」との比を考慮して、「Ｉ/Ｏリフレッシュ処理に係る、調整待ち時間Ｔａ」を算出する。そして、第３待ち時間設定部３６３は、算出した「Ｉ/Ｏリフレッシュ処理に係る、調整待ち時間Ｔａ」を、「Ｉ/Ｏリフレッシュ処理に係る、通常の待ち時間Ｔｗｏ」に追加した期間を、Ｉ/Ｏリフレッシュ処理についての同期チェック処理のための「待ち時間Ｔｗ」として設定する。「Ａｂｍ／Ａｂｙ」が「１」以下である場合、第３待ち時間設定部３６３は、「Ｉ/Ｏリフレッシュ処理に係る、調整待ち時間Ｔａ」を「０」とする。「Ａｂｍ／Ａｂｙ」が「１」より大きい場合、第３待ち時間設定部３６３は、「Ｉ/Ｏリフレッシュ処理に係る、調整待ち時間Ｔａ」を、「自ユニットのＩ/Ｏリフレッシュ処理の実行時間に、『Ａｂｍ／Ａｂｙ』を乗じた値」とする。
【０２０４】
第３待ち時間設定部３６３は、上述の方法により算出した「Ｉ/Ｏリフレッシュ処理についての同期チェック処理のための『待ち時間Ｔｗ』」を、判定部３７０へ通知する。
【０２０５】
判定部３７０は、「自ユニットが各処理の実行を完了した」時点から、待ち時間設定部３６０から通知された待ち時間Ｔｗが経過した後に、同期チェック処理を実行する。例えば、判定部３７０は、「自ユニットが各処理の実行を完了した」時点から待ち時間Ｔｗが経過した時点で、共通レジスタ２００を参照し、自ユニットが実行を完了した或る処理について、二重化される相手方のＣＰＵユニットの実行が完了しているかを確認する。
【０２０６】
待ち時間Ｔｗとして「通常の待ち時間Ｔｗｏ＋調整待ち時間Ｔａ」を通知された判定部３７０は、「自ユニットが各処理の実行を完了した」時点から調整待ち時間Ｔａがするまで待機処理を実行する。そして、判定部３７０は、待機処理の実行完了後（つまり、「自ユニットが各処理の実行を完了した」時点から調整待ち時間Ｔａが経過した後）に、同期チェック処理を実行する。すなわち、判定部３７０は、待機処理の実行完了後に、「通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理の実行を、相手方のＣＰＵユニットが完了していることを確認できるか」を判定する。言い換えれば、判定部３７０は、待機処理の実行完了時点から通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理について、相手方のＣＰＵユニットによる実行完了を確認できるかを判定する。
【０２０７】
待ち時間Ｔｗとして「通常の待ち時間Ｔｗｏ」を通知された判定部３７０は、「自ユニットが各処理の実行を完了した」時点で直ぐに、同期チェック処理を実行する。すなわち、判定部３７０は、「通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理の実行を、相手方のＣＰＵユニットが完了していることを確認できるか」を判定する。言い換えれば、判定部３７０は、自ユニットの実行完了時点から通常の待ち時間Ｔｗｏが経過するまでに、自ユニットが実行完了した処理について、相手方のＣＰＵユニットによる実行完了を確認できるかを判定する。
【０２０８】
＜「自己診断処理」に係る同期チェック処理＞第１判定部３７１は、「自己診断処理」に係る同期チェック処理を実行する。すなわち、第１判定部３７１は、自ユニットの自己診断処理の実行完了時点から、第１待ち時間設定部３６１から通知された「自己診断処理のための『待ち時間Ｔｗ』」が経過するまでに、「相手方のＣＰＵユニットが自己診断処理の実行を完了したか」を確認する。「自己診断処理のための『待ち時間Ｔｗ』」が経過するまでに、「相手方のＣＰＵユニットが自己診断処理の実行を完了した」ことを確認できないと、第１判定部３７１は、相手方のＣＰＵユニットに異常が発生したと判定する。
【０２０９】
＜「命令実行処理」に係る同期チェック処理＞第２判定部３７２は、「命令実行処理」に係る同期チェック処理を実行する。すなわち、第２判定部３７２は、自ユニットの命令実行処理の実行完了時点から、第２待ち時間設定部３６２から通知された「命令実行処理のための『待ち時間Ｔｗ』」が経過するまでに、「相手方のＣＰＵユニットが命令実行処理の実行を完了したか」を確認する。「命令実行処理のための『待ち時間Ｔｗ』」が経過するまでに、「相手方のＣＰＵユニットが命令実行処理の実行を完了した」ことを確認できないと、第２判定部３７２は、相手方のＣＰＵユニットに異常が発生したと判定する。
【０２１０】
＜「Ｉ/Ｏリフレッシュ処理」に係る同期チェック処理＞第３判定部３７３は、「Ｉ/Ｏリフレッシュ処理」に係る同期チェック処理を実行する。すなわち、第３判定部３７３は、自ユニットのＩ/Ｏリフレッシュ処理の実行完了時点から、第３待ち時間設定部３６３から通知された「Ｉ/Ｏリフレッシュ処理のための『待ち時間Ｔｗ』」が経過するまでに、「相手方のＣＰＵユニットがＩ/Ｏリフレッシュ処理の実行を完了したか」を確認する。「Ｉ/Ｏリフレッシュ処理のための『待ち時間Ｔｗ』」が経過するまでに、「相手方のＣＰＵユニットが命令実行処理の実行を完了した」ことを確認できないと、第３判定部３７３は、相手方のＣＰＵユニットに異常が発生したと判定する。
【０２１１】
判定部３７０Ａは、共通レジスタ２００の第２レジスタ２２０を参照し、処理実行部１２０Ａが実行を完了した或る処理について、「処理実行部１２０Ｂによる実行が完了した」旨の書込があるかを確認する。判定部３７０Ａは、処理実行部１２０Ａが実行を完了した或る処理について、第２レジスタ２２０に「処理実行部１２０Ｂによる実行が完了した」旨の書込がないと、第２ＣＰＵユニット３００Ｂに異常が発生したと判定する。
【０２１２】
判定部３７０Ｂは、共通レジスタ２００の第１レジスタ２１０を参照し、処理実行部１２０Ｂが実行を完了した或る処理について、「処理実行部１２０Ａによる実行が完了した」旨の書込があるかを確認する。判定部３７０Ｂは、処理実行部１２０Ｂが実行を完了した或る処理について、第１レジスタ２１０に「処理実行部１２０Ａによる実行が完了した」旨の書込がないと、第１ＣＰＵユニット３００Ａに異常が発生したと判定する。
【０２１３】
（記憶部の詳細）
記憶部３３０は、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとの各々が使用する各種データを格納する記憶装置である。なお、記憶部３３０は、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとの各々が実行する（１）制御プログラム、（２）ＯＳプログラム、（３）第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとの各々が有する各種機能を実行するためのアプリケーションプログラム、および、（４）該アプリケーションプログラムを実行するときに読み出す各種データを非一時的に記憶してもよい。上記の（１）〜（４）のデータは、例えば、ＲＯＭ（read only memory）、フラッシュメモリ、ＥＰＲＯＭ（Erasable Programmable ROM）、ＥＥＰＲＯＭ（登録商標）（Electrically EPROM）、ＨＤＤ（Hard Disc Drive）等の不揮発性記憶装置に記憶される。第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとの各々は、図示しない一時記憶部を備えていてもよい。一時記憶部は、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとの各々が実行する各種処理の過程で、演算に使用するデータおよび演算結果等を一時的に記憶するいわゆるワーキングメモリであり、ＲＡＭ（Random Access Memory）等の揮発性記憶装置で構成される。どのデータをどの記憶装置に記憶するのかについては、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとの各々の使用目的、利便性、コスト、または、物理的な制約等から適宜決定される。記憶部３３０はさらに、他機能力テーブル３４０および自機能力テーブル３５０を格納している。
【０２１４】
他機能力テーブル３４０には、二重化される相手方のＣＰＵユニットの性能Ａｂｙ（処理能力）を示す情報である他機性能情報が格納される。図３を用いて説明したように、能力取得部３１０は、二重化される相手方のＣＰＵユニットの自機能力テーブル３５０を参照して取得した他機性能情報を、自ユニットの他機能力テーブル３４０に格納する。
【０２１５】
第１他機能力テーブル３４１には、二重化される相手方のＣＰＵユニットの第１自機能力テーブル３５１に格納されている「自己診断処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報」が、能力取得部３１０により格納される。
【０２１６】
第２他機能力テーブル３４２には、二重化される相手方のＣＰＵユニットの第２自機能力テーブル３５２に格納されている「命令実行処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報」が、能力取得部３１０により格納される。
【０２１７】
第３他機能力テーブル３４３には、二重化される相手方のＣＰＵユニットの第３自機能力テーブル３５３に格納されている「Ｉ／Ｏリフレッシュ処理に係る、二重化される相手方のＣＰＵユニットの性能Ａｂｙを示す性能情報」が、能力取得部３１０により格納される。
【０２１８】
自機能力テーブル３５０には、自ユニットの性能Ａｂｍ（処理能力）を示す情報である自機性能情報が格納され、例えば、「自ユニットが、基準ＣＰＵユニットと比較して、どの程度の性能（処理能力）を備えているのか」を示す自機性能情報が格納されている。自機性能情報は、例えば第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとの各々の工場出荷時に、自機能力テーブル３５０に格納される。
【０２１９】
第１自機能力テーブル３５１には、「自己診断処理に係る、自ユニットの性能Ａｂｍを示す性能情報（特に、「自己診断処理に係る、基準ＣＰＵユニットの性能Ａｂｂ」に対する、相対的な性能Ａｂｍ）」が格納されている。
【０２２０】
第２自機能力テーブル３５２には、「命令実行処理に係る、自ユニットの性能Ａｂｍを示す性能情報（特に、「命令実行処理に係る、基準ＣＰＵユニットの性能Ａｂｂ」に対する、相対的な性能Ａｂｍ）」が格納されている。
【０２２１】
第３自機能力テーブル３５３には、「Ｉ／Ｏリフレッシュ処理に係る、自ユニットの性能Ａｂｍを示す性能情報（特に、「Ｉ／Ｏリフレッシュ処理に係る、基準ＣＰＵユニットの性能Ａｂｂ」に対する、相対的な性能Ａｂｍ）」が格納されている。
【０２２２】
（ＣＰＵユニットについての整理）
これまでに図４等を用いて構成を説明してきた第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々について、その理解を容易にするため、以下のように整理しておく。すなわち、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々と同様に、ＰＬＣ２０（コントローラ）において二重化されるＣＰＵユニットである。第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、待ち時間設定部３６０（設定部）と判定部３７０とを備えている。待ち時間設定部３６０は、自ユニットの性能Ａｂｍ（処理能力）と、二重化される相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、待ち時間Ｔｗを設定する。判定部３７０は、自ユニットにおける処理の実行完了時点から、待ち時間設定部３６０によって設定された待ち時間Ｔｗを経過するまでに、相手方のＣＰＵユニットの前記処理の実行完了を確認できないと、相手方のＣＰＵユニットに異常が発生したと判定する。
【０２２３】
したがって、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々と同様に、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの違いを考慮した、適切な待ち時間Ｔｗを設定できる。すなわち、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、二重化される相手方のＣＰＵユニットと自ユニットとの性能Ａｂの違いを考慮して、不要な待ち時間Ｔｗを設けずに、同期チェック処理を正確に行なうことができる。
【０２２４】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々において、前記処理（同期チェック処理の対象となる処理）は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を含む。待ち時間設定部３６０（具体的には、第１待ち時間設定部３６１、第２待ち時間設定部３６２、および、第３待ち時間設定部３６３の各々）は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々について、待ち時間Ｔｗを設定する。判定部３７０（具体的には、第１判定部３７１、第２判定部３７２、および、第３判定部３７３の各々）は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々について、前記判定を、つまり、同期チェック処理を実行する。
【０２２５】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行完了のタイミングで、自ユニットと相手方のＣＰＵユニットとの同期を判定することができる。
【０２２６】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理を、この順で繰り返し実行する前に、二重化処理を１回実行する。第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、二重化処理において、相手方のＣＰＵユニットの性能Ａｂｙを、相手方のＣＰＵユニットから取得する。
【０２２７】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、前記各処理を繰り返し実行する前に取得しておいた相手方のＣＰＵユニットの性能Ａｂｙを考慮して、前記各処理についての前記判定に用いる待ち時間Ｔｗを、設定できるとの効果を奏する。
【０２２８】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々において、待ち時間設定部３６０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の待ち時間Ｔｗを、以下のように設定する。すなわち、待ち時間設定部３６０は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々の実行に係る、自ユニットの性能Ａｂｍと、相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、各処理の待ち時間Ｔｗを、設定する。具体的には、第１待ち時間設定部３６１は、自己診断処理に係る、自ユニットの性能Ａｂｍと、相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、自己診断処理についての同期チェック処理のための待ち時間Ｔｗを、設定する。第２待ち時間設定部３６２は、命令実行処理に係る、自ユニットの性能Ａｂｍと、相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、命令実行処理についての同期チェック処理のための待ち時間Ｔｗを、設定する。第３待ち時間設定部３６３は、Ｉ／Ｏリフレッシュ処理に係る、自ユニットの性能Ａｂｍと、相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、Ｉ／Ｏリフレッシュ処理についての同期チェック処理のための待ち時間Ｔｗを、設定する。
【０２２９】
第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々に係る、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの違いを考慮して、各処理の待ち時間Ｔｗを設定する。
【０２３０】
したがって、第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々は、前記各処理の待ち時間Ｔｗを、前記各処理に係る自ユニットおよび相手方のＣＰＵユニットの各々の性能Ａｂに応じて、設定できるとの効果を奏する。
【０２３１】
（動作）
図６は、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が実行する処理の概要を説明する図である。図６に示す第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が実行する処理について、図２に示す第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々が実行する処理との違いは、以下の点である。
【０２３２】
すなわち、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、繰り返し実行する自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理の各々について、自ユニットおよび相手方のＣＰＵユニットの性能Ａｂを把握する。そして、第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、各処理に係る自ユニットおよび相手方のＣＰＵユニットの性能Ａｂを用いて、各処理についての同期チェック処理の際の「待ち時間Ｔｗ」を設定する。第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々は、自ユニットによる各処理の実行完了時点から、各処理についての「待ち時間Ｔｗ」が経過するまでに、「相手方のＣＰＵユニットによる各処理の実行完了」があるかを判定する。
【０２３３】
その他の点においては、「第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が実行する処理」は、「第１ＣＰＵユニット１００Ａおよび第２ＣＰＵユニット１００Ｂの各々が実行する処理」と同様である。
【０２３４】
すなわち、「第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が実行する処理」は、ＰＬＣ２０（コントローラ）において二重化されるＣＰＵユニットの制御方法であって、設定ステップと、判定ステップとを含んでいる。設定ステップは、自ユニットの性能Ａｂｍと、二重化される相手方のＣＰＵユニットの性能Ａｂｙとの比を考慮して、待ち時間Ｔｗを設定する。判定ステップは、自ユニットにおける処理の実行完了時点から、設定ステップにて設定された待ち時間Ｔｗを経過するまでに、相手方のＣＰＵユニットにおける前記処理の実行完了を確認できないと、相手方のＣＰＵユニットに異常が発生したと判定する。
【０２３５】
したがって、「第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が実行する処理」は、自ユニットと相手方のＣＰＵユニットとで性能Ａｂが一致しない場合であっても、自ユニットと相手方のＣＰＵユニットとの性能Ａｂの違いを考慮した、適切な待ち時間Ｔｗを設定できるとの効果を奏する。すなわち、「第１ＣＰＵユニット３００Ａおよび第２ＣＰＵユニット３００Ｂの各々が実行する処理」は、二重化される相手方のＣＰＵユニットと自ユニットとの性能Ａｂの違いを考慮して、不要な待ち時間Ｔｗを設けずに、同期チェック処理を正確に行なうことができるとの効果を奏する。
【０２３６】
§４．変形例
これまで、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとが（または、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとが）、共通レジスタ２００を利用して、同期チェック処理を行なう例を説明してきた。しかしながら、共通レジスタ２００を利用する方法は、同期チェック処理の実現方法の一例にすぎない。同期チェック処理は、例えば、第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとが（または、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとが）、互いのシリアルポートで通信を行いながら、同期をチェックする方法で実現されてもよい。第１ＣＰＵユニット１００Ａと第２ＣＰＵユニット１００Ｂとは（または、第１ＣＰＵユニット３００Ａと第２ＣＰＵユニット３００Ｂとは）、互いのシリアルポートで通信を行ないながら、互いに、相手方のＣＰＵユニットの処理の実行完了を確認してもよい。
【０２３７】
また、これまで自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理がこの順に繰り返し実行され、これらの各処理の実行完了後に、これらの各処理に係る同期チェック処理が実行される例を説明してきた。しかしながら、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理に加えて、さらに別の処理が、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理と同様に繰り返し実行されてもよい。その場合、この別の処理についても、実行完了後に同期チェック処理が実行されることになる。
【０２３８】
例えば、自己診断処理、命令実行処理、および、Ｉ／Ｏリフレッシュ処理に加えて、Ｉ／Ｏリフレッシュ処理で信号の送受信が行われる通信ネットワークとは別の通信ネットワークへの、信号の送受信を行なう「その他の通信処理」が、繰り返し実行されてもよい。すなわち、自己診断処理、命令実行処理、Ｉ／Ｏリフレッシュ処理、および、その他の通信処理が、この順に繰り返し実行され、これらの各処理の実行完了後に、これらの各処理に係る同期チェック処理が実行されてもよい。
【０２３９】
〔ソフトウェアによる実現例〕
第１ＣＰＵユニット１００Ａ、第２ＣＰＵユニット１００Ｂ、第１ＣＰＵユニット３００Ａ、および、第２ＣＰＵユニット３００Ｂの各々の制御ブロック（特に、能力取得部１１０、処理実行部１２０、待ち時間設定部１６０、判定部１７０、能力取得部３１０、待ち時間設定部３６０、および、判定部３７０）は、集積回路（ＩＣチップ）等に形成された論理回路（ハードウェア）によって実現してもよいし、ＣＰＵ（CenＴｒal Processing Unit）を用いてソフトウェアによって実現してもよい。
【０２４０】
後者の場合、第１ＣＰＵユニット１００Ａ、第２ＣＰＵユニット１００Ｂ、第１ＣＰＵユニット３００Ａ、および、第２ＣＰＵユニット３００Ｂの各々は、各機能を実現するソフトウェアであるプログラムの命令を実行するＣＰＵ、上記プログラムおよび各種データがコンピュータ（またはＣＰＵ）で読み取り可能に記録されたＲＯＭ（Read Only Memory）または記憶装置（これらを「記録媒体」と称する）、上記プログラムを展開するＲＡＭ（Random Access Memory）等を備えている。そして、コンピュータ（またはＣＰＵ）が上記プログラムを上記記録媒体から読み取って実行することにより、本発明の目的が達成される。上記記録媒体としては、「一時的でない有形の媒体」、例えば、テープ、ディスク、カード、半導体メモリ、プログラマブルな論理回路等を用いることができる。また、上記プログラムは、該プログラムを伝送可能な任意の伝送媒体（通信ネットワークや放送波等）を介して上記コンピュータに供給されてもよい。なお、本発明は、上記プログラムが電子的な伝送によって具現化された、搬送波に埋め込まれたデータ信号の形態でも実現され得る。
【０２４１】
本発明は上述した各実施形態に限定されるものではなく、請求項に示した範囲で種々の変更が可能であり、異なる実施形態にそれぞれ開示された技術的手段を適宜組み合わせて得られる実施形態についても本発明の技術的範囲に含まれる。
【符号の説明】
【０２４２】
１０  ＰＬＣ
２０  ＰＬＣ
１００Ａ  第１ＣＰＵユニット（ＣＰＵユニット）
１００Ｂ  第２ＣＰＵユニット（ＣＰＵユニット）
３００Ａ  第１ＣＰＵユニット（ＣＰＵユニット）
３００Ｂ  第２ＣＰＵユニット（ＣＰＵユニット）
１６０  時間設定部（設定部）
３６０  時間設定部（設定部）
１７０  判定部
３７０  判定部
Ａｂ  性能（処理能力）
Ｔｗ  待ち時間
【図１】
2020052550.tif 000003
【図２】
2020052550.tif 000004
【図３】
2020052550.tif 000005
【図４】
2020052550.tif 000006
【図５】
2020052550.tif 000007
【図６】
2020052550.tif 000008
【図７】
2020052550.tif 000009
【図８】
2020052550.tif 000010
【図９】
2020052550.tif 000011