(57)【特許請求の範囲】
【請求項１】
複数のＣＰＵモジュールと少なくとも１つの出力モジュールを備えるプログラマブルコントローラにおいて、
前記各ＣＰＵモジュールは、
出力モジュールに対して出力状態を変更するかどうかを指示する共有マスクを生成する共有マスク生成手段と、
前記出力モジュールに対する出力データを前記共有マスクと共に送信する出力データ送信手段と、
を備え、
前記出力モジュールは、
前記ＣＰＵモジュールからの前記出力データを前記共有マスクと共に受信する出力データ受信手段と、
前記出力データと共有マスクを各ＣＰＵモジュール毎にＡＮＤを取った第１のＡＮＤ値を求め、また各前記共有マスクの反転値と現在の出力値とのＡＮＤを取った第２のＡＮＤ値を求め、当該第１のＡＮＤ値と第２のＡＮＤ値のＯＲを取ったＯＲ値から出力状態を決定する共有及び競合制御手段と、
前記出力状態を示す参照出力を自出力モジュールを共有する複数のＣＰＵモジュールへ送信する参照出力送信手段と、
を備えることを特徴とするプログラマブルコントローラ。
【請求項２】
前記ＣＰＵモジュールは、前記共有マスク生成手段が生成した共有マスクを記憶する共有マスク記憶手段と、該共有マスク記憶手段に記憶されている共有マスクと出力モジュールから送信される前記参照出力から、当該ＣＰＵモジュール内において該出力モジュールの出力状態を示す参照データを生成する出力状態参照データ生成手段とを更に備えることを特徴とする請求項１に記載のプログラマブルコントローラ。
【請求項３】
前記出力状態参照データ生成手段が生成した前記出力モジュールの出力状態を示す参照データを、該出力モジュールに対する前記出力データを格納するアドレス領域と同じ領域に格納する参照データ格納手段を更に備えることを特徴とする請求項２記載のプログラマブルコントローラ。
【請求項４】
前記ＣＰＵモジュール及び出力モジュールはリング状の構成をもつバスによって接続され、前記ＣＰＵモジュール及び出力モジュールは、前記バス上にフレームを巡回させて他のモジュールとのデータの転送を行うことを特徴とする請求項１乃至３のいずれか１つに記載のプログラマブルコントローラ。
【請求項５】
前記ＣＰＵモジュールは前記出力モジュールに対してデータを送る場合マルチキャスト方式により、前記出力モジュールは前記ＣＰＵモジュールに対してデータを送る場合トータルフレーム方式によりデータの転送を行うことを特徴とする請求項４記載のプログラマブルコントローラ。
【請求項６】
前記出力データ送信手段は、前記出力データを送信する出力モジュールで該出力データに対し他のＣＰＵモジュールからの出力データとの共有及び競合制御を行う必要が無いとき、該出力データの送信時、前記共有マスクを送信しないことを特徴とする請求項１乃至５の何れか１つに記載のプログラマブルコントローラ。
【請求項７】
前記ＣＰＵモジュールは、前記共有マスクを前記出力データと共に送信したか否かを通知するデータ転送モード制御ビットを生成するデータ転送モード制御ビット生成手段を更に備え、前記出力データ送信手段は、該データ転送モード制御ビットを前記出力データと共に送信し、前記共有及び競合制御手段は、該データ転送モード制御ビットが前記共有マスクが前記出力データと共に送信されていないことを示すとき、該出力データのみから出力状態を決定することを特徴とする請求項６記載のプログラマブルコントローラ。
【請求項８】
前記出力データ送信手段は、他のＣＰＵモジュールと共有及び競合する出力点を持つ出力モジュールに対する出力指示を前記出力データとして送信するとき、前記共有マスクを該出力データと共に送信することを特徴とする請求項６に記載のプログラマブルコントローラ。
【請求項９】
前記共有マスク生成手段は、出力モジュールの他のＣＰＵモジュールと競合しない出力点に対応するビットを常時リセットし、競合する出力点に対応するビットは出力条件成立時にセットし、前記出力データ送信手段が出力データを送信するとリセットして前記共有マスクを生成することを特徴とする請求項１乃至８の何れか１つに記載のプログラマブルコントローラ。
【請求項１０】
前記ＣＰＵモジュールは、他のＣＰＵモジュールと競合する出力点へのデータの書込みがある場合、前記出力点を持つ前記出力モジュールに対して出力データの書込みと共に対応する共有マスクの書き換えを当該ＣＰＵモジュールが行う競合書込み用の書込み命令を備えることを特徴とする請求項１乃至９の何れか１つに記載のプログラマブルコントローラ。
【請求項１１】
ＣＰＵモジュールからの出力データを自己の出力状態を変更するかどうかを指示する共有マスクと共に受信する出力データ受信手段と、
前記出力データと共有マスクを各ＣＰＵモジュール毎にＡＮＤを取った第１のＡＮＤ値を求め、また各前記共有マスクの反転値と現在の出力値とのＡＮＤを取った第２のＡＮＤ値を求め、当該第１のＡＮＤ値と第２のＡＮＤ値のＯＲを取ったＯＲ値から出力状態を決定する共有及び競合制御手段と、
を備えることを特徴とするプログラマブルコントローラの出力モジュール。
【請求項１２】
前記共有及び競合制御手段は、前記出力データと共に前記共有マスクが送信されてこないとき、該出力データから出力状態を決定することを特徴とする請求項１１に記載のプログラマブルコントローラの出力モジュール。
【請求項１３】
複数のＣＰＵモジュールと少なくとも１つの出力モジュールを備えるプログラマブルコントローラにおけるデータ出力の共有及び競合制御方法であって、
前記各ＣＰＵモジュールが、
出力モジュールに対して出力状態を変更するかどうかを指示する共有マスクを生成し、
前記出力モジュールに対する出力データを前記共有マスクと共に送信し、
前記出力モジュールが、
前記ＣＰＵモジュールからの前記出力データを前記共有マスクと共に受信し、  前記出力データと共有マスクを各ＣＰＵモジュール毎にＡＮＤを取った第１のＡＮＤ値を求め、また各前記共有マスクの反転値と現在の出力値とのＡＮＤを取った第２のＡＮＤ値を求め、当該第１のＡＮＤ値と第２のＡＮＤ値のＯＲを取ったＯＲ値から出力状態を決定し、
前記出力状態を示す参照出力を自出力モジュールを共有する複数のＣＰＵモジュールへ送信する、
ことを特徴とするプログラマブルコントローラに於けるデータ出力の共有及び競合制御方法。
【請求項１４】
前記ＣＰＵモジュールは、前記出力データに対し送信先の出力モジュールで他のＣＰＵモジュールからの出力データとの共有及び競合制御を必要とするかどうかを判断し、該判断結果、必要としない場合、前記共有マスクを前記出力モジュールに送信しないことを特徴とする請求項１３に記載のデータ出力の共有及び競合制御方法。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、プログラマブルコントローラに関し、更に詳しくはプログラマブルコントローラにおけるデータ出力の共有及び競合制御に関する。
【０００２】
【従来の技術】
図１６で示すようなシリアルリンクバス等のバス１０１に複数のＣＰＵモジュール１０２やＤＯ（出力）モジュール１０３及びＤＩ（入力）モジュール１０４を接続したマルチＣＰＵ構成のプログラマブルコントローラが知られている。
【０００３】
この様なプログラマブルコントローラにおいて、複数のＣＰＵモジュール１０２−１〜１０２−ｍが一つのＤＯモジュール１０３の出力点を共有して出力を行う場合、この出力点を共有している各ＣＰＵモジュール１０２は、ＤＯモジュール１０３の出力状態が現在ＯＮ（＝“１”）状態なのかＯＦＦ（＝“０”）状態なのかを知ることができない。例えば図１６において、ＣＰＵ１０２−１がＤＯモジュール１０３−１の一つの出力点の出力状態をＯＦＦにしても他のＣＰＵモジュール１０２−２〜１０２−ｍはこのことを知ることが出来ない。このことは、例えば共有するＤＯモジュール１０３−１を緊急停止信号として使用する場合、何れかのＣＰＵモジュール１０２−１がこのＤＯモジュール１０３−１に緊急停止信号をセットし、これを他のＣＰＵモジュール１０２−２〜１０２−ｍが認識して、しかるべき処理を行った後に緊急停止信号をリセットするようなアプリケーション等において、緊急停止信号をセットしたＣＰＵモジュール１０２−１が、その後この緊急停止信号に対して他のＣＰＵモジュール１０２−２〜１０２−ｍが何等かの対処処理を行って緊急停止状態が回避されたかどうかを知ることが出来ず、問題となる。
【０００４】
この為ＤＯモジュール１０３の出力のモニタ用に図１７のごとくＤＩモジュール１０６を別に追加して、このＤＩモジュール１０６にＤＯモジュール１０３の出力を折り返し入力する構成としていた。そしてＤＯモジュール１０３−１に“０”を出力したＣＰＵモジュール１０２−１が他のＣＰＵモジュール１０２−２〜１０２−ｍによって出力が“１”にされたかどうか等、各ＣＰＵモジュール１０２−１〜１０２−ｍは、現在のＤＯモジュール１０３−１の出力状態を知るためには、このＤＩモジュール１０６の出力を参照していた。
【０００５】
図１７はＤＩモジュール１０６によるＤＯモジュール１０３の出力の折り返し入力の例である。図１７において、バス１０１上の局アドレスとして局番０が設定されているＤＯモジュール１０３−１の各出力点１０５からの出力は局番１が設定されているＤＩモジュール１０６の入力点１０７へ折り返し入力されている。ＤＯモジュール１０３−１を共有している各ＣＰＵモジュール１０２上のタスクは、ＤＯモジュール１０３−１へデータを出力する時は局番０のＤＯモジュールをアドレス指定して出力し、またＤＯモジュール１０３−１の出力状態を得たい時は局番１のＤＩモジュールをアドレス指定してＤＩモジュール１０６からのデータを得る。
【０００６】
図１８に図１７の構成での各モジュール及びバス上での出力データの様子を示す。
プログラマブルコントローラでのデータの転送は、シリアルリンクバス１での転送速度と同一速度の一定間隔の周期で行われる。またＣＰＵモジュール１０２内の演算実行部へは、このデータ転送と同一周期で割込みが入力される。この周期をタクト周期といい図１８中縦の点線で示してある。各モジュールはこのタクト周期に同期して処理を行う。
【０００７】
ＣＰＵモジュール１０２の演算実行部２０１で行われる演算処理によって生じたＤＯモジュール１０３への出力データは、ＣＰＵモジュール１０２内のＩ／Ｏ領域の対応するアドレス領域へ格納される。するとこのデータは出力バッファを介してバス１０１上にフレームデータとして送信出力される。
【０００８】
このフレームを受信した局番０のＤＯモジュール１０３はこの受信データに基づいて各出力点の出力状態を変更する。またこのＤＯモジュール１０３の出力は局番１のＤＩモジュール１０６に折り返し入力されているので、このＤＩモジュール１０６によってＤＯモジュール１０３の出力状態はバス１０１上にフレームデータとして送信出力され、これは各ＣＰＵモジュール１０２のＩ／Ｏ領域の局番１に対応するアドレス領域に格納される。
【０００９】
図１９にＣＰＵモジュールの入出力処理の為の機能ブロック図を示す。
ＣＰＵモジュール１０２内には、データの入出力制御を行うための構成要素として演算実行部２０１、Ｉ／Ｏ領域２０２、出力バッファ２０３、入力バッファ２０４、シリアルリンク制御部２０５、出力データ転送テーブル２０６及び入力データ転送テーブル２０７を備える。
【００１０】
シリアルリンク制御部２０５は、バス１０１から送信されてきたフレームのうち自局に必要なデータを入力バッファ２０４に取込むと共に下流局のモジュールに流す。入力バッファ２０４に取込まれたデータは、タスク起動時にそのタスクに対応する入力データ転送テーブル２０７を参照してそのタスクが必要とするデータをＩ／Ｏ領域２０２に転送する。
【００１１】
Ｉ／Ｏ領域２０２は自局で実行されている複数のアプリケーションプログラムの各タスクが直接アクセスすることが出来るメモリ領域で、プログラム処理を行う演算実行部２０１は、このＩ／Ｏ領域２０２内から自己が必要とするデータを読み出す。
【００１２】
また演算実行部２０１はＤＯモジュールへデータ出力する時は、Ｉ／Ｏ領域２０２の対応するアドレス領域へ出力データを書込む。そしてタスク処理がすると、出力処理時に、出力データ転送テーブル２０６に基づいてＩ／Ｏ領域２０２から出力バッファ２０３へそのタスクに割り当てられたデータのみが転送される。そしてシリアルリンク制御部２０５は、これをフレームデータとしてバス１０１に出力する。
【００１３】
【発明が解決しようとする課題】
図１７の様にＤＯモジュール１０３−１の出力をＤＩモジュール１０６で折り返す構成にした場合、この為用に別にＤＩモジュールを追加しなければならない。
【００１４】
また各ＣＰＵモジュール１０２で実行されているアプリケーションプログラムは、ＤＯモジュール１０３−１の出力状態を知るのに、そのＤＯモジュール１０３−１の局アドレスとは別なアドレスを用いなければならない。よってアプリケーションプログラミングに処理の煩雑さを強いることになる。
【００１５】
また、各ＣＰＵモジュール１０２では、Ｉ／Ｏ領域２０２上に、ＤＯモジュール１０３−１の出力モニタ用のＤＩモジュール１０６の局アドレスを設定しなければならない。プログラマブルコントローラでは、Ｉ／Ｏ領域２０２のサイズ、即ち接続できるモジュールの総数は限定されているので、ＤＯモジュール１０３−１の出力状態のモニタのためにＤＩモジュール１０６を用いると、１つのＤＯモジュールの為に２つのアドレスを用いてしまうこととなり、資源利用効率が悪い。
【００１６】
またＣＰＵモジュール１０２では、バス１０１からのデータの入力処理において、入力データ転送テーブル２０７に従って入力バッファ２０４からＩ／Ｏ領域２０２へ入力データのコピーを行い、また出力処理では出力データ転送テーブル２０６に従ってＩ／Ｏ領域２０２から出力バッファ２０３への出力データのコピーを行っている。よって出力データ転送テーブル２０６中の局番０のＤＯモジュール１０３−１に設定されている出力データの転送元アドレスと入力データ転送テーブル２０７中の局番１のＤＩモジュール１０６に設定されている入力データ転送先アドレスを同じにすることにより、Ｉ／Ｏ領域２０２のＤＯモジュール１０３−１への出力先と同じアドレス領域にＤＩモジュール１０６を経由したＤＯモジュール１０３−１の出力状態を入力させることができる。しかしＤＯモジュール１０３−１への入力データと出力データに対してＩ／Ｏ領域２０２の同じアドレス領域を割り当てた場合、図２０に示す不具合がある。
【００１７】
図２０は、出力データ転送テーブル中２０６のＤＯモジュールへの出力データの転送元アドレスと入力データ転送テーブル中２０７のＤＩモジュールからの入力データの転送先アドレスを同じにした場合の各モジュール及びバス上での入出力の状態を示すタイミング図である。
【００１８】
図２０のタクト周期Ａにおいて、演算実行部２０１がＩ／Ｏ領域２０２にＤＯモジュール１０３への出力データとしてＯＵＴ２を出力したとする。しかし次のタクト周期Ｂでは、このＯＵＴ２の出力による折り返し出力がＩ／Ｏ領域２０２に転送される前に、１つ前の出力状態であるＯＵＴ１が入ってくる。もしＯＵＴ２がＣＰＵモジュールが緊急停止信号として出力した“１”で、またＯＵＴ１が“０”であったとき、次のタクト周期ＢでＤＯモジュールの出力状態を得ようとしてＩ／Ｏ領域２０２を参照すると、ＯＵＴ１（“０”）となってるので、アプリケーションプログラムは、ＤＯモジュールの出力が他のＣＰＵによって“０”にリセットされたものと誤認識する。
【００１９】
また一般にマルチＣＰＵ構成のプログラマブルコントローラにおいては、各ＣＰＵで担当するリソースを完全に分け機能分散した構成の場合では、入出力の共有・競合は起こらないが、本来１つのＣＰＵでシステム制御するところを、プログラム容量の増大への対処、並列処理による処理性能の向上などの理由でマルチＣＰＵを採用する場合１つの入出力モジュールを複数のＣＰＵで共有することとなる。そしてこの場合、１台の入出力モジュールに対して、複数のＣＰＵが書込み処理を行う競合書込みを行う場合がある。その場合のプログラムの開発では、ユーザは、競合制御を意識してプログラムソースを作成、変更するようなわずらわしさが有る。また、競合書込みが行われると複数のＣＰＵモジュールのプログラムで、同じ出力モジュールの同一アドレスに対する書込みが行われることとなるが、このアドレス重複が競合書込みによるものなのか、プログラム作業の誤り等によるものかチェックが容易に出来ることが要求される。
【００２０】
本発明は、上記問題点を鑑み、複数のＣＰＵモジュールがＤＯモジュールを共有している場合、そのＤＯモジュールの出力をモニタするＤＩモジュールを設けることなしに、各ＣＰＵモジュールが共有したＤＯモジュールの出力状態を知ることが可能なプログラマブルコントローラ及びアプリケーションプログラム開発装置を提供することを課題とする。
【００２１】
【課題を解決するための手段】
本発明によるプログラマブルコントローラは、複数のＣＰＵモジュールと少なくとも１つの出力モジュールを備えることを前提とする。
【００２２】
上記各ＣＰＵモジュールは、共有マスク生成手段及び出力データ送信手段を備える。
共有マスク生成手段は、出力モジュールに対して出力状態を変更するかどうかを指示する共有マスクを生成する。
【００２３】
出力データ送信手段と、上記出力モジュールに対する出力データを上記共有マスクと共に送信する。
また上記出力モジュールは、出力データ受信手段と共有及び競合制御手段を備える。
【００２４】
出力データ受信手段は、上記ＣＰＵモジュールからの上記出力データを上記共有マスクと共に受信する。
共有及び競合制御手段は、ＣＰＵモジュールからの、例えば自己を共有する複数のＣＰＵモジュールからの上記出力データと共有マスクから出力状態を決定する。
【００２５】
また上記出力モジュールは、上記出力状態を示す参照出力を上記自己を共有する複数のＣＰＵモジュールへ送信する参照出力送信手段を備え、上記ＣＰＵモジュールは、上記共有マスク生成手段が生成した共有マスクを記憶する共有マスク記憶手段と、該共有マスク記憶手段に記憶されている共有マスクと出力モジュールからの上記参照出力から該出力モジュールの出力状態を示す参照データを生成する出力状態参照データ生成手段とを更に備える構成としても良い。
【００２６】
更に上記出力データ送信手段が、上記出力データを送信する出力モジュールで該出力データに対し他のＣＰＵモジュールからの出力データとの共有及び競合制御を行う必要が無い時、該出力データの送信時、上記共有マスクを該出力データを送信しない構成としてもよい。この場合例えばＣＰＵモジュールに、上記共有マスクを上記出力データと共に送信したか否かを通知するデータ転送モード制御ビットを生成するデータ転送モード制御ビット生成手段を更に備え、上記出力データ送信手段が、該データ転送モード制御ビットを上記出力データと共に送信し、受信側の出力モジュールの上記共有及び競合制御手段は、該データ転送モード制御ビットが上記共有マスクが上記出力データと共に送信されていないことを示す時、該出力データのみから出力状態を決定する構成となる。
【００２７】
また、本発明によるプログラマブルコントローラのアプリケーションプログラム開発装置は、プログラム参照手段及び競合書込み命令生成手段を備える。
プログラム参照手段は、マルチＣＰＵ構成のプログラマブルコントローラを構成する全てのＣＰＵモジュールのプログラムを参照する。
【００２８】
競合書込み命令生成手段は、上記参照結果、上記プログラムに複数のＣＰＵモジュールが同じ出力モジュールの同じ出力点への出力を示す命令を含む場合、該命令を競合書込み用の命令に変換する。またこのアプリケーションプログラム開発装置は、上記競合書込み用の命令に変換する部分をユーザに通知するワーニング通知手段を備える。
【００２９】
本発明によれば、各ＣＰＵモジュールは、出力モジュールに対して出力データと共に共有マスクを送信し、出力モジュールではこの共有マスクの内容に基づいて出力の共有及び競合制御を行う。
【００３０】
また各ＣＰＵモジュールは、出力状態参照データ生成手段によって、出力モジュールの参照出力送信手段が送信した参照出力と共有マスク記憶手段が記憶する共有マスクから参照データを生成するので、この参照データから出力モジュールの出力状態を知ることが出来る。
【００３１】
更に参照データは出力モジュールからの参照出力と共有マスク記憶手段が記憶する共有マスクから生成されるので、ＣＰＵモジュールでは、出力モジュールへの出力情報と上記参照データを同一アドレス領域に格納することが出来る。
【００３２】
また、共有及び競合制御を必要としない時には、ＣＰＵモジュールが上記共有マスクを出力データと共に出力モジュールに送信しない構成とすれば、トラフィク量を少なくすることが出来る。
【００３３】
また本発明によるアプリケーションプログラム開発装置によれば、ユーザが意識しなくても競合書込みとなる書込み命令は、競合書込み命令に変換される。また競合書込み命令に変換される部分は、ユーザに通知される。
【００３４】
【発明の実施の形態】
図１は本実施形態におけるプログラマブルコントローラの概略を示す図である。本実施形態でのプログラマブルコントローラは、ＣＰＵモジュール２−１〜２−３の３つのＣＰＵモジュールが１つのＤＯモジュール３を共有しているものとする。
【００３５】
ＤＯモジュール３は、シリアルリンクバス１を介して各ＣＰＵモジュール２から送信されてきた出力データを受信すると、共有及び競合制御回路１０により、その受信データに基づいて出力点からの出力状態を変化させると共に、参照出力として各ＣＰＵモジュール２に現在の出力状態を示すデータを送信する。
【００３６】
尚本実施形態では、ＣＰＵモジュール２とＤＯモジュール３との間でのデータ転送は、本発明の出願人による特願平１０−１４８６４８号に開示されているトータルフレーム方式及びマルチキャスト方式によって行われるものとする。
【００３７】
図２はトータルフレーム方式によるデータ通信の説明図である。
本実施形態では、シリアルリンクバス１の局の内の１つをリングマスター局とし、このリングマスター局によってトータルフレーム方式及び後述するマルチキャスト方式によるデータ転送を管理する。図２ではシリアルリンクバス１に、リングマスター局、Ａ局、Ｂ局、Ｃ局、Ｄ局の順に接続されていたとする。
【００３８】
トータルフレーム方式では、ネットワーク上に唯一存在するリングマスター局により、まずトータルフレーム送信の要求を表すＲＥＱフレームが送信される。図２ではこの時のＲＥＱフレームはｒｅｑ０と表されている。
【００３９】
このＲＥＱフレームには、フレームのデミリタ部（スタートデミリタ（ＳＤ）部）にこのフレームがＲＥＱフレームであることを示すデータが設定されており、このフレームの受信局はＳＤ部を調べることによりこのフレームがＲＥＱフレームであることを認識する。
【００４０】
ＲＥＱフレームを受信した局は、そのフレーム最後に自局のデータを付加して隣の下流局へ送信する。図２の場合、Ａ局はＲＥＱフレームを受信すると、その末尾に自己の出力データＤａを付加して下流局のＢ局へ送信する。Ｂ局ではこのフレームを受信すると、その末尾に自己の出力データＤｂを付加して出力する。以下、順に各局はフレームを受取ると自己のデータをフレームの末尾に付加して下流局へ送信する。尚、本実施形態は複数のＣＰＵモジュール２を使用するマルチＣＰＵの構成であり、ＣＰＵモジュール２が他のＣＰＵモジュール２がＤＯモジュールに出力したデータを参照できるようにするため、ＤＯモジュールも自己のデータの出力を行っている。しかし、ＣＰＵモジュールを１つしか持たないプログラマブルコントローラの構成の場合には、この様な必要はない。
【００４１】
ＲＥＱフレームがシリアルリンクバス１を１巡して、これをリングマスター局が受信すると、リングマスター局はこのフレームのスタートデミリタ（ＳＤ）部に設定されているデータを２巡目のＲＥＱフレームであることを示すデータを設定変更し、またフレームの最後に自己のデータを付加して隣の下流局であるＡ局へ送信する。
【００４２】
このフレームを受信したＡ局は、受信フレームのＳＤ部を調べ、これが２巡目のＲＥＱフレームであることを認識すると、フレームのＳＤ部の次にある１巡目の時に自己が付加した自局データを削除して下流局へ中継する。図２の場合、Ａ局は２巡目のＲＥＱフレームを受信すると、１巡目で自己が付加した自局のデータＤａを削除して下流局のＢ局へ送信し、Ｂ局は受信フレームのＳＤ部の次にある自己の出力データＤｂを削除して次の下流局であるＣ局へ送信する。以下、順に各局はフレームを受取ると１巡目で付加した自己のデータをフレームから削除して下流局へ送信する。
【００４３】
この２巡回目のＲＥＱフレームがシリアルリンクバス１を巡回して、リングマスター局に戻ってくると、リングマスター局は、このフレームをシリアルリンクバス１から除去する。これによってトータルフレーム通信は完了する。
【００４４】
次にマルチキャスト方式によるデータ転送について説明する。
マルチキャスト方式は、ＣＰＵモジュール２からＤＯモジュール３に対してデータの出力を行う時用いられるデータ転送方式である。
【００４５】
マルチキャスト方式は、シリアルリンクバス１上にマルチキャスト通信用のフリートークンを巡回させ、データ伝送を要求する局（ＤＯモジュールに出力するための送信データが用意されており、また当該送信帯域の送信許可設定がされている局）はそのフリートークンを確保して代わりにマルチキャストフレームの送信を行う。マルチキャストフレームはシリアルリンクバス１上を巡回し、このマルチキャストフレームを受信したネットワーク上の局は、それを下流へ中継して巡回させると共にフレーム内の出力データの設定内容に基づいてデータの取込みを行う。
【００４６】
図３は、マルチキャスト方式による通信の説明図である。
マルチキャスト方式による通信では、まず、シリアルリンクバス１上に１つだけ存在するネットワーク管理を行うリングマスター局が、データ転送の権限を制御するフリートークンを生成し、シリアルリンクバス１上にリリースする。このフリートークンのリリースによって、マルチキャスト通信は開始される。
【００４７】
リリースされたフリートークンは、各局が順次下流局へ中継してゆき、シリアルリンクバス１上を巡回する。そしてデータの出力を行いたいＣＰＵモジュール２は、このフリートークンを受信すると、これをシリアルリンクバス１から確保し、マスター局となる。
【００４８】
マスター局は、用意してある送信データを、ＳＤ部にこのフレームがマルチキャスト通信のフレームであることを示すデータを設定したマルチキャストフレームとしてシリアルリンクバス１上に流す。図３では、マスター局は、保持したフリートークンの代わりにＡ局に対する出力データ（Ｍ→Ｄａ）とＢ局に対する出力データ（Ｍ→Ｄｂ）の２つの局に対する出力データがマルチキャストフレームとして、下流局Ｂへ送信される。
【００４９】
このマルチキャストフレームを受取った局は、そのフレーム内の出力データに設定されている出力データの格納先の局番を参照し、この出力データが自局に対するものであれば、それを取込むと共にそのフレームをそのまま下流局へ送信する。図３では、マルチキャストフレームを受信したＡ局及びＢ局はそれぞれ自局にあててマスタ局が出力した出力データ（Ｍ→Ｄａ、Ｍ→Ｄｂ）を取込むと共に、その受信フレームをそのまま隣の下流局であるリングマスター局及びマスター局へ送信する。
【００５０】
フレームが１巡すると、そのフレームを最初に送信したマスタ局は、これをシリアルリンクバス１から除去し、代わりにフリートークンを生成してシリアルリンクバス１上にリリースする。
【００５１】
そしてフリートークンがシリアルリンクバス１を１巡して戻ってくると、リングマスター局はデータ伝送要求の有無をチェックし、要求があれば当該送信データ［Ａ局に対する出力データ（ＲＭ→Ｄａ），Ｂ局に対する出力データ（ＲＭ→Ｄｂ）］の送信を行う。その後、自局が送信したデータフレームがシリアルリンクを１巡して自局に戻ってきたことでリングマスター局はフリートークンをシリアルリンク上から除去し、これによってマルチキャスト通信は終了する。
【００５２】
以下ＤＯモジュール３からＣＰＵモジュール２へデータを送信するときのデータ転送は、トータルフレーム方式により行う。またＣＰＵモジュール２からＤＯモジュール３へデータを出力するときのデータ転送は、マルチキャスト方式により行う。尚本発明では、各モジュール間でのデータ転送はこのトータルフレーム方式とマルチキャスト方式のみに限定されるものではない。また上記トータルフレーム方式及びマルチキャスト方式によるデータ転送は、各モジュールがリング型の伝送トポロジーのバスで接続されていることを前提とするが、本発明が適用されるプログラマブルコントローラにおいて各モジュールを接続するバスはリング型のトポロジーをもつシリアルバスに限定されるものではなく、モジュール間を他のトポロジーやパラレルバスで接続する構成でも良い。
【００５３】
図４にＤＯモジュール３の共有及び競合制御回路１０を詳細に示す。
同図中最下段はシリアルリンクバス１上を伝送されるフレームを示し、１タクト周期中にＤＯモジュール３から各ＣＰＵモジュール２−１〜２−３に対するトータルフレーム方式によるフレームに続いてＣＰＵモジュール２−１、２−２及び２−３からのマルチキャスト方式によるフレームが続く。尚同図中「メッセージ」はＣＰＵモジュール２間やＣＰＵモジュール２と通信モジュールなどとの間で行われるメッセージ転送用の時間帯域を示している。
【００５４】
各ＣＰＵモジュール２−１〜２−３は、ＤＯモジュール３に対する出力データと共に共有マスクを送信フレーム内に格納して、マルチキャスト方式でＤＯモジュール３に送信する。この共有マスクは各ＣＰＵモジュール２がＤＯモジュール３に対して出力状態の変更を行うかどうかを出力点毎に指定するもので、各ＣＰＵモジュール２はＤＯモジュール３の複数の出力点のうち、出力状態を変更したい出力点に対応する共有マスクのビットに“１”を、変更を行わない出力点に対応するビットに“０”を設定し、出力データと共にＤＯモジュールに送信する。
【００５５】
ＤＯモジュール３では、マルチキャスト方式のフレームを自己を共有している各ＣＰＵモジュール２−１〜２−３全てから受信すると、フレーム中の共有マスクデータ１１及び出力データ１２と、参照出力ラッチ１６内の自己の現在の出力状態との論理結果から新出力を求める。
【００５６】
ＤＯモジュール３では、ＣＰＵモジュール２からのフレームから共有マスク１１と出力データ１２を取り出すと、これらを各ＣＰＵモジュール２毎にＡＮＤ回路１３によってＡＮＤ値を取る。また各共有マスク１１−１〜１１−３の反転値と参照出力ラッチ１６の出力のＡＮＤ値をＡＮＤ回路１４によって求める。
【００５７】
そして各ＡＮＤ回路１３−１〜１３−３の出力とＡＮＤ回路１４の出力のＯＲ値をＯＲ回路１５によって求め、これをその出力点の新出力とする。またＯＲ回路１５の出力は参照出力ラッチ１６に格納されて次出力の決定に用いられると共に、トータルフレーム方式でシリアルリンクバス上に出力されて、各ＣＰＵモジュール２−１〜２−３に出力状態を通知する。これにより例えば全てのＣＰＵモジュール２からの共有マスクデータ１１−１〜１１−３が“０”だったビットに対応する出力点は、前回の出力状態の保持となる。また複数のＣＰＵモジュール２からの共有マスクデータ１１が“１”であり、その出力データ１２として“１”と“０”の両方ある場合には“１”が優先され、対応する出力点からは“１”が出力される。
【００５８】
図５はＣＰＵモジュール２の入出力処理の為の構成要素を示す機能ブロック図である。
ＣＰＵモジュール２内には、データの入出力制御を行うための構成要素として演算実行部２１、Ｉ／Ｏ領域２２、出力バッファ２３、入力バッファ２４、シリアルリンク制御部２５、出力データ転送テーブル２６、入力データ転送テーブル２７及び共有マスクデータ領域２８を備える。
【００５９】
プログラム処理を行う演算実行部２１は、演算結果からＤＯモジュールへデータ出力する必要が生じた時は、Ｉ／Ｏ領域２２のそのＤＯモジュールに対応するアドレス領域へ出力データを書込む。この出力データは、タスク処理すると出力処理時に、出力データ転送テーブル２６に基づいて、Ｉ／Ｏ領域２２から出力バッファ２３へそのタスクに割り当てられたデータのみ転送され、シリアルリンク制御部２５は、これをフレームデータとしてシリアルリンクバス１に出力する。
【００６０】
Ｉ／Ｏ領域２２は、自局で実行されている複数のアプリケーションプログラムの各タスクが直接アクセスすることが出来るメモリ領域で、ＣＰＵモジュールの内部メモリ上に構成される。演算実行部２１は、自己が必要とする他モジュールからのデータを、このＩ／Ｏ領域２２内の対応するアドレス領域から読み出し、また他モジュールへ出力する時は、対応するアドレス領域に出力データを書込む。各ＣＰＵモジュール２では、自己が対応している入力モジュールや出力モジュールを、出力データ転送テーブル２６及び入力データ転送テーブル２７でこのＩ／Ｏ領域２２中の各アドレス領域に１：１で対応付けてある。よって、例えばＩ／Ｏ領域２２が０ＨからＦＦＨまでのアドレスをもつ場合、このＣＰＵモジュール２は２５６の入出力モジュールとデータのやり取りを行うことが出来る。また各アドレス領域の各ビットの位置は、各入出力モジュールの入出力点に１：１対応しており、例えば１ワードが８ビットの場合、１つのアドレス領域で８つの入出力点に対応したデータのやり取りを行える。
【００６１】
出力バッファ２３は、出力データを出力先の局番、データのサイズ及び共有マスクと共に、出力する局毎に蓄積するバッファである。タスク処理が終了すると、出力処理時に、そのタスク処理で生じた出力データは出力データ転送テーブル２６に基づいてＩ／Ｏ領域２２から出力バッファ２３へ転送される。そして出力バッファ２３内のデータは、シリアルリンク制御部２５により、演算実行部２１による処理とは無関係にタクト周期でシリアルリンクバス１上に出力される。この様な一連の動作により、シリアルリンクバス１に接続された各モジュールは、一定周期（タクト周期）中は共通のデータを用いて動作することが可能となる。
【００６２】
入力バッファ２４は、上流局から流れてきたデータのうち、自局で必要なものを取込むバッファである。シリアルリンクバス１から受信したデータは、シリアルリンクバス１の転送周期と同一周期のタクト周期で、シリアルリンク制御部２５から入力バッファ２４に格納される。そして、タスク起動時にそのタスクに対応する入力データ転送テーブル２７が参照されてそのタスクが必要とするデータが入力バッファ２４からＩ／Ｏ領域２２に転送される。
【００６３】
シリアルリンク制御部２５は、シリアルリンクバス１から送信されてきたフレームを自己の受信バッファに取込み、それが自局に対するものでなければそのまま下流局に送り、また自局に対するものあればそれを入力バッファ２４に取込むと共に下流局のモジュールに流す。これによってシリアルリンクバス１上をフレームデータが一定方向に巡回する。またマルチキャスト用のトークンを受信するとシリアルリンク制御部２５は、出力バッファ２３内のデータをマルチキャストフレームとして、シリアルリンクバス１上にＤＭＡ転送する。
【００６４】
出力データ転送テーブル２６は、出力先となるモジュールのバス１上での局アドレスとＩ／Ｏ領域２２のアドレスとを対応付けるものである。出力データ転送テーブル２６は、タスク毎に存在し、そのタスク処理によって演算実行部２１が、ＤＯモジュールに出力する出力データをＩ／Ｏ領域２２から出力バッファ２３へ転送する際に参照される。１つのタスク処理が終了すると演算実行部２１は、出力処理時に、出力データ転送テーブル２６を参照し、Ｉ／Ｏ領域２２から出力バッファ２３へそのタスクに割り当てられたデータのみ転送する。
【００６５】
入力データ転送テーブル２７は、入力相手先となるモジュールのバス上での局アドレスとＩ／Ｏ領域２２のアドレスとを対応付けるもので、入力バッファ２４からＩ／Ｏ領域２２へのデータの転送を行う際に参照されるものである。入力データ転送テーブル２７は、各タスク毎に複数存在し、そのタスクが使用するデータの入力バッファ２４でのアドレス、Ｉ／Ｏ領域２２のアドレス及びデータサイズが格納されている。タスクが起動される際に、入力バッファ２４からＩ／Ｏ領域２２へのデータの転送を行うときには、そのタスクに対応した入力データ転送テーブル２７を使用してそのタスクが起動される前に入力バッファ２４からＩ／Ｏ領域２２にそのタスクが使用するデータのみが転送される。
【００６６】
共有マスクデータ領域２８は、Ｉ／Ｏ領域２２と同じ構成をもつ記憶領域で、ＣＰＵモジュールの内部メモリ上に構成される。演算実行部２１はこの共有マスクデータ領域２８中に共有マスクを生成する。そしてこの共有マスクは、Ｉ／Ｏ領域２２中の同じアドレスの出力データと共に出力バッファ２３へ転送され、対応するＤＯモジュール３へ送信される。
【００６７】
この共有マスクは、ＤＯモジュールへ送信後も共有マスクデータ領域２８内に保持される。そして、ＤＯモジュール３からの自己の出力状態を通知する参照出力を受信した時、そのＤＯモジュールに対応するアドレス領域内の共有マスクに基づいて入力バッファ２４からＩ／Ｏ領域２２への転送を行う。またこのＩ／Ｏ領域２２への転送入力処理が完了すると、対応する共有マスクは“０”にリセットされる。この点については後述する。
【００６８】
図６はＣＰＵモジュールで作られる共有マスクの例を示す図である。
演算実行部２１はタスク処理の結果からＤＯモジュールの出力状態を変更する必要が生じた時、出力データと共に共有マスクデータ領域２８に共有マスクデータを生成する。この共有マスクデータは、各ビットがＤＯモジュールの出力点と１：１対応した複数ビットのマスクデータで、ＤＯモジュールの各出力点のうち出力状態を変更する出力点に対応するビットに“１”、変更しない出力点に対応するビットに“０”が設定してある。
【００６９】
図６の共有マスクは８ビット構成の例で、この共有マスクのデータによって８つの出力点についての共有及び競合制御を行う。図６ではタスク処理による演算結果から、ＤＯモジュールに出力する出力データはビット０が“１”から“０”に、またビット４が“０”から“１”に変化しているため、共有マスクデータは出力状態に変更があるビット０とビット４に“１”、他の変更がないビットに“０”がセットされたものが生成され、共有マスクデータ領域２８に格納される。
【００７０】
またＣＰＵモジュール２では、ＤＯモジュール３からトータルフレームによる参照出力を受信すると、これを入力バッファ２４に格納した後、入力データ参照テーブル２７に基づいてＩ／Ｏ領域２２の対応するアドレス領域へ転送するが、この時全てのデータがＩ／Ｏ領域２２に転送されるわけではなく、Ｉ／Ｏ領域２２と同じアドレス領域の共有マスク領域２８内の共有マスクを参照して、ビット毎に転送を行うかどうかを決定して、排他的にデータ転送を行う。
【００７１】
共有マスクに“１”がセットされているビットの参照出力は、図６のビット０やビット４の様に自己がＤＯモジュールに出力の変更を指示した出力点の出力状態を示すものだが、今回の受信データはまだこの変更は反映されていないものである。よってこれをそのまま現在のＤＯモジュールの出力状態として入力バッファ２４からＩ／Ｏ領域２２へ転送すると図２０で示したような問題を生じる。よって共有マスクに“１”がセットされているビットの参照出力の転送は行わずに出力データの値をそのままＤＯモジュールの出力状態を示す値として残し、“０”がセットされているビットの参照出力のみ入力バッファ２４からＩ／Ｏ領域２２へ転送する。
【００７２】
そしてＩ／Ｏ領域２２への出力状態を示すデータの転送処理完了後、共有マスク領域２８内の対応アドレス領域の共有マスクを“０”にリセットし、次の出力データの生成に備える。
【００７３】
尚共有マスク領域２８内の共有マスクのリセットは、Ｉ／Ｏ領域２２への参照データの書き換え時に随時行っても良いし、またタスク処理による演算を行う前にＩ／Ｏ領域２２内のデータをコピーしておいたものと、演算後のＩ／Ｏ領域２２内のデータとを全アドレス領域に対して比較を行い、まとめて全ての共有マスクを生成する構成としても良い。
【００７４】
図７はＣＰＵモジュール２からＤＯモジュール３に、出力データを送信するためにシリアルリンクバス１上に送出されるマルチキャストフレームの構成例である。
【００７５】
各ＣＰＵモジュール２は出力データを送信するＤＯモジュール３宛てのマルチキャストフレームを送出する。マルチキャスト方式は、１タクト周期で複数のモジュールに対してデータを送信することが出来、１フレーム中に複数のＤＯモジュールへのデータを含めることが出来る。
【００７６】
図７では、マルチキャストフレームには、複数のＤＯモジュールに対する出力データが含まれており、この出力データは出力相手局を示す局番、データのサイズ及びマスク情報と共に各ＤＯモジュール毎に格納されている。
【００７７】
ＤＯモジュール３は、マルチキャストフレームを受信すると、受信フレーム内の各出力データに対し付されている局番と自己の局番情報を比較してゆき、一致するものがあれば対応する出力データを入力バッファに取込む。
【００７８】
図８はＣＰＵ０とＣＰＵ１の２つのＣＰＵモジュールがＤＯモジュールを共有している場合の各モジュール及びバス上での入出力状態の例を示すタイミング図である。同図は、ＣＰＵ０がＤＯモジュールの１つの出力点を“１”にセットし、これを認識したＣＰＵ１がこれを“０”にリセットする例である。尚同図及び以下の説明は説明簡略化の為、ＤＯモジュールの１つの出力点について、つまり１ビットのデータの入出力について記載されている。
【００７９】
図８において、まずタクト周期Ａでタスク処理による演算結果から、ＣＰＵ０が共有しているＤＯモジュールの１つの出力点に対し、出力状態を“０”から“１”へ変更する必要が生じたとする。演算実行部２１は、Ｉ／Ｏ領域２２のそのＤＯモジュール及び出力点に対応するアドレス領域に出力データとして“１”をセットし、また共有マスク領域２８のＩ／Ｏ領域２２のアドレスと同じアドレス領域に対応ビットを“１”にセットした共有マスクを生成し、格納する。
【００８０】
この出力データと共有マスクはマルチキャストフレーム３２−１としてＤＯモジュールに送信される。ＤＯモジュールではＣＰＵ０及びＣＰＵ０からの出力データ及び共有マスクに基づいて、タクト周期Ｂで、ＤＯモジュールは出力状態を変更する。この場合ＣＰＵ０の共有マスクは“１”、ＣＰＵ１の共有マスクは“０”なので出力状態はＣＰＵ０からの出力データが反映され、出力点の出力状態は“０”から“１”になる。
【００８１】
またこの間にＤＯモジュールからは、自己の出力状態を通知する参照出力がトータルフレーム３１−１によってＣＰＵ０及びＣＰＵ１に通知される。このトータルフレーム３１−１による参照出力は、マルチキャストフレーム３２−１によるＣＰＵ０からの出力データが反映されていないものなので、これをＤＯモジュールの出力状態としてＣＰＵ０のＩ／Ｏ領域２２に転送すると、ＣＰＵ０は自己がセットした出力“１”がＣＰＵ１によって“０”にリセットされたと誤判断してしまう。しかし、ＣＰＵ０では共有マスク領域２８に記憶されている共有マスクが“１”となっているので、このトータルフレーム３１−１による参照出力はＩ／Ｏ領域に転送されず出力状態を示す参照データはタクト周期Ａでセットされた“１”のままとなる。これによりＣＰＵ０でタクト周期Ｂの演算処理で演算実行部２１がＩ／Ｏ領域２２からＤＯモジュールの出力状態を示す参照データを読み出しても、タクト周期Ａでセットした出力が他のＣＰＵモジュールによってリセットされていると誤認識することはない。
【００８２】
トータルフレームによるデータのＩ／Ｏ領域２２への入力処理が完了すると、共有マスク領域２８内の同じアドレス領域内の共有マスクは“０”にクリアされる。これにより、演算処理によって新たにＤＯモジュールの出力状態を変更する必要が生じて、共有マスクが生成されるまでの間はトータルフレームによるＤＯモジュールからの参照出力は参照データとしてそのままＩ／Ｏ領域２２に入力される。図８では、ＣＰＵ０は、トータルフレーム３１−２、３１−３、３１−４の参照出力はそのままＩ／Ｏ領域２２にＤＯモジュールの出力状態を示す参照データとして入力される。
【００８３】
またＣＰＵ１では、ＤＯモジュールからのトータルフレーム３１−１及び３１−２による参照出力は、そのままＩ／Ｏ領域２２へ参照データとして入力される。ＣＰＵ１はタクト周期Ｃで、ＤＯモジュールの出力状態が“０”から“１”変化があったのを知ると、出力状態を“１”から“０”へリセットするようにＤＯモジュールへ指示する出力データを生成してＩ／Ｏ領域へ格納し、また対応ビットが“１”となる共有マスクを生成して共有マスク領域へ格納する。これらは、マルチキャストフレーム３２−３としてＤＯモジュールに通知される。ＤＯモジュールでは、マルチキャストフレーム３２−３内の共有マスクがＣＰＵ０からのものは“０”、ＣＰＵ１からのものは“１”なので、ＣＰＵ１からの出力データ“０”を反映させて出力状態を“１”から“０”に変更する。またこの変更された出力状態は参照出力として、トータルフレーム３１−４によってＣＰＵ０及びＣＰＵ１に通知される。
【００８４】
この様に本実施形態によるプログラマブルコントローラでは、ＤＯモジュールでは、出力データと共に送信されるＣＰＵモジュールからの共有マスクによって、各ＣＰＵモジュールからの出力の競合制御を行うことが出来る。
【００８５】
またＣＰＵモジュールでは、ＤＯモジュールから参照出力を受信すると、共有マスク領域内の対応する共有マスクを参照してＩ／Ｏ領域への転送を行うので、ＤＯモジュールへの出力データと参照データを同一アドレスに設定しても問題を生じない。
次に本発明の第２の実施形態について説明する。
【００８６】
これまでのプログラマブルコントローラでは、他のＣＰＵモジュールと共有しており競合制御の必要のあるＤＯモジュールだけでなく、共有していないＤＯモジュールに対しても、ＣＰＵモジュールは常に共有マスクデータを含む大きさのフレームをシリアルリンクバス１上に流すので、シリアルリンクバス１上の伝送効率は低下してしまう。
【００８７】
第２の実施形態のプログラマブルコントローラはこの点を考慮したもので、送信先が競合制御を必要とするか否かによって、送信フレームを変更する構成を備えている。
【００８８】
図９は、本発明の第２の実施形態でのマルチキャストフレームの構成例を示す図で、図７の第１の実施形態のフレーム構成図に対応するものである。
第２の実施形態によるフレーム構成では、フレーム内にデータ転送モード制御ビットを設けてある。同図の場合フレームの先頭部分である送信先を示す入出力モジュールの局番部分の上位のリザーブビットをデータ転送モード制御ビットに用いている。尚このデータ転送モード制御ビットは、同図の位置に限らず、特定の位置であればフレーム内の他の位置に設けたり、独立して設けることも可能である。
【００８９】
このデータ転送モード制御ビットは、共有マスクによるデータ転送制御を行うか否かを示すビットで、データ転送時に共有及び競合制御を行う場合にはこのビットに“１”を、共有及び競合制御を行う必要が無い場合にはこのビットに“０”を設定したフレームを送信する。
【００９０】
図９中（１）は、送信先のＤＯモジュールで共有及び競合制御を行わない場合のフレーム構成を示すもので、フレーム先頭部のデータ転送モード制御ビットに“０”がセットされ、またこのフレーム内には共有マスクデータは含まれておらず、局番、サイズ、出力データで構成される。また同図（２）は、共有及び競合制御を行う場合のフレーム構成を示すもので、データ転送モード制御ビットに“１”がセットされ、また図７の第１の実施形態でのフレーム構成と同様、出力データと共に共有マスクデータを持つ構成となっている。
【００９１】
データ送信を行うＣＰＵモジュールは、送信先が共有されているか否か、競合制御を必要としているかどうかによってこれら２つのフレームを使い分け、他のＣＰＵと共有している出力モジュールに出力データを送信する場合は、図９（２）に示したような構成のフレームを用い、他のＣＰＵと共有していない出力モジュールに出力データを送信する際は、同図（１）に示したような構成のフレームを用いる。この様にフレームを使い分けることにより、他のＣＰＵとデータ出力の共有及び競合制御を行う必要が無い場合は、余分な共有マスクデータをフレーム内に含まなくなるので、その分トラヒック量は減り、シリアルリンクバス１上のデータ転送効率は良くなる。
【００９２】
図１０は、第２実施形態におけるＤＯモジュール側の出力データを決定する共有及び競合制御回路４０の詳細を示す図である。図１０は、第１の実施形態の図４の構成に対応するもので、同一の構成要素には同じ番号が符されている。
【００９３】
図１０の共有及び競合制御回路４０は、図４の構成を基本に共有マスク有効モード記憶レジスタ４１、新規受信有り記憶レジスタ４２、ＮＯＴ回路４３及びＯＲ回路４４が各ＣＰＵモジュール毎に加えられ、またＡＮＤ回路は３入力のＡＮＤ回路に変更されている。このうち共有マスク有効モード記憶レジスタ４１は、受信したマルチキャストフレーム中のデータ転送モード制御ビットの値がセットされるもので、この値により共有及び競合制御回路４０は、共有及び競合制御を行う共有マスク有りモードと共有及び競合制御を行わない共有マスク無しモードを切替える。また新規受信有り記憶レジスタ４２は、新規のマルチキャストフレームを受信したことを示すレジスタで、新規にマルチキャストフレームをＣＰＵモジュールから受信するとそのＣＰＵモジュールに対応する新規受信有り記憶レジスタ４２に“１”にセットされる。そしてＯＲ回路１５の出力がＤＯ出力点から出力され、また参照出力ラッチ１６にラッチされると“０”にリセットされる。
【００９４】
共有マスク有効モード記憶レジスタ４１の値は、ＮＯＴ回路４３により反転された後ＯＲ回路４４により共有マスクデータ１１とのＯＲ値が取られる。よってＯＲ回路４４からは、共有マスク有効モード記憶レジスタ４１に“０”がセットされている時は“１”が、“１”がセットされている時は共有マスクデータ１１の値が出力されて、ＡＮＤ回路４５により出力データ１２及び新規受信有り記憶レジスタ４２内の値とＡＮＤ値が取られる。例えば図９（１）の様な競合制御を行わない場合のフレームを受信すると、対応する共有マスク有効モード記憶レジスタ４１には“０”がセットされる。また新規に受信したマルチキャストフレームが無い間は、各新規受信有り記憶レジスタ４２−１〜４２−３の値は“０”にリセットされたままなので、各ＡＮＤ回路４５−１〜４５−３の出力は“０”となり、ＤＯ出力点からの出力は、参照出力ラッチ１６にラッチされている値がＡＮＤ回路１４及びＯＲ回路１５を介して出力され続ける。
【００９５】
次に各ＣＰＵモジュールが、共有マスクデータを持たないフレーム（図９（１）のフレーム）と持つフレーム（図９（２）のフレーム）のどちらを用いるかを決定する共有マスクモジュールモード決定の仕方について説明する。
【００９６】
図１１は、共有マスクモード決定論理を示す図で、同図（ａ）は、複数のＣＰＵモジュールにより出力点の共有及び競合がある場合すなわち共有マスク有りモードを示し、同図（ｂ）は共有及び競合が無い場合すなわち共有マスクデータ無モードの例を示す。同図（ａ）はＣＰＵ０〜２の３つのＣＰＵモジュールが出力モジュールＤＯ０及びＤＯ１にデータを送信する際、データ共有を行う場合に共有マスク有りのモードの決定を例としたもので、１６点の出力点を持つ１つのＤＯモジュールに対する１６ビットの共有マスクデータをＣＰＵの使用ビットとして示している。
【００９７】
図１１（ａ）の出力モジュールＤＯ０の場合、ビット０がＣＰＵ１とＣＰＵ２、ビット１０がＣＰＵ０とＣＰＵ２、ビット１３がＣＰＵ１とＣＰＵ２、及びビット１５がＣＰＵ０とＣＰＵ１で共有マスクに“１”が設定され、これらに対応するＤＯ０の出力点が競合されていることが分る。よってＣＰＵモジュールＣＰＵ０、ＣＰＵ１及びＣＰＵ２は出力モジュールＤＯ０にデータを送信し出力点の出力状態の変更を行う時は、共有有りモードとして図９（２）に示した様な共有マスクデータを含むフレームをマルチキャストフレームとして送信する。
【００９８】
また同図（ａ）において出力モジュールＤＯ１の場合は、同一ワードにおいて、ＣＰＵ０がビット１３，１４，１５を使用し、ＣＰＵ１がビット１０，１１，１２を使用し、ＣＰＵ２がビット０，１，２を使用しており、３台のＣＰＵで共有されている。そして各ＣＰＵモジュールは出力モジュールＤＯ１にデータを送信する時は、共有マスク有りモードとして、ＣＰＵ使用ビットに対応する共有マスクデータを出力データと共に送出する。
【００９９】
また同図（ｂ）のＤＯ２の場合、ＣＰＵ０のみがＤＯ２の全ビットを使用しており、ＣＰＵ１とＣＰＵ２はＤＯ２を一切使用していない。すなわちＤＯ２はＣＰＵ０のみの制御下の出力モジュールであり、ＣＰＵ０は共有無しモードとして図９（１）に示したような共有マスクデータを含まないフレームをマルチキャストフレームとして出力モジュールＤＯ２に送信する。
【０１００】
図１２は、第２の実施形態でのＣＰＵモジュールによる共有マスクデータの制御例を示す図である。同図は図１１の出力条件で、ＣＰＵ０がＤＯ０の出力制御を行う場合の共有マスクの制御動作を例として示したものである。
【０１０１】
ＣＰＵモジュールＣＰＵ０では、出力モジュールＤＯ０に対して、図１２に示すように固定共有マスクレジスタ５１及び出力条件共有マスクレジスタ５２をＯＲ回路５３の入力に、その出力をシリアルリンク出力共有マスクレジスタ５４に接続して備えている。固定共有マスクレジスタ５１は、ＣＰＵモジュールで動作するＯＳによって操作されるもので、他のＣＰＵモジュールと競合せずにＣＰＵ０のみが用いる出力点に対応するビットに“１”がセットされる。この固定共有マスクレジスタ５１の値は、そのＤＯモジュールの出力点の共有状態の変更が無ければ、固定的にセットされたままである。出力条件共有マスクレジスタ５２は、ＣＰＵモジュールがＤＯモジュールに出力変更を行う出力点を設定するレジスタで、出力条件が整った出力点に対応するビットに“１”が出力条件判定部５５によってセットされる。シリアルリンク出力共有マスクレジスタ５４は、マルチキャストフレームに格納して送信する共有マスクデータを格納するレジスタである。
【０１０２】
ＣＰＵ０がＤＯ０を出力制御する場合の共有マスクデータ生成の制御動作処理を以下に示す。
▲１▼ＣＰＵ０は、ＤＯ０のビット１、２を他のＣＰＵモジュールと競合せずに使用するため、予めＯＳ処理によってＤＯ０用の固定共有マスクレジスタのビット１及び２に“１”をセットしておく。
▲２▼ＣＰＵ０は、競合出力点に対する出力条件判定を行い、出力条件が成立した場合出力条件判定部５５がＤＯ０出力条件成立共有マスクレジスタ５２の対応ビットに“１”をセットする。同図の場合、ビット１５に対応する出力点で出力条件が成立したのでビット１５に“１”をセットする。
▲３▼ＤＯ０用の固定共有マスクレジスタ５１と出力条件成立共有マスクレジスタ５２の値のＯＲ値を取り、結果をＤＯ０用のシリアルリンク出力共有マスクレジスタ５４にセットする。この場合ビット１，２，１５に“１”がセットされた値がシリアルリンク出力共有マスクレジスタ５４にセットされる。そしてこのシリアルリンク出力共有マスクレジスタ５４内のデータは、共有マスクデータとしてマルチキャストフレームにより出力データと共にＤＯ０に送信される。ＤＯ０では図１０に示した共有及び競合制御回路４０により、共有及び競合制御として共有マスクデータからビット１、２、１５に対応する出力点の出力をＣＰＵ０からの出力データに基づいて変更する。尚ビット１０に対応する出力点もＣＰＵ０は出力制御を行っているが、今回は出力条件が成立しなかったため、出力は前回値のまま保持される。
【０１０３】
ところで一般に、マルチＣＰＵシステムのプログラマブルコントローラにおいては、各ＣＰＵで担当するリソースを完全に分け機能分散した構成の場合では、入出力の共有・競合は起こらないが、本来１つのＣＰＵでシステム制御するところを、プログラム容量の増大への対処、並列処理による処理性能の向上などの理由でマルチＣＰＵを採用する場合入出力モジュールを複数のＣＰＵで共有することとなる。そしてこの場合、１台の入出力モジュールに対して、複数のＣＰＵが書込み処理を行う競合ＷＴ（書込み）を行う場合がある。その場合のプログラム開発においてユーザは、競合制御を意識してプログラムソースを作成、変更するようなわずらわしさが有ってはならない。また、競合ＷＴが行われると複数のＣＰＵのプログラムで、同じＤＯモジュールの同一アドレスに対する書込みが行われることとなるが、このアドレス重複が競合書込みによるものなのか、プログラム作業の誤り等によるものかチェックが容易に出来ることが要求される。
【０１０４】
これに対応するため本発明では、複数のＣＰＵで共有されている出力点への書込みに対し、競合制御を行う競合ＷＴ命令を持ち、またユーザはこの競合ＷＴ命令を意識して用いなくても、アプリケーションプログラム開発装置（以下ローダという）が自動的に競合ＷＴ命令を生成する機構を備える。
【０１０５】
図１３に基本的な競合ＷＴ命令例を示す。同図ではユーザ記述プログラム例として、基本的なＷＴ命令のラダー表示、それをコーディングした通常命令表示であるＳ（セット）、Ｒ（リセット）、Ｗ（ライト）及びそれぞれに対応する競合ＷＴ命令ＫＳ（競合セット）、ＫＲ（競合リセット）、ＫＷ（競合ライト）を示している。
【０１０６】
各ＷＴ命令の基本動作を以下に示す。
0004123660.tif 000002
となる。
【０１０７】
図１４にローダによる競合ＷＴ命令生成処理例を示す。
図１４（ａ）に示すように、ローダは、ローダ処理として各ＣＰＵモジュールの実行オブジェクトを生成するに際し、マルチＣＰＵシステムを構成する全てのＣＰＵモジュール（同図ではＣＰＵ０、ＣＰＵ１、ＣＰＵ２）のソースプログラムを参照し、異なるＣＰＵによって同じ入出力モジュールの同一出力点への出力、即ち同じ出力アドレスへの書込みが行われいる部分を調べる。そして、同じアドレスに対し複数のＣＰＵが書込みを行っている箇所を検出すると、そのＣＰＵのソースプログラム中のＷＴ命令を図１３に示したような競合ＷＴ命令に変換された後、実行オブジェクトを生成する。
【０１０８】
図１４（ｂ）の場合、ＣＰＵ０とＣＰＵ１のプログラム中、出力モジュールＤＯ０のビット１５に対しての書込みが競合しているため、ローダはＣＰＵ０とＣＰＵ１のソースプログラム中のビット１５に対するＷＴ命令を競合ＷＴ命令（ＫＷ）に置換えている。尚、ＣＰＵ０のＤＯ０ビット２に対する書込みとＣＰＵ１のＤＯ０のビット１０に対する書込みは他のＣＰＵと競合していないので、通常のＷＴ命令（Ｗ）のままとなっている。
【０１０９】
また、同一アドレスへの書込みは、その出力点を複数のＣＰＵモジュールが競合使用しているために発生する場合と、プログラミング作業の誤り等によるユーザの認識外の要因によって発生した場合が考えられる。よって、後者の要因によるものを排除するために、ローダは上記競合ＷＴ命令への置換を行う前にユーザに対してアドレスの重複を警告する競合ＷＴのワーニング通知を行う。
【０１１０】
図１５はローダによる競合ＷＴのワーニング通知例を示す図である。
このワーニング通知の方法としては、同図（ａ）に示すように、ソースプログラムレベルで表示し、競合が発生した出力命令部分を他の表示部分と表示色を替えたり、あるいは点滅表示したりして強調する方法がある。同図の場合、通常表示部分が白色で表示されているのに対し、競合が発生した書込み命令部分を赤色で表示してユーザに通知している。
【０１１１】
またワーニング通知の別方法としては、同図（ｂ）に示すように競合制御箇所をプログラムの行番号と命令種類をリスト形式で示す方法がある。
ユーザは、これらのワーニング通知からプログラムの誤りを検出することが出来る。以上の説明で、出力モジュールとしてデジタル出力モジュール（ＤＯモジュール）を例として説明したが、アナログ出力モジュール（ＡＯモジュール）においても、共有及び競合制御の考え方は全く同じであり、ただ共有マスクデータが出力データ、例えば１ワードに対して１ビットで対応することで実現することが出来る。例えば４ワードＡＯモジュールにおいて、１ワード目はＣＰＵ０が使用し、２ワード目はＣＰＵ１が使用し、３、４ワード目はＣＰＵ２が使用する場合は、共有が行われ共有マスク有りモードとなり、４ワードデータに対して４ビットの共有マスクデータで制御されることとなる。また出力モジュールにおける共有及び競合制御回路は、単純なＡＮＤ及びＯＲ回路でなくセレクタ及び中間値データ生成及び平均値データ生成回路などで実現することも出来る。
【０１１２】
【発明の効果】
本発明に基づくプログラマブルコントローラによれば、出力モジュールの出力状態をＣＰＵモジュールに知らせるために、新たに入力モジュールを設ける必要が無い。
【０１１３】
また、出力モジュールでは各ＣＰＵモジュールから出力データと共に送信されてくる共有マスクによって各ＣＰＵモジュールによる出力データの共有及び競合制御を行うことが出来る。
【０１１４】
更にＣＰＵモジュールでは、ＣＰＵモジュールが出力モジュールの出力状態を誤認識する等の問題を生じることが無く、出力モジュールに対する出力データと参照出力に対して同じアドレスを設定することが出来る。よって、出力モジュールにデータを出力する時も、出力状態を参照する時も同じアドレスを用いることが出来るので、プログラミングに混乱を招かない。これはアプリケーションプログラミングに拠るデータの入出力処理を簡易化することが出来、プログラムの簡略化や処理速度の向上を実現できる。
【０１１５】
また共有及び競合制御を必要としない出力データの場合には出力データと共に共有マスクを出力モジュールに送信しない構成とした場合には、単一ＣＰＵシステムと同様の通信負荷となり、システム性能を向上することが出来る。すなわち、単一ＣＰＵシステムにおいても、本発明は上記共有マスク無しモードでそのまま使用可能である。
【０１１６】
更にマルチＣＰＵのプログラマブルコントローラのプログラム開発に於て、ユーザは、競合制御を行う場合でも、通常の入出力モジュールへの書込み命令を記述すれば、ローダが複数のＣＰＵのプログラムを参照して自動的に競合制御専用の命令に変換する。またこの変換部分は、ユーザに通知されるので、ユーザは競合を意識してアドレスを重複させてたのか、誤ってアドレスを重複させたのかを容易に確認でき、マルチプロセッサシステムにおけるプログラミング開発効率及びプログラムの品質を向上することが出来る。
【図面の簡単な説明】
【図１】本実施形態におけるＤＯモジュールの概略を示す図である。
【図２】トータルフレーム方式による通信の説明図である。
【図３】マルチキャスト方式による通信の説明図である。
【図４】ＤＯモジュールの競合制御回路を詳細に示す図である。
【図５】ＣＰＵモジュールの入出力処理の為の構成要素を示す機能ブロック図である。
【図６】ＣＰＵモジュールで作られる共有マスクの例を示す図である。
【図７】マルチキャストフレームの構成例を示す図である。
【図８】２つのＣＰＵモジュールがＤＯモジュールを共有している場合の各モジュール及びバス上での入出力の状態例を示すタイミング図である。
【図９】第２の実施形態でのマルチキャストフレームの構成例を示す図である。
【図１０】第２実施形態における競合制御回路を詳細に示す図である。
【図１１】各ＣＰＵモジュールで行われる共有マスクモード決定論理を示す図である。
【図１２】第２の実施形態でのＣＰＵモジュールによる共有マスクデータの制御例を示す図である。
【図１３】基本的な競合ＷＴ（書込み）命令例を示す図である。
【図１４】ローダによる競合ＷＴ命令生成処理例を示す図である。
【図１５】競合ＷＴのワーニング通知例を示す図である。
【図１６】バスに複数のＣＰＵモジュールやＤＩモジュール及びＤＯモジュールを接続したマルチＣＰＵ構成のプログラマブルコントローラを示す図である。
【図１７】ＤＩモジュールによるＤＯモジュールの出力の折り返し入力の例を示す図である。
【図１８】各モジュール及びバス上での出力データの様子を示すタイミング図である。
【図１９】従来のＣＰＵモジュールの入出力処理の為の機能ブロック図である。
【図２０】ＤＯモジュールへの出力データの転送元アドレスとＤＩモジュールからの入力データの転送先アドレスを同じにした場合の各モジュール及びバス上での入出力の状態を示すタイミング図である。
【符号の説明】
１、１０１  シリアルリンクバス
２、１０２  ＣＰＵモジュール
３、１０３  ＤＯモジュール
１０、４０  共有及び競合制御回路
１１  共有マスク
１２  出力データ
１３、１４、４５  ＡＮＤ回路
１５、４４、５３  ＯＲ回路
１６  参照出力ラッチ
２１  演算実行部
２２  Ｉ／Ｏ領域
２３  出力バッファ
２４  入力バッファ
２５  シリアルリンク制御部
２６  入力バッファ転送テーブル
２７  入力データ転送テーブル
２８  共有マスクデータ領域
４１  共有マスク有効モード記憶レジスタ
４２  新規受信有り記憶レジスタ
４３  ＮＯＴ回路
５１  固定共有マスクレジスタ
５２  出力条件共有マスクレジスタ
５４  シリアルリンク出力共有マスクレジスタ
【図１】
0004123660.tif 000003
【図２】
0004123660.tif 000004
【図３】
0004123660.tif 000005
【図４】
0004123660.tif 000006
【図５】
0004123660.tif 000007
【図６】
0004123660.tif 000008
【図７】
0004123660.tif 000009
【図８】
0004123660.tif 000010
【図９】
0004123660.tif 000011
【図１０】
0004123660.tif 000012
【図１１】
0004123660.tif 000013
【図１２】
0004123660.tif 000014
【図１３】
0004123660.tif 000015
【図１４】
0004123660.tif 000016
【図１５】
0004123660.tif 000017
【図１６】
0004123660.tif 000018
【図１７】
0004123660.tif 000019
【図１８】
0004123660.tif 000020
【図１９】
0004123660.tif 000021
【図２０】
0004123660.tif 000022