(57)【特許請求の範囲】
【請求項１】
第１コントローラと、
第２コントローラと、
外部機器と接続可能なＩ／Ｏモジュールと、
前記第１コントローラ、前記第２コントローラ、および、前記Ｉ／Ｏモジュールが実装される複数のスロットを備えた入出力バスと、を備え、
前記第１コントローラおよび前記第２コントローラのそれぞれは、制御部と、前記入出力バスへデータを出力するおよび前記入出力バスからデータが入力されるインタフェース部と、前記制御部および前記インタフェース部からアクセス可能なメモリと、を備え、
前記メモリは、前記制御部の運転モードを明示するメモリ領域と、他方の前記制御部の運転モードを明示するメモリ領域と、実行結果を等値化するために他方の前記制御部から実行結果データが書き込まれるメモリ領域と、を備え、
前記第１コントローラおよび前記第２コントローラの制御部は、
前記入出力バスに実装されたスロット位置で、プライマリ側であるかセカンダリ側であるかを判断する手段と、
他方の前記制御部の運転モード等から前記第１コントローラおよび前記第２コントローラの制御部が稼動系か待機系かを判断する手段と、
前記判断する手段により稼動系と判断したときに、前記Ｉ／Ｏモジュールにデータを入出力する手段と、ユーザ制御プログラムを実行する手段と、待機系の前記制御部と実行結果データを等値化するために待機系側の前記メモリに実行結果データを書き込む手段と、自身の運転モードを待機系の前記メモリに書き込み、且つ、他方の運転モードを待機系のメモリから読み出す手段と、
前記稼動系か待機系かを判断する手段により、待機系と判断したときに、稼働系と判断した前記制御部から書き込まれた運転モードをメモリから読み出し次の運転モードを判定する手段と、稼働系と判断した前記制御部が停止モードを示すときに、稼動系処理へ移行し稼動系の前記制御部として運転を継続実行する手段と、を備え、
前記制御部は、初期化処理において、相手監視時間をクリアし、他方の前記制御部の運転モードから他方の前記制御部の運転モードが稼動系か否か判断し、稼働系であるときに待機系処理を行い、他方の前記制御部の運転モードが稼動系でなく且つ自己がプライマリ側であるときに稼動系処理を行い、相手が稼動系でなく且つ自己がセカンダリ側であるときに相手監視時間を更新するとともに相手監視時間が所定の時間をオーバーするまで相手の運転モードが稼動系でなければ、稼動系処理を行う二重化制御装置。
【請求項２】
前記Ｉ／Ｏモジュールは、外部機器とインタフェースする外部機器インタフェース部と、前記入出力バスとインタフェースするためのインタフェース部と、前記インタフェース部を介してデータの読み書きが可能で、且つ、前記外部機器インタフェース部を介して読み書きが可能なメモリと、
を備えた請求項１記載の二重化制御装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明の実施形態は、二重化制御装置に関する。
【背景技術】
【０００２】
工場や公共施設等の各種プラントの動作を制御するコントローラには、このコントローラに何等かの異常が発生して、制御対象のプラントが停止すると重大な事故に至る恐れがある。
【０００３】
一般に、このような制御対象に対しては、同一構成の２つのコントローラを接続して、いずれか一方を稼動系、他方を待機系として、通常は稼動系のみで制御対象を制御し、稼動系に異常が生じたときに、待機系を稼動系用に切り替え、制御を続行するように構成される待機冗長型の二重化制御装置がある。
【０００４】
このような二重化制御装置においては、２つのコントローラのうち、一方が稼動状態で、かつ他方がバックアップに備えて待機状態となり、コントローラ間で互いに相手の運転状態を監視し、稼動系がダウンしたら待機系がそれを検知し、待機系を稼動系に切替えて制御を継続して実行している。
【０００５】
そのため、従来の二重化制御装置は、互いに相手のコントローラの状態を検知及び通知するためのステータス伝送路（バス）とそれをインタフェースするステータス伝送路（バス）入出力ポートと、コントローラがバックアップ時に制御を継続して実行するためのデータとなる実行結果情報を相手のコントローラに転送するためのデータ伝送路（バス）とそれをインタフェースするデータ伝送路（バス）インタフェースと、実行結果情報を受信及び送信するためのバッファとを備えるようにしている。
【０００６】
このような構成によれば、システムダウンの確率が軽減され、信頼度の高い二重化制御装置を構成することができる。
【０００７】
従来の二重化機能を備えたコントローラは、その重要性から専用の二重化制御部を備え、その二重化制御部を使用して二重化情報を専用にやりとりしながら二重化方式を実現していた。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開２００８−１４６２３９号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
従来の二重化機能を備えたコントローラは、専用の二重化制御部により高速で大量の二重化情報のやりとりを可能とするため、二重化制御部の構成が複雑になり且つ比較的高価になる。そのため小規模なプラントや製造ライン等の産業分野で使用されるコントローラでは、高価な仕組みを採用することが困難であった。
【００１０】
本発明は、上記事情を鑑みて成されたものであって、構成が複雑になることを回避し、安価な二重化制御装置を提供することを目的とする。
【課題を解決するための手段】
【００１１】
実施形態による二重化制御装置は、第１コントローラと、第２コントローラと、外部機器と接続可能なＩ／Ｏモジュールと、前記第１コントローラ、前記第２コントローラ、および、前記Ｉ／Ｏモジュールが実装される複数のスロットを備えた入出力バスと、を備え、前記第１コントローラおよび前記第２コントローラのそれぞれは、制御部と、前記入出力バスへデータを出力するおよび前記入出力バスからデータが入力されるインタフェース部と、前記制御部および前記インタフェース部からアクセス可能なメモリと、を備え、前記メモリは、前記制御部の運転モードを明示するメモリ領域と、他方の前記制御部の運転モードを明示するメモリ領域と、実行結果を等値化するために他方の前記制御部から実行結果データが書き込まれるメモリ領域と、を備え、前記第１コントローラおよび前記第２コントローラの制御部は、前記入出力バスに実装されたスロット位置で、プライマリ側であるかセカンダリ側であるかを判断する手段と、他方の前記制御部の運転モード等から前記第１コントローラおよび前記第２コントローラの制御部が稼動系か待機系かを判断する手段と、前記判断する手段により稼動系と判断したときに、前記Ｉ／Ｏモジュールにデータを入出力する手段と、ユーザ制御プログラムを実行する手段と、待機系の前記制御部と実行結果データを等値化するために待機系側の前記メモリに実行結果データを書き込む手段と、自身の運転モードを待機系の前記メモリに書き込み、且つ、他方の運転モードを待機系のメモリから読み出す手段と、前記判断する手段により待機系と判断したときに、稼働系と判断した前記制御部から書き込まれた運転モードをメモリから読み出し次の運転モードを判定する手段と、稼働系と判断した前記制御部が停止モードを示すときに、稼動系処理へ移行し稼動系の前記制御部として運転を継続実行する手段と、を備え、前記制御部は、初期化処理において、相手監視時間をクリアし、他方の前記制御部の運転モードから他方の前記制御部の運転モードが稼動系か否か判断し、稼働系であるときに待機系処理を行い、他方の前記制御部の運転モードが稼動系でなく且つ自己がプライマリ側であるときに稼動系処理を行い、相手が稼動系でなく且つ自己がセカンダリ側であるときに相手監視時間を更新するとともに相手監視時間が所定の時間をオーバーするまで相手の運転モードが稼動系でなければ、稼動系処理を行う二重化制御装置。
【図面の簡単な説明】
【００１２】
【図１】実施形態の二重化制御装置の一構成例を説明するための図である。
【図２】図１に示す二重化制御装置のデータの流れの一例を説明するための図である。
【図３】図１に示す二重化制御装置のデータの流れの一例を説明するための図である。
【図４】図１に示す入出力バスのスロットおよびＩ／Ｏ空間の割り付けの一例を示す図である。
【図５】図１に示す二重化制御装置の初期化処理の一例を説明するためのフローチャートである。
【図６】図１に示す二重化制御装置の稼動系処理の一例を説明するためのフローチャートである。
【図７】図１に示す二重化制御装置の待機系処理の一例を説明するためのフローチャートである。
【図８】図１に示す二重化制御装置の稼動系処理および待機系処理の一例を説明するためのタイミングチャートである。
【図９】図１に示す二重化制御装置の切り替わり動作の一例を説明するためのタイミングチャートである。
【発明を実施するための形態】
【００１３】
以下、実施形態について、図面を参照して説明する。  
図１に、本実施形態の二重化制御装置の一構成例を示す。本実施形態に係る二重化制御装置は、プライマリ側コントローラ１０と、セカンダリ側コントローラ１１と、Ｉ／Ｏ出力モジュール１２と、Ｉ／Ｏ入力モジュール１３と、入出力バス１と、を備えている。プライマリ側コントローラ１０、セカンダリ側コントローラ１１と、Ｉ／Ｏ出力モジュール１２と、Ｉ／Ｏ入力モジュール１３とは、それぞれが入出力バス１に設けたスロットに実装され、入出力バス１により互いに信号を送受信することが可能に構成されている。
【００１４】
プライマリ側コントローラ１０は、入出力バス１への信号の送信および入出力バス１からの信号の受信を行うためのインタフェース部１０１と、メモリＭＥＭＰ１００と、インタフェース部１０１およびメモリＭＥＭＰ１００を制御するＣＰＵ部１０２と、を備えている。
【００１５】
メモリＭＥＭＰ１００は、インタフェース部１０１と接続されている。したがって、プライマリ側コントローラ１０は、セカンダリ側コントローラ１１、Ｉ／Ｏ出力モジュール１２、および、Ｉ／Ｏ入力モジュール１３から受信されるデータの書き込み、および、データの読み出しが可能である。またＣＰＵ部１０２からメモリＭＥＭＰ１００へのデータの書き込みおよびメモリＭＥＭＳ１１０からＣＰＵ部１０２へのデータの読み出しも可能である。
【００１６】
インタフェース部１０１とＣＰＵ部１０２とは、内部バス１０３で接続されている。ＣＰＵ部１０２は、内部バス１０３、インタフェース部１０１および入出力バス１を介して、他のモジュール１１、１２、１３のメモリＭＥＭＳ１１０、ＭＥＭＯ１２０、ＭＥＭＩ１３０を直接読み書きすることができる。
【００１７】
ＣＰＵ部１０２は、入出力バス１に実装されたスロット位置で、プライマリ側であるかセカンダリ側であるかを判断する手段（図示せず）と、相手の運転モード等から自身が稼動系であるか待機系であるかを判断する手段（図示せず）と、を備えている。
【００１８】
プライマリ側コントローラ１０、すなわち、ＣＰＵ部１０２が、稼動系コントローラに搭載される場合には、さらに、Ｉ／Ｏ入力モジュール１２、１３にデータを入出力する手段（図示せず）と、ユーザ制御プログラムを実行する手段（図示せず）と、待機系コントローラと実行結果データを等値化するために待機系コントローラのメモリに実行結果データを書き込む手段（図示せず）と、自身の運転モードを待機系コントローラのメモリに書き込み、且つ、相手の運転モードを待機系コントローラのメモリから読み出す手段（図示せず）と、を備える。
【００１９】
ＣＰＵ部１０２が、待機系コントローラに搭載される場合には、さらに、自分の運転モードを自分のメモリに書き込み、相手から自分のメモリに書き込まれた相手の運転モードを読み出し次の運転モードを判定する手段（図示せず）と、自分を稼動系として運転する手段（図示せず）とを備える。
【００２０】
セカンダリ側コントローラ１１は、プライマリ側コントローラ１０と同様の構成である。すなわち、セカンダリ側コントローラ１１は、入出力バス１への信号の送信および入出力バス１からの信号の受信を行うためのインタフェース部１１１と、メモリＭＥＭＳ１１０と、インタフェース部１１１およびメモリＭＥＭＳ１１０を制御するＣＰＵ部１１２と、を備えている。
【００２１】
メモリＭＥＭＳ１１０は、インタフェース部１１１と接続されている。したがって、セカンダリ側コントローラ１１は、プライマリ側コントローラ１０、Ｉ／Ｏ出力モジュール１２、および、Ｉ／Ｏ入力モジュール１３から受信されるデータの書き込み、および、データの読み出しが可能である。またＣＰＵ部１１２からメモリＭＥＭＳ１１０へのデータの書き込みおよびメモリＭＥＭＳ１１０からＣＰＵ部１１２へのデータの読み出しも可能である。
【００２２】
インタフェース部１１１とＣＰＵ部１１２とは、内部バス１１３で接続されている。ＣＰＵ部１１２は、内部バス１１３、インタフェース部１１１および入出力バス１を介して、他のモジュール１０、１２、１３のメモリＭＥＭＰ１００、ＭＥＭＯ１２０、ＭＥＭＩ１３０を直接読み書きすることができる。
【００２３】
ＣＰＵ部１１２は、入出力バス１に実装されたスロット位置で、プライマリ側であるかセカンダリ側であるかを判断する手段（図示せず）と、相手の運転モード等から自身が稼動系であるか待機系であるかを判断する手段（図示せず）と、を備えている。ここでの判断方法については初期化処理として後に説明する。
【００２４】
セカンダリ側コントローラ１０、すなわち、ＣＰＵ部１１２が、稼動系コントローラに搭載される場合には、さらに、Ｉ／Ｏ入力モジュール１２、１３にデータを入出力する手段（図示せず）と、ユーザ制御プログラムを実行する手段（図示せず）と、待機系コントローラと実行結果データを等値化するために待機系コントローラのメモリに実行結果データを書き込む手段（図示せず）と、自身の運転モードを待機系コントローラのメモリに書き込み、且つ、相手の運転モードを待機系コントローラのメモリから読み出す手段（図示せず）と、を備える。
【００２５】
ＣＰＵ部１１２が、待機系コントローラに搭載される場合には、さらに、自分の運転モードを自分のメモリに書き込み、相手から自分のメモリに書き込まれた相手の運転モードを読み出し次の運転モードを判定する手段（図示せず）と、自分を稼動系として運転する手段（図示せず）とを備える。
【００２６】
上記プライマリ側コントローラ１０およびセカンダリ側コントローラ１１は、入出力バス１のプライマリ側用スロットとセカンダリ側用スロットに実装し、その他のスロットにはＩ／Ｏモジュールを実装する。
【００２７】
入出力バス１は、コントローラやＩ／Ｏ入力モジュール、Ｉ／Ｏ出力モジュールを実装するための複数のスロット１−１〜１−Ｎを備えている。スロット１−１は、プライマリ側コントローラ１０を実装し、スロット１−２は、セカンダリ側コントローラ１１を実装する。スロット１−３以降のスロットには、Ｉ／Ｏ出力モジュール１２やＩ／Ｏ入力モジュール１３を実装可能としている。入出力バス１は、例えば、ＰＣＩ（Peripheral Component Interconnect）バスやＩＳＡ（Industry Standard Architecture）バス等のパラレルバスである。なお、入出力バス１は、シリアルバスであってもよく、イーサネット（登録商標）ケーブル等のローカルエリアネットワーク（ＬＡＮ）ケーブルであってもよい。
【００２８】
Ｉ／Ｏ出力モジュール１２には、入出力バス１とインタフェースを行うためのインタフェース部１２１と、外部出力機器１４へデータを出力する出力インタフェース部１２２と、インタフェース部１２１を介してプライマリ側コントローラ１０およびセカンダリ側コントローラ１１からデータの読み書きが可能で、且つ、出力インタフェース部１２２からもデータの読み書きが可能なメモリＭＥＭＯ１２０と、を備えている。メモリＭＥＭＯ１２０は、インタフェース部１２１と、出力インタフェース部１２２とに接続されている。出力インタフェース部１２２は、常時、メモリＭＥＭＯ１２０に書き込まれた出力データを外部出力機器１４へ出力する。
【００２９】
Ｉ／Ｏ入力モジュール１３には、入出力バス１とインタフェースを行うためのインタフェース部１３１と、外部入力機器１５からのデータが入力される入力インタフェース部１３２と、インタフェース部１３１を介してプライマリ側コントローラ１０およびセカンダリ側コントローラ１１からデータの読み書きが可能で、且つ、入力インタフェース部１３２からもデータの読み書きが可能なメモリＭＥＭＩ１３０と、を備えている。メモリＭＥＭＩ１３０は、インタフェース部１３１と入力インタフェース部１３２とに接続されている。及び、入力インタフェース部１３２は、常時、外部入力機器１５から入力された入力データをメモリＭＥＭＩ１３０に書き込む。
【００３０】
図４に、入出力バス１のＩ／Ｏ空間４０とスロット１−１〜１−Ｎの割り付けの一例を示す。スロット１−１〜１−Ｎそれぞれに、一定のＩ／Ｏ空間が割り当てられ、該当スロットの空間内に該当スロットのインタフェース部に接続されたメモリＭＥＭＰ１００、ＭＥＭＳ１１０、ＭＥＭＯ１２０、ＭＥＭＩ１３０が割り付けられている。
【００３１】
スロット１−１のメモリ空間には、プライマリ側コントローラ１０のメモリＭＥＭＰ１００が割り付けられ、スロット１−２のメモリ空間には、セカンダリ側コントローラ１１のメモリＭＥＭＳ１１０が割り付けられている。スロット１−３以降には、実装されているＩ／Ｏ出力モジュール１２のメモリＭＥＭＯ１２０、Ｉ／Ｏ入力モジュール１３のメモリＭＥＭＩ１３０が各々割り付けられている。
【００３２】
スロット１−１とスロット１−２のＩ／Ｏ空間に割り付けられているメモリ空間は、二重化情報部４６、４７として、稼動系コントローラと待機系コントローラとで二重化情報のやりとりを行うためのメモリとして使用する。
【００３３】
Ｉ／Ｏ空間の二重化情報部４６、４７は、自身の運転モードを明示するメモリ４１０と、相手の運転モードを明示するメモリ４１１と、実行結果を等値化するために相手から実行結果データ書き込まれるメモリ４１２と、を含む。
【００３４】
これら二重化情報部４６、４７は、稼動系コントローラと待機系コントローラとの間で相手のコントローラから互いに読み書きができ、自信のコントローラ内でも読み書きができる。
【００３５】
スロット１−３以降のスロットに割り付けられたＩ／Ｏ空間に割り付けられているメモリＭＥＭＯ１２０、ＭＥＭＩ１３０は、Ｉ／Ｏ出力モジュール１２のメモリＭＥＭＯ１２０であれば、出力レジスタ部４８で構成され、各出力レジスタ０〜Ｍに稼動系コントローラから出力データが書き込まれ、この出力レジスタの出力データは、出力インタフェース部１２２により外部出力機器１４に出力される。
【００３６】
Ｉ／Ｏ入力モジュール１３のメモリＭＲＭＩ１３０であれば、入力レジスタ部４９で構成され、各入力レジスタ０〜Ｎには、入力インタフェース部１３２により外部入力機器１５から入力した入力データが書き込まれ、稼動系コントローラから入力データとして読み出される。
【００３７】
上記のように、プライマリ側コントローラ１０およびセカンダリ側コントローラ１１は、Ｉ／Ｏ空間にアクセスすることで、プライマリ側コントローラ１０、セカンダリ側コントローラ１１、Ｉ／Ｏ出力モジュール１２、および、Ｉ／Ｏ入力モジュール１３に具備されたインタフェース部１０１、１１１、１２１、１３１に接続されたメモリＭＥＭＰ１００、ＭＥＭＳ１１０、ＭＥＭＯ１２０、ＭＥＭＩ１３０に自由にアクセスできる。
【００３８】
図２は、プライマリ側コントローラ１０が稼動系コントローラで、セカンダリ側コントローラ１１が待機系コンロトーラである場合の、データの流れの一例を示している。稼動系コントローラ１０から、Ｉ／Ｏ出力モジュール１２へ出力データを出力する時のデータの流れ２−１は、先ず、ＣＰＵ部１０２からデータが、内部バス１０３を介してインタフェース部１０１へ出力される。インタフェース部１０１へ出力されたデータは、更に、入出力バス１を通って、Ｉ／Ｏ出力モジュール１２のインタフェース部１２１に出力される。次に、インタフェース部１２１を介して、メモリＭＥＭＯ１２０の出力レジスタ部４８の各出力レジスタ４１３、４１４、４１５、４１６に書き込まれる。
【００３９】
更に、常時、出力インタフェース部１２２により、出力レジスタ部４８の各出力レジスタ４１３、４１４、４１５、４１６に書き込まれた出力データを、外部出力機器１４に出力する（２−２）。
【００４０】
次に、稼動系コントローラ１０により、Ｉ／Ｏ入力モジュール１３の入力データを入力する時のデータの流れ２−３について説明する。先ず、ＣＰＵ部１０２から、入力するレジスタの読み出しを要求すると、読み出し要求が、内部バス１０３を介して、インタフェース部１０１へ出力され、更に、入出力バス１を通って、Ｉ／Ｏ入力モジュール１３のインタフェース部１３１に出力される。インタフェース部１３１が読み出し要求に従って、メモリＭＥＭＩ１３０の入力レジスタ部４９の各入力レジスタ４１７、４１８、４１９、４２０から読み出した入力データを、今度は、入出力バス１を介して、稼動系コントローラ１０のインタフェース部１０１へ入力し、インタフェース部１０１から、内部バス１０３を介して、ＣＰＵ部１０２へ入力データが入力される。
【００４１】
更に、常時、入力インタフェース部１３２により、外部入力機器１５から入力した入力データを、入力レジスタ部４９の各出力レジスタ４１７、４１８、４１９、４２０に書き込む（２−４）。
【００４２】
次に、稼動系コントローラ１０から、待機系コントローラ１１のメモリＭＥＭＳ１１０にデータを書き込む時のデータの流れ２−５の一例を説明する。先ず、ＣＰＵ部１０２から、出力データが、内部バス１０３を介して、インタフェース部１０１へ出力され、更に、入出力バス１を通って、待機系コントローラ１１のインタフェース部１１１に出力される。次に、インタフェース部１１１を介して、メモリＭＥＭＳ１１０に書き込まれる。更に、メモリＭＥＭＳ１１０に書き込まれたデータはＣＰＵ部１１２により読み出し可能である（２−６）。
【００４３】
次に、稼動系コントローラ１０から、待機系コントローラ１１のデータを読み出す時のデータの流れ２−７の一例を説明する。先ず、ＣＰＵ部１０２からメモリの読み出しを要求すると、読み出し要求が、内部バス１０３を介して、インタフェース部１０１へ出力され、更に、入出力バス１を通って、待機系コントローラ１１のインタフェース部１１１に出力される。次に、インタフェース部１１１が読み出し要求に従って、メモリＭＥＭＳ１１０から読み出したデータを、今度は、入出力バス１を介して、コントローラ１０のインタフェース部１０１へ入力し、インタフェース部１０１から、内部バス１０３を介して、ＣＰＵ部１０２へデータが読み込まれる。なお、ＣＰＵ部１１２から自身のメモリＭＥＭＳ１１０へデータの書き込むことも可能である（２−８）。
【００４４】
図３は、セカンダリ側コントローラ１１が稼動系コントローラで、プライマリ側コントローラ１０が待機系コントローラである場合のデータの流れの一例を示している。稼動系コントローラ１１から、Ｉ／Ｏ出力モジュール１２へ出力データを出力する時のデータの流れ３−１の一例について説明する。先ず、ＣＰＵ部１１２から、出力データが、内部バス１１３を介して、インタフェース部１１１へ出力され、更に、入出力バス１を通って、Ｉ／Ｏ出力モジュール１２のインタフェース部１２１に出力される。次に、インタフェース部１２１を介して、メモリＭＥＭＯ１２０の出力レジスタ部４８の各出力レジスタ４１３、４１４、４１５、４１６に書き込まれる。更に、常時、出力インタフェース部１２２により、出力レジスタ部４８の各出力レジスタ４１３、４１４、４１５、４１６に書き込まれた出力データを、外部出力機器１４に出力する（３−２）。
【００４５】
次に、稼動系コントローラ１１から、Ｉ／Ｏ入力モジュール１３の入力データを入力する時のデータの流れ３−３の一例について説明する。先ず、ＣＰＵ部１１２から、入力するレジスタの読み出しを要求すると、読み出し要求が、内部バス１１３を介して、インタフェース部１１１へ出力され、更に、入出力バス１を通って、Ｉ／Ｏ入力モジュール１３のインタフェース部１３１に出力される。次に、インタフェース部１３１が読み出し要求に従って、メモリＭＥＭＩ１３０の入力レジスタ部４９の各入力レジスタ４１７、４１８、４１９、４２０から読み出した入力データを、今度は、入出力バス１を介して、コントローラ１１のインタフェース部１１１へ入力し、インタフェース部１１１から、内部バス１１３を介して、ＣＰＵ部１１２へ入力データが入力される。更に、常時、入力インタフェース部１３２により、外部入力機器１５から入力した入力データを、入力レジスタ部４９の各出力レジスタ４１７、４１８、４１９、４２０に書き込む（３−４）。
【００４６】
次に、稼動系コントローラ１１から、待機系コントローラ１０のメモリＭＥＭＰ１００にデータを書き込む時のデータの流れ３−５の一例について説明する。先ず、ＣＰＵ部１１２から、出力データが、内部バス１１３を介して、インタフェース部１１１へ出力され、更に、入出力バス１を通って、待機系コントローラ１０のインタフェース部１０１に出力される。次に、インタフェース部１０１を介して、メモリＭＥＭＰ１００に書き込まれる。更に、メモリＭＥＭＰ１００に書き込まれたデータはＣＰＵ部１０２で読み出し可能である（３−６）。
【００４７】
次に、稼動系コントローラ１１から、待機系コントローラ１０のデータを読み出す時のデータの流れ３−７の一例について説明する。先ず、ＣＰＵ部１１２からメモリの読み出しを要求すると、読み出し要求が、内部バス１１３を介して、インタフェース部１１１へ出力され、更に、入出力バス１を通って、待機系コントローラ１０のインタフェース部１０１に出力される。次に、インタフェース部１０１が読み出し要求に従って、メモリＭＥＭＰ１００から読み出したデータを、今度は、入出力バス１を介して、稼動系コントローラ１１のインタフェース部１１１へ入力し、インタフェース部１１１から、内部バス１１３を介して、ＣＰＵ部１１２へデータが読み込まれる。
【００４８】
図５は、プライマリ側コントローラ１０およびセカンダリ側コントローラ１１のＣＰＵ部１０２、１１２において、稼動系と待機系との選択する初期化処理（ステップ５−１）の一例を示すフローチャートである。プライマリ側コントローラ１０およびセカンダリ側コントローラ１１のＣＰＵ部１０２、１１２は、最初に自分がプライマリ側であるかセカンダリ側であるかを判断し、相手の運転モードにより自分を稼動系に立ち上げるか、待機系に立ち上げるかを以下のように判断する。
【００４９】
先ず、相手監視時間をクリアする（ステップ５−２）。次に相手のメモリの二重化情報部４６、４７から相手の運転モードを読み出す（ステップ５−３）。次に、相手の運転モードが稼動系の運転であれば（既に稼動系で運転中であれば）、待機系処理（ステップ７−１）へ移行する（ステップ５−４）。
【００５０】
次に、自分がプライマリ側であれば稼動系処理（ステップ６−１）へ移行する（ステップ５−５）。次に、相手監視時間を更新する（ステップ５−６）。相手監視時間が所定の時間をオーバーしていなければ、再度、相手のメモリの二重化情報部４６、４７から相手の運転モードを読み出し、同じ動作を繰り返す。相手監視時間が所定の時間をオーバーしていれば、稼動系処理（ステップ６−１）へ移行する（ステップ５−７）。
【００５１】
図６は、プライマリ側コントローラ１０およびセカンダリ側コントローラ１１のＣＰＵ部１０２、１１２に実装されている稼動系処理（ステップ６−１）と二重化トラッキング処理（ステップ６−７）と停止処理（ステップ６−１２）との一例を示すフローチャートである。稼動系処理（ステップ６−１）と二重化トラッキング処理（ステップ６−７）とはスキャン周期に従って定期的に実行される。
【００５２】
稼動系処理（ステップ６−１）では、先ず、自分の運転モード（稼動系を示す運転モード）を相手（待機系側）のメモリの二重化情報部４６、４７の相手の運転モードメモリ４１１に書き込む（ステップ６−２）。
【００５３】
次に、Ｉ／Ｏ入力モジュール１３のメモリＭＲＭＩ（メモリ４９）から入力データを読み出す（ステップ６−３）。次に、読み出した入力データを元にユーザ制御プログラムを実行する（ステップ６−４）。次に、ユーザ制御プログラムの実行で得られた出力データをＩ／Ｏ出力モジュール１２のメモリＭＥＭＯ１２０（メモリ４８）へ書き込む（ステップ６−５）。
【００５４】
以上の処理の中で異常が発生していなければ、二重化トラッキング処理（ステップ６−７）へ移行し、異常が発生していれば、停止処理（ステップ６−１２）へ移行する(ステップ６−６)。
【００５５】
二重化トラッキング処理（ステップ６−７）では、先ず、相手（待機系側）のメモリの二重化情報部４６、４７の自分の運転モードメモリ４１０から運転モードを読み出し、相手が待機系の運転モードであれば（ステップ６−９）、稼動系処理（ステップ６−１）でユーザ制御プログラムを実行した時の実行結果データを、相手（待機系側）のメモリの二重化情報部４６、４７の等値化用の実行結果データメモリ４１２へ書き込み、稼動系と待機系との実行状態を等値化する(ステップ６−１０)。
【００５６】
次に、次のスキャン周期に達するまで実行を待ち、次のスキャン周期に達したら、繰り返し稼動系処理を実行する（ステップ６−１１）。
【００５７】
停止処理（ステップ６−１２）では、自分の停止モードを相手のメモリの二重化情報部４６、４７の相手の運転モードメモリ４１１へ書き込む（ステップ６−１３）。次に、再スタートの要求がなければ停止処理を最初から実行し、再スタート要求があれば、図５で示した初期化処理（ステップ５−１）から実行を開始する（ステップ６−１４）。
【００５８】
図７は、プライマリ側コントローラ１０およびセカンダリ側コントローラ１１のＣＰＵ部１０２、１１２での待機系処理（ステップ７−１）の一例を示すフローチャートである。待機系処理（ステップ７−１）では、先ず、自分のメモリの二重化情報部４６、４７の自分の運転モードメモリ４１０に自分の運転モード（待機系を示す運転モード）を書き込む、（ステップ７−２）。この運転モードは、稼動系コントローラの稼動系処理（ステップ６−１）の中で読み出される（ステップ６−８）。
【００５９】
次に、自分メモリの二重化情報部４６，４７の相手の運転モードメモリ４１１から、相手の運転モードを読み出す（ステップ７−３）。相手が、稼動系を示す運転モードであれば、待機系処理を繰り返し実行する（ステップ７−４）。相手が、停止を示す運転モードであれば、自分のメモリの二重化情報４６、４７の等値化用の実行結果データメモリ４１２から等値化のための実行結果データを読み出し自分の実行データに取り込む（ステップ７−５）。次に稼動系処理（ステップ６−１）へ移行し、稼動系としてコントローラを実行する。
【００６０】
図８は、上記二重化制御装置における通常の二重化運転の一例を説明するタイミングチャートを示す。稼動系側コントローラ８１０は、スキャン周期８９に従って定周期で稼動系処理（ステップ６−１）を実行する。
【００６１】
稼動系処理（ステップ６−１）では、先ず、タイミング８１において、自分の運転モードを待機系側コントローラ８１１の二重化情報部８１３の相手の運転モードメモリ４１１に書き込む８２０。次に、タイミング８２において、稼動系側コントローラ８１０はＩ／Ｏ入力モジュール１３から入力データを読み出す（ステップ６−３）。次に、タイミング８３において、入力データを入力情報としてユーザ制御プログラムを実行する（ステップ６−４）。次に、タイミング８４において、ユーザ制御プログラムで生成した出力データを、Ｉ／Ｏ出力モジュール１２へ書き込む（ステップ６−５）。次に、タイミング８５において、待機系側コントローラ８１１の二重化情報部８１３の自分の運転モードメモリ４１０から、待機系側コントローラ８１１の運転モードを読み出す８２３（ステップ６−８）。待機系側コントローラ８１１の運転モードが、待機系を示す運転モードであれば、次に、タイミング８６において、ユーザ制御プログラムの実行結果データを等値化するために、待機系側８１１の二重化情報部８１３の等値化用の実行結果データメモリ４１２へ書き込む８２４（ステップ６−１０）。
【００６２】
待機系側コントローラ８１１は、少なくとも、スキャン周期８９よりも短い周期で、待機系処理（ステップ７−１）を一定周期で実行する。待機系処理（ステップ７−１）では、先ず、タイミング８７において、自分の二重化情報部８１３の自分の運転モードメモリ４１０に、待機モードを示す運転モードを書き込む８２１（ステップ７−２）。次に、タイミング８８において、自分の二重化情報部８１３の相手の運転モードメモリ４１１から、相手の運転モードを読み出す８２２（ステップ７−３）。相手の運転モードが稼動系を示す運転モードであれば、次の周期でも上記の待機系処理（ステップ７−１）を繰り返し実行する。
【００６３】
以上のように、稼動系側８１０は、一定周期で、Ｉ／Ｏデータの入出力（タイミング８２、８４）とユーザ制御プログラムを実行し（タイミング８３）、制御対象を制御しながら、二重化情報である自分の運転モードと等値化用の実行結果データとを待機系側コントローラ８１１に書き込む（タイミング８１、８６）ことで、二重化の稼動系の運転を維持している。
【００６４】
一方、待機系側コントローラ８１１は、常時、待機系側コントローラ８１０から書き込まれる運転モードを監視し（タイミング８８）、及び、同時に稼動系側コントローラ８１０から書き込まれる等値化用の実行結果データ４１２を保持し、いつでも稼動系側コントローラ８１０に切り替われるように二重化の待機系の運転を維持している。
【００６５】
なお、二重化運転中においても、稼動系側コントローラ８１０から待機系側８１１のメモリをアクセスするのみで、待機系側コントローラ８１１は、稼動系側コントローラ８１０のメモリをアクセスしないため、メモリアクセスの経路である入出力バス１とインタフェース部１０１、１１１、１２１、１３１との負荷を低減することが可能となり、それを構成する回路を簡素化することが可能である。
【００６６】
図９は、稼動系側コントローラ８１１での異常発生による二重化の切り替わりのタイミングチャートを示す。稼動系側コントローラ８１０は、あるスキャン周期９１の稼動系処理（ステップ６−１）において、タイミング８２、８４でのＩ／Ｏデータの入出力（ステップ６−３、６−５）やタイミング８３でのユーザ制御プログラムの実行（ステップ６−４）で、異常を検出すると（タイミング９２）、直ちに停止処理（ステップ６−１２）９５へ移行する。
【００６７】
停止処理（ステップ６−１２）では、先ず、タイミング９３において停止モードを示す運転モードを、相手（待機系側コントローラ）の二重化情報部８１３の相手の運転モードメモリ４１１に書き込む（ステップ６−１３）。稼動系側コントローラ８１０は、次に、新たな再スタート要求がなければ、この停止モードを維持する。
【００６８】
一方、待機系側コントローラ８１１は、待機系処理（ステップ７−１）の中で、タイミング９６において、自分の二重化情報部８１３の相手の運転モードメモリ４１１から、相手の運転モードを読み出し（ステップ７−３）、相手が停止モードを示していれば、タイミング９８において自分の二重化情報部８１３の実行結果データメモリ４１２から、相手が等値化用に書き込んだユーザ制御プログラムの実行結果データを読み出し、自分の実行データに取り込み（ステップ７−５）、タイミング９１０より直ちに、稼動系処理（ステップ６−１）へ移行し稼動系側９１１として運転を継続実行する。
【００６９】
以上のように、図１で示したハード構成と、図４で示したスロットとＩ／Ｏ空間との割り付けとを備え、図５で示した初期化処理の手段と、図６で示した稼動系処理と二重化トラッキング処理と停止処理の手段と、図７で示した待機系処理の手段を備え、それらを組み合わせることで、専用の二重化制御部を必要としない、簡易で安価な二重化制御装置を実現することが可能になった。すなわち、本実施形態によれば、構成が複雑になることを回避し、安価な二重化制御装置を提供することができる。
【００７０】
本発明のいくつかの実施形態を説明したが、これらの実施形態は、例として提示したものであり、発明の範囲を限定することは意図していない。これら新規な実施形態は、その他の様々な形態で実施されることが可能であり、発明の要旨を逸脱しない範囲で、種々の省略、置き換え、変更を行うことができる。これら実施形態やその変形は、発明の範囲や要旨に含まれるとともに、特許請求の範囲に記載された発明とその均等の範囲に含まれる。
【符号の説明】
【００７１】
１００、１１０、１２０、１３０…メモリ、１…入出力バス、１０…プライマリ側コントローラ、１１…セカンダリ側コントローラ、１２…Ｉ／Ｏ出力モジュール、１２…Ｏ入力モジュール、１３…Ｉ／Ｏ入力モジュール、１４…外部出力機器、１５…外部入力機器、４０…Ｉ／Ｏ空間、４６、４７…二重化情報部、４１０…自分の運転モードメモリ、４１１…相手の運転モードメモリ、４８…出力レジスタ部、４１３、４１４、４１５、４１６…出力レジスタ、４９…入力レジスタ部、４１３、４１４、４１５、４１６…入力レジスタ、８９、９１、９１０…スキャン周期、１０１、１１１、１２１、１３１…インタフェース部、１０２、１１２…ＣＰＵ部（制御部）、１０３、１１３、１２３、１３３…内部バス、１２２…出力インタフェース部、１３２…入力インタフェース部、８９、９１、９１０…スキャン周期、８１０…稼動系、８１１,９１１…待機系、８１２…稼動系側の二重化情報部、８１３…待機系側の二重化情報部、９５…停止。
【図１】
0005583046.tif 000002
【図２】
0005583046.tif 000003
【図３】
0005583046.tif 000004
【図４】
0005583046.tif 000005
【図５】
0005583046.tif 000006
【図６】
0005583046.tif 000007
【図７】
0005583046.tif 000008
【図８】
0005583046.tif 000009
【図９】
0005583046.tif 000010