(57)【要約】【課題】コントローラ冗長化システムにおいて、稼動系と待機系とで演算実行タイミングがズレても、これを検出して修正することができる。【解決手段】稼動系実行順序通知部（１２、２２）は、所定のときに、その時点における自コントローラにおける演算実行状況を、相手側コントローラに通知する。タイミング確認部（１４，２４）は、自己と相手側の演算実行状況と実行順序テーブル（１６、２６）等に基づいて、自己の演算実行状況が相手側と同一か進んでいるか遅れているかを判定する。ずれ修正機能部１５は、演算実行状況が相手側と異なる場合には相手側と同一となるように修正する。例えば、遅れている場合には、相手側に追いつくまで演算実行し、その間は相手側の演算実行を一時停止させる。【選択図】図１
2015170053.tif 000002
【特許請求の範囲】
【請求項１】
何れか一方が稼動系、他方が待機系となる２つのコントローラを有し、該稼動系、待機系の両方のコントローラが、定期的に同じアプリケーションに係わる各演算を実行するコントローラ冗長化システムであって、
前記各コントローラは、
予め前記各演算の実行順序を記憶する実行順序記憶手段と、
所定のときに、その時点における自コントローラにおける演算実行状況を、相手側コントローラに通知する状況通知手段と、
前記相手側コントローラから通知された前記演算実行状況と前記実行順序記憶手段とに基づいて、自コントローラの演算実行状況が相手側コントローラよりも遅れているか進んでいるか同じであるかを判定するタイミング確認手段と、
該タイミング確認手段によって前記相手側コントローラよりも遅れていると判定された場合には、自コントローラの演算実行状況が前記相手側コントローラと同じとなるまで演算を実行し、実行完了したら完了通知を前記相手側コントローラに通知するズレ修正手段と、
を有することを特徴とするコントローラ冗長化システム。
【請求項２】
前記ズレ修正手段は、前記タイミング確認手段によって自コントローラの演算実行状況が前記相手側コントローラよりも進んでいると判定された場合には、前記完了通知を受信するまで演算実行を中止することを特徴とする請求項１記載のコントローラ冗長化システム。
【請求項３】
前記演算実行状況は、次に実行する演算を示す識別情報であることを特徴とする請求項１または２記載のコントローラ冗長化システム。
【請求項４】
前記各コントローラは、複数のタスク各々に係わる各演算を実行し、任意のタスク実行中に該タスクより上位のタスクの実行要求があった場合には、該任意のタスクを中断して該上位のタスクを実行し、該上位のタスクを実行完了したら該任意のタスクを再開するアプリケーション実行管理手段を更に有し、
前記実行順序記憶手段には、前記各タスク毎に、そのタスクに係わる各演算の実行順序が記憶されており、
前記状況通知手段は、前記中断中の任意のタスクがある場合には、該中断中のタスクに係わる演算実行状況を通知することを特徴とする請求項１〜３の何れかに記載のコントローラ冗長化システム。
【請求項５】
前記ズレ修正手段は、前記中断中のタスクの演算実行状況が相手側コントローラよりも遅れている場合には、該中断中のタスクを再開してその演算実行状況が前記相手側コントローラと同じとなるまで演算を実行して再度中断することを特徴とする請求項４記載のコントローラ冗長化システム。
【請求項６】
前記所定のときは、入力処理時、出力処理時、定周期タイミング到来時であることを特徴とする請求項１〜５の何れかに記載のコントローラ冗長化システム。
【請求項７】
何れか一方が稼動系、他方が待機系となる２つのコントローラを有し、該稼動系、待機系の両方のコントローラが、定期的に同じアプリケーションに係わる各演算を実行するコントローラ冗長化システムにおける該各コントローラであって、
予め前記各演算の実行順序を記憶する実行順序記憶手段と、
所定のときに、その時点における自コントローラにおける演算実行状況を、相手側コントローラに通知する状況通知手段と、
前記相手側コントローラから通知された前記演算実行状況と前記実行順序記憶手段とに基づいて、自コントローラの演算実行状況が相手側コントローラよりも遅れているか進んでいるか同じであるかを判定するタイミング確認手段と、
該タイミング確認手段によって前記相手側コントローラよりも遅れていると判定された場合には、自コントローラの演算実行状況が前記相手側コントローラと同じとなるまで演算を実行し、実行完了したら完了通知を前記相手側コントローラに通知するズレ修正手段と、
を有することを特徴とするコントローラ冗長化システムのコントローラ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、制御コントローラの二重化システムに関する。
【背景技術】
【０００２】
従来のプログラマブルコントローラの冗長化システムは、稼働系コントローラは運用動作しており、待機系コントローラは運用停止しているが等値化データの受信と保持は行っている構成が、よく知られているものである。例えば特許文献１等に開示の冗長化システムが知られている。
【０００３】
特許文献１では、主系制御モジュールは、待機系制御モジュールに対して構成情報を通知している。待機系モジュールは、構成情報の通知が途絶えた場合に、自己を新たな主系制御モジュールとする。その際、保持していた構成情報を用いれば済むので、改めて構成情報を収集する必要がないので、制御を引き継ぐまでの時間を短縮できる。
【０００４】
これに対して、従来、稼働系コントローラと待機系コントローラの両方を運用動作させる構成も考えられていた。つまり、稼働系コントローラと待機系コントローラの両方で、同じアプリケーション（制御プログラム等）を繰り返し実行する。稼動系コントローラは、このアプリケーションを実行に伴って各種制御対象機器を制御する。
【０００５】
一方、待機系コントローラは、アプリケーションは実行するが、制御対象機器の制御は行わない。つまり、アプリケーション実行結果を制御対象機器に出力するようなことはない。しかしながら、稼動系コントローラと同様の処理動作を行っているので、稼動系コントローラが故障した場合等には、直ちに制御を引き継げることになる。
【０００６】
尚、上記従来技術では、稼働系コントローラと待機系コントローラとは、非同期でアプリケーションの実行をしていた。つまり、各演算等が同タイミングで実行されるように制御するようなことは、行われていなかった。
【０００７】
図９に、上記従来の稼動・待機アプリケーション実行例を示す。
上記の通り、稼働系コントローラと待機系コントローラとで同じアプリケーションを実行するものであり、図示の例ではタスク１とタスク２を実行する。尚、ここでは、タスク１はタスク２より上位レベルであり、従ってタスク２を実行中にタスク１の起動要求があった場合には、タスク２を中断してタスク１を実行することになる。
【０００８】
各タスクは、基本的に、入力処理、出力処理、演算処理から成る。演算処理では、複数の演算を実行する場合が多い。図示の例では、タスク１の演算処理では、演算ａと演算ｂの２種類の演算を実行する。実行順は、演算ｂ→演算ａである。タスク２の演算処理では、演算ｃと演算ｄと演算ｅと演算ｆと演算ｇと演算ｈの６種類の演算を実行する。実行順は、演算ｄ→演算ｃ→演算ｇ→演算ｈ→演算ｅ→演算ｆである。
【０００９】
図９は、横軸方向は時間軸であり、点線によって定周期の制御周期を示してある。各制御周期毎に任意のタスクの起動要求が発生する場合がある。時間軸に沿って説明するならば、最初はタスク１とタスク２の両方の起動要求がある。この場合、上記の理由から、まずタスク１が実行され、実行完了したら、続いてタスク２が実行開始される。
【００１０】
そして、図示の例では、タスク２は、この制御周期内では実行完了せず、次の制御周期内でも演算ｅまでしか実行出来ていない。この状態で更に次の制御周期になると、タスク１の起動要求が発生しているので、タスク２は中断し、タスク１を実行することになる。そして、タスク１を実行完了したら、タスク２を再開し、図示の例では演算ｆと出力処理を実行している。ここまでは、稼動系と待機系とで同じ動作が行われている。
【００１１】
ここで、演算ｈは、変数Ａを＋１インクリメントする処理（Ａ＝Ａ＋１）であり、ここでは仮にＡ＝‘３’であったものとし、従って「Ａ＝３＋１＝４」となる。また、演算ａは、「Ｃ＝Ａ＋２」を演算するものであり、Ａ＝４であることから、「Ｃ＝４＋２＝６」が算出される。これは、上記の通り、ここまでは稼動系と待機系とで同一の動作となっており、従って両方ともＡ＝４となっており、それによってＣ＝６が演算されることになる。よって、ここまでは特に問題ない。
【００１２】
しかしながら、次の制御周期で、タスク２の起動要求があったことからタスク２を実行中に、稼動系のみ途中で非同期で要求される処理（メッセージ処理等）が発生している。この為、この制御周期において、待機系は演算ｈまで実行したが、稼動系は演算ｇまでしか実行していない。この為、待機系では変数Ａは‘５’に更新されているが、稼動系では変数Ａは上記‘４’のままとなっている。
【００１３】
この状態で、次の制御周期で、タスク１の起動要求が発生したことから、タスク２は中断され、タスク１が実行されることになる。この為、稼動系では、変数Ａが更新されないまま、上記演算ａが実行されることになる。この為、待機系では演算ａによってＣ＝５＋２＝７となるが、稼動系では演算ａによってＣ＝４＋２＝６となり、両者で値が異なる状態となってしまう。
【００１４】
このように、定常的に行っている演算処理中に、非同期で要求される処理（メッセージ処理、割り込み処理）の要求が発生することにより、アプリケーションの実行タイミングに関して、稼働コントローラと待機コントローラとでずれが生じる場合があり、以って実行結果（変数ＡやＣの値）が異なるケースが生じ得る。
【００１５】
その為、アプリケーションを作成する際に、出力結果が非同期な（異なる）状態が存在することを許容するか、プログラムで同期化の確認をするなどの処理を行う必要があった。
【先行技術文献】
【特許文献】
【００１６】
【特許文献１】特開２０１２−２５６１６４号公報
【発明の概要】
【発明が解決しようとする課題】
【００１７】
従来のプログラマブルコントローラ冗長化システムのなかで、特に上述したような稼働系、待機系の両コントローラが同一のアプリケーションを実行する冗長化システムにおいては、例えば上述したような問題が生じる。すなわち、この様なシステムにおいて、メッセージ処理等が原因で、稼動系と待機系とで演算実行タイミングがズレて、以って演算結果が異なる場合が起こり得る。
【００１８】
本発明の課題は、稼働系、待機系の両コントローラが同一のアプリケーションを実行するコントローラ冗長化システムにおいて、稼動系と待機系とで演算実行タイミングがズレても、これを検出して修正することができるコントローラ冗長化システム等を提供することである。
【課題を解決するための手段】
【００１９】
本発明のコントローラ冗長化システムは、何れか一方が稼動系、他方が待機系となる２つのコントローラを有し、該稼動系、待機系の両方のコントローラが、定期的に同じアプリケーションに係わる各演算を実行するコントローラ冗長化システムであって、これら各コントローラは、下記の構成を有する。
【００２０】
・予め前記各演算の実行順序を記憶する実行順序記憶手段；
・所定のときに、その時点における自コントローラにおける演算実行状況を、相手側コントローラに通知する状況通知手段；
・前記相手側コントローラから通知された前記演算実行状況と前記実行順序記憶手段とに基づいて、自コントローラの演算実行状況が相手側コントローラよりも遅れているか進んでいるか同じであるかを判定するタイミング確認手段；
・該タイミング確認手段によって前記相手側コントローラよりも遅れていると判定された場合には、自コントローラの演算実行状況が前記相手側コントローラと同じとなるまで演算を実行し、実行完了したら完了通知を前記相手側コントローラに通知するズレ修正手段。
【発明の効果】
【００２１】
本発明のコントローラ冗長化システム等は、稼働系、待機系の両コントローラが同一のアプリケーションを実行するコントローラ冗長化システムにおいて、稼動系と待機系とで演算実行タイミングがズレても、これを検出して修正することができる。これによって、稼動系と待機系とで演算結果が異なる事態となることを防止できる。
【図面の簡単な説明】
【００２２】
【図１】本例のコントローラ冗長化システムの構成図である。
【図２】各タスク毎の各演算の具体的イメージ例である。
【図３】図２の例に応じた実行順序テーブルの具体例である。
【図４】実行順序テーブルの生成・配信の具体例である。
【図５】各ＰＬＣの処理フローチャート図である。
【図６】本手法による各種処理実行タイミングチャート（正常時）である。
【図７】本手法による各種処理実行タイミングチャート（異常時）である。
【図８】本手法による各種処理実行タイミングチャート（異常時）である。
【図９】従来の稼動・待機アプリケーション実行例を示す図である。
【発明を実施するための形態】
【００２３】
以下、図面を参照して本発明の実施の形態について説明する。
図１は、本例のプログラマブルコントローラシステム（ＰＬＣシステム）の構成図である。換言すれば、図１は、本例のコントローラ冗長化システムの構成図であるとも言える。ここでは、コントローラ冗長化システムとは、稼働系、待機系の両コントローラが同一のアプリケーションを実行する冗長化システムであるものとする。尚、本説明では、プログラマブルコントローラを、ＰＬＣと略記する場合もあるものとする。
【００２４】
図１には、稼動系ＰＬＣ１０と待機系ＰＬＣ２０の構成を示す。ここで、図示の例では、稼動系ＰＬＣ１０と待機系ＰＬＣ２０とで各構成の名称や符号が異なるように示しているが、実際には殆ど同じであると見做してよい。両者の違いは、待機系ＰＬＣ２０における「出力処理」は、実際に制御対象機器に出力するものではない点である。稼動系ＰＬＣ１０のみが、「出力処理」によって演算結果等を制御対象機器へ出力する。但し、図１では、この様な「出力処理」機能部は省略して示しているので、図１に示す構成に関しては、稼動系ＰＬＣ１０と待機系ＰＬＣ２０とで実質的に相違は無いものと見做しても構わない。
【００２５】
図１の例では、稼動系ＰＬＣ１０は、アプリケーション実行部１１、稼動系実行順序通知部１２、待機系実行順序受信部１３、タイミング確認部１４、ずれ修正機能部１５等の各種処理機能部を有する。更に、タスク別アプリケーション実行順序テーブル１６を記憶している。これは、本例では、タスク１アプリケーション実行順序テーブル１６ａ、タスク２アプリケーション実行順序テーブル１６ｂ等より成る。尚、これらは、以下、簡略化して、実行順序テーブル１６、タスク１実行順序テーブル１６ａ、タスク２実行順序テーブル１６ｂ等と記すものとする。
【００２６】
また、待機系ＰＬＣ２０は、アプリケーション実行部２１、待機系実行順序通知部２２、稼動系実行順序受信部２３、タイミング確認部２４、ずれ修正機能部２５等の各種処理機能部を有する。更に、タスク別アプリケーション実行順序テーブル２６を記憶している。これは、本例では、タスク１アプリケーション実行順序テーブル２６ａ、タスク２アプリケーション実行順序テーブル２６ｂ等より成る。尚、これらも、以下、簡略化して、実行順序テーブル２６、タスク１実行順序テーブル２６ａ、タスク２実行順序テーブル２６ｂ等と記すものとする。
【００２７】
尚、稼動系ＰＬＣ１０、待機系ＰＬＣ２０は、ハードウェア構成は同じであってよく、例えば一般的なプログラマブルコントローラ（ＣＰＵモジュール等）の構成であってよい。よって、特に図示しないが、ＣＰＵ／ＭＰＵ等の演算プロセッサ、メモリ等の記憶部、通信機能部等を有している。記憶部には予め所定のプログラムが記憶されており、このプログラムを演算プロセッサが実行することで、上記各種処理機能部１１〜１５、２１〜２５が実現される。また、稼動系ＰＬＣ１０と待機系ＰＬＣ２０とは、通信線１を介して、相互にデータ送受信等を行える。通信線１の具体例や通信方式の具体例は、特に示さないものとする。
【００２８】
アプリケーション実行部１１、２１は、任意のアプリケーションプログラム（特に制御プログラム）を実行する。制御プログラムは、よく知られているように、不図示の制御対象機器を監視・制御する為のプログラムであり、基本的に、定期的に（定周期で）実行される。本説明では制御プログラムを例にして説明する。
【００２９】
アプリケーション実行部１１とアプリケーション実行部２１とでは、基本的に、ほぼ同じタイミングで同じ処理が実行されている。これ自体は既存技術である。
アプリケーション実行部１１，２１は、例えば、複数のタスクを定期的に実行する。これは、例えば、複数のタスク各々に係わる各演算を順次実行し、任意のタスク実行中に該タスクより上位のタスクの実行要求があった場合には、該任意のタスクを中断して該上位のタスクを実行し、該上位のタスクを実行完了したら該任意のタスクを再開する。
【００３０】
また、アプリケーション実行部１１，２１は、上記タスクを実行中にメッセージ処理等が発生したら、このメッセージ処理等を実行して、タスクの処理を再開する。
本手法は、このようにメッセージ処理等が原因でタスクの演算等の実行タイミングがズレた状態となったら、これを修正できるものである。
【００３１】
稼動系実行順序通知部１２は、所定のときに、その時点における自コントローラにおける演算実行状況を、相手側コントローラ（待機系ＰＬＣ２０）に通知する。演算実行状況とは、例えば次に実行する処理（演算など）を示す識別情報等が含まれる所定情報１７等である。
【００３２】
同様に、待機系実行順序通知部２２は、所定のときに、その時点における自コントローラにおける演算実行状況を、相手側コントローラ（稼動系ＰＬＣ１０）に通知する。つまり、例えば、次に実行する処理（演算など）を示す識別情報等が含まれる所定情報２７を、稼動系ＰＬＣ１０に通知する。
【００３３】
尚、上記識別情報とは、後述するＩＤ等であってもよいし、後述するタスク番号と実行順序番号等であってもよいが、これらの例に限らない。
上記所定のときとは、例えば入力処理実行開始時、出力処理実行開始時、制御周期毎（定周期タイミング到来時）等である。また、上記所定情報１７，２７は、上記のように自コントローラにおける演算実行状況を示す情報であり、一例が上記「次に実行する処理（演算）を示す識別情報」であるが、この例に限らない。例えば、“次の処理”ではなく“直前に実行した処理”等であってもよい。但し、ここでは、「次に実行する処理（演算）」とする場合を例にして説明するものとする。
【００３４】
また、上記所定情報１７としては、上述した稼動系ＰＬＣ１０で次に実行する処理の識別情報等以外にも、中断しているタスクがある場合にはその中断情報等もあってよい。中断情報とは、例えば、中断中のタスクの再開時に実行する処理（演算など）の識別情報等であるが、この例に限らない。中断情報は、中断直前に実行した処理（演算など）の識別情報等であってもよく、再開時に実行すべき処理を判別可能な情報であれば何でも良い。また、中断情報のみを所定情報１７として通知するようにしてもよい。
【００３５】
上記所定情報２７も、上記所定情報１７と略同様であり、上記待機系ＰＬＣ２０で次に実行する処理の識別情報等以外にも、中断しているタスクがある場合にはその中断情報等もあってよい。中断情報については、上記の通りである。また、中断情報のみを所定情報２７として通知するようにしてもよい。
【００３６】
待機系実行順序受信部１３は、上記待機系実行順序通知部２２から通知される上記所定情報２７を受信する。同様にして、稼動系実行順序受信部２３は、上記稼動系実行順序通知部１２から通知される上記所定情報１７を受信する。つまり、待機系実行順序受信部１３，２３は、それぞれ、相手側コントローラの演算実行状況を、取得するものと言える。尚、演算実行状況には、実行中のタスクの演算に関する情報だけでなく中断中のタスクの演算に関する情報も含まれる場合があるものとする。
【００３７】
タイミング確認部１４は、上記受信した待機側の所定情報２７、自己の所定情報１７、実行順序テーブル１６等に基づいて、自己の演算実行状況が待機系ＰＬＣ２０と“同じである”か“進んでいる”か“遅れている”か、等を判定する。
【００３８】
同様にして、タイミング確認部２４は、上記受信した稼動側の所定情報１７、自己の所定情報２７、実行順序テーブル２６等に基づいて、自己の演算実行状況が稼動系ＰＬＣ１０と“同じである”か“進んでいる”か“遅れている”か、等を判定する。
【００３９】
つまり、タイミング確認部１４、２４は、それぞれ、自コントローラの演算実行状況が相手側コントローラと“同じである”か“進んでいる”か“遅れている”か、等を判定するものと言える。
【００４０】
ずれ修正機能部１５は、上記タイミング確認部１４の判定結果に応じて、制御プログラムの演算実行状況が待機系ＰＬＣ２０と同じとなるように修正する。但し、上記“同じである”と判定された場合には、何も行わないでよい。演算実行状況が待機系ＰＬＣ２０よりも遅れている場合には、待機系ＰＬＣ２０に追いつくまで演算処理等を実行し、追いついたら完了通知を待機系ＰＬＣ２０に送る。一方、演算実行状況が待機系ＰＬＣ２０よりも進んでいる場合には、待機系ＰＬＣ２０が追いつくのを待つ。つまり、上記完了通知が待機系ＰＬＣ２０から送られてくるまで、演算処理等を一時停止する。
【００４１】
同様にして、ずれ修正機能部２５も、上記タイミング確認部２４の判定結果に応じて、制御プログラムの演算実行状況が稼動系ＰＬＣ１０と同じとなるように修正する。但し、上記“同じである”と判定された場合には、何も行わないでよい。演算実行状況が稼動系ＰＬＣ１０よりも遅れている場合には、稼動系ＰＬＣ１０に追いつくまで演算処理等を実行し、追いついたら完了通知を稼動系ＰＬＣ１０に送る。一方、演算実行状況が稼動系ＰＬＣ１０よりも進んでいる場合には、稼動系ＰＬＣ１０が追いつくのを待つ。つまり、上記完了通知が稼動系ＰＬＣ１０から送られてくるまで、演算処理等を一時停止する。
【００４２】
つまり、ずれ修正機能部１５、２５は、それぞれ、自己のタイミング確認部の判定結果に応じて、制御プログラムの演算実行状況が、相手側コントローラと異なる場合には、相手側コントローラと同じとなるように修正する処理を行う。
【００４３】
上述した各種処理機能において、上記実行順序テーブル１６、２６を参照する場合がある。これについて以下、図２、図３に示す具体例を用いて説明する。実行順序テーブル１６と実行順序テーブル２６とは、同一の内容となっている。
【００４４】
尚、ここでは上記従来の図９に示す例を用いるものとする。つまり、各ＰＬＣ１０，２０の制御プログラム実行例として、タスク１とタスク２を実行するものとし、且つ、タスク１がタスク２より上位レベルであるものとする。タスク１は、演算ａと演算ｂとを実行するものであって、実行順序は演算ｂ→演算ａである。タスク２は、演算ｃと演算ｄと演算ｅと演算ｆと演算ｇと演算ｈの６種類の演算処理を実行するものであって、実行順序は、演算ｄ→演算ｃ→演算ｇ→演算ｈ→演算ｅ→演算ｆである。
【００４５】
図２は、上記のことをイメージとして示したものであり、特に説明しないが、図示のa〜ｈは、各演算に予め割り当てられたＩＤ等である。また、図示の（１）〜（６）の各数値は、各タスクにおけるその演算の実行順序を示す実行順序番号と見做してよい。
【００４６】
図３は、上記具体例に応じた上記実行順序テーブル１６、２６の具体例である。
実行順序テーブル１６、２６には、各タスク１，２毎に、そのタスクの各演算を示す情報（上記ＩＤ等）が、実行順序通りに格納されている。これより、実行順序テーブル１６、２６を参照すれば、上記実行順序番号や次の演算等を認識できる。
【００４７】
そして、例えば、実行中または実行完了した演算や中断している演算のタスクやＩＤ等は認識できるので、その次に実行すべき演算は実行順序テーブル１６、２６を参照すれば分かる。これより上記所定情報１７、２７を作成できる。つまり、例えば、自コントローラの次の演算のＩＤ（または実行順序番号）等を含む上記所定情報１７、２７を作成できる。尚、逐一述べないが、実行順序番号には、そのタスクを示す情報も含まれるものとする。例えば、演算ｇに対応する実行順序番号は「タスク２の３番目」等となる。
【００４８】
また、タイミング確認部１４，２４は、例えば、自コントローラの次の演算のＩＤ（または実行順序番号）と相手側コントローラの次の演算のＩＤ（または実行順序番号）とが同一ではない場合に、実行順序テーブル１６，２６を参照することで、自コントローラの演算実行状況が相手側コントローラより進んでいるか遅れているかを判別できる。
【００４９】
例えば図３に示す例において、稼動系ＰＬＣ１０は、仮に、自コントローラの次の演算が演算ｇであり、相手側コントローラの次の演算が演算ｈであった場合には、実行順序テーブル１６を参照することで、自己の実行順序番号がタスク２の３番目であり且つ相手の実行順序番号がタスク２の４番目であると認識できる。これより、自己の演算実行状況が相手側コントローラよりも遅れていると判定することになる。
【００５０】
尚、この例に限らず、例えば上記所定情報１７、２７の作成の際に、実行順序テーブル１６，２６を参照することで、自コントローラの次の演算の実行順序番号を判別してこれを上記所定情報１７、２７として相手側コントローラに通知するようにしてもよい。
【００５１】
遅れていると判断したコントローラは、相手側コントローラの実行完了分まで演算を進め、完了通知を相手側コントローラへ通知する。進んでいると判断したコントローラは、相手側コントローラからの完了通知を受信するまで演算実行を停止し、完了通知が届いた時点で、演算を再開させる。
【００５２】
尚、上記実行順序テーブル１６、２６は、例えば図４に示すように、プログラミングツール２において、開発者等が任意にアプリケーション実行順序テーブル３を作成して、これを各ＰＬＣ１０、２０にダウンロードして保持させたものである。プログラミングツール２は、支援装置等とも呼ばれる、ユーザが任意の制御プログラムを作成するのを支援する機能等を有する既存の構成であり、ハードウェア的には汎用のパソコン等である。よく知られた既存の構成であるので、これ以上詳細には説明しない。
【００５３】
図５に、各ＰＬＣ１０、２０の処理フローチャート図を示す。尚、稼動系ＰＬＣ１０と待機系ＰＬＣ２０とでは、上記の通り、処理内容は殆ど同じであり、どちらも図５の処理を実行する。
【００５４】
図５の処理例では、例えば、任意のタスクに関して入力処理を行った際に、同期化情報を相手側コントローラに送信する（ステップＳ１１）。相手側コントローラとは、自己が稼動系ＰＬＣ１０であれば待機系ＰＬＣ２０のことであり、自己が待機系ＰＬＣ２０であれば稼動系ＰＬＣ１０のことである。
【００５５】
上記同期化情報には、上記所定情報（１７ｏｒ２７）が含まれる。すなわち、例えば、次に実行する処理を示す情報（次の演算のＩＤまたは実行順序番号等）などが含まれる。更に、例えば、入力処理で取得した入力データ等が含まれる。尚、入力処理は、例えば不図示の制御対象機器の状態データ（センサ計測値等）等を取得する処理である。稼動系ＰＬＣ１０と待機系ＰＬＣ２０とで、同じ演算を実行しても、演算に用いる入力データが異なっていれば、出力が異なることになる。それ故、演算の実行順だけでなく入力データが一致することも確認する必要がある。
【００５６】
尚、上記入力処理に伴う同期化情報は、入力処理同期化情報と呼ぶ場合もあるものとする。一方、後述する出力処理に伴う同期化情報は、上記入力データの代わりに演算結果等の出力データが含まれるものであり、出力処理同期化情報と呼ぶ場合もあるものとする
ほぼ同じタイミングで相手側からも上記入力処理同期化情報が送られてくるはずであるので、この入力処理同期化情報を受信したら（ステップＳ１２）、これが自己が送信した入力処理同期化情報と同じであるか否かをチェックする（ステップＳ１３）。
【００５７】
そして、図には示していないが、例えば入力データが一致しない場合には、稼動系ＰＬＣ１０の入力データを正式なものとして採用する。これによって、稼動系と待機系とで同一の入力データを用いて演算実行することになる。また、ステップＳ１３では、稼動側と待機系とで上記“次の演算”が同一であるか否かもチェックし、同一である場合には（ステップＳ１３，ＹＥＳ）、通常通りの処理を行う。つまり、そのまま各演算を実行する（ステップＳ１４）。当然、最初は当該“次の演算”を実行することになり、それ以降の演算（次の次の演算など）も順次実行していく。
【００５８】
一方、上記“次の演算”が相手側コントローラとは異なる場合には（ステップＳ１３，ＮＯ）、相手側コントローラの方が遅いか否かを判定し（ステップＳ２２）、相手側コントローラの方が遅い場合には（ステップＳ２２，ＹＥＳ）、相手側コントローラから「完了通知」が送られてくるまで待機状態となり、相手側コントローラからの「完了通知」を受信したら（ステップＳ２３）、元に戻る。元に戻るとは、上記ステップＳ２２に移行する判定を行った判定処理に戻ることであり、本例ではステップＳ１３に戻るものであり、このときには稼動系と待機系とで上記“次の演算”が同一となっているので、ステップＳ１３を強制的にＹＥＳ判定とする。後述するステップＳ１８やステップＳ２１がＮＯの場合にもステップＳ２２に移行することになり、それぞれのケースで、元に戻ることになる。尚、上記待機状態では、演算実行を一時停止している。そして、上記のようにステップＳ１３に戻って強制的に判定ＹＥＳとすることで、ステップＳ１４により演算を再開することになる。
【００５９】
一方、相手側コントローラの方が演算実行状況が進んでいる場合には（ステップＳ２２，ＮＯ）、相手側コントローラと同じ演算実行状況となるまで、演算を実行し続ける（ステップＳ２４）。これは、相手側コントローラの次の演算は分かるので、実行順序テーブル（１６ｏｒ２６）を参照すればその直前の演算が認識できるので、当該直前の演算まで実行することになる。そして、演算実行状況が相手側コントローラと同じとなったら、上記「完了通知」を相手側コントローラに送信する（ステップＳ２５）。
【００６０】
また、定周期の制御周期タイミングとなったら（所謂、タクト実行周期になったら）（ステップＳ１５、ＹＥＳ）、上記所定情報（１７ｏｒ２７）等を相手側コントローラに通知し（ステップＳ１９）、相手側コントローラからも上記所定情報（２７ｏｒ１７）等が送られてきて受信したら（ステップＳ２１）、これら自己と相手側の所定情報等に基づいて、演算実行状況が相手側と同じであるか否かを判定する（ステップＳ２１）。同じである場合には（ステップＳ２１，ＹＥＳ）ステップＳ１４へ移行する。
【００６１】
尚、所定情報（１７ｏｒ２７）には、上記の通り一例としては、次に実行する処理を示す情報（次の演算のＩＤや実行順序番号等）などが含まれる。この例の場合、ステップＳ２１では、次の演算等が相手側と同一であるか否かを判定することになる。
【００６２】
そして、演算実行状況が相手側コントローラと同一ではない場合には（ステップＳ２１，ＮＯ）上記ステップＳ２２の処理へ移行する。一方、“次の演算”が相手側コントローラと同一の場合には（ステップＳ２１，ＹＥＳ）ステップＳ１４へ戻り、通常通りの演算実行を続ける。
【００６３】
また、任意のタスクに関して出力処理を行う際に、上記出力処理同期化情報を相手側コントローラに送信する（ステップＳ１６）。ほぼ同じタイミングで相手側コントローラからも出力処理同期化情報が送られてくるはずであるので、この出力処理同期化情報を受信したら（ステップＳ１７）、これら自己と相手側の出力処理同期化情報等に基づいて、演算実行状況が相手側と同じであるか否かを判定する（ステップＳ１８）。これは、一例としては、稼動系と待機系とで“次の演算”が同一であるか否かを判定するものであり、これ自体は上記ステップＳ２１等と略同様の処理である。そして、例えば、稼動系と待機系とで“次の演算”が異なる場合には（ステップＳ１８，ＮＯ）、上記ステップＳ２２の処理へ移行する。
【００６４】
尚、上記のように、出力処理同期化情報には、出力データ等も含まれていてもよい。そして、図には示していないが、稼動系と待機系とで出力データ（演算結果）が異なる場合には、例えば稼動系の出力データを正式なものとして採用する処理を実行してもよい。但し、この例に限らない。
【００６５】
ここで、各コントローラ１０，２０が複数のタスクを実行する場合において、上位レベルタスクの割込みによって中断しているタスクがある場合には、その中断情報等も上記所定情報（１７ｏｒ２７）に含まれていても良い。中断情報とは、既に述べたように、例えば、中断中のタスクの再開時に実行する処理（演算など）の識別情報等である。そして、上記ステップＳ１３、Ｓ１８、Ｓ２１の判定処理には、この中断情報に基づいて、中断中のタスクに関する演算実行状況が相手側コントローラと同じであるか否かを判定する処理が含まれていても良い。そして、中断中のタスクに関する演算実行状況が相手側コントローラと異なる場合には、ステップＳ２２の処理に移行する。
【００６６】
この場合のステップＳ２２の処理には、中断中のタスクに関する演算実行状況が、相手側コントローラより進んでいるか遅れているかを判別する処理が含まれていてよい。そして、相手側より遅い場合には（ステップＳ２２，ＮＯ）、ステップＳ２４において、中断中のタスクに関する演算実行状況が相手側コントローラと同じとなるまで、当該中断中のタスクを再開してその演算を実行する。そして、実行完了したら、このタスクを再度中断状態にしたうえで、「完了通知」を相手側コントローラへ通知する。これより、その後、上記上位レベルタスクの演算等を実行することになる。
【００６７】
一方、相手側の方が遅い場合には（ステップＳ２２，ＹＥＳ）、上記中断中のタスクを再開することはなく、そのまま上記「完了通知」を受信するまで待ち、「完了通知」を受信したら、上位レベルタスクの演算等を実行開始する。
【００６８】
この様に、本例では、中断中のタスクに関する演算実行状況のズレの修正処理を、上位レベルタスクよりも優先させて、実行する場合があるものとする。
尚、ステップＳ１４のアプリケーション実行処理つまり何らかの演算を実行する処理は、図示のようにステップＳ１３とステップＳ１５の間に実行する例に限らず、何らかの実行すべき演算がある状況であって演算可能な状況では、演算を実行するものである。尚、演算可能な状況とは、他の処理（例えば入力処理や出力処理や上記“次の演算”が同一であるか否かをチェックする処理等）が行われていない状況である。
【００６９】
入力処理、出力処理についても、図示の例に限らず、入力処理を行うときにはステップＳ１１，Ｓ１２，Ｓ１３の処理を実行し、出力処理を行うときにはステップＳ１６，Ｓ１７，Ｓ１８の処理を実行するものと見做してよい。そして、入力処理後は、予め決められた順番通りに各演算を順次実行することになる。
【００７０】
尚、次の演算を示す情報は、上記次の演算のＩＤ等に限らず、例えばタスクの識別情報と実行順序番号等であってもよい。例えば、タスク２の実行順序＝３であれば、図３に示す実行順序テーブル１６、２６を参照すれば、演算ｇであることが分かる。勿論、その逆に、実行順序テーブル１６、２６を参照すれば、演算ｇのタスクと実行順序番号が分かることになる。
【００７１】
図６、図７、図８に、本手法による各種処理実行タイミングチャートを示す。
図６は正常例、図７は異常時の例である。尚、これらの例は、図３に示す順序で各演算が実行されたものとる。また、各タスクの起動要求発生タイミングは、上記従来の図９と同じであるものとする。また、ここでは、入力データ、出力データについては、稼動系と待機系とで常に一致するものとし、その一致判定処理や判定結果については特に言及しないものとする。
【００７２】
まず、図６について説明する。
まず、図上左端の制御周期のタイミングで、タスク１とタスク２の起動要求があり、図９で説明した通り、まず優先度が高いタスク１を実行することになる。よって、上記の通り、タスク１に関して「入力処理→演算ｂ→演算ａ→出力処理」を実行することになる。
【００７３】
まず、この入力処理の際に上記ステップＳ１１〜Ｓ１３の処理が実行されることになり、稼動系と待機系とで相互に、自己の上記入力処理同期化情報を相手側コントローラに送信する。この例では、稼動系も待機系も、入力データと共に演算ｂのＩＤ等を送信することになる。これより、ステップＳ１３の判定はＹＥＳとなり、タスク１の演算ｂ→演算ａが実行され（ステップＳ１４）、続いて出力処理が実行される。
【００７４】
この出力処理の際に上記ステップＳ１６〜Ｓ１８の処理が実行されることになり、稼動系と待機系とで相互に、自己の上記出力処理同期化情報を相手側コントローラに送信する。ここでは、“次の演算”として例えば“タスク２の入力処理”を示す情報を送信するが、この例に限らない。何れにしても、ステップＳ１８の判定はＹＥＳとなり、続いてタスク２の入力処理の際に、上記ステップＳ１１〜Ｓ１３の処理が実行されることになる。この場合もステップＳ１３の判定はＹＥＳとなり、続いて、タスク２の処理が順次実行されることになる（ステップＳ１４）。但し、図示の例では、タスク２の入力処理が実行された時点で次の制御周期タイミングとなってステップＳ１５がＹＥＳとなるので、ステップＳ１９〜Ｓ２１の処理が実行される。よって、この例では、演算ｄのＩＤ等が相互に送受信されることになり、ステップＳ２１がＹＥＳとなり、ステップＳ１４に戻って、タスク２の処理の続きを開始する。すなわち、演算ｄ→演算ｃ→演算ｇ→演算ｈ→演算ｅを実行することになる。
【００７５】
そして、図示の例では、上記演算ｅまで実行したが次の演算ｆが実行される前に次の制御周期タイミングとなり、ステップＳ１５の判定がＹＥＳとなり、ステップＳ１９〜Ｓ２１の処理が実行される。このとき、図示のようにタスク１の起動要求がある為、タスク２は中断状態となり、タスク１の入力処理（あるいは演算ｂ）を“次の演算”として入力データと共に相手側コントローラに通知することになる。本例では、その際、更に、中断情報も一緒に相手側コントローラに通知する。中断情報とは、例えば、中断中のタスクに関して、その再開直後に実行する演算を示すＩＤ（あるいは実行順序番号）等である。本例では、演算ｆのＩＤ等が相手側コントローラに通知されることになる。勿論、相手側コントローラからも同様のデータが通知されてくる。
【００７６】
そして、上記ステップＳ２１で説明したように、相手側コントローラから通知された“次の演算”や入力データが自己と同一であるか否かをチェックする。本例では、更に、相手側コントローラの上記中断情報が、自己の中断情報と同一であるか否かをチェックする。そして、中断情報が同一ではない場合にも、ステップＳ２２の処理へ移行すると共に、当該中断しているタスクに関してステップＳ２２〜Ｓ２５の処理を実行する。
【００７７】
このように、本手法では、所定のときに、稼動系と待機系とで演算実行状況が同じであるか否かをチェックするが、この演算実行状況は、現在の実行対象タスクの演算実行状況だけでなく、中断しているタスクの演算実行状況も含まれていてもよい。
【００７８】
そして、本例では、稼動系と待機系とで“次に実行する処理”が同じである状況であっても、中断しているタスクの演算実行状況にズレが生じている場合には、このズレを修正する処理を優先的に行うものとする。つまり、この場合にはタスクのレベルは関係ないものとするので、タスク１よりもタスク２の演算を優先して行うことも起こり得る。但し、この例に限るわけではない。
【００７９】
その後の処理については説明を省略するが、何れにしても図６に示す例では、稼動系と待機系とで演算実行状況にズレが生じることは１度も無く、従ってステップＳ２２〜Ｓ２５の処理が実行されることも１度もないことになる。
【００８０】
一方、図７に示す例では、稼動系ＰＬＣ１０において、図上右側に示すタスク２の演算ｇの実行直後、すなわち本来であれば演算ｈを実行すべきタイミングで、メッセージ処理等の割込処理が発生して当該メッセージ処理等を実行している。一方、待機系ではそのまま演算ｈを実行している。そして、その直後、制御周期タイミングとなりステップＳ１５がＹＥＳとなってステップＳ１９〜Ｓ２１の処理が実行されることになる。
【００８１】
この例では、上記中断情報が、稼動系と待機系とで異なることになる。つまり、タスク２に関して再開直後の演算が、稼動系では演算ｈであり、待機系では演算ｅとなる。これより、稼動系ＰＬＣ１０は、自己の中断中のタスク２の演算実行状況が待機系ＰＬＣ２０よりも遅れていると判定して（ステップＳ２２、ＮＯ）、タスク２の中断状態を解除してタスク２の演算実行状況が待機系ＰＬＣ２０と同じとなるまでタスク２の演算を実行する（ステップＳ２４）。そして、「完了通知」を相手側に送ると共に（ステップＳ２５）タスク２を再度中断状態とする。この例では演算ｈを実行して、タスク２を再度中断状態とすることになる。尚、この状況は、本来であればタスク１を優先して実行すべきであるが、ステップＳ２２がＮＯとなった場合には、優先レベルに関係なく、中断しているタスクも含めて全タスクで相手側コントローラと同じ演算実行状況になることを優先させる。
【００８２】
ここで、待機系ＰＬＣ２０では、既に演算ｈを実行済みの状況なので、図９で説明したように、変数Ａは‘５’になっていた。一方、稼動系ＰＬＣ１０では変数Ａは未だ‘４’であったが、上記演算ｈを実行したことで‘５’に更新されることになる。
【００８３】
そして、「完了通知」を待機系ＰＬＣ２０に通知して、通常の処理状態に復帰する。これにより、この例ではタスク１の各処理を実行することになり、タスク１の入力処理→演算ｂ→演算ａ→出力処理を順次実行することになる。
【００８４】
一方、待機系ＰＬＣ２０は、自己の演算実行状況が稼動系ＰＬＣ１０よりも進んでいると判定して（ステップＳ２２、ＹＥＳ）、稼動系から「完了通知」が来るまで、待機状態となる。そして、上記「完了通知」が来たら、こちらも通常の処理状態に復帰する。すなわち、この例では、タスク１の各処理を実行することになる。
【００８５】
ここで、図９で説明したように、タスク１の演算ａは、Ｃ＝Ａ＋２を演算する処理であり、上述したようにズレを修正したことで稼動系も待機系も演算ａの実行時にはＡ＝５になっている。よって、稼動系も待機系も演算ａによってＣ＝‘７’となる。
【００８６】
このように、稼動系と待機系とで演算実行状況にズレが生じても、これを検出してズレを修正することができると共に、稼動系と待機系とで演算結果が異なる事態が生じることを防止できる。
【００８７】
図８に、他の異常例を示す。これは、稼動系と待機系とで演算タイミングがズレたとき及びこのズレを修正する部分のみを示す。
但し、図８については特に説明しない。
【００８８】
尚、上記稼動−待機間で相互に通知する情報は、“次の演算”に限らず、例えば直前に実行した演算等であっても構わない。稼動系と待機系とでアプリケーション（演算）の実行状況にズレが生じているか否かを判定できる情報であれば何でも良い。
【００８９】
以上説明したように、本例のコントローラ冗長化システムは、稼働系、待機系の両コントローラが同じアプリケーションを実行し、稼働系のコントローラの出力値を出力する形態の冗長化システムであって、例えば下記の特徴・効果を有する。
【００９０】
すなわち、稼働系、待機系の各コントローラは、各々、自コントローラのアプリケーションプログラムの実行状況について所定のときに相手側コントローラに通知する。所定のときとは、たとえば、入力処理時、出力処理時、タクト周期（制御周期）等である。更に、両コントローラに、アプリケーションプログラムの各演算の実行順序を記憶しておくことで、アプリケーションの実行状況がズレたことを相互に検知する機能を持たせる。
【００９１】
遅れたことを認識したコントローラは、遅れた分の演算をし、終了時点で相手側コントローラへ完了通知を送る。進んだことを認識したコントローラは、遅れた側である相手コントローラの演算完了待ちを行い、相手コントローラから完了通知を受けたことにより、演算を再開する。
【００９２】
また、中断しているタスクがある場合には、その実行状況（例えば再開時に実行する演算など）も相手側コントローラに通知するようにしてもよい。そして、当該中断しているタスクに関して、相手側コントローラとのズレの有無を判定して、相手側より遅れている場合にはこの中断中のタスクを再開して遅れた分の演算を実行して再度中断する。
【００９３】
この様にして、稼動系コントローラと待機系コントローラとで演算実行状況にズレが生じた場合でも、ズレが生じたことを検知してズレを修正することができる。これより、稼動系と待機系とで各演算を実質的に同期させて動作させることができ、演算結果が異なる事態が生じることを防止できる。
【符号の説明】
【００９４】
１０  稼動系ＰＬＣ
１１  アプリケーション実行部
１２  稼動系実行順序通知部
１３  待機系実行順序受信部
１４  タイミング確認部
１５  ずれ修正機能部
１６  タスク別アプリケーション実行順序テーブル
１６ａ  タスク１アプリケーション実行順序テーブル
１６ｂ  タスク２アプリケーション実行順序テーブル
１７  所定情報
２０  待機系ＰＬＣ
２１  アプリケーション実行部
２２  稼動系実行順序通知部
２３  待機系実行順序受信部
２４  タイミング確認部
２５  ずれ修正機能部
２６  タスク別アプリケーション実行順序テーブル
２６ａ  タスク１アプリケーション実行順序テーブル
２６ｂ  タスク２アプリケーション実行順序テーブル
２７  所定情報
【図１】
2015170053.tif 000003
【図３】
2015170053.tif 000004
【図４】
2015170053.tif 000005
【図５】
2015170053.tif 000006
【図２】
2015170053.tif 000007
【図６】
2015170053.tif 000008
【図７】
2015170053.tif 000009
【図８】
2015170053.tif 000010
【図９】
2015170053.tif 000011