(57)【特許請求の範囲】
【請求項１】
同一ユニット内に実装され、演算処理を実行するＣＰＵモジュールと共有メモリを介してデータの受け渡しを行い、夫々動作モードとして稼動側または待機側として機能する少なくとも一対の入出力モジュールを備えた入出力二重化装置であって、
夫々の前記入出力モジュールは、
相手系と接続され、動作モードを送受信する通信手段と、
前記通信手段によって受信される相手系の動作モードと、自系の自己診断結果に基づいて、自系の動作モードを決定し、当該決定した動作モードを前記ＣＰＵモジュールへ通知する動作モード調整手段と、
前記動作モード調整手段によって決定された動作モードに基づいて、自系が稼動側の場合は、前記ＣＰＵモジュールから設定パラメータを入力し、該設定パラメータを用いて入力処理または出力処理を実行させる一方、相手系へ該設定パラメータを送信し、自系が待機側の場合は、相手系から送信されてくる設定パラメータを受信し、当該受信した設定パラメータを用いて入力処理または出力処理を実行させるコマンド送受信手段と、を備え、
前記ＣＰＵモジュールは、稼動側の入出力モジュールのみに前記設定パラメータを出力することを特徴とする入出力二重化装置。
【請求項２】
前記動作モード調整手段は、自系の自己診断結果が正常のときの自系の動作モードの決定において、
受信された前記相手系の動作モードが待機側の場合、自系の動作モードを稼動側に仮設定すると共に相手系へ自系が稼動側であることを通知し、この通知に対する相手系からの応答を受信し、この応答に含まれる相手系の動作モードも待機側のとき、前記仮設定を本設定にして自系の動作モードを稼動側に決定し、前記応答に含まれる相手系の動作モードが稼動側のとき、前記仮設定を解除し、自系の動作モードを待機側に決定することを特徴とする請求項１に記載の入出力二重化装置。
【請求項３】
前記動作モード調整手段は、自系と相手系が互いに稼動側として動作モードが競合したときに、待機系に移すと共に、動作モードの送信タイミングをずらすことを特徴とする請求項１または２に記載の入出力二重化装置。
【請求項４】
稼動側および待機側の入出力モジュールが夫々備える共有メモリのＣＰＵモジュール側からアクセスするアドレス空間は同一のアドレス空間が割り付けられており、
夫々の前記入出力モジュールは、稼動側のときにのみ前記ＣＰＵモジュールの当該共有メモリへのアクセスを許可することを特徴とする請求項１乃至３の何れか一項に記載の入出力二重化装置。
【請求項５】
前記ＣＰＵモジュールは、稼動側を待機側に切り替えるための稼動／待機切替信号を稼動側の入出力モジュールへ送信し、
前記稼動側の入出力モジュールは、前記稼動／待機切替信号を受信して、自系を待機側へ切り替えることにより、相手系を稼動側へ移行させることを特徴とする請求項１乃至４の何れか一項に記載の入出力二重化装置。
【請求項６】
前記入出力モジュールは、アナログ入力モジュールであって、
稼動側アナログ入力モジュールは、
入力されるアナログ値の範囲とデジタル値の範囲の対応関係を示す理論調整スケール値を登録する稼動側基本情報登録手段と、
該稼動側アナログ入力モジュールのＡ／Ｄ変換誤差を修正するための稼動側校正値および外部機器から出力されるアナログ信号のＡ／Ｄ変換値をそれぞれ入力する稼動側計測値入力手段と、
前記外部機器の特性に合わせるための機器調整値を保持する稼動側記憶手段と、
前記機器調整値と前記理論調整スケール値と前記稼動側校正値とを用いて待機側アナログ入力モジュールのＡ／Ｄ変換値の修正に使用する補正値を演算し、この補正値を周期的に前記待機側アナログ入力モジュールへ送信する補正値送信手段と、
前記稼動側計測値入力手段によって入力されたアナログ信号のＡ／Ｄ変換値を前記稼動側記憶手段に保持されている機器調整値によって修正したＡ／Ｄ変換値を出力する出力値算出手段と、を備え、
前記待機側アナログ入力モジュールは、
入力されるアナログ値の範囲とデジタル値の範囲の対応関係を示す理論調整スケール値を登録する待機側基本情報登録手段と、
該待機側アナログ入力モジュールのＡ／Ｄ変換誤差を修正するための待機側校正値および前記外部機器から出力されるアナログ信号のＡ／Ｄ変換値をそれぞれ入力する待機側計測値入力手段と、
前記補正値送信手段によって送信された補正値を受信し、この補正値と前記理論調整スケール値と前記待機側校正値とを用いて待機側の機器調整値を演算して待機側記憶手段に保存する演算保存手段と、を備え、
前記待機側アナログ入力モジュールは、所定の期間、前記補正値送信手段から補正値を受信しないことにより、稼動側アナログ入力モジュールとして動作することを特徴とする請求項１乃至５の何れか一項に記載の入出力二重化装置。
【請求項７】
前記出力値算出手段は、前記修正したＡ／Ｄ変換値をユーザが要求するスケール範囲にさらにスケール変換することを特徴とする請求項６に記載の入出力二重化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、主にプログラマブルコントローラやネットワーク端末などに用いられる入出力モジュールの二重化技術に関し、同じユニット内でＣＰＵモジュールとバスを共有する入出力モジュールが二重化されたシステム構成における入出力二重化装置に関する。
【背景技術】
【０００２】
従来の入出力二重化装置は、図１９に示すように、アプリケーションを含む装置全体の演算処理を実行するＣＰＵモジュールと、同じ装置内のベースボードのバスを介してＣＰＵモジュールとデータの受け渡しを行い、入力処理や出力処理を実行する入出力モジュールが実装されている。装置の信頼性や稼働率を上げるためにこの入出力モジュールが二重化された構成が採用されている。なお、入出力モジュールとしては、アナログ入力モジュールやデジタル入力モジュールなどのように入力機能のみの場合、アナログ出力モジュールやデジタル出力モジュールなどのように出力機能のみ場合、あるいは両方の機能が実装されている場合がある。
【０００３】
図２０は、従来の二重化構成による入出力二重化装置のブロック図である。この図において、従来の入出力二重化装置１００は、ＣＰＵモジュール２と二以上の入出力モジュール９９で構成されている。図２０は、アナログ入力モジュールを用いた例であるが、入出力モジュールの機能によって外部Ｉ／Ｆ部の回路や外部機器との接続方法が異なる。
【０００４】
ＣＰＵモジュール２と入出力モジュール９９は、複数の信号線からなるバス３で接続されている。なお、図示していないが、入出力二重化装置１００は、電源モジュールも有しており、電源線またはベースボード上の電源パターンを通して各モジュールに電力を供給している。また、バス３はベースボードを使わず直接コネクタでモジュール間を接続する場合もある。
【０００５】
各入出力モジュール９９は、共有メモリを有しバス３を介してＣＰＵモジュール２との間でデータの受け渡しを行うバスインタフェース（以下、ＢＵＳＩ／Ｆ）回路１５、入力処理や出力処理などの種々の演算処理を実行するＣＰＵ回路１１、入力信号や出力信号の変換処理を行う外部Ｉ／Ｆ部９７を備えている。
【０００６】
ＣＰＵモジュール２は、バス３と各入出力モジュール１０に設けられているＢＵＳＩ／Ｆ回路１５を介して、データの受け渡しを行う。このＢＵＳＩ／Ｆ回路１５は、図２１に示すように、主にデコード回路８１と共有メモリ８２で構成され、デコード回路８１によってＣＰＵモジュール２から出力されるアドレスバスの上位アドレスをデコードし、共有メモリ８２の選択信号を生成する。また、アドレスバスの下位側の所定数のアドレス信号、読み出し信号、書き込み信号は、共有メモリ８２に接続されている。図２１では省略しているが、入出力モジュールのＣＰＵ回路１１側も同様の信号が共有メモリ８２に接続されている。
【０００７】
入出力二重化装置１００は、上記の構成を有する入出力モジュール９９を複数有し、各入出力モジュール９９はＣＰＵモジュール２からの指令によって種々のパラメータの設定が行われる。また、稼動側入出力モジュール（以下、「稼動側モジュール」または単に「稼動側」という。）と待機側入出力モジュール（以下、「待機側モジュール」または単に「待機側」という。）は、外部機器９との間で二重化のための配線が施され、運用時はＣＰＵモジュール２からの指令によって稼動／待機の動作モードの設定が行われる。なお、二重化のための配線のしかたは入力機能や出力機能によって異なる。図２０は、入力機能の場合の例であるが、出力機能の場合は、出力端にリレー接点を設け、動作モードが稼動の場合は「閉」、動作モードが待機の場合は「開」にするのが一般的である。なお、入力機能の場合でも、必要により入力端に切替スイッチを設けて稼動側モジュールのみに外部機器９からの信号が入力されるように構成することもある。
【０００８】
上記の構成を有する入出力モジュール９９に対して、ＣＰＵモジュール２は、各入出力モジュール９９の自己診断結果や、入出力モジュール９９との間の診断などによって異常を検知すると、ＣＰＵモジュール２から各入出力モジュール９９へ稼動／待機切替指令を出力して、稼動側モジュールを切り替えている。
【０００９】
このように従来は、ＣＰＵモジュール２が入出力モジュール９９の二重化制御を行っていたため、その処理負荷が高くなるという問題があった。このため、たとえば特許文献１では、ＣＰＵモジュールの負荷を軽減するために、ＣＰＵモジュールと入出力モジュールとの間に監視モジュール（データ二重化装置）を設け、この監視モジュールに二重化された入出力モジュールの制御を実行させるシステム及び方法が提案されている。
【先行技術文献】
【特許文献】
【００１０】
【特許文献１】特開２００５−１９６４９０号公報
【発明の概要】
【発明が解決しようとする課題】
【００１１】
しかしながら、特許文献１の技術によれば、ＣＰＵモジュールの負荷は軽減されるものの監視モジュールを必要とするため、コストアップの要因になる。
【００１２】
本発明は上述のかかる事情に鑑みてなされたものであり、二重化制御のために専用の装置を用いることなく、ＣＰＵモジュールの負荷を軽減して、安価で信頼性の高い入出力二重化装置を提供することを目的とする。
【課題を解決するための手段】
【００１３】
上記の目的を達成するため、本発明に係る入出力二重化装置は、同一ユニット内に実装され、演算処理を実行するＣＰＵモジュールと共有メモリを介してデータの受け渡しを行い、夫々動作モードとして稼動側または待機側として機能する少なくとも一対の入出力モジュールを備えた入出力二重化装置であって、夫々の前記入出力モジュールは、相手側の入出力モジュール(以下、「相手系」という)と接続され、動作モードを送受信する通信手段と、前記通信手段によって受信される相手系の動作モードと、自己側の入出力モジュール（以下、「自系」という）の自己診断結果に基づいて、自系の動作モードを決定し、当該決定した動作モードを前記ＣＰＵモジュールへ通知する動作モード調整手段と、前記動作モード調整手段によって決定された動作モードに基づいて、自系が稼動側の場合は、前記ＣＰＵモジュールから設定パラメータを入力し、該設定パラメータを用いて入力処理または出力処理を実行させる一方、相手系へ該設定パラメータを送信し、自系が待機側の場合は、相手系から送信されてくる設定パラメータを受信し、当該受信した設定パラメータを用いて入力処理または出力処理を実行させるコマンド送受信手段と、を備え、前記ＣＰＵモジュールは、稼動側の入出力モジュールのみに前記設定パラメータを出力することを特徴とする。
【００１４】
ここで、「設定パラメータ」とは、入出力モジュールを所定の仕様で動作させるためのパラメータであり、例えばアナログ入出力ではスケール変換値、デジタル出力ではパルス幅、デジタル入力ではフィルタ時間などがある。
【００１５】
本発明では、各入出力モジュールの備える動作モード調整手段によって、稼動側、待機側を決定し、稼動側／待機側の動作モード情報をＣＰＵモジュールへ通知する。ＣＰＵモジュールは、稼動側の入出力モジュールに対してのみ設定パラメータを送信する。これにより、ＣＰＵモジュールの負荷を軽減させることができる。
【００１６】
また、本発明に係る入出力二重化装置の動作モード調整手段は、自系の自己診断結果が正常のときの自系の動作モードの決定において、受信された前記相手系の動作モードが待機側の場合、自系の動作モードを稼動側に仮設定すると共に相手系へ自系が稼動側であることを通知し、この通知に対する相手系からの応答を受信し、この応答に含まれる相手系の動作モードも待機側のとき、前記仮設定を本設定にして自系の動作モードを稼動側に決定し、前記応答に含まれる相手系の動作モードが稼動側のとき、前記仮設定を解除し、自系の動作モードを待機側に決定することを特徴とする。
【００１７】
本発明では、動作モードの決定の際に、相手系の動作モードが待機側の場合に直ちに自系が稼動側であると決定するのではなく、まず稼動側として仮設定をする。この仮設定状態のときは、相手系に自系が稼動側であることは通知するが、ＣＰＵモジュールへは自系が稼動側であることは通知しない。自系が稼動側として仮設定されている状態のときに、仮設定状態であることの相手側への通知に対する応答として受信した相手形の動作モードが尚も待機側である場合は、仮設定を本設定にして、このときＣＰＵモジュールへ自系が稼動側であると決定したことを通知するのである。
【００１８】
これにより、特にシステム立ち上がり時の各入出力モジュールの動作モードの決定処理において、相手系と自系の動作モードが競合しても、ＣＰＵモジュールへ通知する動作モードが不安定になることはなく、安定したシステム動作を実現することができる。
【００１９】
特に動作モード調整手段は、自系と相手系が互いに稼動側として動作モードが競合したときに、一旦自系を待機側に移すと共に、動作モードの送信タイミングをずらすことによって、動作モードの調整を迅速かつ確実に実行することができる。
【００２０】
また、本発明に係る入出力二重化装置では、稼動側および待機側の入出力モジュールが夫々備える共有メモリのＣＰＵモジュール側は同一のアドレス空間が割り付けられており、夫々の前記入出力モジュールは、稼動側のときにのみ前記ＣＰＵモジュールの当該共有メモリへのアクセスを許可することを特徴とする。
【００２１】
これにより、ＣＰＵモジュールのメモリ空間を節約することができ、ユニットへ実装可能な入出力モジュール数を増やしたり、安価なＣＰＵの採用を可能にするなど、コストパフォーマンスの高い入出力二重化装置を実現することができる。
【００２２】
なお、ＣＰＵモジュールは、稼動側を待機側に切り替えるための稼動／待機切替信号を稼動側の入出力モジュールへ送信し、稼動側の入出力モジュールは、前記稼動／待機切替信号を受信して、自系を待機側へ切り替えることにより、相手系を稼動側へ移行させることにより、動作モードの切替を行う。これにより、ＣＰＵモジュールは、二重化処理の負担を軽減することができる。
【００２３】
さらに、本発明に係る入出力二重化装置は、入出力モジュールとしてアナログ入力モジュールを用いる入出力二重化装置であって、稼動側アナログ入力モジュールは、入力されるアナログ値の範囲とデジタル値の範囲の対応関係を示す理論調整スケール値を登録する稼動側基本情報登録手段と、該稼動側アナログ入力モジュールのＡ／Ｄ変換誤差を修正するための稼動側校正値および外部機器から出力されるアナログ信号のＡ／Ｄ変換値をそれぞれ入力する稼動側計測値入力手段と、前記外部機器の特性に合わせるための機器調整値を保持する稼動側記憶手段と、前記機器調整値と前記理論調整スケール値と前記稼動側校正値とを用いて待機側アナログ入力モジュールのＡ／Ｄ変換値の修正に使用する補正値を演算し、この補正値を周期的に前記待機側アナログ入力モジュールへ送信する補正値送信手段と、前記稼動側計測値入力手段によって入力されたアナログ信号のＡ／Ｄ変換値を前記稼動側記憶手段に保持されている機器調整値によって修正したＡ／Ｄ変換値を出力する出力値算出手段と、を備え、前記待機側アナログ入力モジュールは、入力されるアナログ値の範囲とデジタル値の範囲の対応関係を示す理論調整スケール値を登録する待機側基本情報登録手段と、該待機側アナログ入力モジュールのＡ／Ｄ変換誤差を修正するための待機側校正値および前記外部機器から出力されるアナログ信号のＡ／Ｄ変換値をそれぞれ入力する待機側計測値入力手段と、前記補正値送信手段によって送信された補正値を受信し、この補正値と前記理論調整スケール値と前記待機側校正値とを用いて待機側の機器調整値を演算して待機側記憶手段に保存する演算保存手段と、を備え、前記待機側アナログ入力モジュールは、所定の期間、前記補正値送信手段から補正値を受信しないことにより、稼動側アナログ入力モジュールとして動作することを特徴とする。
【００２４】
ここで、「所定の期間」とは、補正値の送信周期をもとに予め設定される値であり、プログラマブルコントローラの制御周期（データリフレッシュ周期）に影響を与えない程度の期間をいう。例えば、制御周期を１０ｍＳとしたプログラマブルコントローラシステムに適用する場合は、所定の期間は１０ｍＳ以下の値に設定し、送信周期はこの設定値の数分の１程度にするのが好ましい。
【００２５】
本発明では、稼動側アナログ入力モジュールは、現地で機器調整値を入力して自モジュールの記憶部に保存する一方で、この機器調整値を用いて補正値を演算し、当該補正値を待機側アナログ入力モジュールへ送信する。待機側アナログ入力モジュールでは、受信した補正値を用いて、当該アナログ入力モジュールとしての機器調整値を算出して自モジュールの記憶部に保存しておく。そして、所定の期間補正値が受信されないことにより稼動側入力モジュールの異常を検知して、自モジュールが稼動側アナログ入力モジュールとして動作する。このとき、自モジュールの記憶部に保存されている機器調整値を用いて、入力したＡ／Ｄ変換値の修正を行うので、待機側アナログ入力モジュールとしては外部機器の特性に合わせるための機器調整値の入力は不要になる。また、故障したアナログ入力モジュールの交換時には、交換され待機側として立ち上がったアナログ入力モジュールは新たに稼動側になったアナログ入力モジュールから自動的に補正値を受信することになるので、交換するアナログ入力モジュールについても外部機器の特性に合わせるための機器調整が不要になる。このため稼働率が向上する。
【００２６】
また、本発明に係る入出力二重化方法は、稼動側と待機側からなりアナログ値をデジタル値に変換して入力するアナログ入力モジュールを二重化して用いる方法であって、入力するアナログ値の範囲とデジタル値の範囲の対応関係（６３）を稼動側と待機側の両方に共通の設定値として設定し、稼動側と待機側のそれぞれでＡ／Ｄ変換誤差を修正するための校正値（６４）を入力し、該校正値と前記対応関係（６３）から調整用スケール変換データを計算し、稼動側において、外部機器（９）の特性に合わせるための機器調整値（６５）を入力し、入力した機器調整値（６５）と校正値（６４）との差を稼動側の調整用スケール変換データによってスケール変換して下限値および上限値による補正値（６８）を算出すると共に該補正値を待機側へ送信し、待機側において、受信した補正値と待機側の調整用スケール変換データを用いて、待機側の機器調整値（６５）を計算し、稼動側と待機側の少なくともいずれか一方において、入力した計測値を夫々が保持する機器調整値（６５）を用いて修正することを特徴とする。
【００２７】
本発明によれば、稼動側において、現地調整により機器調整値を求め、これを用いて補正値を算出し、この補正値を待機側へ送信し、待機側モジュールではこの補正値を用いて自モジュール用の機器調整値を計算するようにしたので、システム立ち上げ時は、稼動側モジュールのみ現地調整を行えば良く、また、片方のアナログ入力モジュールが故障した場合には、他方のアナログ入力モジュールが稼動側となり、待機側として実装される交換品に対して、当該補正値を転送するので、交換作業時の現地調整は不要となる。
【００２８】
また、本発明に係るアナログ入力モジュール（１０）は、稼動側か或いは待機側かの動作モードが設定可能なアナログ入力モジュールであって、動作モードの初期値（６１）、入力するアナログ値の範囲とデジタル値の範囲の対応関係を示す理論調整スケール値（６３）を登録する基本情報登録手段（４２）と、Ａ／Ｄ変換誤差を修正するための校正値（６４）および外部機器（９）から出力されるアナログ信号のＡ／Ｄ変換値（６６）を入力する計測値入力手段（４３）と、動作モードが稼動側のときに、外部機器（９）の特性に合わせるための機器調整値（６５）を入力し、当該入力した機器調整値（６５）と理論調整スケール値（６３）と校正値（６４）とを用いて補正値（６８）を演算し、当該演算した補正値を送信する手段（調整値変換手段４４，補正値算出手段４５，補正値送信手段４７）と、動作モードが待機側のときに、稼動側から送られてくる補正値（６８）を受信し、当該受信した補正値（６８）と理論調整スケール値（６３）と校正値（６４）とを用いて機器調整値を演算する手段（補正値受信手段４８，機器補正値変換手段５０，機器調整値算出手段５１）と、計測値入力手段（４３）によって入力されたＡ／Ｄ変換値（６６）を機器調整値（６５）によって修正する出力値算出手段（４６）と、を備えたことを特徴とする。
【００２９】
本発明では、動作モードが稼動側のときは、入力した機器調整値と理論調整スケール値と校正値とを用いて補正値を算出して送信し、動作モードが待機側のときは、稼動側から送られてくる補正値を受信し、当該受信した補正値を用いて機器調整値を演算する。そして、計測値入力手段によって入力されたＡ／Ｄ変換値を機器調整値によって修正する。
【００３０】
好ましくは、出力値算出手段（４６）は、入力するアナログ値の範囲とデジタル値の範囲のアプリケーションプログラムへ渡すデジタル値の範囲の対応関係を示すユーザ要求スケール値によって、前記修正したＡ／Ｄ変換値をさらにスケール変換するようにすると良い。
【００３１】
本発明に係るアナログ入力モジュール（１０）は、さらに、動作モードが稼動側のときは、補正値（６８）を周期的に待機側へ送信する一方、待機側からの該補正値の送信に対する応答の有無によって待機側の異常の有無を判定し、動作モードが待機側のときは、補正値の受信に対して応答する一方、補正値が周期的に送られてくるか否かによって稼動側の異常の有無の判定を行う稼動／待機判定手段（５２）を備えたことを特徴とする。
【００３２】
本発明では、補正値を周期的に送信することにより、アナログ入力モジュールを活線状態で差替えても自動的に待機側へ補正値が転送されるので、システム停止やリセットの必要がなく稼働率が向上する。
【発明の効果】
【００３３】
本発明によれば、二重化を構成する入出力モジュール間で稼動／待機の動作モードの調整を実行し、アプリケーション層を介さずに補正値などの設定パラメータの転送を実行するので、ＣＰＵモジュールは二重化制御や待機側に対する処理をする必要がなくなりＣＰＵ負荷を軽減することができる。
【００３４】
さらに、入出力モジュールの動作モードの判定結果により、稼動側の入出力モジュールのみがＣＰＵモジュールからのアクセスを可能にすることによって、ＣＰＵモジュールのメモリ空間を節約することができる。
【図面の簡単な説明】
【００３５】
【図１】本発明の第１の実施の形態による入出力二重化装置１の機能ブロック図である。
【図２】本発明の実施の形態による入出力二重化装置１のモジュール実装図である。
【図３】図１のＣＰＵ回路１１の機能ブロック図である。
【図４】本発明の第１の実施の形態によるＣＰＵモジュール２のメモリマップの説明図である。
【図５】図３の動作モード調整手段７２の処理手順を示すフローチャートである。
【図６】図３の動作モード管理テーブル７３のデータ構成例である。
【図７】図１のＣＰＵモジュール２の入出力処理手順を示すフローチャートである。
【図８】本発明の第２の実施の形態によるＣＰＵモジュール２のメモリマップの説明図である。
【図９】本発明の第２の実施の形態による入出力モジュール１０の機能ブロック図である。
【図１０】図９の動作モード判定部３０とＢＵＳＩ／Ｆ回路１５の構成図である。
【図１１】本発明の第２の実施の形態による動作モード調整手段７２の処理手順をに示すフローチャートである。
【図１２】本発明の第２の実施の形態によるＣＰＵモジュール２の処理手順をに示すフローチャートである。
【図１３】本発明の実施の形態による入出力二重化装置１のブロック図である。
【図１４】図１３のアナログ入力モジュール１０の機能ブロック図である。
【図１５】図１４に示すアナログ入力モジュール１０を稼動側と待機側の二重化構成で用いた場合の処理概要を説明するためのブロック図である。
【図１６】図１３の入出力二重化装置１の現地での動作概要の処理手順を示すフローチャートである。
【図１７】外部Ａ／Ｄ変換値（理論調整値scale）と、内部Ａ／Ｄ変換値（校正値および機器調整値）との関係を示す説明図であり、図１７（ａ）は稼動側モジュールの説明図、図１７（２）は待機側モジュールの説明図である。
【図１８】現地調整時の外部機器の特性への合わせこみの説明図である。
【図１９】従来技術による入出力二重化装置のユニット実装図である。
【図２０】従来技術による二重化構成による入出力二重化装置のブロック図である。
【図２１】図２０の従来のＢＵＳＩ／Ｆ回路１５の構成図である。
【発明を実施するための形態】
【００３６】
以下、図面を参照しながら本発明の実施の形態を説明する。なお、同じ構成には同一符号を付している。
【００３７】
図１は、本発明の第１の実施の形態による入出力二重化装置１の機能ブロック図である。図２０に示した従来のハードウェア構成との主な違いは、二重化構成による稼動側と待機側の入出力モジュール間のシリアル通信を行う通信部９６を設け、通信ケーブル５で稼動側と待機側を接続したことである。この通信部９６は、データを送信回路２１、データを受信する受信回路２２、および、信号を絶縁する絶縁回路２３から構成されている。
【００３８】
この入出力二重化装置１において、各入出力モジュール１０は、二重化されたモジュール間で一定のデータを受け渡すことによって、自系が稼動側になるべきか、待機側になるべきかの判定を行うものである。
【００３９】
図２は、本実施の形態による入出力二重化装置１のモジュール実装図である。
この図において、入出力二重化装置１は、ＣＰＵモジュール２と、稼動系または待機系として動作する一対（ペア）の入出力モジュール１０が複数ペア実装されている。
【００４０】
ＣＰＵモジュール２および各入出力モジュール１０は、ユニットに実装され、各モジュールのコネクタを介してベースボードのバス３と接続する。このバス３は、アドレスバス、データバスの他、読み出し信号、書き込み信号などのコントロールバスで構成されている。
【００４１】
図３は、本実施の形態による入出力モジュール１０のＣＰＵ回路１１の機能ブロック図である。この図において、ＣＰＵ回路１１は、プログラムのストール監視やメモリチェックなどを行う自己診断手段７１、ＣＰＵモジュール２との間でデータの受け渡し処理を行うＣＰＵＩ／Ｆ手段４１、相手系との間で稼動／待機の動作モードを調整する動作モード調整手段７２、二重化構成において相手系の健全性確認その他の設定パラメータの受け渡しを行い相手系が正常か異常かの判定結果を出力するコマンド送受信手段４９を有している。
【００４２】
自己診断手段７１は、電源投入時やシステムリセット時、その後周期的に診断処理を実行し、その診断結果を動作モード調整手段７２に渡す。
【００４３】
コマンド送受信手段４９のいわゆる相手系診断処理は、通信部９６を介して定期的に診断チェック用データが送信されてくるか否かを判定し、一定時間データが送られてこない場合は相手系異常として判定し、その判定結果を動作モード調整手段７２に渡す。なお、診断チェック用データとして設定パラメータを兼用してもよい。
【００４４】
＜ＣＰＵモジュールのメモリマップ＞
ＣＰＵモジュール２のメモリマップを図４に示す。
各入出モジュール１０の共有メモリ８２には、ＣＰＵモジュール２のメモリ空間が割り付けられ、入出力モジュールの実装されるスロットごとに異なるアドレス範囲が割り当てられている。なお、入出力モジュールにアドレス範囲を設定するスイッチを設けて、入出力モジュールごとにメモリ空間の割付を行うようにしてもよいが、本実施の形態ではスロットごとに異なるアドレス範囲が割り付けられる場合について説明する。
【００４５】
ＣＰＵモジュール２の動作の概要は、入出力モジュール１０から入力される正常か異常かのステータス情報、稼動か待機かの動作モード情報を取り込み、設定パラメータと稼動／待機切替指令を入出力モジュールに出力する。入出力データの内容は、入出力モジュールの種類によって異なる。たとえば、アナログ入力モジュールならば、同モジュールから渡されるＡ／Ｄ変換値を入力することとなり、アナログ出力モジュールならば、同モジュールへ渡す出力指令値を出力することになる。
【００４６】
入出力モジュール１０のステータス情報や動作モードは、入出力モジュール１０のＣＰＵ回路１１によって共有メモリ８２に書き込まれる。そして、ＣＰＵモジュールが共有メモリ８２からそのデータを読み出す。設定パラメータや稼動／待機切替指令は、ＣＰＵモジュール２から共有メモリ８２に書き込まれ、入出力モジュール１０のＣＰＵ回路１１がそのデータを読み取って、所定の動作を実行する。
【００４７】
また、共有メモリ８２を介して、ＣＰＵモジュール２と入出力モジュール１０のＣＰＵ回路１１との間で入出力データの受け渡しが行われる。
【００４８】
図４は、一つのペアの入出力モジュールに対するメモリ空間を示しているが、複数ペアの入出力モジュールが実装される場合は、夫々の入出力モジュール１０に対して異なるメモリ空間が割り付けられる。
次に、本実施の形態による入出力二重化装置１の動作を説明する。
【００４９】
＜装置の初期化処理＞
電源ＯＮ時に、ＣＰＵモジュール２は、各入出力モジュール１０について、共有メモリ８２の全領域を初期化する。たとえば、領域内の動作モード（稼動／待機情報）については、稼動でも待機でもないデータを初期値として設定する。また、ステータス領域についても、正常、異常時のコードとは異なる初期値を設定する。これにより、ＣＰＵモジュール２は、起動後一定時間、初期値が変化しなかった場合は、入出力モジュール１０が正常に動作をしていないことを検知することができる。
【００５０】
ＣＰＵモジュール２は、この初期化処理後に各入出力モジュール１０のＣＰＵ回路１１に対して割込み信号等によって共有メモリ８２の書き込み許可の通知をする。
【００５１】
＜動作モード調整処理＞
次に、図５を用いて入出力モジュール１０の動作モード調整手段７２の処理手順を説明する。動作モード調整手段７２は、電源ＯＮやシステムリセットにより起動されると、自己診断手段７１の診断結果から異常の有無を判定し（Ｓ２０１，Ｓ２０２）、異常がある場合は（Ｓ２０２で「ＮＯ」）、共有メモリ上のステータス情報格納領域に異常内容に対応するエラーコードを書き込む（Ｓ２０３）。その後、動作モード調整手段７２は、自系の動作モードを待機モードに設定する（Ｓ２０４）。具体的には、共有メモリ上の動作モード格納領域に「待機」を書き込む。そして、通信部９６を介して、自系が待機モードであることを相手系に通知する（Ｓ２０５）。その後、動作モード管理テーブル７３の仮設定フラグをリセットして、ステップＳ２０１に戻って以降の処理を繰り返す（Ｓ２０６）。
【００５２】
ここで、図６に動作モード管理テーブル７３の例を示す。稼動モードの本設定（以下、単に「本設定」という。）、稼動モードの仮設定（以下、単に「仮設定」という。）、および待機モードの各項目ごとにフラグが設定可能になっている。後述する処理により、それぞれ動作モードに対応するフラグが設定される。
【００５３】
図５に戻り、動作モード調整手段７２は、ステップＳ２０２でＮＯの場合は、共有メモリ８２のステータス情報格納領域に「正常」を書き込む（Ｓ２０７）。次に、コマンド送受信手段４９を介して受け取った相手系の動作モードから、相手系が稼動モードの場合は（Ｓ２０８で「ＹＥＳ」）、さらに、コマンド送受信手段４９の出力結果から相手系が正常かどうかを判定し（Ｓ２０９）、正常の場合は、自系の動作モードを待機モードに設定する（Ｓ２１０）。なお、ステップＳ２０８の判定処理で用いる相手系の動作モードは、相手系から周期的に送られてくる動作モードのうち最新の動作モードを用いるものとする。
【００５４】
ステップＳ２１０の後、コマンド送受信手段４９を介して自系が待機モードであることを相手系に通知して（Ｓ２１１）、動作モード管理テーブル７３の仮設定フラグをリセットする（Ｓ２１２）。その後、乱数を発生させ、乱数で定まる一定時間スリープした後（Ｓ２１３）、ステップＳ２０１に戻って以降の処理を繰り返す。なお、乱数の例としては、０〜９までの数字をランダムに選択し、その数字に所定時間（たとえば１ｍＳ）を掛け合わせた時間分だけスリープさせるものである。この所定時間は、動作モード調整手段７２の一回の処理時間と同程度であるのが好ましい。
【００５５】
ステップＳ２０８で「ＮＯ」、即ち相手系が待機モードか、或いは動作モードの通知がない場合、およびステップＳ２０９で相手系が正常でない場合は、次に自系が稼動モードか否かを判定する（Ｓ２１４）。なお、動作モード管理テーブル７３の本設定フラグがセットされている場合に、稼動モードであると判定する。この判定の結果、自系が稼動モードである場合は（Ｓ２１４で「ＹＥＳ」）、共有メモリ８２の稼動／待機切替指令格納領域のデータを読み込み（Ｓ２１５）、ＣＰＵモジュール２によって切替指令が設定されている場合は（Ｓ２１６で「ＹＥＳ」）、自系の動作モードを待機側に設定する（Ｓ２１７）。具体的には、動作モード管理テーブル７３の待機フラグをセットすると共に、共有メモリ８２の動作モード格納領域に「待機」を書き込む。そして、コマンド送受信手段４９を介して自系が待機モードであることを相手系に通知する（Ｓ２１８）。その後、共有メモリ８２の稼動／待機切替指令と動作モード管理テーブル７３の仮設定フラグをリセットする（Ｓ２１９、Ｓ２２０）。
【００５６】
一方、ステップＳ２１４で、稼動モードの本設定が行われていない場合は、次に、動作モード管理テーブル７３の仮設定フラグがセットされているか否かを判定し（Ｓ２２１）、仮設定フラグがセットされている場合は、動作モード管理テーブル７３の本設定フラグをセットして、自系の動作モードを稼動側に設定すると共に、共有メモリ８２の動作モードとして、「稼動」を書き込む（Ｓ２２２）。その後、仮設定フラグをリセットして（Ｓ２２３）、コマンド送受信手段４９を介して自系が稼動モードであることを相手系に通知して（Ｓ２２５）、ステップＳ２０１へ戻って以降の処理を繰り返す。
【００５７】
一方、ステップＳ２２１で、仮設定フラグがセットされていない場合は、仮設定フラグをセットして（Ｓ２２４）、ステップＳ２２５へ移行する。
動作モード調整手段７２は、以上の手順によって相手系との稼動／待機の調停を行う。
【００５８】
なお、上記の説明では、コマンド送受信手段４９を介して周期的に自系の動作モードを相手系に送信することとしたが、さらに、コマンド送受信手段４９が相手系の動作モードを受信したときは、その応答として自系の動作モードを返信するようにしておき、上記の処理においてステップＳ２２１の判定の結果、仮設定フラグがセットされている場合は、前回起動時のステップＳ２２５の送信処理に対する相手系の応答に含まれている動作モードが待機側の場合にステップＳ２２２の本設定処理を行うようにすると良い。これにより、自系が稼動側であることを確実に相手系に伝えた後の相手系の動作モードに基づいて自系稼動側の決定を行うことができる。
【００５９】
＜動作モード調整後のＣＰＵモジュール側の動作＞
次に、図７を用いて、ＣＰＵモジュール２側の入出力処理手順について説明する。
ＣＰＵモジュール２は、電源が投入されると、例えばＣＰＵモジュール２に接続された保守ツール（図示せず）など外部から動作モードの切替要求があるか否かを判定し（Ｓ３０１）、切替要求が有る場合は、対象となる稼動側入出力モジュールの出力領域に稼動／待機切替指令を書き込む（Ｓ３０２）。これにより、入出力モジュール１０の図５ステップＳ２１６〜Ｓ２２０の処理によって、稼動側が待機側へ切り替わり、その結果、待機側が稼動側へ切り替わる。
【００６０】
ステップＳ３０２の後、予め定められた起動遅延の設定時間を経過したか否かを判定し、経過していない場合は、ステップＳ３０１へ戻り、経過している場合は、次に入出力モジュール１（１０）に対応する入力領域である入力領域１にアクセスして、共有メモリ８２に設定されている稼動／待機情報を取得する（Ｓ３０４）。なお、ステップＳ３０３における起動遅延の設定時間とは、外部から切替指令を入力し、かつ、入出力モジュール１０が動作モードを決定するのに十分な時間である。
【００６１】
取得した稼動／待機情報が「稼動」の場合は、共有メモリ８２の出力領域１に設定パラメータを書き込むことにより、入出力モジュール１（１０）のＣＰＵ回路１１に設定パラメータを転送する（Ｓ３０６）。なお、この設定パラメータは、入出力モジュール１（１０）のコマンド送受信手段４９によって相手系に送られる。
【００６２】
次に、ＣＰＵモジュール２は、入力領域１から稼動／待機情報を取得し（Ｓ３０７）、入出力モジュール１（１０）が稼動モードか否かを判定する（Ｓ３０８）。判定の結果、稼動モードの場合は、入出力領域１にアクセスして、入出力モジュール１（１０）からのデータの読み出し、または入出力モジュール１（１０）へのデータの書き込みを行い（Ｓ３０９）、ステップＳ３０７へ戻って以降の処理を繰り返す。ステップＳ３０８の判定の結果、稼動モードでない場合は、外部に入出力モジュール１（１０）の交換指示を出力して（Ｓ３１０）、後述するステップＳ３１５へ移行する。
【００６３】
一方、ステップＳ３０５で入出力モジュール１（１０）が稼動モードでない場合は、ＣＰＵモジュール２は、次に入力領域２の稼動／待機情報を読み込んで（Ｓ３１１）、入出力モジュール２（１０）の動作モードを判定する。その結果、入出力モジュール２（１０）が稼動モードでない場合は（Ｓ３１２で「ＮＯ」）、外部にエラー通知を行って終了する（Ｓ３１３）。入出力モジュール２（１０）が稼動モードの場合（Ｓ３１２で「ＹＥＳ」）は、入出力モジュール２（１０）に設定パラメータを転送する（Ｓ３１４）。この設定パラメータは、入出力モジュール２（１０）のコマンド送受信手段４９によって相手系に送られる。
【００６４】
次に、ＣＰＵモジュール２は、入力領域２から稼動／待機情報を取得し（Ｓ３１５）、入出力モジュール２（１０）が稼動モードか否かを判定する（Ｓ３１６）。判定の結果、稼動モードの場合は、入出力領域２にアクセスして、入出力モジュール２（１０）からのデータの読み出し、または入出力モジュール２（１０）へのデータの書き込みを行い（Ｓ３１７）、ステップＳ３１５へ戻って以降の処理を繰り返す。ステップＳ３１６の判定の結果、稼動モードでない場合は、外部に入出力モジュール２（１０）の交換指示を出力して（Ｓ３１８）、ステップＳ３０７へ移行する。
ＣＰＵモジュール２の入出力処理は、以上の手順で行われる。
【００６５】
なお、上記は一組の入出力モジュールについての処理手順であるが、複数のペアが存在する場合は、夫々のペアごとに上記の処理を実行する。
【００６６】
（他の実施例１）
図５の動作モード調整手段７２のステップＳ２１３では、乱数を発生させて、それに応じた遅延時間を待たせることにより、二重化を構成する入出力モジュール間の処理タイミングをずらして、稼動、待機の判定結果が処理のたびに反転することを防止しているが、入出力モジュール１０が実装されるスロットの識別情報（スロットＩＤ）を読み込み、読み込んだスロットＩＤに応じた時間分遅延させるようにしても良い。これにより、一旦タイミングが重なって、競合状態（両系とも相手系が稼動モードと認識した状態）となっても、両系とも一旦待機モードになり、次の周期では、スロットＩＤで定まるスリープ時間の短い入出力モジュール１０のみが確実に稼動モードになることができる。
【００６７】
また、本実施の形態による動作モード調整手段７２の処理では、稼動モードの判定になったときに、直ちに「稼動」設定をするのではなく、まず仮設定フラグをセットし、これにより、相手系には、稼動側であることを通知する一方で、共有メモリを介してＣＰＵモジュール２に渡す情報は、この時点では「稼動」にはしない。すなわち、この時点ではＣＰＵモジュール２は、待機モードあるいは未設定状態として動作モードを取得することになる。
【００６８】
そして、動作モード調整手段７２は、次の周期で再び稼動判定になったときに、自系の動作モードを「稼動」として本設定し、ＣＰＵモジュール２へ渡す情報も「稼動」にする。これにより、二重化を構成する入出力モジュール間で動作モード調整処理のタイミングが重なったときに、両方が稼動モードになることを防止することができる。
【００６９】
（他の実施例２）
上記は、入出力モジュール１０の動作モード調整手段７２の処理によって、稼動／待機のモードを決定するものであるが、簡便な方法としては、各入出力モジュール１０に予め動作モード設定スイッチあるいは動作モードを格納する不揮発性メモリを設け、工場出荷時等に稼動、待機の設定をするようにしても良い。
【００７０】
次に本発明の第２の実施の形態を説明する。
本実施の形態は、第１の実施の形態の入出力二重化装置１に対して、さらにＣＰＵモジュール２のメモリ空間を削減するものである。
【００７１】
＜ＣＰＵモジュールのメモリ空間＞
本実施の形態によるメモリ空間を図８に示す。
メモリ空間は、入出力モジュールのステータス情報を読み込み、制御信号を出力するためのメモリ空間、すなわちモジュールを管理するための空間（Ｉ／Ｏ管理空間という）と、入出力モジュールとの間で入出力データを受け渡すための空間（Ｉ／Ｏデータ空間という）に分けられている。
【００７２】
そして、Ｉ／Ｏ管理空間は、各入出力モジュールごとに割り付けられ、Ｉ／Ｏデータ空間は、入出力モジュールのペアごとに割り付けられている。
【００７３】
Ｉ／Ｏデータ空間に対しては、以下に説明するようにＣＰＵモジュール２は稼動側モジュールのみとデータの受け渡しを行う。
【００７４】
図９は、第２の実施の形態による入出力モジュール１０の機能ブロック図である。図１に対して、さらに動作モード判定部３０が加わっている。また、本実施の形態による入出力モジュール１０の動作モード判定部３０とＢＵＳＩ／Ｆ回路１５の構成を図１０に示す。
【００７５】
図１０に示すＢＵＳＩ／Ｆ回路１５は、図８のメモリ空間、特に二重化を構成する入出力モジュール間で同一のＩ／Ｏデータ空間を割り付けるための回路構成の一例を示している。
【００７６】
ＢＵＳＩ／Ｆ回路１５は、共有メモリ８２と、ステータス情報等をバス３に出力するゲート回路８３を有している。また、ＢＵＳＩ／Ｆ回路１５は、Ｉ／Ｏデータ空間を選択するための上位アドレスのデコード回路８１、Ｉ／Ｏデータ空間の中でペアとなるスロットに実装された入出力モジュールの共有メモリ８２を選択するための一致回路８４、デコード回路８１、一致回路８４、および後述する自系動作モード信号を入力して共有メモリ８２の選択信号を生成するＡＮＤ回路８５、さらに、Ｉ／Ｏ管理空間を選択するためのデコード回路８６、スロットごとに選択信号を生成するための一致回路８７、回路８６，８７の出力からゲート回路８３の選択信号を生成するＡＮＤ回路８８で構成されている。
【００７７】
ゲート回路８３には、ＣＰＵ回路１１から出力されるステータス情報と自系動作モードの信号が入力されている。
【００７８】
本実施の形態では、スロットＩＤは、Ｓ３（ＭＳＢ）〜Ｓ０（ＬＳＢ）の４ビットで識別され、スロットごとに連番となっている。図１０の例では、Ｓ２とＳ０が抵抗Ｒ６９を通してプルアップされ、Ｓ３とＳ１が０Ｖに接続されているので、スロットＩＤ"５"を表している。
【００７９】
一致回路８４には、スロットＩＤのＬＳＢを除くＳ３〜Ｓ１が入力され、アドレスバスのうちペアごとの共有メモリ空間を選択するための中位アドレスと比較され、完全に一致した場合に論理"１"が出力される。
【００８０】
一方、一致回路８７には、スロットＩＤの全ての信号Ｓ３〜Ｓ０が入力され、アドレスバスのうちスロットごと（即ち入出力モジュールごと）のＩ／Ｏ管理空間を選択するためのアドレス（例えば下位４ビット）と比較され、完全に一致した場合に"１"が出力される。
【００８１】
動作モード判定部３０は、ＣＰＵ回路１１のモード設定信号を保持（ラッチ）する保持回路３１、保持回路３１の出力を入力するＮＡＮＤ回路３２ａ、ＮＡＮＤ回路３２ａの出力と繋がり、その出力を増幅あるいは信号変換して自系稼動信号として相手系へ送信する送信回路３４、ＮＡＮＤ回路３２ａと共にＲＳフリップフロップを構成するＮＡＮＤ回路３２ｂ、相手系から送られてくる稼動信号を入力する受信回路３５、受信回路３５の入力を反転して、ＮＡＮＤ回路３２ｂの入力とするＮＯＴ回路３３ａを有している。また、ＮＡＮＤ回路３２ａの出力は、ＮＯＴ回路３３ｂを介してＣＰＵ回路１１に入力され、自系動作モード信号として読み込み可能になっている。また、バス３の書き込み信号と、Ｉ／Ｏ管理空間のデコード信号がＡＮＤ回路３６を介してＤ型フリップフロップ（以下、「ＤＦ／Ｆ」という）３７のクロック入力に接続され、バス３のデータ信号がＤＦ／Ｆ３７のＤ入力端子に接続されている。ＤＦ／Ｆ３７の出力Ｑの反転端子はＮＡＮＤ回路３２ａの入力に接続されている。さらに、送信回路３４の出力は相手系の受信回路３５と接続され、相手系の送信回路３４は自系の受信回路３５と接続される。
この動作モード判定部３０は、通信部９６とは別個に設けられている。
【００８２】
次に上記の構成を有する入出力二重化装置１の動作を説明する。
＜入出力モジュールの動作モード調整処理＞
本実施の形態による入出力モジュールの動作モード調整手段７２の処理手順を図１１に示す。図５に示した第１の実施の形態の手順との違いとして、ステップＳ２２２で自系の動作モードを稼動モードに設定する処理を、保持回路３１に"１"を出力する処理（Ｓ２２２ａ）に代え、また、ステップＳ２０４、Ｓ２１０、Ｓ２１７で自系の動作モードを「待機」に設定する処理を、保持回路３１に"０"を出力する処理（Ｓ２０４ａ、Ｓ２１０ａ、Ｓ２１７ａ）に代えている。さらに、ステップＳ２０７でステータス情報として「正常」設定をした後に、自系動作モードの値（即ちＮＯＴ回路３３ｂの出力値）を読み込み、その値が"０"のときはステップＳ２０８へ移行し、入力値が"１"のときはステップＳ２０１へ戻る処理（Ｓ２０７ａ）を追加している。
【００８３】
なお、本実施の形態では、動作モードは、共有メモリ８２を介してＣＰＵモジュール２へ通知するのではなく、ＣＰＵモジュールがＩ／Ｏ管理空間にアクセスして、ゲート回路８３を介して自系動作モードの値を読み込むことにより、稼動／待機情報を取得する。
【００８４】
＜動作モード判定部３０の作用＞
動作モード判定部３０の作用を簡単に説明する。入出力モジュール１０は、電源ＯＮ又はシステムリセットにより、ＣＰＵ回路１１からリセット信号が出力され、そのリセット信号は保持回路３１に入力される。保持回路３１は、リセット信号を入力することによって、"０"を出力する。これによりＮＡＮＤ回路３２ａの出力および送信回路３４の出力は"１"となる。送信回路３４から出力される自系稼動信号は、自系が稼動モードであることを相手系に通知する信号であり、"０"ならば稼動モード、"１"ならば待機モードであることを意味する。電源ＯＮ又はシステムリセット直後の初期状態においては、"１"すなわち待機モードであるが、図１１のステップＳ２２２ａで、保持回路３１に"１"が出力されるタイミングでは、相手系は待機モードであるため、ＮＡＮＤ回路３２ｂの出力は"１"、また、ＤＦ／Ｆ３７の反転出力も"１"なので、ＮＡＮＤ回路３２ａの出力は"０"になる。この信号は、相手系の入出力モジュールに対しては、相手系稼動信号として受信回路３５で受信される。相手系はこの時点では待機モードであるため、相手系のＮＡＮＤ回路３２ｂの入力は全て"１"となり、ＮＡＮＤ回路３２ｂの出力は"０"となる。このため、相手系では、保持回路３１の出力値によらず、常にＮＡＮＤ回路３２ａの出力は"１"、つまり待機モードが維持されることになる。
【００８５】
すなわち、動作モード判定部３０から出力される自系稼動信号は、相手系の動作モードの変化をロックする機能を有することになる。
【００８６】
一方、稼動モードである自系では、ＣＰＵ回路１１が異常を検知して、待機モードへ移行したり、リセット信号を発生したり、あるいは、ＣＰＵモジュール２から稼動／待機切替指令が出力された場合は、ＮＡＮＤ回路３２ａの入力が"０"になるため、自系稼動信号は"１"になる。これにより、相手系に対するロックが解除され、相手系が稼動モードへの移行が可能になる。
【００８７】
このように、本実施の形態では、ソフトウェアとハードウェアを組み合わせて動作モードの管理をするので、頻繁なモード変化を防止すると共に、両方の入出力モジュールが同時に稼動モードになるような事態が発生する可能性を低くすることができる。
【００８８】
＜ＢＵＳＩ／Ｆ回路１５の作用＞
本実施の形態の一致回路８４では、連番のスロットＩＤの最下位ビット（ＬＳＢ）をマスクしてアドレスと比較しているため、最下位ビットのみが異なるスロットは同じアドレス範囲が割り付けられることになる。したがって、スロットＩＤが、０と１、２と３、４と５・・・というように隣同士にペアとなる入出力モジュールを実装しておけば、同じメモリ空間で、自系動作モード信号により稼動側の入出力モジュールのみがアクセス可能になる。すなわち、自系動作モード信号がＡＮＤ回路８５の入力になっているので、ＣＰＵモジュール２からのアクセスにより、稼動側の共有メモリ選択信号（ＡＮＤ回路８５の出力）はイネーブルになり、共有メモリからのデータの読み出し／共有メモリへのデータの書き込みが行われる。一方、待機側の自系動作モード信号は"０"なので、ＣＰＵモジュール２からのアクセスの有無にかかわらず、共有メモリ選択信号はイネーブルにならない。これにより、ＣＰＵモジュール２のＩ／Ｏデータ空間を節約することができる。
【００８９】
＜ＣＰＵモジュールからのデータ読み出し／書き込み処理＞
図１２に本実施の形態によるＣＰＵモジュール２の入出力処理の手順を示す。
ＣＰＵモジュール２は起動すると、まずＩ／Ｏ管理空間にアクセスして、入力領域１と入力領域２のステータス情報を取得する（Ｓ４０１）。この時点で、いずれか一方でも異常があれば（Ｓ４０２で「ＮＯ」）、外部にエラー通知を行う（Ｓ４０３）。
【００９０】
次に、外部からの切替要求の有無を判定し、切替要求が有る場合は、稼動／待機切替指令を出力する（Ｓ４０５）。その後、起動遅延の設定時間経過したか否かを判定し（Ｓ４０６）、経過していない場合は、ステップＳ４０４へ戻る。経過している場合は、次にＩ／Ｏデータ空間にアクセスして共有メモリに設定パラメータを書き込む（Ｓ４０７）。
【００９１】
続いて、入力領域１と入力領域２のステータス情報を取得して（Ｓ４０８）、待機側が異常の場合は（Ｓ４０９で「ＮＯ」）、外部に待機側モジュールの交換指示を出力する（Ｓ４１０）。稼動側が異常の場合は（Ｓ４１１で「ＮＯ」）、稼動／待機指令を出力して（Ｓ４１３）、一定時間遅延後（Ｓ４１４）、ステップＳ４０８に戻って以降の処理を繰り返す。一定時間遅延させるのは、入出力モジュール間での動作モード切替処理の完了を待つためである。
【００９２】
ステップＳ４１１で稼動側が正常の場合は、入出力領域に対してデータの読み出し、またはデータの書き込みの処理を行い（Ｓ４１２）、その後ステップＳ４０８へ戻って以降の処理を繰り返す。
【００９３】
＜ＣＰＵモジュールから切替指令＞
ＣＰＵモジュール２はＩ／Ｏ管理空間にアクセスして、入出力モジュールごとに、異常の有無等のステータス情報や動作モード等のデータを取得する。ＣＰＵモジュール２は取得したデータによって稼動側の異常を検知したときは、Ｉ／Ｏ管理空間に対して稼動／待機切替指令を出力する。この切替指令は、稼動側モジュールについては、稼動モードから待機モードへ強制的に切り替えるものであり、これにより待機側モジュールは、動作モード調整手段７２によって稼動側に移行する。
【００９４】
これにより、ＣＰＵモジュール２は新たに稼動側になった入出力モジュールとデータの受け渡しを行うことができる。また、強制的に待機モードへ切り替えられた入出力モジュールの共有メモリ選択信号はハードウェアでロックされるので、ソフトウェアの暴走等によりイネーブルになることはない。
【００９５】
本実施の形態によれば、入出力モジュール間で稼動／待機の動作モードの調整処理（二重化制御）を行い、ＣＰＵモジュールは、二重化制御をする必要がないので、ＣＰＵモジュールの処理負荷を軽減することができる。また、ＣＰＵモジュール側のアドレス空間を節約することができるので、安価な入出力二重化装置を実現することができる。
【００９６】
次に、第３の実施の形態を説明する。
一般に、アナログ入力モジュールは、現地でシステム立ち上げ時に、現地の外部機器（センサ、アクチュエータ等）の特性に合わせて調整する必要がある。
【００９７】
これは、図１８に示すように、アナログ入力値（横軸）とＡ／Ｄ変換値（縦軸）の対応関係をユーザが変更したり、入出力二重化装置の設置環境、たとえば、外部機器９のアナログ出力回路の特性、接続ケーブル９２のインピーダンス、各装置の接地状態などによって、アナログ出力値のＡ／Ｄ変換値が所望の値からずれる場合があり、このずれを補正する必要があるからである。
【００９８】
このため、従来はシステム立ち上げ時には、稼動側モジュール、待機側モジュールの両方とも現地調整を行い取得した機器調整値によってＡ／Ｄ変換値を補正していた。また、もし、一方が故障して別のアナログ入力モジュールと交換するような場合は、その交換品に対しても現地調整を行う必要があり、システムの停止を余儀無くされることも度々あった。
【００９９】
本実施の形態は、アナログ入力モジュールについて、特に現地調整によってＡ／Ｄ変換値を補正するが、この補正処理を稼動側についてのみ行い、その補正値を待機側に対して送信するというものである。
【０１００】
なお、上述した動作モード調整処理やＣＰＵモジュールとの受け渡しにおいては、第１の実施の形態と同様であるので、説明を割愛する。また、以下の説明においては、稼動／待機の動作モードの初期値は予めアナログ入力モジュールの不揮発性メモリに格納しておくか、モジュールに搭載されているスイッチの設定を読み込むこととしているが、第１または第２の実施の形態で説明したように動作モード調整手段７２によって、稼動，待機を決定するようにしても良い。
【０１０１】
以下、入出力モジュールとして、アナログ入力モジュールを例にして本実施の形態による入出力二重化装置について説明する。
【０１０２】
図１３は、入出力モジュールとしてアナログ入力モジュールを用いたときの入出力二重化装置のブロック図である。アナログ入力モジュール１０の外部Ｉ／Ｆ部９７は、外部機器９から出力されるアナログ信号を入力し、入力したアナログ信号の大きさに基づいて所定の大きさの電気信号を出力する複数の入力回路９８、各入力回路９８から出力される電気信号のうち一つを選択するマルチプレクサ回路（以下、ＭＰＸ）１４、ＭＰＸ１４の出力信号を一定時間保持するサンプルホールド回路（ＳＨ）１９、アナログ信号をデジタル信号に変換してＣＰＵ回路１１に渡すＡ／Ｄ変換器（以下、ＡＤＣ）１２で構成されている。
【０１０３】
なお、ＡＤＣ１２を絶縁型にするなど、必要により外部Ｉ／Ｆ部９７側とＣＰＵ回路１１側は絶縁されている。
【０１０４】
図１４は、図１３のアナログ入力モジュール１０の機能ブロック図である。図１４において、アナログ入力モジュール１０は、ＢＵＳＩ／Ｆ回路１５を介して、ＣＰＵモジュール２との間でデータの受け渡し処理を行うＣＰＵＩ／Ｆ手段４１、ＣＰＵモジュール２から送られてくる基本情報（稼動／待機の初期値６１，ユーザ要求値scale６２，理論調整値scale６３）をＣＰＵ回路１１の内部の図示しない記憶部４０に保存する基本情報登録手段４２、外部機器９などから出力されるアナログ信号を外部Ｉ／Ｆ部９７を介して入力し、入力された計測値をＣＰＵモジュール２からの指令によって、校正値６４、機器調整値６５、計測値６６のそれぞれの記憶領域へ保存する計測値入力手段４３、稼動モードのときに理論調整値scale６３，校正値６４，機器調整値６５を用いて理論調整値６７を演算する調整値変換手段４４、この理論調整値６７と理論調整値scale６３を用いて稼動側から待機側へ送るための補正値を演算する補正値算出手段４５、機器調整値６５，計測値６６，ユーザ要求値scale６２を用いてＣＰＵモジュール２のアプリケーションプログラムへ渡すための修正後計測値（以下、これを出力値という。）を演算する出力値算出手段４６、補正値算出手段４５によって算出された補正値を待機側へ送信する補正値送信手段４７、待機モードのときに稼動側から送られてくる補正値を受信する補正値受信手段４８、二重化構成において相手側の健全性確認その他のパラメータの受け渡しを行い相手側が正常か異常かの判定結果を出力するコマンド送受信手段４９、補正値受信手段４８によって補正値が受信されたときに、この補正値と理論調整値scale６３，校正値６４を用いて機器補正値６９を演算する機器補正値変換手段５０、この機器補正値６９と校正値６４を用いて機器調整値６５を演算する機器調整値算出手段５１、稼動／待機の初期値６１とコマンド送受信手段４９から出力される判定結果から自系が稼動モードで動作すべきか待機モードで動作すべきかを決定する稼動／待機判定手段５２を備えている。ここで、各手段４１〜５２はＣＰＵ回路１１の演算部によって動作するプログラムによって実現可能な機能であり、各データ６１〜７０は、ＣＰＵ回路１１の記憶部に保存されるデータである。なお、記憶部として、電源断時にもデータ保持可能な不揮発メモリを用いるのが好ましい。
【０１０５】
次に上記の構成を有する入出力二重化装置１の動作を図１４と図１５を用いて説明する。ここで、図１５は、図１４に示すアナログ入力モジュール１０を稼動側と待機側の二重化構成で用いた場合の処理概要の説明図である。
【０１０６】
［稼動側の動作］
＜基本情報登録処理＞
基本情報登録手段４２は、ＣＰＵＩ／Ｆ手段４１を介してＣＰＵモジュール２から渡された基本情報を記憶部４０の基本情報保存領域に格納する。
【０１０７】
上記において、ＣＰＵモジュール２から渡される基本情報には、アプリケーションプログラムに渡すアナログ入力値のデータレンジを示すユーザ要求スケール値（ユーザ要求値scale）６２、入力するアナログ値の範囲とデジタル値の範囲との対応関係を指定する稼動側と待機側共通のスケール値（理論調整値scale）６３がある。なお、ユーザ要求値scale６２と理論値scale６３は共通にすることもできるが、ユーザ要求値scale６２はアプリケーションプログラムと密接に関連するものであり、ＯＳや下位層のいわゆる基本プログラムで管理するのが好ましい理論調整値scale６３とは別々に設定できるようにしておくのが良い。
【０１０８】
なお、基本情報のうち稼動／待機の初期値６１は、アナログ入力モジュール１０に不揮発性メモリあるいはスイッチ等の入力手段を設けて、この設定状態を初期値として読み込む。また、運用状態においてアナログ入力モジュールの故障によって差替えられた新たなアナログ入力モジュールは、初期値として待機の設定がなされるものとする。
【０１０９】
スケール値などの範囲を指定するデータは、下限（Low側）と上限（High側）で指定するので、以降の説明においてLow側のデータを［Lo］、High側のデータを［Hi］で表す。
【０１１０】
＜計測値入力処理＞
計測値入力手段４３は、外部Ｉ／Ｆ部９７を介して外部機器９から出力されたアナログ信号を入力する。
なお、入力信号は、外部Ｉ／Ｆ部９７のＡ／Ｄ変換器１２によってデジタルデータとして入力され、当該外部機器のＩＤと関連付けられてＣＰＵ回路１１の記憶部に保存される。
【０１１１】
＜校正値登録処理＞
アナログ入力モジュール１０は、出荷に際して校正が必要になるが、入力信号として校正用の基準となるアナログ信号が入力される。この信号は、計測値入力手段４３によって入力処理されるが、このときＣＰＵモジュール２を経由して同モジュールに接続されたユーザインタフェース（タッチパネルやメンテナンスツール）から入力信号が校正値であることを示す指令を送信するようにし、この指令から当該アナログ入力モジュール１０の計測値入力手段４３は、入力信号が校正値であることを認識して、記憶部４０の該当する校正値保存領域に保存する。この校正処理は、稼動側、待機側を問わず全てのアナログ入力モジュールについて実施する。
【０１１２】
＜機器調整値登録処理＞
現地では、運用前に外部機器９の特性に合わせるための調整処理が行われる。調整処理としては、上記校正値登録処理と同様にＣＰＵモジュール２から入力信号が機器調整値であることを示す指令をアナログ入力モジュール１０へ送り、外部機器９から調整用の信号を入力する。アナログ入力モジュール１０の計測値入力手段４３は、この指令から入力信号が機器調整値であることを認識して、記憶部４０の該当する機器調整値保存領域に保存する。この調整処理は、二重化されたアナログ入力モジュール１０のうち、稼動側のモジュールに対してのみ実施する。なお、読み込んだ校正値、機器調整値の記憶部４０への書き込み処理もＣＰＵモジュール２からの指令によって行われる。
【０１１３】
＜調整値変換処理＞
次に、調整値変換手段４４は、記憶部に保存されている理論調整値scaleと校正値と機器調整値を抽出し、次の式（１Ｌ），式（１Ｈ）により理論調整値を計算する。計算結果は、記憶部の理論調整値保存領域に格納される。
【０１１４】
理論調整値[Lo] = 理論調整値Scale[Lo] + (機器調整値[Lo] - 校正値[Lo])×(理論調整値Scale[Hi] - 理論調整値Scale[Lo])／（校正値[Hi]−校正値[Lo]）
・・・（１Ｌ）
理論調整値[Hi] = 理論調整値Scale[Lo] + (機器調整値[Hi] - 校正値[Lo])×(理論調整値Scale[Hi] - 理論調整値Scale[Lo])／（校正値[Hi]−校正値[Lo]）
・・・（１Ｈ）
【０１１５】
なお、上記の式（１Ｌ），式（１Ｈ）のうち、(理論調整値Scale[Hi] - 理論調整値Scale[Lo])／（校正値[Hi]−校正値[Lo]）を調整用スケール変換データという。
【０１１６】
具体例として、設定された理論調整値Scale[Lo]＝0，理論調整値Scale[Hi]＝30000、ユーザ要求値Scale[Lo] ＝ 0，ユーザ要求値Scale[Hi]＝16000、収集された校正値[Lo]＝0，校正値[Hi]＝32000、機器調整値[Lo]＝3200，機器調整値[Hi]＝32000，稼動側計測値＝32000の場合について以下に各手段の計算結果を示す。
【０１１７】
この具体例の場合、調整値変換手段４４の出力は、式（１Ｌ），式（１Ｈ）より、理論調整値[Lo]＝3000，理論調整値[Hi]＝30000となる。
【０１１８】
理論調整値を求める理由は、稼動側モジュールが何Ｖ調整したかを待機側モジュールに伝えるためには0-10V/0-30000のように電圧とスケールを一致させておく必要があるからである。
【０１１９】
＜補正値算出処理＞
次に、補正値算出手段４５は、記憶部に格納されている理論調整値６７と理論調整値scale６３を抽出し、式（２Ｌ），（２Ｈ）により補正値を計算する。計算結果は、記憶部の補正値保存領域に格納される。
【０１２０】
補正値[Lo]＝理論調整値[Lo]−理論調整値Scale[Lo]     ・・・（２Ｌ）
補正値[Hi]＝理論調整値[Hi]−理論調整値Scale[Hi]     ・・・（２Ｈ）
【０１２１】
上記具体例では、理論調整値Scale[Lo]＝0，理論調整値Scale[Hi] ＝30000、調整値変換手段４４で算出した理論調整値[Lo]＝3000，理論調整値[Hi]＝30000であるから式（２Ｌ）,式（１Ｈ）より、補正値[Lo]＝3000，補正値[Hi]＝0となる。
【０１２２】
＜補正値送信処理＞
次に、補正値送信手段４７は、算出した補正値を待機側モジュールへ向けて送信する。
【０１２３】
＜出力値算出処理＞
その後、運用状態において、入力処理を実行する。計測値入力手段４３は、外部機器９からの入力信号を記憶部４０の計測値保存領域に格納する。
【０１２４】
出力値算出手段４６は、この計測値保存領域に保存されている計測値６６と、同じく記憶部４０に保存されている機器調整値６５とユーザ要求値scale６２を用いて、式（５）によりＣＰＵモジュール２へ出力するためのデータ（稼動側出力値）を計算する。
【０１２５】
稼動側出力値 = ユーザ要求値Scale[Lo]＋(稼動側計測値−機器調整値[Lo])×(ユーザ要求値Scale[Hi]−ユーザ要求値Scale[Lo])／(機器調整値[Hi]−機器調整値[Lo])
・・・  （５）
【０１２６】
上記具体例では、ユーザ要求値Scale[Lo] = 0，ユーザ要求値Scale[Hi] = 16000、機器調整値[Lo] = 3200，機器調整値[Hi] = 32000、稼動側計測値=32000であるから、式（５）より、ＣＰＵモジュール２へ渡す計測データとして、稼動側出力値=16000となる。
【０１２７】
［待機側の動作］
待機側モジュールの処理として、上記の基本情報登録処理、計測値入力処理、校正値登録処理、および出力値算出処理は稼動側モジュールと同様の処理内容を実行するが、このとき機器調整値については、計測値入力手段４３によって入力するのではなく次の処理によって受信した補正値から演算する。
【０１２８】
＜補正値受信処理＞
待機側モジュールの補正値受信手段４８は、稼動側から送られてきた補正値６８を受信すると、記憶部４０の補正値保存領域に格納する。
【０１２９】
＜機器補正値変換処理＞
次に、機器補正値変換手段５０によって、記憶部４０に保存されている補正値６８と理論調整値scale６３と校正値６４とを用いて、次の式（３Ｌ），式（３Ｈ）によって、機器補正値６９を計算する。計算結果は、記憶部４０の機器補正値保存領域に格納される。
【０１３０】
機器補正値[Lo] = (補正値[Lo]−理論調整値Scale[Lo])×（校正値[Hi]−校正値[Lo]）／(理論調整値Scale[Hi]−理論調整値Scale[Lo])                  ・・・（３Ｌ）
機器補正値[Hi] = (補正値[Hi]−理論調整値Scale[Lo])×（校正値[Hi]−校正値[Lo]）／(理論調整値Scale[Hi]−理論調整値Scale[Lo])                  ・・・（３Ｈ）
【０１３１】
なお、上記の式（３Ｌ），式（３Ｈ）のうち、（校正値[Hi]−校正値[Lo]）／(理論調整値Scale[Hi]−理論調整値Scale[Lo])の項は、調整用スケール変換データに該当している。
【０１３２】
具体例として、ＣＰＵモジュール２から設定される理論調整値は稼動側と同じ値であり、理論調整値Scale[Lo] = 0，理論調整値Scale[Hi] = 30000である。また、校正値としては校正値[Hi] = 28000，校正値[Lo] =0とする。このとき、稼動側から送られてくる補正値は、補正値[Lo] = 3000，補正値[Hi] = 0なので、上記の式（３Ｌ），（３Ｈ）より、機器補正値[Lo] =2800 ，機器補正値[Hi] =0となる。
【０１３３】
＜機器調整値算出処理＞
次に、機器調整値算出手段５１は、記憶部４０に格納されている機器補正値６９と校正値６４を抽出して、次の式（４Ｌ），（４Ｈ）により、機器調整値６５を計算する。計算結果は、記憶部４０の機器調整値保存領域に格納される。
【０１３４】
機器調整値[Lo]＝校正値[Lo]＋機器補正値[Lo]       ・・・（４Ｌ）
機器調整値[Hi]＝校正値[Hi]＋機器補正値[Hi]       ・・・（４Ｈ）
【０１３５】
上記具体例では、校正値[Lo]＝0，校正値[Hi]＝28000、機器補正値[Lo]＝2800，機器補正値[Hi]＝0なので、式（４Ｌ），式（４Ｈ）より、機器調整値[Lo]＝2800，機器調整値[Hi]＝28000になる。この機器調整値算出手段５１によって算出された機器調整値で計測値を修正することにより、アナログ入力モジュールの個体差が吸収される。
【０１３６】
＜出力値算出処理＞
待機側モジュールでアナログ入力処理を行う場合は、記憶部４０に保存されている計測値６６、ユーザ要求値scale６２、および機器調整値６５を抽出し、上記の式（５）により、待機側入力値を計算する。そして、稼動／待機判定手段５２によって、稼動側モジュールが故障したと判定した場合は、待機側が新たな稼動側となり、ユーザ要求値scale６２によってスケール変換された計測値をＣＰＵモジュール２に送る。なお、具体例として、待機側計測値=28000の場合には、式（５）より、待機側出力値=16000となる。すなわち、本実施の形態の演算処理によれば、ＣＰＵモジュール２へ出力するデータ値は、稼動側と待機側で同じになる。
【０１３７】
なお、故障したモジュールは、新たなアナログ入力モジュールと交換されるが、このとき、この新たなアナログ入力モジュールは待機側に設定され、出荷時に校正処理が行われ、校正値６４が記憶部４０に保存されているものとする。このモジュールが現地の入出力二重化装置１に実装されると、稼動側モジュールは、保存されている補正値を補正値送信手段４７によって、当該交換された待機側モジュールへ送り、待機側モジュールは、上述した待機側モジュールの処理を実行する。
【０１３８】
以上、入出力二重化装置１の各手段の処理内容について説明した。次に入出力二重化装置１の現地での動作、特に補正値の送信処理、他系の異常検出処理、および稼動/待機の切替処理について図１６のフローチャートを用いて説明する。
【０１３９】
まず、アナログ入力モジュール１０は、電源ＯＮによってＣＰＵ回路１１の記憶部４０から「調整値」、「二重化設定」のフラグ、「稼動／待機」の別、「補正値」を各データの保存エリアから読み出し（Ｓ１０１）、二重化設定でない場合は、単独運転処理を実行する（Ｓ１０２）。この場合は、補正値送信手段４７、補正値受信手段４８、コマンド送受信手段４９は機能させない。
【０１４０】
稼動／待機判定手段５２は、稼動／待機の初期状態６１から、自モジュールが稼動設定されている場合は（Ｓ１０４で「ＹＥＳ」）、計測値入力手段４３はＣＰＵモジュール２からの指令により自モジュールは調整中か否かを判定する（Ｓ１０５）。
【０１４１】
自モジュールが調整中の場合は（Ｓ１０５で「ＹＥＳ」）、調整用の入力値（機器調整値）を取得して、調整値変換手段４４により理論調整値を算出する（１０６）。
【０１４２】
次に、補正値算出手段４５を起動して、理論調整値を元に補正値を算出する（Ｓ１０７）。そして、記憶部４０への書き込み要求が有る場合は、機器調整値と補正値を記憶部４０へ書き込む（Ｓ１０９）。
【０１４３】
続いて、補正値送信手段４７により通信ケーブル５を経由して、算出した補正値を待機側モジュールへ転送する（Ｓ１１０）。なお、この転送により待機側モジュールは稼動側モジュールの健全性を検知する。
【０１４４】
その後、コマンド送受信手段４９は待機側モジュールから補正値の受信完了のレスポンスがあったか否かを判定し（Ｓ１１１）、レスポンスがあった場合は、その後周期的に待機側モジュールへ生存確認等の所定のコマンドを送信する（Ｓ１１３）。なお、互いに相手方の正常性を確認する手法としては、いわゆるハローコールなど予め定められた手順によって所定のデータ（補正値でも良い）を受け渡すことによって実現することができる。
【０１４５】
一方、レスポンスが無い場合は、再度、補正値を待機側モジュールに転送すると共に（Ｓ１１２）、入力処理を実行し（Ｓ１１４）、出力値算出手段４６により機器調整値等をもとに入力値を補正する（Ｓ１１５）。
【０１４６】
そして、待機側モジュールが正常か否かをステップＳ１１３のコマンド送信のレスポンスによって確認し（Ｓ１１６）、一定時間または一定回数レスポンスが無い場合は、ＣＰＵモジュール２に待機側モジュールが異常であることを通知して（Ｓ１１７）、ステップＳ１０５へ戻り以降の処理を繰り返す。
【０１４７】
一方、ステップＳ１０４で、自モジュールが待機側設定の場合は、補正値受信手段４８により補正値の受信があったか否かを判定し（Ｓ１１８）、補正値の受信があった場合は、受信した補正値を記憶部４０に書き込む（Ｓ１１９）。
【０１４８】
そして、機器補正値変換手段５０および機器調整値算出手段５１により補正値を機器調整値に変換する（Ｓ１２０）。また、稼動側モジュールに補正値の受信完了レスポンスを送信する（Ｓ１２１）。
【０１４９】
その後は、稼動側モジュールへ生存確認等のコマンド送受信処理を行い（Ｓ１２２）、稼動側モジュールが正常か否かの確認を行う（Ｓ１２３）。
【０１５０】
そして、稼動側モジュールが正常の場合は、入力処理を実行して、ステップＳ１１８へ戻り以降の処理を繰り返す。一方、ステップＳ１２３で、稼動側モジュールが正常でないと判定した場合は、稼動／待機判定手段５２によりＣＰＵモジュール２へ稼動側が異常であることを通知して、記憶部４０の稼動／待機の設定を稼動に書き換えて、自モジュールが稼動側に切り替わり（Ｓ１２６）、ステップＳ１０５へ移行して、以降の処理を実行する。
【０１５１】
なお、このとき、オンライン状態で新たに稼動側へ切り替わったアナログ入力モジュールは、ステップＳ１０５では、自モジュールは調整中ではないため、ステップＳ１１１へジャンプする。このとき、異常と判定された相手側モジュールは、待機側扱いとなるが、この待機側モジュールからは、補正値受信完了レスポンスはないため、Ｓ１１２へ移行し、自モジュールの記憶部４０に保存されている機器調整値を用いて入力値を補正し、ＣＰＵモジュール２へ渡す。
【０１５２】
その後、待機側モジュールが交換された場合は、ステップＳ１１２の処理によって、新たに稼動側となったモジュールの記憶部４０に保存されている補正値が待機側モジュールへ転送されることになる。一方、交換された待機側モジュールは、ステップＳ１０４で「ＮＯ」となり、ステップＳ１１８へ移行し、補正値を受信し自モジュールの記憶部４０へ保存し、以後はこの補正値を用いて機器調整値を算出し、これにより入力値を補正することになる。  
【０１５３】
［理論調整値scaleと校正値・機器調整値との関係］
図１７は、理論調整値scale（外部A/D変換値）と、校正値および機器調整値との関係を示す説明図である。ここで、理論調整値scaleは、ＣＰＵモジュール２から指定されるＡ／Ｄ変換の範囲を示す値（スケール値）であるため、外部Ａ／Ｄ変換値と言い、校正値および調整値は、入力されたアナログ値（この例では電圧値）に対応するアナログ入力モジュール内のＡＤＣ１２のＡ／Ｄ変換値であるため内部Ａ／Ｄ変換値と言う。
【０１５４】
この表において、電圧の単位を[v]、デジタル値の単位を[d]で表している。
まず、ＣＰＵモジュール２からは、基準となるスケール値として0[v]−10[v]の入力範囲に対して、電圧0[v]に対しては、0[d]（理論調整値scale[Lo]）、電圧10[v]に対しては、30000[d]（理論調整値scale[Hi]）の対応関係が設定される。
【０１５５】
次に、校正段階において、電圧0[v]の印加に対する内部Ａ／Ｄ変換値（校正値[Lo]）が0[d]、電圧10[v]の印加に対する内部Ａ／Ｄ変換値（校正値[Hi]）が32000[d]であったとすると、図１７（ａ）の直線Ａのようになる。なお、この例では、説明の便宜上、原点（0[d]）を合わせるように、入力値をシフト、すなわち[Lo]側の差分だけ [Hi]側も差し引くように補正することを前提としているが、計測値をそのまま用いるようにしても良い。
【０１５６】
次に、現地での調整段階において、電圧0[v]の印加に対する内部Ａ／Ｄ変換値（機器調整値[Lo]）が3200[d]、電圧10[v]の印加に対する内部Ａ／Ｄ変換値（機器調整値[Hi]）が32000[d]であったとすると、図１７（ａ）の直線Ｂのようになる。なお、この例では、機器調整値[Hi]を校正値[Hi]に合わせるようにシフトしているが、計測値をそのまま用いるようにしても良い。
【０１５７】
このとき、式（１Ｌ），式（１Ｈ）から理論調整値[Lo]＝3000、理論調整値[Hi]＝30000となるが、これは、機器調整値[Lo]、機器調整値 [Hi]をそれぞれ、校正値のスケール（すなわち内部Ａ／Ｄ変換値のスケール）から理論調整値のスケール（外部Ａ／Ｄ変換値のスケール）に変換することを意味している。すなわち、この補正値は外部Ａ／Ｄ変換値のスケール上での補正値を意味する。
【０１５８】
このように、稼動側では、ＣＰＵモジュール２から指定された入力範囲のデジタル値（理論調整値scale）と校正値から調整用スケール変換データ（直線Ａ）を求め、入力した機器調整値をこの調整用スケール変換データによってスケール変換して、補正値を求め、該補正値を待機側へ送信しているのである。
【０１５９】
そして、待機側では、この補正値から式（３Ｌ），式（３Ｈ）により、機器補正値[Lo]、機器補正値[Hi]を計算する。この式（３Ｌ），式（３Ｈ）は、補正値を外部Ａ／Ｄ変換値のスケールから内部変換Ａ／Ｄ変換値のスケールへ変換する処理であり、機器補正値は、内部変換Ａ／Ｄ変換値のスケール上での値を意味している。
【０１６０】
そして、待機側の出荷時の校正値に対してこの機器補正値を加算することによって、機器調整値をそれぞれ[Lo]側、[Hi]側について求める（式（４Ｌ）,式（４Ｈ））。このときの校正値と機器調整値は、それぞれ直線Ｃ、直線Ｄのようになる。
【０１６１】
この機器調整値を用いて、式（５）により計測値を修正して、ＣＰＵモジュール２へ出力するのである。
【０１６２】
すなわち、待機側では受信した補正値をもとに調整用スケール変換データ（直線Ｃ）によって、待機用の補正値である機器補正値を算出し、該機器補正値を用いて、待機側の機器調整値を求めて、計測値を修正し出力値を算出しているのである。
【０１６３】
以上、本実施の形態によれば、入力範囲のデジタル値（理論調整値scale）と校正値から調整用スケール変換データを求め、入力した機器調整値をこの調整用スケール変換データによってスケール変換して補正値を求め、該補正値を待機側へ送信し、待機側では受信した補正値をもとに待機側の調整用スケール変換データによって、待機側の補正値である機器補正値を算出し、該機器補正値を用いて待機側の機器調整値を求めて、計測値を修正しＣＰＵモジュールへの出力値を算出する。
【０１６４】
これにより、現地の外部機器との接続に伴う調整は、最初に稼動側モジュールに対してのみ行えば良く、待機側モジュール、およびその後の交換したアナログ入力モジュールについては、最初の稼動側モジュールで計算した補正値を用いることによって、外部機器の特性に合わせる調整を自動的に行うことができるので、現地調整の手間が省け、作業効率が向上する。
【０１６５】
本発明は、上述した実施の形態に限定されること無く、その要旨を逸脱しない範囲で種々変形して実施をすることができる。
たとえば、稼動側から待機側へ補正値に送信の都度インクリメントされる連番を付して周期的に送るようにし、待機側はこの補正値の受信によって応答を返すようにしても良い。これにより、運用中に待機側が故障したときに活線状態で交換されたときでも稼動側から待機側へ補正値が送られ、稼動側においてその応答によって待機側の健全性を確認することができる。
【０１６６】
また、上述したように補正値送信手段４７は、理論調整値と理論調整スケール値（理論調整値scale）との差分を補正値として送信しても良いが、調整値変換手段４４で算出する理論調整値または基本情報を用いてこのデータに変換可能なデータを補正値として送信するようにしても良い。
【符号の説明】
【０１６７】
１  入出力二重化装置
２  ＣＰＵモジュール
３  バス
５  通信ケーブル
９  外部機器
１０  入出力モジュール  （アナログ入力モジュール含む）
１１  ＣＰＵ回路
１２  ＡＤＣ（Ａ／Ｄ変換器）
１４  ＭＰＸ（マルチプレクサ）
１５  ＢＵＳＩ／Ｆ回路
１９  サンプルホールド回路（ＳＨ）
２１  送信回路
２２  受信回路
２３  絶縁回路
３０    動作モード判定部
３１    保持回路
３２ａ，３２ｂ  ＮＡＮＤ回路
３３ａ，３３ｂ  ＮＯＴ回路
３４    送信回路
３５    受信回路
３６，８５，８８  ＡＮＤ回路
３７    ＤＦ／Ｆ    
４０  記憶部
４１  ＣＰＵＩ／Ｆ手段
４２  基本情報登録手段
４３  計測値入力手段
４４  調整値変換手段
４５  補正値算出手段
４６  出力値算出手段
４７  補正値送信手段
４８  補正値受信手段
４９  コマンド送受信手段
５０  機器補正値変換手段
５１  機器調整値算出手段
５２  稼動／待機判定手段  
７１    自己診断手段
７２    動作モード調整手段
７３    動作モード管理テーブル
８１，８６    デコード回路
８２    共有メモリ
８３    ゲート回路
８４，８７    一致回路
９２    接続ケーブル
９６  通信部
９７  外部Ｉ／Ｆ部
９８  入力回路
９９  従来のアナログ入力モジュール
１００  従来の入出力二重化装置  
【図１】
0005594116.tif 000002
【図２】
0005594116.tif 000003
【図３】
0005594116.tif 000004
【図４】
0005594116.tif 000005
【図５】
0005594116.tif 000006
【図６】
0005594116.tif 000007
【図７】
0005594116.tif 000008
【図８】
0005594116.tif 000009
【図９】
0005594116.tif 000010
【図１０】
0005594116.tif 000011
【図１１】
0005594116.tif 000012
【図１２】
0005594116.tif 000013
【図１３】
0005594116.tif 000014
【図１４】
0005594116.tif 000015
【図１５】
0005594116.tif 000016
【図１６】
0005594116.tif 000017
【図１８】
0005594116.tif 000018
【図１９】
0005594116.tif 000019
【図２０】
0005594116.tif 000020
【図２１】
0005594116.tif 000021
【図１７】
0005594116.tif 000022