図1は、本発明に係るプログラマブルコントローラを用いて構築されるネットワークシステムの一例を示している。この例では、2つのPLCで分散コントロールシステムを構築した状態を示している。すなわち、第1PLC10aと第2PLC10bは、ネットワーク15を介して接続されている。
図1に示した例では、第1PLC10aは、ユーザプログラムを演算実行したり、I/Oリフレッシュや周辺処理をサイクリックに実行する第1CPUユニット11aと、他のノードと通信を行なう第1通信ユニット12aと、入出力機器を接続するI/Oユニット13aと、その他のユニット14a等を備えている。これらのユニットは、システムバスを介して接続される。その他のユニット14aは、例えば、PLCを構成する各ユニットに対して電源供給をする電源ユニットや、マスタスレーブ通信を行なうためのマスタユニット等がある。また、同種のユニットを複数連結することもある。また、第2PLC10aは、ユーザプログラムを演算実行したり、I/Oリフレッシュや周辺処理をサイクリックに実行する第2CPUユニット11bと、他のノードと通信を行なう第2通信ユニット12bと、入出力機器を接続するI/Oユニット13bと、その他のユニット14b等を備えている。これらのユニットは、システムバスを介して接続される。その他のユニット14bは、PLCを構成する各ユニットに対して電源供給をする電源ユニットや、マスタスレーブ通信を行なうためのマスタユニット等がある。また、同種のユニットを複数連結することもある。そして、図1では、第1PLC10aと第2PLC10bは、ともに4つのユニットを連結して形成された状態を示したが、各PLCを構成するユニット数は必ずしも等しいとは限らず、必要に応じて連結するユニットを増減する。
このシステムは、第1PLC10aに接続された第1,第2スイッチSW1,SW2の入力信号に従って、第2PLC10bに接続されたモータMの動作を制御する。つまり、第1スイッチSW1がONになると、モータMが回転駆動し、第2スイッチ2がONになるとモータMが停止する。ここでは、第2PLC10bの第2CPUニット11bが、第1PLC10a(第1CPUユニット11a)に対して第1,第2スイッチSW1,SW2のIO情報(ON/OFFデータ)の読み出し要求を行ない、第1PLC10aからのレスポンスによりIO情報を取得し、モータMに対する動作制御行なう。
図2は、第1,第2CPUユニット11a,11bの内部構造、および第1,第2通信ユニット12a,12bの内部構造を示している。これらの各ユニットは、第1PLC10aと第2PLC10bと間でデータを送受信する処理に関与する。各CPUユニット11a,11bのハードウェア構成は等しいため、代表して1つ示している。同様に、各通信ユニット11a,11bのハードウェア構成は等しいため、代表して1つ示している。
第1CPUユニット11aと第2CPUユニット11bは、コントローラと称されるものである。第1,第2CPUユニット11a,11bは、共にユーザプログラムを格納する不揮発性記憶手段たるフラッシュROM21と、そのユーザプログラムを実行するMPU22と、そのMPU22が演算実行中にワークメモリとして使用したり、IO情報を格納したりするための揮発性記憶手段たるSRAM23と、他のユニットと通信をするためのインタフェース回路24とを備えている。CPUユニット全体の基本動作等を行なうためのメインファームプログラムや、各種のパラメータ(設定情報)は、フラッシュROM21に記憶される。また、インタフェース回路24は、システムバス26に接続される。
第1,第2通信ユニット12a,12bは、各種プログラムや各種パラメータ等が格納される不揮発性記憶手段たるフラッシュROM31と、そのフラッシュROM31に格納されたプログラムを実行するMPU32と、揮発性記憶手段たるSRAM33と、対応するCPUユニットとデータを供給するための共有RAM34と、システムバス26に接続され、他のユニットと通信を行なうインタフェース回路35と、ネットワーク15に接続された他のノードとの間で実際にデータの送受処理を行なう通信コントローラ36と、ネットワーク15に接続される通信インタフェース回路37と、を備えている。
ここで本発明では、第1,第2CPUユニット11a,11bは、共に機能に着目して設定されたラベルである変数名(Tag,論理名とも称されることがある)でプログラミングされたユーザプログラムを実行し、変数名(Tag)でアクセスできるようになっている。それら第1,第2CPUユニット11a,11bに接続された第1,第2通信ユニット12a,12bに対するサイクリック通信は、後述するコネクションIDを用いて行なえるようにしている。
本実施形態では、係るコネクションIDを用いたサイクリック通信を可能にするため、変数名(Tag)と実アドレス(PLC内部のローカルな物理アドレス)を対応づけた変数テーブルを、第1,第2CPUユニット11a,11bに持たせるとともに、どの変数名に対応するデータをサイクリック通信の対象にするかの通信設定情報を第1,第2通信ユニット12a,12bに登録するようにした。変数テーブルや通信設定情報は、ユーザが通信設定ツール30を利用して作成し、各ユニットに格納する。さらに、第1,第2通信ユニット12a,12bは、システム起動時に、登録された変数名の実アドレスを、CPUユニット(コントローラ)に問い合わせることにより自主的に変数名と実アドレスとの関係を解決し、内部にテーブルとして保持するようにした。
上記した処理を実行するための具体的な処理機能について、図3以降の図面を参照にしつつ説明する。図3は、本発明の第1実施形態を示している。図3に示すように、第1,第2CPUユニット11a,11bは、変数名とデータ種類(型)と実アドレスとを関連づけた変数テーブルを記憶保持する。この変数テーブルは、フラッシュROM21に格納される。なお、実アドレスで特定されるデータは、SRAM23に格納される。
図3の場合、第1CPUユニット11aは、2つのスイッチをそれぞれ特定する変数名(Switch1,2)と、2つのスイッチのON/OFFを示すIOデータを格納する実アドレス(DM100,DM101)とが関連づけられた変数テーブルを備える。第2CPUユニット11bは、モータMの駆動(READY),停止(STOP)を意味する変数名と、その変数名に対応するデータを格納する実アドレス(DM200,DM201)とが関連づけられた変数テーブルを備える。そして、第1CPUユニット11aのDM100のメモリエリアに格納されたデータが、最終的に第2CPUユニット11bのDM200のメモリエリアに格納される。第1CPUユニット11aのDM101のメモリエリアに格納されたデータが、最終的に第2CPUユニット11bのDM201のメモリエリアに格納される。そして、第2CPUユニット11bは、実アドレスがDM200,DM201のメモリエリアに格納されたデータに基づき、モータMの動作を制御する。
第1,第2通信ユニット12a,12bは、自己のユニットでどの変数名のデータをサイクリック通信対象にするかを特定する通信設定情報を備えている。この通信設定情報は、フラッシュROM31に格納される。通信設定情報は、サイクリック通信対象となるデータを特定する変数名と送信/受信を区別する種別情報とを関連付けたデーブル構造をとる。さらに、受信データの場合には、その受信データが格納されている送信元のノードアドレスと、そのノードにおいて使用される変数名と、受信間隔とを関連付けたデータ構造となる。
具体例をあげて説明すると、ノードアドレスが#1の第1通信ユニット12aに格納される通信設定情報は、変数名が「Switch1」で、送受信種別が「送信」となる。これは、他のノードからサイクリック通信を受けた場合に、変数名がSwitchi1に対応するデータを送信することを意味する。同様に、ノードアドレスが#2の第2通信ユニット12bに格納される通信設定情報は、その第2通信ユニット12bに接続された第2CPUユニット11bで使用される、変数名が「READY」で、送受信種別が「受信」となる。この「READY」は受信データであり、「READY」に対応するデータは第1CPUユニット11aに格納された変数名「Switch1」のデータである。そこで、第2通信ユニット12bに格納する通信設定情報は、上記の「READY」,「受信」に加え、「READY」に対応するデータが格納された第1CPUユニット11a(第1PLC10a)のノードアドレス(#1)と、その第1CPUユニット11aにおける変数名「Switch1」と、受信間隔(5ms)とを関連付けたデータとなっている。この第2通信ユニット12aに格納された通信設定情報は、「自己が接続されている第2CPUユニット11bで変数名が「READY」と設定されたデータは、ノードアドレス(#1)に「Switch1」という変数名で格納されているとともに、第2CPUユニット11bでは、そのデータを5ms間隔で収集したい」ということを意味する。
また、第2通信ユニット11bが記憶保持する通信設定情報として、必要とする受信対象のデータが記憶保持された送信元のノードのアドレス(#1)、ならびにそのノードにおける変数名(Switch1)というように他のノードの情報を有しているが、係る他のノード情報は、通信設定ツール30から設定される。すなわち、通信設定ツール30は、第1通信ユニット12aに対しても通信設定情報の登録を行なう。さらに、通信設定ツール30を操作するユーザは、第2CPUユニット11bで使用する変数名「READY」のデータと、第1CPUユニット11aで使用する変数名「Switch1」のデータが同一のデータであることがわかっているので、第2通信ユニット12bに登録する際に第1通信ユニット12aのノードアドレス等を関連づけて登録することができる。なお、通信設定ツール30を用いた設定処理については、後述する。
そして、各通信ユニット12a,12bのMPU32は、それぞれ自己のフラッシュROM31に格納された通信設定情報と、第1,第2CPUユニット11a,11bに格納された変数テーブルとに基づいてテンポラリ内部テーブルを生成し、そのテンポラリ内部テーブルを揮発性メモリであるSRAM33に格納する。このテンポラリ内部テーブルは、接続された各CPUユニット11a,11bで使用される変数名と、その変数名に対応するデータのデータ種別と、その変数名のデータを記録すべきCPUユニットの実アドレスとを関連付けたテーブルである。
なお、図3に示した例では、変数名が「Switch1」,「READY」についての通信設定情報ならびにテンポラリ内部テーブルについて示したが、「Switch2」,「STOP」についての通信設定情報ならびにテンポラリ内部テーブルももちろん設定される。
次に、各通信ユニットが主体的になって行なう名前解決(変数と実アドレスの紐付け)の具体的な処理手順・機能を図3,図4を用いて説明する。まず、各通信ユニット12a,12bは、それぞれ独立して非同期に変数の解決(変数名と実アドレスの解決)を行なう。すなわち、各通信ユニット12a,12bは、MPU32内のユニット管理部32aがユニット起動等の変数の解決を行なう条件になったことを認識すると、変数解決処理を起動する。
(0)すると、それに伴いMPU32内のユニット変数管理部32bが、変数情報ストレージ処理部32cを介して、あらかじめ通信設定ツールによりフラッシュROM31に格納されている通信設定情報を読み出す。
次いで、読み出した通信設定情報に基づいて実際に変数解決処理を行なう。すなわち、(1)ユニット変数管理部32bは、読み出した通信設定情報から変数名を抽出し、同一システムバス26上のCPUユニットに対し、解決要求メッセージを送信する。つまり、システムバス26経由で変数名(例えば「READY」や「Switch1」)のデータが格納された実アドレスを要求するメッセージを送信する。
(2)係る解決要求を受けたCPUユニットの変数テーブル管理部22a(MPU22の一機能として実装される)は、自己が保有するローカルの変数テーブル内を検索し、受け取った変数名と同じ変数名を探し、そのエントリに格納されている物理アドレス情報(実アドレス)・変数のサイズ情報(変数の型)を読出し、要求への応答にその情報を付加し、メッセージとして返信する。この返信により、各通信ユニットは、解決要求をした変数が登録されるCPUユニットのSRAM23における実アドレスを知ることができる。
(3)各通信ユニットは、係る返信メッセージを受け取ると、テンポラリ内部テーブルを作成し、SRAM33に格納する。つまり、受け取った変数の実アドレスとサイズ情報に、自己が有するその変数の変数名を関連づけたテーブルを作成し、テンポラリ内部テーブルとしてSRAM33に格納する。なお、係るテーブルを最終的に作成するのは返信メッセージを受信した後の所定タイミングになるが、予め実アドレス等を空欄にしたテーブル(変数名は格納)を作成し、実アドレス等を受信した際に対応する領域にその実アドレス等を格納するようにしても良い。
(4)次いで、各通信ユニットは、通信情報設定を検索し、「受信」属性を持つ変数を検索し、存在する場合には、その変数の付加情報に基づき、サイクリック通信要求を送信する。図3の例では、第2通信ユニット12b(#2)に「READY」という変数が存在し、「受信」属性を持っていることがわかる。さらに、変数「READY」の付加情報には、「通信ユニット#1につながるコントローラ1の変数「Switch1」を5ms周期で受信したい」と書かれている。従って第2通信ユニット12b(#2)は、第1通信ユニット12a(#1)宛てに、「変数:Switch1/5ms」というサイクリック通信要求を送信する。
(5)係るサイクリック通信要求を受信した第1通信ユニット12aは、要求された変数が、自ユニット内のテンポラリ内部テーブルに存在するかどうかをチェックし、存在する場合には、サイクリック通信ID(コネクションID:この例ではID=1)を付加した正常応答を返信する。
(6)同時に、要求を受けた通信ユニットは、ローカルのCPUユニットとメモリ情報を交換(I/Oリフレッシュ)するために、テンポラリ内部テーブルに格納されている「解決済みの実アドレス」を、システムバス上のI/Oリフレッシュ情報として使用する。つまり、システムバス管理部32dが共有RAM34のサイクリックリフレッシュ転送テーブルにセットする。このサイクリックリフレッシュ転送テーブルのデータ構造は、サイクリック通信ID(コネクションID)と、実アドレスと、サイクリック受信対象となる実際のデータを書き込むデータ領域とを関連づけたテーブルであり、このデータ領域にサイクリック通信により得られたデータを書き込む。これにより、変数の解決が完了する。
その後は、第1通信ユニット12aから第2通信ユニット12b宛てに、5ms周期で、Switch1の最新値が送信される。なお、係る送信は、第1通信ユニット12a画自発的に行なっても良いし、第2通信ユニット12bからの要求に対するレスポンスとして返信することにより実行しても良い。
この時、第1通信ユニット12aと第2通信ユニット12b間で送信されるパケットには、サイクリック通信ID=1が付加される。各通信ユニット12a,12bは、サイクリック通信IDと、そのIDとともに送受信されるデータが格納されるべきCPUユニットのSRAMの実アドレスと、送受信するデータを一時的に格納するバッファメモリ領域が関連づけられたサイクリックリフレッシュ転送テーブルを備えている。そこで、第2通信ユニット12bは、受信したパケットに格納されたサイクリック通信IDに基づき、受信した最新値をサイクリックリフレッシュ転送テーブルの対応するデータ領域に書き込む。なお、このデータ領域への書き込みであるが、サイクリック通信により受信したデータを直接サイクリックフレッシュ転送データに格納して良いし、一旦、SRAM33に格納し、そのSRAM33に格納したデータを転送するようにしても良い。
そして、第2CPUユニット11bは、IOリフレッシュにより、共有RAM34をアクセスし、サイクリックリフレッシュ転送テーブルに格納されたデータを取得し、対応する実アドレスで規定される自己のSRAM23に格納する。
このように、変数の解決を行なった後のノード間の通信では、ネットワーク上にユニークに存在するサイクリック通信ID(コネクションID)をキーにデータの送受を行なう。そして、CPUユニットと通信ユニット間のローカルな世界でのデータ送受は、各ノードの通信ユニットに設けたサイクリック通信IDとCPUユニットに格納すべき実アドレスを関係づけたサイクリックリフレッシュ転送テーブルに従って処理する。これにより、各PLCは、送受信する相手のノードで使用される送受信対象のデータが格納される実アドレスを知らなくても、データの送受ができる。
ところで、オンラインエディット等により、CPUユニット側で変数の割付が変更された場合には、変数テーブル管理部が、通信ユニットに対し「変更要求」を通知する。そして、その通知に基づき、通信ユニット側は変数解決処理を行ない、テンポラリ内部テーブルを更新する。これにより、変数の割付が行なわれても、そのまま処理を実行できる。
また、上記した実施形態では、2台のPLC10a,10bでネットワークが構成された例を示したが、本発明これに限ることはなく、3台以上でも同様の手順で変数の解決を行ない、その後、上記と同様にサイクリック通信IDとともにサイクリック通信対象のデータを送受信することができる(図5参照)。
なお、同一のデータを複数のノードで受信対象になっている場合には、サイクリック通信する周期は等しくする。そして、同一のデータを使用する複数のノードが存在する場合に、その複数のノードに対して同時に通信設定ツール30を用いて通信設定情報を設定するようにすれば問題はない。また、例えば新たにPLCを追加した場合に、その追加したPCLで受信データとして設定されたれたものがすでに他のPLCの通信設定情報にも設定される場合には、基本的にそれを利用する。
図5を用いて、すでに2台で動作しているネットワークに、3台目のPLCが参加する場合を例に説明する。係る事態は、例えば、PLC3の立ち上がりが遅れた場合、通信設定が後から個別になされた場合などに生じる。
まず、上述した(1)〜(4)の処理を実行し、通信設定情報で「受信」属性を持つ変数について、サイクリック通信要求を送信する。上記「受信」属性をもつ変数のデータを格納する通信ユニットが、当該要求を受信するので、以下に示す処理を実行する。
(5)′サイクリック通信要求を受信した通信ユニット(図の例では第1通信ユニット12a)では、受信した要求(図示の場合、追加された第3通信ユニット12cからの要求)を解析し、要求されている変数が既に他のユニットにサービスしているかどうかを検索する。つまり、具体的には、テンポラリ内部テーブルを参照し、Switch1が存在するかどうかを確認する。Switch1が存在するので、そのサービス周期を要求値と比較する。この例では5msと同じであるので、第2通信ユニット(#2)12bにサービスしている処理と共有できると判断し、そのIDを読出し、ID=1で送信することを要求した第3通信ユニット#3に応答する。
(6)その後、第1通信ユニット12a(#1)は、5ms周期で、ID=1としてSwitch1の最新値をネットワーク上にブロードキャストで送出する(送信先ユニット番号を指定しない)。各通信ユニットは、ブロードキャストを受信した際にID番号を確認し、自身が要求してOKとなったIDと一致するかどうかを確認し、一致すればユニット内部に取り込み、上記の同様の処理を行なう。
また、要求されたサイクリック通信時間が異なる場合には、第1ユニット12aは新たにサイクリック通信ID(例えば、ID=2)を生成した上で、第3通信ユニット12cに応答し、それ以降ID=1の送信とは別にID=2として要求された周期で送信する。一例を示すと、例えば、第3通信ユニット12c(#3)が、第1通信ユニット12aにSwitch1を要求するが、サイクリック通信時間が7msである場合には、ユニット#3の通信設定は、START:受信:#1/Switch1:7msとなる。すると、Switch1が既にサービスされているものの、要求周期が異なるため、第1通信ユニットは新たにIDを生成した上(ID=2、等)で、第3通信ユニット12cに応答し、それ以降ID=1の送信とは別にID=2として7ms周期で送信する。このようにIDを変えることにより、同一のデータでありながら、各通信ユニットにとって適した周期でサイクリック通信を行なうことができる。
また、本発明は、以下のような処理としてもよい。すなわち、多くの制御システムにおいては、より高速にデータが更新される方が都合がよい場合が多い。したがって、サイクリック通信の要求周期が、既にサービスしている周期よりも大きい場合には、一番周期の小さいサービスで共有するという処理も可能となる。そうすると、第1通信ユニット12aの送信処理も効率化できるとともに、通信回線利用効率もあがるため、システム全体としてはメリットがでることが多い。
そこで、前述の処理(5)′において、要求された変数が共有できるが、サイクリック周期が異なる場合には、周期を比較し、既に存在するサービスの周期が小さい場合には、応答として「OK,ID=1,5ms」と、サービスできる周期を付加する。その後は、第2,第3通信ユニットの2台に対し、ID=1で5ms周期で最新値が送信されることになる。
次に、通信設定ツール30を用いた設定処理について説明する。上記した変数解決をするための前提とし、通信設定ツール30を用いて各通信ユニットに対して通信設定情報を格納する必要がある。この設定処理は、例えば図6(a),(b)に示すように、通信設定ツール30の表示画面に、通信設定情報テーブルと同様の表形式の入力画面を出力表示する。そして、ユーザは、その表中の空欄に所望のデータを入力する(図は、書物データを入力後の状態を示している)。そして、入力したデータを確定すると、そのデータをネットワークを介して各通信ユニットにダウンロードする。これにより、通信ユニットのフラッシュROM31に格納する。
なお、図示省略するが、送信側の通信ユニットに対しても、上記と同様の入力画面を用意し、ダウロードしても良いし、この受信側の通信設定ツール30の設定例の画面中の「通信ユニットNo(ノードアドレス)と、受信Tag名を抽出し、送信側の通信ユニットの通信設定情報を生成し、登録するようにしても良い。
さらに、通信設定ツール30は、同一のデータに対して異なる通信周期を指定した場合の対応として、以下のような機能を持つ。すなわち、例えば、受信通信ユニット#3の通信設定内容を入力した場合、通信ユニットNo.,受信Tag名と同じものが、既に入力された通信ユニットにおいて設定されたものがあるか否か検索する。そして、同じエントリが存在する場合には、その通信周期を比較し、周期が異なる設定が存在する場合には、それらをツール画面に表示し、設定者に確認を求める。その場合、図7に示すように、最速の周期にあわせるように促すメッセージを表示するようにする。
上述のようにこの実施形態においては、通信設定情報について、どの変数名を他のノードとの間の通信(サイクリック通信他)の対象にするかの情報は通信ユニットに登録するようにし、その通信ユニットは、システム起動時等の所定のタイミングで、通信設定情報に登録された変数の実アドレス(プログラマブルコントローラ内部のローカルな物理アドレス)を、コントローラに問い合わせることにより自主的に解決し、内部にテーブルとして保持するようにした。これにより、通信ユニットとコントローラとの間のデータの受渡が可能となる。つまり、実アドレスと相違し、変数名は同じシステムにおいては頻繁に変わることがない。従って、通信ユニットに設定した後で、コントローラ側で変更される可能性が少ないので、一度通信設定情報を通信ユニットに登録すると、その変数名について再設定する必要がなくなる。
さらに、通信ユニットは、通信を行なう他のノードとの間で、通信する際のデータを特定する識別情報(実施形態では、通信ID)を共有し、データの通信はその識別情報を付加して行なうことにより、通信ユニット間でのデータの送受が行なえる。
そして、通信ユニットは、他の通信ユニットとデータ送受するための識別情報と、自己が接続されたコントローラにおけるその識別情報で特定されるテータの格納エリア(実アドレス)がわかっているため、各プログラマブルコントローラで異なる変数名を使用していても、通信ユニットがその関係を認識し、コントローラとの間でデータの受渡しができ、それにより、コントローラ(プログラマブルコントローラ)間で同一データの共有が可能となる。
このように、変数名と通信の結びつき管理を通信ユニットが行なうため、コントローラでは管理が不要となり、負荷分散になる。そして、通信ユニットが複数になった場合にも、各通信ユニットが係る管理を行なうので、コントローラに求められるリソースは増やさなくてすむ。よって、通信能力(データ量、ノード数など)がコントローラに依存しないので、ユニットを増やせば能力も増大する。
図8は、本発明の第2実施形態を示している。上述の第1実施形態は、通信設定ツール30を用いて各通信ユニットに対してそれぞれ通信設定情報を設定し、それに基づいて通信ユニットとCPUユニット11間での名前解決を行ない、最終的にサイクリック通信ID(コネクションID)を設定した。すなわち、各通信ユニットは、接続されるCPUユニットとの間で名前解決する変数名に関する通信設定情報を備えるようにした。換言すると、上述の第1実施形態は、PLC間のデータ送受信を実現するために、データを送信する側のPLCの通信ユニットに送信用の通信設定情報を格納するいっぽう、データを受信する側のPLCの通信ユニットに受信用の通信設定情報を格納する例であった。つまり、1つのコネクションIDを決定する際に用いる通信設定情報を送信側と受信側に分け、それぞれのユニットに格納した。
これに対し、本実施形態では、1つのコネクションIDを設定するのに関係する通信設定情報を一方の通信ユニットに対してのみ格納するようにした。そして、互いに通信する通信ユニット同士で、片方の通信ユニットに送受信両方の通信設定情報を入れるようにした。図8に示す例では、通信設定情報は、ノードアドレスが#1の第1通信ユニット12aに格納される。この通信設定情報が格納されたユニットをオリジネータとし、通信設定情報が格納されないユニットをターゲットと称する。また、第1,第2CPUユニット11a,11bは、共に変数テーブルを備えている。この変数テーブルは、ユーザが作成したプログラムにおいて使用された変数名と、その変数名に対応するデータの型と、そのデータが格納されるメモリアドレスとを関連づけたテーブルである。この変数テーブルについては、第1実施形態と同様である。ただし、本実施形態では、第2CPUユニット10bに接続されたモータMのステータスについての情報も管理するようにしている。このステータスは、例えば、動作中と停止中の2つの状態を示すものである。
これに伴い、モータMが接続された第2PLC10bを構成する第2CPUユニット11bは、モータMのステータスを意味する変数名が「STATUS」で、型が「word」で、そのモータMのステータスを格納するメモリアドレスが「DM250」で有ることを関連づけた変数テーブルを備えている。もちろん、第1実施形態と同様に、「READY」,「STOP」についても、変数名テーブルに格納されており、これら2つの変数名が意味する内容は、第1実施形態と同様である。
また、第1PLC10aを構成する第1CPUユニット11aは、モータMのステータスを監視するようになっている。それに合わせて、第1CPUユニット11aの変数テーブルは、変数名「Switch1」と「Switch2」に加え、モータのステータスを入力するための変数名「M_ST」についての関連データも記述されている。
さらに、第1の通信ユニット12aは、他の通信ユニットと送受信するデータを一時記憶するための通信バッファテーブルを備えている。第2の通信ユニットも同様に通信バッファテーブルを備えている。この通信バッファテーブルは、テーブル番号と、変数名と、送受信するデータを格納するエリアとを関連づけたテーブル構造となっている。そして、この通信バッファテーブルは、例えば、共有RAM34に格納される。この通信バッファテーブルは、実際の動作の際には、異なるPLC同士の通信ユニット間のデータ通信に用いられ、また同一PLC内の通信ユニットとCPUユニットとの間のデータ転送に用いられる。この通信バッファテーブルに記憶された情報は、通信ユニット内の不揮発性メモリにバックアップされる。そして通信ユニットのMPU32は、電源投入時等の所定のタイミングで不揮発性のメモリからバックアップした情報を読み出し、それを共有RAM34に格納する。
以下、接続されたCPUユニットと通信ユニット間で行なわれる名前解決と、通信ユニット間で実際にデータを送受信する際に利用するコネクションIDの決定の処理手順を説明しつつ、各ユニットの機能を説明する。
(0)まず、ユーザは、通信設定ツール30を操作して、第1CPUユニット11aに格納する変数テーブルを作成し、その作成した変数テーブルを第1CPUユニット11aにダウンロードする。同様に、ユーザは、通信設定ツール30を操作して、第2CPUユニット11bに格納する変数テーブルを作成し、その作成した変数テーブルを第2CPUユニット11bにダウンロードする。
また、ユーザは、通信設定ツール30を操作して、第1通信ユニット12aに格納する通信バッファテーブルを作成し、その作成した通信バッファテーブルを第1通信ユニット12aにダウンロードする。同様に、ユーザは、通信設定ツール30を操作して、第2通信ユニット12bに格納する通信バッファテーブルを作成し、その作成した通信バッファテーブルを第2通信ユニット12bにダウンロードする。
ユーザは、プログラミングツール(ハードウェアとしては、通信設定ツール30と同一のパソコンの場合もあるし、異なる場合もある)を用いて各CPUユニットが実行するユーザプログラムを作成する。ツール30で作成されたユーザプログラムは、CPUユニットにダウンロードする際にコンパイルされる。コンパイルの際にプログラム中に用いられている変数名は実アドレスに変換されるので、CPUユニットは、実アドレスで記述されたユーザプログラムを実行する。なお、ユーザプログラムに用いる変数は、予めユーザがPLC制御に用いるデータ(接点の意味を含む)と対応付けて決めるものであるので、ユーザは、各CPUユニットにおける変数(変数名)とデータ(接点の意味を含む)との対応情報を知っている。また、ユーザは、各CPUユニットにおけるメモリ割付情報、つまり、データ(接点の意味を含む)と、そのデータのCPUユニットのメモリの記憶エリア(実アドレス)との対応情報を知っている。さらに、ユーザは、PLC間でデータの送受信を行なう場合、どのCPUユニットに格納されたデータを、別のどのCPUユニットに送るべきかを知っている。さらにユーザは、PLC間で送受信対象となっているデータが、送信するCPUユニットおよび受信するCPUユニットにおいてどのような変数名に対応するかを知っている。そこで、係る情報に基づいて、ユーザが各CPUユニットにダウンロードする変数テーブルや、各通信ユニットにダウンロードする通信バッファテーブルを作成することができる。
さらに、ユーザは、通信設定ツール30を操作し、一方の通信ユニット(この例では、第1通信ユニット11a(オリジネータ側))の通信設定情報を作成し、第1通信ユニット12a(#1)へ格納する。ここで設定する通信設定情報は、自局で使用される変数名と、相手局で使用される変数名と、通信相手のノードアドレスと、通信の向き(OUT/IN)と、データを送受信する際の周期と、データサイズと、を関連づけたテーブルとなる。
(1)変数テーブルと、通信バッファテーブルを各ユニットにダウンロードすると、各通信ユニット12a,12bは、名前解決処理を実行可能となる。例えば、通信ユニットは、リセットされることを契機として名前解決を行なう。具体的には、リセットされると、各通信ユニット12a,12bは、オリジネータ/ターゲットを問わず例えば通信バッファテーブルに格納された変数名に基づいて、その変数名に対応するデータが格納される実アドレスが何であるかについて、接続されたCPUユニットへ問合せをする。すなわち、例えば第1通信ユニット12aは、第1CPUユニット11aに対し、変数名が「Switch1」のデータが格納されているメモリの実アドレスの問い合わせをする。
(2)第1CPUユニット11aは、問い合わせを受けた変数名をキーにして変数テーブルをアクセスし、該当する実アドレス(DM100)を取得すると共に、問い合わせに対するレスポンスとして、取得した実アドレスを第1通信ユニット12aに返信する。第1通信ユニット12aは、同様に「Switch2」,「M_ST」に対応する実アドレスについても問い合わせを行ない、第1CPUユニット11aからレスポンスとして対応する実アドレスを取得する。
なお、図示の例では、1つずつ問い合わせをしているが、一括して問い合わせをしても良い。図示省略するが、この実アドレスの返信の際に、データサイズ(型)も返信するようにしてもよい。この点は、他の実施の形態及び変形例でも同じである。
同様に、第2通信ユニット12bは、第2CPUユニット11bに対し、変数名が「READY」,「STOP」,「STATUS」に対応するデータが格納されているメモリの実アドレスの問い合わせをする。そして、第2CPUユニット11bは、問い合わせを受けた変数名をキーにして変数テーブルをアクセスし、該当する実アドレス,型(サイズ)を取得すると共に、問い合わせに対するレスポンスとして、取得した実アドレス,型(サイズ)を第2通信ユニット12bに返信する。図8では、第2通信ユニット12bが「READY」について名前解決の問い合わせをし、第2CPUユニット11bから「DM200/1W」と返信がされている。
なお、この名前解決処理を実行するタイミングは、上述したリセットに基づくものに限定されず、自由に設定することができ、少なくとも通信バッファテーブルと変数テーブルが格納されたならば、作成することができる。この点は、他の実施の形態及び変形例でも同じである。
各通信ユニットが取得した実アドレスとデータサイズとの情報について簡単に説明すると、実アドレスは、通信確立後に通信ユニット間で通信される場合、通信ユニットがCPUユニットとの間のデータ交換に必要な情報であり、オリジネータ/ターゲット問わず両方で用いる。データサイズは、通信確立をする際に、オリジネータ側が通信確立要求をするとき、またはターゲット側が通信確立処理をする際に必要な情報である。この点は、他の実施の形態及び変形例でも同じである。
また、この第2実施形態では、オリジネータ側の通信ユニット12aは、自局において通信対象となる変数名の情報が通信設定情報にすべて含まれた状態で記憶している。よって、このオリジネータ側の第1通信ユニット12aが名前解決処理を行う際、上述のように通信バッファテーブルに記憶された変数名に基づく代わりに、通信設定情報に含まれた変数名に基づいて行うことができる。つまり、第1通信ユニット12aは、通信設定情報に含まれた「Switch1」、「Switch2」、「M_ST」のそれぞれの変数名に対応する実アドレスを第1CPUユニット11aに問い合わせを行ない、それぞれに対応する実アドレスを取得する。もちろん必要に応じて、図示のように同時にデータのサイズに関する情報を取得してもよい。
(3)第1通信ユニット12aは、名前解決した情報を記憶しておく。記憶エリアは、例えば、テンポラリ内部テーブルを用いることができる。なお、通信設定情報を備えたオリジネータ側では、通信設定情報中に「向き」まで特定されているため、図8に示すようにテンポラリ内部テーブルは完成する。テンポラリ内部テーブルは、通信バッファテーブル番号,変数名,実アドレス,データサイズ,向き(IN/OUT)を関連づけたテーブルである。これにより、名前解決は終了する。なお、通信設定情報にデータサイズも格納するようにしたため、テンポラリ内部テーブルのサイズの欄に格納するデータは、その通信設定情報のサイズの欄から取得するようにしたが、本発明はこれに限ることはなく、第1CPUユニット11aから返信される実アドレスと共にデータの型(サイズ)を加えることにより、第1CPUユニットに格納された変数テーブル中のデータを利用してテンポラリ内部テーブルのデータサイズを作成することができる。さらに、通信設定情報を作成する際に、ユーザがデータサイズを書き込むのではなく、変数テーブルのデータを利用して作成するようにしても良い。この点は、他の実施の形態及び変形例でも同じである。
(3)′第2通信ユニット12bは、名前解決した情報を記憶しておく。記憶エリアは、例えば、テンポラリ内部テーブルを用いることができる。ターゲット側の第2通信ユニット12bは、通信設定情報を持っていないため、データ送信の向き(送信:OUT,受信:IN)の区別等は不明である。しかし、第2通信ユニット12bは、通信バッファテーブルに格納された情報から第1の通信ユニット12aと通信するデータの自局の変数名はわかっているため、変数名の実アドレスを第2CPUユニット11bに問い合わせることにより、その変数名と実アドレスの対応付けを認識できる。従って、第2通信ユニット12bは、通信バッファテーブルに格納された全ての変数名について、処理(1),(2)を実行することにより、通信バッファテーブルのテーブル番号と、変数名と、実アドレスと、サイズ(型に基づき設定)とを関連づけることができ、その関連づけたデータをテンポラリ内部テーブルに格納する。これにより、通信の向きが空欄のテンポラリ内部テーブルが作成される。尚、図8は、後述する全ての処理を実行し最終的に作成される「向き」も格納したテンポラリ内部テーブルの状態を示している。この(3)′の処理を実行することにより、第2通信ユニット12b側でも名前解決が終了する。
(4)次に、コネクションIDの設定処理手順について説明する。ノード番号の小さいオリジネータから順番に、ターゲットへ通信確立要求をする。この通信確立要求は、ツール30からの通信確立命令が出されたことに基づき、各通信ユニットが順次処理対象のデータの通信相手となる通信ユニットに対して通信確立要求を発行することになる。この通信確立要求は、相手局変数名,データサイズ,向き並びに周期の情報を相手ノードに送る。これに自己局の変数名を含めても良い。もちろん、通信確立要求のフレームのヘッダには、送信元情報として、自己のノードアドレス(#1)と相手のノードアドレス(#2)が格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。また、この通信確立要求は、コネクションIDを設定する単位で行なわれる。従って、本実施形態では、変数名ごとにコネクションIDを競ってするため、変数名ごとに1つずつ処理を実行する。
図8の例では、ノードアドレス#1の第1通信ユニット12aは、まず、第2通信ユニット12bに対し「READY/1W/OUT/5ms」を内容とする通信確立要求を発行する。
(5)この通信確立要求を受信したターゲットは、要求内容をチェックする。すなわち、テンポラリ内部テーブルをアクセスし、通信確立要求された変数名の有無をチェックする。そして、変数名が存在している場合には、ターゲットは、サイズが一致するか否かをチェックし、一致する場合には、通信確立要求と共に送られてきた「向き情報」と反対の向きをテンポラリ内部テーブルに格納する。従って、上記の通信確立要求を受けた第2通信ユニット12bが要求内容を正しいと認定した場合、第2通信ユニット12bは、空欄となっていたテンポラリ内部テーブルのREADYに対応する「向き」の欄に、「IN」を入力する。
なお、変数名の有無のチェックは、上記のようにテンポラリ内部テーブルに基づいて行なっても良いが、本発明はこれに限るものではなく、通信バッファテーブルに基づいて行なっても良い。さらに、テンポラリ内部テーブルと通信バッファテーブルの両方に基づいて変数名の有無をダブルチェックするようにしてもよい。
(6)さらに、ターゲットは、実周期と要求周期とを比較し、対応可能か否かをチェックする。対応可能な場合には、ターゲットは、コネクションIDを特定し、通信設定ツール30の表示装置に「要求条件OK」の旨と「通信確立内容」とをモニタ表示させる。そして、ターゲットは、通信確立要求の発行元であるオリジネータに対して「要求条件OK」の旨と、コネクションIDを通知する。このとき、実周期を同時に送るようにしても良い。ターゲット側の実周期は、ターゲットのシステムメモリに格納されているため、ターゲットは、それを読み出してコネクションID等と一緒に通知する。
コネクションIDは、オリジネータのノードアドレスと、ターゲットのノードアドレスと、シリアル番号との組み合わせから構成される。シリアル番号は、処理した順に付与する。従って、例えば上述した「READY」についての通信確立要求が最初に発行されてきた場合、ターゲットは、「#1#2−001」というコネクションIDを設定する。
一方、ターゲットが、要求された周期では対応できない場合には、通信設定ツール30の表示装置に「要求周期では対応不可。実周期**secでよいか?」等の確認メッセージを表示し、ユーザへ確認を促す。この確認メッセージに対してユーザ入力が「よい」とされた場合には、ターゲット側で対応可能な実周期を、(6)の要求許可通知とともに通知する。実周期はターゲットである第2通信ユニット12bに予め設定されている。要求許可通知に含まれる情報を念のため詳しく挙げると、許可通知(OK/NG)、コネクションID、自己局ノードアドレス(ターゲット側ノードアドレス)、相手局ノードアドレス(オリジネータ側ノードアドレス)、周期である。(一部は図示を省略しているが)。また、通信確立要求は、変数名ごとに1つずつ行なわれるため、上述した(4)から(6)の処理は、さらに「STOP」,「STATUS」についてそれぞれ順に実行される。また、各通信確立要求を受けたターゲットから要求許可通知が発行されると、オリジネータとターゲットでは、図9に示すデータ構造からなるコネクションテーブルが作成される。このコネクションテーブルは、1つのコネクションIDが付与されるごとに、逐次作成され、更新される。
上述した手順により通信確立した後は、コネクションIDを利用して通信ユニット間で、Switch1のON/OFF情報やSwitch2のON/OFF情報、モータのステータス情報などの各種データを通信する。例えば、第1通信ユニット12a(#1)が、Switch2のデータを第2通信ユニット12b(#2)へ送信するときについて説明する。第1通信ユニット12aのMPUは、テンポラリ内部テーブルを参照して、送信データを第1CPUユニット11aから読み出す処理を行う。テンポラリ内部テーブルは、通信ユニットにおける通信対象データ(送信データ)とCPUユニットの実アドレスとの対応情報を持っている。第1通信ユニット12aは、テンポラリ内部テーブルに基づいて通信対処データに対応するCPUユニット11aのメモリの実アドレスを取得する。第1通信ユニット12aと第1CPUユニット11aとの間のデータ送受はシステムバス26を介して行われる。詳しく言うと、第1通信ユニット12aと第1CPUユニット12bとの間では、IOリフレッシュまたは周辺処理などのタイミングで第1CPUユニット12bの実アドレスDM100に格納されているデータを、通信バッファに格納し更新する。この点は後述の各実施形態でも同様である。
第1通信ユニット12aは、取得した通信対象データを通信バッファに記憶する。通信バッファの格納領域は通信バッファテーブルにて一義に決まる。そして、第1通信ユニット12aは、通信対象データを送信するために、コネクションテーブルを参照して、メッセージフレームを生成する。つまり、コネクションID「#1#2−002」と、通信バッファテーブルのテーブル番号「2」のデータエリアに格納されたデータとをメッセージフレームに含ませて、ノードアドレス#2の第2通信ユニット12bへ送信する。第2通信ユニット12bは、自己宛のコネクションID「#1#2−002」のメッセージを受信したら、コネクションテーブルから記憶すべき通信バッファテーブルのテーブル番号「12」を認識し、そのテーブル番号「12」に対応する通信バッファのメモリエリアに受信したデータを格納する。ここで言う第1通信ユニット12aが行うデータ送信は、第1通信ユニット12aが自発的に送信動作をするようにしてもよいし、第2通信ユニット12bが第1通信ユニット12aへデータ要求をし、それに応じて第1通信ユニット12aが送信動作をするようにしてもよい。その通信サイクルは、通信確立の際に定めた定周期(例えば5ms)となる。この点は後述の各実施形態でも同様である。
なお、第2通信ユニット12bと第2CPUユニット11bとの間では、所定タイミングで通信バッファテーブルに格納されたデータが第2CPUユニット11bの実アドレスDM201に格納される。すなわち、第2通信ユニット12bは、テンポラリ内部テーブルにより通信バッファテーブルのテーブル番号「12」に格納されたデータの実アドレスがDM201であることがわかるので、第2CPUユニット11bのIOリフレッシュまたは周辺処理などのタイミングで第2CPUユニット11bのデータ更新を行なう。
図10は、第2実施形態の変形例を示している。上述した第2実施形態は、各通信ユニットとCPUユニット間における名前解決処理を、コネクションIDの設定処理を行なう前に、予め各ユニット間同士で事前に行なうようにした。これに対し、この変形例では、ターゲット側の名前解決は、コネクションIDの設定を行なう一連の処理手順の中で行なうようにした。
(0)すなわち、ユーザは、通信設定ツール30を操作し、第1CPUユニット11a用の変数テーブルと、第2CPUユニット11b用の変数テーブルと、第1通信ユニット用の通信バッファテーブルと、第2通信ユニット用の通信バッファテーブルを作成し、それぞれのテーブルを対応するユニットにダウンロードする。さらに、ユーザは、通信設定ツール30を操作し、通信設定情報を作成し、第1通信ユニット12aへ格納する。この変形例においても、第1通信ユニット12aは、送信側と受信側の区別無く、オリジネータとなり、送受信両方の通信設定情報を保持する。
(1)次に、オリジネータ側の第1通信ユニット12aは、通信設定情報に格納された自局変数名について、第1CPUユニット11aへ名前解決要求をする。この名前解決要求は、自局変数名に対応するデータが格納される第1CPUユニット11aにおけるメモリの実アドレスを問い合わせることである。なお、オリジネータ側となる通信ユニットにおける名前解決要求の実行の変化例として、通信設定情報の中に設定された変数名に代えて、通信バッファテーブルの中の記憶された変数名に基づいて名前解決要求を実行することも可能である。この点は後述の各実施形態の変形例でも同じである。また、名前解決要求する単位は、変数名ごとに1つずつ行なうようにしても良いし、複数の変数名について一括して行なうようにしても良い。この点も後述の実施形態の変形例でも同じである。
(2)第1CPUユニット11aは、受信した名前解決要求に応じて変数テーブルを参照し、対応する実アドレス(メモリアドレス)を返信する。このとき、第1CPUユニット11aは、データサイズも併せて返信してもよい。
(3)オリジネータ側の第1通信ユニット12aは、第1CPUユニット11aから返信されてきた情報(実アドレス,型:データサイズ)と、自己が保有する通信設定情報とに基づいてテンポラリ内部テーブルを作成する。作成されるテンポラリ内部テーブルのデータ構造は、第2実施形態と同様である。
(4)通信設定ツール30からの通信確立命令を受けて、オリジネータ側の第1通信ユニット12a(#1)は、通信設定情報に格納された変数名について、テンポラリ内部テーブルに基づいて、ターゲット側の第2通信ユニット12b(#2)へ通信確立要求をする。通信確立要求とともに送る情報は、相手局変数名/サイズ/向き/周期を含む。この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。この通信確立要求は、一つずつ行なう。図では、テンポラリ内部テーブルに格納された「READY」について通信確立要求をしている。最終的には、第1通信ユニット12aは、通信設定情報に格納された全ての変数名について通信確立要求をする。
(5)通信確立要求を受信した第2通信ユニット12bは、第2CPUユニット11bに対し、受信した変数名について名前解決要求をする。図示の例では、第2通信ユニット12bは、変数名「READY」についての実アドレスを問い合わせる要求をしている。
(6)第2CPUユニット11bは、名前解決要求に応じて変数テーブルを参照し、変数名に対応する実アドレスと型(サイズ)とを取得し、第2通信ユニット12bへ返信する。図では、第2CPUユニット11bは、問い合わせのあった「READY」に対し、「DM200/1W(1wordの意味)」を返信している。
(7)第2通信ユニット12bは、第2CPUユニット11bから取得したメモリアドレスと型(サイズ)に基づき、第1通信ユニット12aから受信した通信確立要求の内容をチェックする。具体的なチェック項目は、「要求された変数名を持つか?」,「その変数名のデータが通信バッファに設定あるか?」,「サイズが合致しているか?」,「実周期と要求周期とを比較し、対応可能か?」等がある。第2通信ユニット12bは、全ての条件を具備した場合、通信確立要求を許可する決定をし、要求周期以外の条件が1つでも合致しない場合には、通信確立要求を許可しない決定をする。また、要求周期が対応不可の場合には、ツールで「要求周期では対応不可。実周期**secでよいか?」等のメッセージを表示し、ユーザへ確認を促す。ユーザ入力が「よい」を受け付けた場合には、提示した実周期で通信することを条件に通信確立要求を許可する決定をする。
そして、要求内容が正しく、通信確立要求を許可する場合には、第2通信ユニット12bは、テンポラリ内部テーブルを作成する。このテンポラリ内部テーブルのデータ構造は、第2実施形態と同様である。ここでは、受信した通信確立要求の内容と、名前解決処理で取得した変数名と実アドレスの対応関係から、現在コネクションIDの設定の処理対象となっている変数名について一度に作成する。つまり、第2実施形態のように、一旦「向き」が空欄となった不完全なテンポラリ内部テーブルを作成するのではなく、その変数名について関連する全ての情報が格納されたテンポラリ内部テーブルを作成する。あわせて、第2通信ユニット12bは、通信設定ツール30に、「要求条件OK」の旨と「通信確立内容」とをモニタ表示する。
(8)通信確立要求を許可する場合、第2通信ユニット12bは、コネクションIDを特定し、特定したコネクションIDと、「確立要求許可通知」とを第1通信ユニット12aに返信する。このとき、第2通信ユニット12bは、実周期を合わせて送信しても良い。
以下、第2実施形態と同様に、第1通信ユニット12aと第2通信ユニット12bは、ともにコネクションテーブルを作成する。さらに、上記の(4)から(8)の処理を、各変数名ごとに繰り返し実行し、全ての変数名(READY、STOP、STATUS)についての確立要求を行ない、コネクションIDを設定する。従って、図示の例では、READY、STOP、STATUSを別々に通信確立要求を行なうため、上記の(4)から(8)の処理は、合計3回実行される。通信確立したのちは、コネクションIDを利用して通信ユニット間で通信することは、第2実施形態と同様であるため、その説明を省略する。
図11,図12は、本発明の第3実施形態を示している。この第3実施形態は、第2実施形態と同様に1つのコネクションIDを設定するための通信設定情報は、一方の通信ユニットに設定する。ただし、通信設定情報を設定する通信ユニットは、データを受信する側のみとする。これにより、第2実施形態のように、1つの通信ユニットに送信するデータと受信するデータが存在する場合、各通信ユニットが、それぞれ受信データに基づく通信設定情報を持つことになる。例えば、図11に示すように、第1通信ユニット12aは、自局変数名が「M_ST」についての通信設定情報を備える。また、図12に示すように、第2通信ユニット12bは、自局変数名が「READY」,「STOP」についての通信設定情報を備える。
以下、接続されたCPUユニットと通信ユニット間で行なわれる名前解決と、通信ユニット間で実際にデータを送受信する際に利用するコネクションIDの決定の処理手順を説明しつつ、各ユニットの機能を説明する。
(0)第1CPUユニット11aの変数テーブル、第2CPUユニット11bの変数テーブル、第1通信ユニット12aの通信バッファテーブル、および、第2通信ユニット12bの通信バッファテーブルのそれぞれの準備処理機能は、第2実施形態と同様である。
さらに、ユーザは、通信設定ツール30を操作し、受信側の通信ユニットに格納する通信設定情報を作成し、該当する通信ユニットへ格納する。つまり、第1通信ユニット11aの通信設定情報は、自局変数名が「M_ST」について作成し、第2通信ユニット12aの通信設定情報は、自局変数名が「READY」,「STOP」の2つについて作成する。ここで作成する通信設定情報は、自局で使用される変数名と、相手局で使用される変数名と、通信相手のノードアドレスと、通信の向き(IN)と、データを送受信する際の周期と、データサイズと、を関連づけたテーブルとなる。本実施形態では、通信設定情報は、受信側に設定されるため、通信の向きは必ずINとなるので、省略するようにしても良い。
また、通信設定情報が設定された通信ユニットがオリジネータとなり、設定されない通信ユニットがターゲットとなるのも第2実施形態と同様である。従って、本実施形態では、「M_ST」の通信設定情報については、第1通信ユニット12aがオリジネータとなり、第2通信ユニット12bがターゲットとなる。「READY」,「STOP」の通信設定情報については、第2通信ユニット12bがオリジネータとなり、第1通信ユニット12aがターゲットとなる。このように、通信設定情報ごとにオリジネータとターゲットが決まる。
(1)変数テーブルと、通信バッファテーブルを各ユニットにダウンロードすると、各通信ユニット12a,12bは、名前解決処理を実行可能となる。例えば、通信ユニットは、リセットされることを契機として名前解決を行なう。第2実施形態と同様な処理であるが、具体的に説明する。各通信ユニット12a,12bは、例えばリセットのタイミング(電源リセットや動作リセットなど)で、オリジネータ/ターゲットを問わず通信バッファテーブルに格納された変数名に基づいて、その変数名に対応するデータがCPUユニットのメモリのどのアドレス(実アドレス)に格納されるかについて、CPUユニットへ問合せをする。すなわち、第1通信ユニット12aは、第1CPUユニット11aに対し、例えば変数名「Switch1」の名前解決処理を行うべく、実アドレスの問い合わせをする。同様に、第2通信ユニット12bは、第2CPUユニット11aに対し、変数名「READY」の名前解決処理を行うべく、格納先となるメモリの実アドレスの問い合わせをする。
(2)第1CPUユニット11aは、問い合わせを受けた変数名をキーにして変数テーブルをアクセスし、該当する実アドレス(DM100)を取得すると共に、問い合わせに対するレスポンスとして、取得した実アドレスを第1通信ユニット12aに返信する。第1通信ユニット12aは、同様に「Switch2」,「M_ST」に対応する実アドレスについても問い合わせを行ない、第1CPUユニット11aからレスポンスとして対応する実アドレスを取得する。なお、図示の例では、1つずつ問い合わせをしているが、一括して問い合わせをしても良い。図示省略するが、この実アドレスの返信の際に、データサイズ(型)も返信する。
同様に、第2通信ユニット12bは、第2CPUユニット11bに対し、変数名が「READY」,「STOP」,「STATUS」に対応するデータが格納されているメモリの実アドレスの問い合わせをする。そして、第2CPUユニット11bは、問い合わせを受けた変数名をキーにして変数テーブルをアクセスし、該当する実アドレス,型を取得すると共に、問い合わせに対するレスポンスとして、取得した実アドレス,型を第2通信ユニット12bに返信する。図では、「READY」の問い合わせに対し、第2CPUユニット11bは、「DM200/1W」を返信する。
なお、オリジネータ側は通信設定情報を持っているため、特にCPUユニットからのレスポンスとしてデータサイズは不要である。そこで、名前解決の問い合わせの際に通信設定情報を持ったオリジネータ側であるか否かを確認し、オリジネータ側でない場合にのみデータサイズも要求するようにしても良いが、処理が煩雑となるので、オリジネータ側か否かを問わず名前解決の問い合わせに対するレスポンスは、実アドレスと型(サイズ)にしている。
なお、この名前解決処理を実行するタイミングは、上述したリセットに基づくものに限定されず、自由に設定することができ、少なくとも通信バッファテーブルと変数テーブルが格納されたならば、作成することができる。
(3)各通信ユニット12a,12bは、名前解決した情報を記憶しておく。記憶エリアをテンポラリ内部テーブルとした場合は、図11,図12に示すようなテンポラリ内部テーブルが完成する。テンポラリ内部テーブルの完成により名前解決処理は終了する。なお、本実施形態では、受信側をオリジネータ側としたため、通信設定情報が設定されたデータの向きは必ず「IN」となる。
また、ターゲット側の通信ユニットは、通信設定情報を持っていないため、直接的にはデータ送信の向き(送信:OUT,受信:IN)の区別等は不明である。しかし、第2通信ユニット12bは、通信バッファテーブルに格納された情報から第1の通信ユニット12aと通信するデータの自局の変数名はわかっているため、変数名の実アドレスを第2CPUユニット11bに問い合わせることにより、その変数名と実アドレスの対応付けを認識できる。従って、第2通信ユニット12bは、通信バッファテーブルに格納された全ての変数名について、処理(1),(2)を実行することにより、通信バッファテーブルと、変数名と、実アドレスと、サイズ(型に基づき設定)の欄にデータとを関連づけることができ、その関連づけたデータをテンポラリ内部テーブルに格納する。さらに、通信バッファテーブルに存在した変数名について、通信設定情報が設定されていない場合、その変数名は、送信側のデータであると推定できるので、「向き」はOUTとみなせる。これにより、全てのデータが関連づけられたテンポラリ内部テーブルが作成される。なお、第2実施形態と同様に、通信設定情報を有していないターゲット側の通信ユニットは、通信の向きが空欄のテンポラリ内部テーブルが作成されるようにしてもよい。
(4)次に、コネクションIDの設定処理手順について説明する。この手順は基本的には第2実施形態と同様である。図11,図12に示す第3実施形態では、最初にノードアドレスが#1と小さい第1通信ユニット12aが実行する。すなわち、図11に示すように、第1通信ユニット12aは、第2通信ユニット12bに対し「STATUS/1W/IN/5ms」を内容とする通信確立要求を発行する。この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。
(5)この通信確立要求を受信したターゲット(第2通信ユニット12b)は、要求内容をチェックする。すなわち、テンポラリ内部テーブルをアクセスし、通信確立要求された変数名の有無をチェックする。そして、変数名が存在している場合には、ターゲットは、サイズが一致するか否かをチェックする。さらに、一致する場合には、名前解決の際に行なった処理(3)で、テンポラリ内部テーブルの「向き」の欄に仮登録した場合には、格納されている「向き」が通信確立要求と共に送られてきた「向き情報」(IN)と反対のOUTであることを確認し、テンポラリ内部テーブルの内容を確定する。また、処理(3)で作成したテンポラリ内部テーブルの「向き」の欄が空欄の場合、第2通信ユニット12bは、空欄となっていたテンポラリ内部テーブルのSTATUSに対応する「向き」の欄に、受信した向きと逆の「OUT」を入力する。
なお、変数名の有無のチェックは、上記のようにテンポラリ内部テーブルに基づいて行なっても良いが、本発明はこれに限るものではなく、通信バッファテーブルに基づいて行なっても良い。さらに、テンポラリ内部テーブルと通信バッファテーブルの両方に基づいて変数名の有無をダブルチェックするようにしてもよい。
(6)さらに、ターゲットは、実周期と要求周期とを比較し、対応可能か否かをチェックする。対応可能な場合には、ターゲットは、コネクションIDを特定し、通信設定ツール30の表示装置に「要求条件OK」の旨と「通信確立内容」とをモニタ表示させる。そして、ターゲットは、通信確立要求の発行元であるオリジネータに対して「要求条件OK」の旨と、コネクションIDを通知する。このとき、実周期を同時に送るようにしても良い。ターゲット側の実周期は、ターゲットのシステムメモリに格納されているため、ターゲットは、それを読み出してコネクションID等と一緒に通知する。なお、ターゲットが、要求された周期では対応できない場合には、第2実施形態と同様の手順で対応する。
コネクションIDは、オリジネータのノードアドレス−ターゲットのアドレスーシリアル番号から構成される。シリアル番号は、処理した順に付与する。従って、例えば上述した「STATUS」についての通信確立要求が最初に発行されてきた場合、ターゲットである第2通信ユニット12bは、STATUSのデータについて「#1#2−001」というコネクションIDを設定する。
また、各通信確立要求を受けたターゲットからコネクションIDとともに要求許可通知が発行されると、オリジネータとターゲットでは、図13に示すデータ構造からなるコネクションテーブルが作成される。このコネクションテーブルは、1つのコネクションIDが付与されるごとに、逐次作成され、更新される。
通信確立要求は、コネクションIDの単位、つまり、変数名ごとに1つずつ行なわれるが、第1通信ユニット12aがオリジネータとなっているデータは、自局変数名が「M_ST」の1つであるため、上述した「STATUS」についてのコネクションIDの設定終わると第1通信ユニット12aの通信設定情報にコネクションIDの設定処理は完了する。そこで、図12に示すように、次に小さい番号のノードアドレス#2の第2通信ユニット12bが、通信確立要求を発行する。
(4)具体的には、まず第2通信ユニット12bは、通信設定情報の先頭に格納された自局変数名「READY」についての通信要求を発行する。つまり、図12に示すように、第2通信ユニット12bは、第1通信ユニット12aに対し「Switch1/1W/IN/5ms」を内容とする通信確立要求を発行する。この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。
(5)この通信確立要求を受信したターゲット(第1通信ユニット12a)は、要求内容をチェックする。すなわち、テンポラリ内部テーブルをアクセスし、通信確立要求された変数名の有無をチェックする。そして、変数名が存在している場合には、ターゲットは、サイズが一致するか否かをチェックする。さらに、一致する場合には、名前解決の際に行なった処理(3)で、テンポラリ内部テーブルの「向き」の欄に仮登録した場合には、格納されている「向き」が通信確立要求と共に送られてきた「向き情報」(IN)と反対のOUTであることを確認し、テンポラリ内部テーブルの内容を確定する。また、処理(3)で作成したテンポラリ内部テーブルの「向き」の欄が空欄の場合、第1通信ユニット12aは、空欄となっていたテンポラリ内部テーブルのSwitch1に対応する「向き」の欄に、受信した向きと逆の「OUT」を入力する。
なお、変数名の有無のチェックは、上記のようにテンポラリ内部テーブルに基づいて行なっても良いが、本発明はこれに限るものではなく、通信バッファテーブルに基づいて行なっても良い。さらに、テンポラリ内部テーブルと通信バッファテーブルの両方に基づいて変数名の有無をダブルチェックするようにしてもよい。
(6)さらに、ターゲットは、実周期と要求周期とを比較し、対応可能か否かをチェックする。対応可能な場合には、ターゲットは、コネクションIDを特定し、通信設定ツール30の表示装置に「要求条件OK」の旨と「通信確立内容」とをモニタ表示させる。そして、ターゲットは、通信確立要求の発行元であるオリジネータに対して「要求条件OK」の旨と、コネクションIDを通知する。このとき、実周期を同時に送るようにしても良い。ターゲット側の実周期は、ターゲットのシステムメモリに格納されているため、ターゲットは、それを読み出してコネクションID等と一緒に通知する。なお、ターゲットが、要求された周期では対応できない場合には、第2実施形態と同様の手順で対応する。
コネクションIDは、オリジネータのノードアドレス−ターゲットのアドレスーシリアル番号から構成される。シリアル番号は、処理した順に付与する。従って、例えば上述した「Switch1」についての通信確立要求が最初に発行されてきた場合、ターゲットである第1通信ユニット12aは、Switch1のデータについて「#2#1−001」というコネクションIDを設定する。
第2通信ユニット12bは、次に、自局変数名「STOP」についてのコネクションIDの設定処理を行なうべく、第1通信ユニット12aに対し、「Switch2/1W/IN/5ms」を内容とする通信確立要求をする。この通信確立要求に基づき、上述した(5),(6)の処理を実行することにより、第1通信ユニット12aは、「Switch2」についてのコネクションIDを設定する。
これにより、各通信確立要求を受けたターゲットからコネクションIDとともに要求許可通知が発行されると、オリジネータとターゲットでは、最終的に図14に示すデータ構造からなるコネクションテーブルが作成される。
本実施形態では、受信側がオリジネータとなっているため、通信確立要求をするデータの向きは、「IN」であるため、実際に送信する内容には「IN」を省略しても良い。その場合にターゲット側の通信ユニットでは、通信確立要求を受けた場合には、省略された向きは「IN」であり、ターゲット側での向きは「OUT」となることを認識して処理をすることになる。
すべてのオリジネータの通信設定情報について通信確立をした後は、図14のコネクションテーブルのコネクションIDを利用して、オリジネータ側の通信ユニットとターゲット側の通信ユニットとの間で、該当するデータの送受信が行われる。
図15,図16は、第3実施形態の変形例を示している。上述した第3実施形態は、各通信ユニットとCPUユニット間における名前解決処理を、コネクションIDの設定処理を行なう前に、予め各ユニット間同士で事前に行なうようにした。これに対し、この変形例では、ターゲット側の名前解決は、コネクションIDの設定を行なう一連の処理手順の中で行なうようにした。
(0)第1CPUユニット11aの変数テーブル、第2CPUユニット11bの変数テーブル、第1通信ユニット12aの通信バッファテーブル、および、第2通信ユニット12bの通信バッファテーブルのそれぞれの準備処理機能は、上述の第3実施形態と同様である。
次に、名前解決処理とコネクションIDの設定処理とを行なうが、これらの処理はノードアドレスの小さい通信ユニットから順に処理を行なう。従って、この実施形態では、第1通信ユニットがオリジネータになっているものについて行なわれる。そこで、係る処理を図15を用いて説明する。
(1)オリジネータ側の第1通信ユニット12aは、通信設定情報に格納された自局変数名(M_ST)について、第1CPUユニット11aへ名前解決要求をする。具体的には、第1通信ユニット12aは、第1CPUユニット11aに対し、変数名が「M_ST」のデータが格納されている実アドレスを問い合わせる。なお、オリジネータ側となる通信ユニットにおける名前解決要求の実行は、通信設定情報に格納された変数名に代えて、通信バッファテーブルの中に記憶された変数名に基づいて行うことも可能である。また、名前解決要求する単位は、変数名ごとに1つずつ行なうようにしても良いし、複数の変数名について一括して行なうようにしても良い。
(2)第1CPUユニット11aは、受信した名前解決要求に応じて変数テーブルを参照し、対応する実アドレス(DM150)を返信する。このとき、第1CPUユニット11aは、型(サイズ)も併せて返信してもよい。
(3)オリジネータ側の第1通信ユニット12aは、第1CPUユニット11aから返信されてきた情報と、自己が保有する通信設定情報とに基づいてテンポラリ内部テーブルを作成する。つまり、「M_ST」に関するテンポラリ内部テーブルが作成される。また、通信設定情報に通信バッファテーブルのテーブル番号が記述されていない場合には、第1通信ユニット12aは、通信バッファテーブルも参照し、テーブル番号を取得することにより、テンポラリ内部テーブルが作成される。作成されるテンポラリ内部テーブルのデータ構造は、第3実施形態と同様である。
(4)通信設定ツール30からの通信確立命令を受けて、オリジネータ側の第1通信ユニット12a(#1)は、通信設定情報に格納された変数名について、テンポラリ内部テーブルに基づいて、ターゲット側の第2通信ユニット12b(#2)へ通信確立要求をする。通信確立要求とともに送る情報は、相手局変数名/サイズ/向き/周期を含む。この通信確立要求に自己局変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。この通信確立要求は、一つずつ行なう。図では、テンポラリ内部テーブルに格納された自局変数名「M_ST」に対応し、「STATUS/1W/IN/5ms」を内容とする通信確立要求をする。もちろん通信の向きである「IN」は、省略しても良い。
(5)通信確立要求を受信した第2通信ユニット12bは、第2CPUユニット11bに対し、受信した変数名についての名前解決要求をする。図示の例では、第2通信ユニット12bは、変数名「STATUS」についての実アドレスを問い合わせる要求をしている。
(6)第2CPUユニット11bは、名前解決要求に応じて変数テーブルを参照し、変数名に対応するメモリアドレスと型(サイズ)とを取得し(DM250/1W)、第2通信ユニット12bへ返信する。
(7)第2通信ユニット12bは、第2CPUユニット11bから取得したメモリアドレスと型(サイズ)に基づき、第1通信ユニット12aから受信した通信確立要求の内容をチェックする。ここでの処理は、第2の実施形態の変形例と同様である。具体的なチェック項目は、「要求された変数名を持つか?」,「その変数名のデータが通信バッファに設定あるか?」,「サイズが合致しているか?」,「実周期と要求周期とを比較し、対応可能か?」等がある。第2通信ユニット12bは、全ての条件を具備した場合、通信確立要求を許可する決定をし、要求周期以外の条件が1つでも合致しない場合には、通信確立要求を許可しない決定をする。また、要求周期が対応不可の場合には、ツールで「要求周期では対応不可。実周期**secでよいか?」等のメッセージを表示し、ユーザへ確認を促す。ユーザ入力が「よい」を受け付けた場合には、提示した実周期で通信することを条件に通信確立要求を許可する決定をする。
そして、要求内容が正しく、通信確立要求を許可する場合には、第2通信ユニット12bは、その変数名(STATUS)についてのテンポラリ内部テーブルを作成する。このテンポラリ内部テーブルのデータ構造は、第3実施形態と同様である。ここでは、受信した通信確立要求の内容と、名前解決処理で取得した変数名と実アドレスの対応関係から、現在処理対象となっている変数名について一度に作成する。つまり、「STATUS」について関連する全ての情報が格納されたテンポラリ内部テーブルを作成する。あわせて、第2通信ユニット12bは、通信設定ツール30に、「要求条件OK」の旨と「通信確立内容」とをモニタ表示する。
(8)通信確立要求を許可する場合、第2通信ユニット12bは、コネクションIDを特定し、特定したコネクションIDと、「確立要求許可通知」とを第1通信ユニット12aに返信する。このとき、第2通信ユニット12bは、実周期を合わせて送信しても良い。
通信確立要求は、コネクションIDの単位である変数名ごとに1つずつ行なわれる。そして、第1通信ユニット12aがオリジネータとなっているデータは、自局変数名がM_STの1つであるため、上述した「STATUS」についてのコネクションIDの設定終わると第1通信ユニット12aの通信設定情報にコネクションIDの設定処理は完了する。そこで、図16に示すように、次に小さい番号のノードアドレス#2の第2通信ユニット12bが、通信確立要求を発行する。
(1)まず、第2通信ユニット12bが通信設定情報の変数名について、第2CPUユニット11bへ名前解決要求をする。つまり、まず変数名が「READY」について問い合わせをする。もちろん第2通信ユニット12bは、「READY」に加え「STOP」に対する名前解決要求を一括して要求してもよい。
(2)第2CPUユニット11bは、受信した名前解決要求に応じて変数テーブルを参照し、対応する実アドレス(READYについては、DM200)を返信する。このとき、第2CPUユニット11bは、型(サイズ)も併せて返信してもよい。
(3)オリジネータ側の第2通信ユニット12bは、第2CPUユニット11bから返信されてきた情報と、自己が保有する通信設定情報とに基づいて「READY」と「STOP」についてのテンポラリ内部テーブルを作成する。
(4)通信設定ツール30からの通信確立命令を受けて、オリジネータ側の第2通信ユニット12b(#2)は、通信設定情報に格納された変数名について、テンポラリ内部テーブルに基づいて、ターゲット側の第1通信ユニット12a(#1)へ通信確立要求をする。通信確立要求とともに送る情報は、相手局変数名/サイズ/向き/周期を含む。この通信確立要求は、一つずつ行なう。図では、テンポラリ内部テーブルに格納された自局変数名「READY」に対応する「Switch1/1W/IN/5ms」を内容とする通信確立要求をする。ここで「IN」を省略しても良い。この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。
(5)通信確立要求を受信した第1通信ユニット12aは、第1CPUユニット11aに対し、受信した変数名についての名前解決要求をする。図示の例では、第1通信ユニット12aは、変数名「Switch1」についての実アドレスを問い合わせる要求をしている。
(6)第1CPUユニット11aは、名前解決要求に応じて変数テーブルを参照し、変数名に対応するメモリアドレスと型(サイズ)とを取得し(DM100/1W)、第1通信ユニット12aへ返信する。
(7)第1通信ユニット12aは、第1CPUユニット11aから取得したメモリアドレスと型(サイズ)に基づき、第2通信ユニット12bから受信した通信確立要求の内容をチェックする。このチェック処理の具体的な内容は、上述した第2通信ユニット12bで行なったものと同様であるため、ここではその説明を省略する。
そして、要求内容が正しく、通信確立要求を許可する場合には、テンポラリ内部テーブルを作成する。このテンポラリ内部テーブルのデータ構造は、第3実施形態と同様である。ここでは、受信した通信確立要求の内容と、名前解決処理で取得した変数名と実アドレスの対応関係と、通信バッファテーブルのテーブル番号から、現在コネクションIDの設定の処理対象となっている変数名について一度に作成する。つまり、まず、「Switch1」について関連する全ての情報が格納されたテンポラリ内部テーブルを作成する。あわせて、第2通信ユニット12bは、通信設定ツール30に、「要求条件OK」の旨と「通信確立内容」とをモニタ表示する。
(8)通信確立要求を許可する場合、第2通信ユニット12bは、コネクションIDを特定し、特定したコネクションIDと、「確立要求許可通知」とを第1通信ユニット12aに返信する。このとき、第2通信ユニット11bは、実周期を合わせて送信しても良い。
また、コネクションIDの設定処理は、1つのデータごとに行なわれるため、Switch1についてのコネクションIDの設定処理が完了したならば、次は「Switch2」についてコネクションIDの設定処理を行なう。つまり、上述した(4)から(8)までの処理を繰り返し実行する。これにより、「Switch2」についてのテンポラリ内部テーブルも作成される。
そして、第3実施形態と同様に、第1通信ユニット12aと第2通信ユニット12bは、ともにコネクションテーブルを作成する。ここで作成される最終的なコネクションテーブルは、図14と同じになる。そして、全ての変数について通信確立した後は、コネクションIDを利用して通信ユニット間で通信する。
図17,図18は、本発明の第4実施形態を示している。この第4実施形態では、第3実施形態とは逆に、送信側をオリジネータ側に設定している。従って、図17に示すように、第1通信ユニット12aは、自局変数名が「Switch1」,「Switch2」についての通信設定情報を備える。また、図18に示すように、第2通信ユニット12bは、自局変数名が「STATUS」についての通信設定情報を備える。
以下、接続されたCPUユニットと通信ユニット間で行なわれる名前解決と、通信ユニット間で実際にデータを送受信する際に利用するコネクションIDの決定の処理手順を説明しつつ、各ユニットの機能を説明する。
(0)第1CPUユニット11aの変数テーブル、第2CPUユニット11bの変数テーブル、第1通信ユニット12aの通信バッファテーブル、および、第2通信ユニット12bの通信バッファテーブルのそれぞれの準備処理機能は、上述の第2,第3実施形態と同様である。
さらに、ユーザは、通信設定ツール30を操作し、送信側の通信ユニットに格納する通信設定情報を作成し、該当する通信ユニットへ格納する。つまり、第1通信ユニット11aの通信設定情報は、自局変数名が「Switch1」,「Switch2」の2つについて作成し、第2通信ユニット12aの通信設定情報は、自局変数名が「STATUS」について作成する。ここで作成する通信設定情報は、自局で使用される変数名と、相手局で使用される変数名と、通信相手のノードアドレスと、通信の向き(OUT)と、データを送受信する際の周期と、データサイズと、を関連づけたテーブルとなる。本実施形態では、通信設定情報は、受信側に設定されるため、通信の向きは必ずOUTとなるので、省略するようにしても良い。
本実施形態では、「Switch1」,「Switch2」の通信設定情報については、第1通信ユニット12aがオリジネータとなり、第2通信ユニット12bがターゲットとなる。「STATUS」の通信設定情報については、第2通信ユニット12bがオリジネータとなり、第1通信ユニット12aがターゲットとなる。このように、通信設定情報ごとにオリジネータとターゲットが決まる。
(1)および(2)変数テーブルと通信バッファテーブルとを各ユニットにダウンロードした後、各通信ユニット12a,12bにおける名前解決処理は、第2、第3の実施形態と同様である。つまり、オリジネータ側の通信ユニット12a、ターゲット側の通信ユニット12bともに、それぞれ保有する通信バッファテーブルの変数名に基づいて、同一のプログラマブルコントローラ内のCPUニットに対して名前解決の要求を出し、対応する実アドレスとサイズとを取得する。
(3)の処理も第2、第3の実施形態とほぼ同じ処理となる。ただし、本実施形態では、受信側をオリジネータ側としたため、通信設定情報が設定されたデータの向きは必ず「OUT」となる。また、通信バッファテーブルに存在した変数名について、通信設定情報が設定されていない場合、その変数名は、送信側のデータであると推定できるので、「向き」はINとみなせる。この(3)の処理により、全てのデータが関連づけられたテンポラリ内部テーブルが作成される。なお、第2実施形態と同様に、通信設定情報を有していないターゲット側の通信ユニットは、通信の向きが空欄のテンポラリ内部テーブルが作成されるようにしてもよい。
(4)の処理も第2、第3の実施形態とほぼ同じ処理となる。この第4実施形態では、最初にノードアドレスが#1と小さい第1通信ユニット12aが実行する。すなわち、図17に示すように、第1通信ユニット12aは、第2通信ユニット12bに対し「READY/1W/OUT/5ms」を内容とする通信確立要求を発行する。この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。
(5)の処理も第2、第3の実施形態とほぼ同じ処理となる。つまり、この通信確立要求を受信したターゲット(第2通信ユニット12b)は、要求内容をチェックする。すなわち、テンポラリ内部テーブルをアクセスし、通信確立要求された変数名の有無をチェックする。そして、変数名が存在している場合には、ターゲットは、サイズが一致するか否かをチェックする。さらに、一致する場合には、名前解決の際に行なった処理(3)で、テンポラリ内部テーブルの「向き」の欄に仮登録した場合には、格納されている「向き」が通信確立要求と共に送られてきた「向き情報」(OUT)と反対のINであることを確認し、テンポラリ内部テーブルの内容を確定する。また、処理(3)で作成したテンポラリ内部テーブルの「向き」の欄が空欄の場合、第2通信ユニット12bは、空欄となっていたテンポラリ内部テーブルの「READY」,「STOP」に対応する「向き」の欄に、受信した向きと逆の「IN」を入力する。
なお、第2、第3の実施形態と同様に、変数名の有無のチェックは、上記のようにテンポラリ内部テーブルに基づいて行なっても良いが、本発明はこれに限るものではなく、通信バッファテーブルに基づいて行なっても良い。さらに、テンポラリ内部テーブルと通信バッファテーブルの両方に基づいて変数名の有無をダブルチェックするようにしてもよい。
(6)さらに、ターゲットは、実周期と要求周期とを比較し、対応可能か否かをチェックする。この処理についても第2、第3の実施形態とほぼ同じ処理となる。ただし、例えば上述した「READY」についての通信確立要求が最初に発行されてきた場合、ターゲットである第2通信ユニット12bは、RADYのデータについて「#1#2−001」というコネクションIDを設定する。
第1通信ユニット12bは、次に、自局変数名「Switch2」についてのコネクションIDの設定処理を行なうべく、第2通信ユニット12aに対し、「STOP/1W/OUT/5ms」を内容とする通信確立要求をする。この通信確立要求に基づき、上述した(5),(6)の処理を実行することにより、第2通信ユニット12bは、「STOP」についてのコネクションID(#1#2−002)を設定する。
また、各通信確立要求を受けたターゲットからコネクションIDとともに要求許可通知が発行されると、オリジネータとターゲットでは、図19に示すデータ構造からなるコネクションテーブルが作成される。このコネクションテーブルは、1つのコネクションIDが付与されるごとに、逐次作成され、更新される。図19は、完成された状態を示しており、第1通信ユニット12aに基づくコネクションIDの設定処理では、コネクションテーブルの2番目までが作成される。
第1通信ユニット12aの通信設定情報に格納された全ての変数名についてコネクションIDの設定処理を完了すると、図18に示すように、次に小さい番号のノードアドレス#2の第2通信ユニット12bが、通信確立要求を発行する。
(4)具体的には、まず第2通信ユニット12bは、通信設定情報に格納された自局変数名「STATUS」についての通信要求を発行する。つまり、図18に示すように、第2通信ユニット12bは、第1通信ユニット12aに対し「M_ST/1W/OUT/5ms」を内容とする通信確立要求を発行する。ここでもOUTの記述は省略しても良い。
(5)この通信確立要求を受信したターゲット(第1通信ユニット12a)は、要求内容をチェックする。すなわち、テンポラリ内部テーブルをアクセスし、通信確立要求された変数名の有無をチェックする。そして、変数名が存在している場合には、ターゲットは、サイズが一致するか否かをチェックする。さらに、一致する場合には、名前解決の際に行なった処理(3)で、テンポラリ内部テーブルの「向き」の欄に仮登録した場合には、格納されている「向き」が通信確立要求と共に送られてきた「向き情報」(OUT)と反対のINであることを確認し、テンポラリ内部テーブルの内容を確定する。また、処理(3)で作成したテンポラリ内部テーブルの「向き」の欄が空欄の場合、第1通信ユニット12aは、空欄となっていたテンポラリ内部テーブルの「M_ST」に対応する「向き」の欄に、受信した向きと逆の「IN」を入力する。
なお、変数名の有無のチェックは、上記のようにテンポラリ内部テーブルに基づいて行なっても良いが、本発明はこれに限るものではなく、通信バッファテーブルに基づいて行なっても良い。さらに、テンポラリ内部テーブルと通信バッファテーブルの両方に基づいて変数名の有無をダブルチェックするようにしてもよい。
(6)さらに、ターゲットは、実周期と要求周期とを比較し、対応可能か否かをチェックする。この処理についても第2、第3の実施形態と同様の手順で対応する。この実施形態では、例えば上述した「M_ST」についての通信確立要求が最初に発行されてきた場合、ターゲットである第1通信ユニット12aは、M_STのデータについて「#2#1−001」というコネクションIDを設定する。
これにより、各通信確立要求を受けたターゲットからコネクションIDとともに要求許可通知が発行されると、オリジネータとターゲットでは、最終的に図19に示すデータ構造からなるコネクションテーブルが作成される。そして、全ての変数について通信確立した後は、コネクションIDを利用して通信ユニット間で通信する。
本実施形態では、送信側がオリジネータとなっているため、通信確立要求をするデータの向きは、「OUT」であるため、実際に送信する内容には「OUT」を省略しても良い。その場合にターゲット側の通信ユニットでは、通信確立要求を受けた場合には、省略された向きは「IN」であり、ターゲット側での向きは「IN」となることを認識して処理をすることになる。
図20,図21は、第4実施形態の変形例を示している。上述した第4実施形態は、各通信ユニットとCPUユニット間における名前解決処理を、コネクションIDの設定処理を行なう前に、予め各ユニット間同士で事前に行なうようにした。これに対し、この変形例では、ターゲット側の名前解決は、コネクションIDの設定を行なう一連の処理手順の中で行なうようにした。
(0)第1CPUユニット11aの変数テーブル、第2CPUユニット11bの変数テーブル、第1通信ユニット12aの通信バッファテーブル、および、第2通信ユニット12bの通信バッファテーブルのそれぞれの準備処理機能は、上述の第3、第4実施形態と同様である。
次に、名前解決処理とコネクションIDの設定処理とを行なう。これらの処理はノードアドレスの小さい通信ユニットから順に処理を行なう。従って、上記の各処理は、第1通信ユニットがオリジネータになっているものについて行なわれる。そこで、係る処理を図20を用いて説明する。
(1)第1通信ユニット12aが通信設定情報の変数名について、第1CPUユニット11aへ名前解決要求をする。つまり、まず変数名が「Switch1」について問い合わせをする。なお、オリジネータ側となる通信ユニットにおける名前解決要求の実行は、このように通信設定情報の中に格納された変数名に基づいておこなうことに代えて、通信バッファテーブルに記憶された変数名に基づいて行うことも可能である。オリジネータ側の通信ユニットにおける名前解決要求する単位は、変数名ごとに1つずつ行なうようにしても良いし、複数の変数名「Switch1」「Switch2」に対する名前解決要求を一括して要求してもよい。
(2)第1CPUユニット11aは、受信した名前解決要求に応じて変数テーブルを参照し、対応する実アドレス(DM100)と型(サイズ)を返信する。第1CPUユニット11aは、型(サイズ)については返信しなくてもよい。
(3)オリジネータ側の第1通信ユニット12aは、第1CPUユニット11aから返信されてきた情報と、自己が保有する通信設定情報とに基づいてテンポラリ内部テーブルを作成する。つまり、「Switch1」,「Switch1」に関するテンポラリ内部テーブルが作成される。また、通信設定情報に通信バッファテーブルのテーブル番号が記述されていない場合には、第1通信ユニット12aは、通信バッファテーブルも参照し、テーブル番号を取得することにより、テンポラリ内部テーブルが作成される。作成されるテンポラリ内部テーブルのデータ構造は、第4実施形態と同様である。
(4)通信設定ツール30からの通信確立命令を受けて、オリジネータ側の第1通信ユニット12a(#1)は、通信設定情報に格納された変数名について、テンポラリ内部テーブルに基づいて、ターゲット側の第2通信ユニット12b(#2)へ通信確立要求をする。通信確立要求とともに送る情報は、相手局変数名/サイズ/向き/周期を含む。この通信確立要求は、一つずつ行なう。図では、テンポラリ内部テーブルに格納された自局変数名「Switch1」に対応し、「READY/1W/OUT/5ms」を内容とする通信確立要求をする。もちろん通信の向きである「OUT」は、省略しても良い。なお、この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。
(5)通信確立要求を受信した第2通信ユニット12bは、第2CPUユニット11bに対し、受信した変数名についての名前解決要求をする。図示の例では、第2通信ユニット12bは、変数名「READY」についての実アドレスを問い合わせる要求をしている。
(6)第2CPUユニット11bは、名前解決要求に応じて変数テーブルを参照し、変数名に対応するメモリアドレスと型(サイズ)とを取得し(DM200/1W)、第2通信ユニット12bへ返信する。
(7)第2通信ユニット12bは、第2CPUユニット11bから取得したメモリアドレスと型(サイズ)に基づき、第1通信ユニット12aから受信した通信確立要求の内容をチェックする。ここでの処理は第2の実施形態の変形例、第3の実施形態の変形例と同様であるので、説明を省略する。そして、要求内容が正しく、通信確立要求を許可する場合には、第2通信ユニット12bは、その変数名(READY)についてのテンポラリ内部テーブルを作成する。このテンポラリ内部テーブルのデータ構造は、第4実施形態と同様である。ここでは、受信した通信確立要求の内容と、名前解決処理で取得した変数名と実アドレスの対応関係から、現在処理対象となっている変数名について一度に作成する。つまり、「READY」について関連する全ての情報が格納されたテンポラリ内部テーブルを作成する。あわせて、第2通信ユニット12bは、通信設定ツール30に、「要求条件OK」の旨と「通信確立内容」とをモニタ表示する。
(8)通信確立要求を許可する場合、第2通信ユニット12bは、コネクションIDを特定し、特定したコネクションIDと、「確立要求許可通知」とを第1通信ユニット12aに返信する。このとき、第2通信ユニット12bは、実周期を合わせて送信しても良い。
通信確立要求は、コネクションIDの単位である変数名ごとに1つずつ行なわれる。そこで、「READY」についてのコネクションIDの設定処理が完了したならば、次は「STOP」についてのコネクションIDの設定処理を行なう。つまり、上述した(4)から(8)までの処理を繰り返し実行する。これにより、「STOP」についてのテンポラリ内部テーブルも作成され、コネクションIDも設定される。これに伴い、コネクションテーブルも作成される。
第1通信ユニット12aがオリジネータとなっているデータは、自局変数名がSwitch1とSwitch2の2つであるため、上述した2つの変数名についてのコネクションIDの設定終わると第1通信ユニット12aの通信設定情報にコネクションIDの設定処理は完了する。そこで、図21に示すように、次に小さい番号のノードアドレス#2の第2通信ユニット12bが、通信確立要求を発行する。
(1)第2通信ユニット12bが通信設定情報の変数名について、第2CPUユニット11bへ名前解決要求をする。つまり、変数名が「STATUS」について問い合わせをする。
(2)第2CPUユニット11bは、受信した名前解決要求に応じて変数テーブルを参照し、対応する実アドレス(DM250)を返信する。このとき、第2CPUユニット11bは、型(サイズ)も併せて返信してもよい。
(3)オリジネータ側の第2通信ユニット12bは、第2CPUユニット11bから返信されてきた情報と、自己が保有する通信設定情報とに基づいて「STATUS」についてテンポラリ内部テーブルを追加作成する。「READY」と「STOP」についてのテンポラリ内部テーブルは、図20を用いて説明した第1通信ユニットからの通信確立要求に基づく処理を実行中にすでに作成される。これにより、第2通信ユニット12bが扱う全ての変数について、テンポラリ内部テーブルが作成される。
(4)通信設定ツール30からの通信確立命令を受けて、オリジネータ側の第2通信ユニット12b(#2)は、通信設定情報に格納された変数名について、テンポラリ内部テーブルに基づいて、ターゲット側の第1通信ユニット12a(#1)へ通信確立要求をする。通信確立要求とともに送る情報は、相手局変数名/サイズ/向き/周期を含む。この通信確立要求は、一つずつ行なう。図では、テンポラリ内部テーブルに格納された自局変数名「STATUS」に対応する「M_ST/1W/OUT/5ms」を内容とする通信確立要求をする。ここで「OUT」を省略しても良い。この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されている。
(5)通信確立要求を受信した第1通信ユニット12aは、第1CPUユニット11aに対し、受信した変数名についての名前解決要求をする。図示の例では、第1通信ユニット12aは、変数名「M_ST」の実アドレスを問い合わせる要求をしている。
(6)第1CPUユニット11aは、名前解決要求に応じて変数テーブルを参照し、変数名に対応するメモリアドレスと型(サイズ)とを取得し(DM150/1W)、第1通信ユニット12aへ返信する。
(7)第1通信ユニット12aは、第1CPUユニット11aから取得したメモリアドレスと型(サイズ)に基づき、第2通信ユニット12bから受信した通信確立要求の内容をチェックする。このチェック処理の具体的な内容は、上述した第2通信ユニット12bで行なったものと同様であるため、ここではその説明を省略する。
そして、要求内容が正しく、通信確立要求を許可する場合には、テンポラリ内部テーブルを作成する。このテンポラリ内部テーブルのデータ構造は、第4実施形態と同様である。ここでは、受信した通信確立要求の内容と、名前解決処理で取得した変数名と実アドレスの対応関係と、通信バッファテーブルのテーブル番号から、現在コネクションIDの設定の処理対象となっている変数名について一度に作成する。つまり、まず、「M_ST」について関連する全ての情報が格納されたテンポラリ内部テーブルを作成する。あわせて、第1通信ユニット12aは、通信設定ツール30に、「要求条件OK」の旨と「通信確立内容」とをモニタ表示する。
(8)通信確立要求を許可する場合、第1通信ユニット12aは、コネクションIDを特定し、特定したコネクションIDと、「確立要求許可通知」とを第2通信ユニット12bに返信する。このとき、第1通信ユニット11aは、実周期を合わせて送信しても良い。
そして、第4実施形態と同様に、第1通信ユニット12aと第2通信ユニット12bは、ともにコネクションテーブルを作成する。ここで作成される最終的なコネクションテーブルは、図19と同じになる。そして、全ての変数について通信確立した後は、コネクションIDを利用して通信ユニット間で通信する。
以上、第2〜第4の実施形態でも第2〜第4の実施形態の変形例を説明したが、いずれの実施形態においても次のようにするのが好ましい。
まず、オリジネータが発行する通信要求に、自己局ノードアドレス(オリジネータ側ノードアドレス)、自己局の変数名(オリジネータ側の変数名)、相手局ノードアドレス(ターゲット側ノードアドレス)、相手局変数名(ターゲット側の変数名),データサイズ(通信対象データのサイズ),向き(送信なのか受信なのか)並びに周期を含めるようにする。
いっぽう、ターゲットがオリジネータに対して送る要求許可通知に、許可通知(OK/NG)、コネクションID、自己局ノードアドレス(ターゲット側ノードアドレス)、相手局ノードアドレス(オリジネータ側ノードアドレス)、周期に加え、自己局の変数名(ターゲット側の変数名)、相手局変数名(ターゲット側の変数名),データサイズ(通信対象データのサイズ)、向き(送信なのか受信なのか)を含めるようにする。このうち自己局の変数名(ターゲット側の変数名)と相手局変数名(ターゲット側の変数名)とについては、もともとオリジネータがふたつの関係付けを記憶しているので、どちらかを省略してもよい。また、データサイズ(通信対象データのサイズ)もオリジネータが記憶している情報なので省略してもよい。
そして、オリジネータがターゲットから通信許可を受取れば、通信設定情報のなかの周期を通信許可された周期に上書きして記憶する。こうすることで、ユーザはオリジネータの通信設定情報を確認することで、オリジネータとして関わる通信内容を把握することができる。ここでの通信設定情報にかかるすべての情報をテーブルとして持つようにしてもよい。
また、ターゲットが、オリジネータからの通信要求、ターゲットでの通信確立処理を通じて取得した情報をひとまとめに記憶するのが好ましい。例えば、新たに通信設定情報を記憶できる記憶領域を用意し、そこにコネクションID、自己局ノードアドレス(ターゲット側ノードアドレス)、自己局の変数名(ターゲット側の変数名)、相手局ノードアドレス(オリジネータ側ノードアドレス)、相手局変数名(オリジネータ側の変数名)、データサイズ(通信対象データのサイズ)、向き(送信なのか受信なのか)、並びに周期(通信許可した周期)の情報を含む情報を別途記憶しておくとよい。こうすると、ユーザはターゲットとして関わる通信設定内容をその記憶情報を確認することで、変数名に基づいて通信内容を知ることができる。
なお、第3、第4の実施形態およびその変化例のように、1つの通信ユニットがオリジネータの立場とターゲットの立場の両方をとることがある。この場合であっても、ひとつの通信ユニットがオリジネータとして通信確立後の通信設定情報と、ターゲットとしての通信確立後の通信設定情報を併せ持つので、ユーザはそれらの記憶することで、変数名に基づいて通信内容を知ることができる。
図22は、本発明の第5実施形態を示している。上記した各実施の形態は、コネクションIDは、1つの変数名に対して1つ設定した。本実施の形態ではそれと相違し、複数の変数名をグループ化し、複数のデータを同時に送受信できるようにした。グループ化するデータは、通信相手が共通で、周期が同じで、通信の向きが同じものである。通信確立要求は、オリジネータ側から行なうため、上記のグループ化の条件に従い、ターゲットが共通で、周期が同じ「OUTデータ」同士は、グループ化することができる。また、ターゲットが共通で、周期が同じで「INデータ」同士は、グループ化することができる。
例えば、第2実施形態の場合、「Switch1」と「Switch2」は、ターゲットが#2の第2通信ユニット12bで同じであり、周期も5msで一致した「OUT」データであるためグループ化できる。M_STは、グループ化の条件を満たす他のデータがないため、単独でコネクションIDを設定し、通信することになる。以下、本実施形態の特徴であるグループ化して送信するデータについての名前解決処理とコネクションIDの設定処理について説明する。
(0)ユーザは、通信設定ツール30を操作し、グループ化するデータを管理するためのアセンブリテーブルを作成し、各通信ユニットに格納する。アセンブリテーブルは、第2実施形態等における通信バッファテーブルと同様のもので、アセンブリ名と、バッファエリアと、対応変数とを関連づけたテーブル構造となっている。対応変数の欄には、グループ化する変数名を格納する。バッファエリアは、変数名に対応するデータを格納するエリアであり、このバッファエリアの大きさによりグループ化できるデータ数が決定される。
ユーザは、通信設定ツール30を操作し、オリジネータである第1通信ユニット12aに格納する通信設定情報も作成し、格納する。通信設定情報は、自局アセンブリ名と、相手局を特定するノードアドレスと、相手局アセンブリ名と、データサイズと、向きと、周期と、を関連づけたテーブル構造となる。データサイズは、グループ化する各データのデータサイズの総和となる。
もちろん、ユーザは、通信設定ツール30を操作し、各変数テーブルを作成し、対応するCPUユニットに格納するし、グループ化されないデータについての通信バッファテーブルや通信設定情報も作成し、対応する通信ユニットに格納する。
(1)通信ユニットが変数名と、実アドレスの対応付けする名前解決処理は、各変数名ごとに行なうため、第2実施形態などと同様に行なう。つまり、通信ユニットは、アセンブリテーブルに格納された変数名を取得し、接続されたCPUユニットに対し取得した変数名の実アドレスを問い合わせる。この問い合わせる際の変数名の数は、任意であり、1個ずつ問い合わせても良いし、一括して問い合わせても良い。
(2)各CPUユニットは、問い合わせを受けると、変数テーブルを参照し、変数名に対する実アドレス並びに、型(サイズ)を返信する。これら(1),(2)の処理は、各通信ユニットとCPUユニットとの間で適宜のタイミングで実行される。
(3)オリジネータ側の第1通信ユニット12aは、名前解決した情報を記憶しておく。記憶エリアは、例えば、テンポラリ内部テーブルを用いることができる。なお、通信設定情報を備えたオリジネータ側では、通信設定情報中に「向き」まで特定されているため、図22に示すようにテンポラリ内部テーブルは完成する。テンポラリ内部テーブルは、アセンブリテーブルのバッファエリアを特定する情報(図では、Bf1)と、自局アセンブリ名と、グループ全体のデータサイズと、グループ化された変数名と、実アドレスと、向きを関連づけたテーブルとなる。図から明らかなように、グループ単位で1連のテーブルが作成される。
(3)′ターゲット側の第2通信ユニット12bは、名前解決した情報を記憶しておく。記憶エリアは、例えば、テンポラリ内部テーブルを用いることができる。なお、通信設定情報を備えていないターゲット側では、「向き」を特定できないため、この処理が実行されて作成されるテンポラリ内部テーブルは、向きが空欄となる。
(4)次に、コネクションIDの設定処理手順について説明する。ノード番号の小さいオリジネータから順番に、ターゲットへ通信確立要求をする。この通信確立要求は、ツール30からの通信確立命令が出されたことに基づき、各通信ユニットが順次処理対象のデータの通信相手となる通信ユニットに対して通信確立要求を発行することになる。
この通信確立要求は、グループ化されたものについては、アセンブリ単位で行なう。つまり、通信確立要求は、相手局アセンブリ名,データサイズ,向き並びに周期の情報を相手ノードに送る。もちろん、送信フレームのヘッダには、送信元情報として、自己のノードアドレス(#1)が格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。
従って、図22に示す第5実施形態では、最初にノードアドレスが#1と小さい第1通信ユニット12aが実行する。すなわち、第1通信ユニット12aは、第2通信ユニット12bに対し「T_ASy1/2W/OUT/5ms」を内容とする通信確立要求を発行する。もちろん、グループ化されていないデータについては、第2実施形態等と同様に変数名ごとに通信確立要求をする。
(5)この通信確立要求を受信したターゲット(第2通信ユニット12b)は、要求内容をチェックする。すなわち、テンポラリ内部テーブルをアクセスし、通信確立要求されたアセンブリ名の有無をチェックする。そして、アセンブリ名が存在している場合には、ターゲットは、サイズが一致するか否かをチェックする。そして、一致する場合には、第2通信ユニット12bは、空欄となっていたテンポラリ内部テーブルの「READY」,「STOP」に対応する「向き」の欄に、受信した向きと逆の「IN」を入力する。
なお、アセンブリ名の有無のチェックは、上記のようにテンポラリ内部テーブルに基づいて行なっても良いが、本発明はこれに限るものではなく、アセンブリテーブルに基づいて行なっても良い。さらに、テンポラリ内部テーブルとアセンブリテーブルの両方に基づいてアセンブリ名の有無をダブルチェックするようにしてもよい。
(6)さらに、ターゲットは、実周期と要求周期とを比較し、対応可能か否かをチェックする。対応可能な場合には、ターゲットは、コネクションIDを特定し、通信設定ツール30の表示装置に「要求条件OK」の旨と「通信確立内容」とをモニタ表示させる。そして、ターゲットは、通信確立要求の発行元であるオリジネータに対して「要求条件OK」の旨と、コネクションIDを通知する。このとき、実周期を同時に送るようにしても良い。ターゲット側の実周期は、ターゲットのシステムメモリに格納されているため、ターゲットは、それを読み出してコネクションID等と一緒に通知する。なお、ターゲットが、要求された周期では対応できない場合には、第2実施形態と同様の手順で対応する。
コネクションIDは、オリジネータのノードアドレス−ターゲットのアドレスーシリアル番号から構成される。シリアル番号は、処理した順に付与する。従って、例えば上述した「T_Asy1」についての通信確立要求が最初に発行されてきた場合、ターゲットである第2通信ユニット12bは、T_Asy1のデータについて「#1#2−001」というコネクションIDを設定する。
通信確立要求を受けたターゲットからコネクションIDとともに要求許可通知が発行されると、オリジネータとターゲットでは、図23(a)に示すデータ構造からなるコネクションテーブルが作成される。このコネクションテーブルは、1つのコネクションIDが付与されるごとに、逐次作成され、更新される。
また、本実施形態では、グループ化できないデータについては、上述した第2実施形態等で説明した方式に従い変数名単位でコネクションIDを設定する。この設定されたコネクションIDは、コネクションテーブルにより管理されるが、図23(a)に示したグループ化したアセンブリ名を用いたコネクションテーブルと別に形成する。また、グループ化できない1つの変数名についての情報をアセンブリテーブルに登録することにより、図23(b)に示すように、同一のコネクションテーブルで一元管理ができる。この場合に、Bf2は、例えば、M_STのみのデータが格納されるようになる。
全てのデータについてコネクションIDが設定されたならば、第1通信ユニット12aと、第2通信ユニット12bとの間では、コネクションIDを用いてデータの送受を行なう。従って、グループ化されたものについては、一括してデータが送信されることになる。
図24は、第5実施形態の変形例を示している。上述した第5実施形態は、各通信ユニットとCPUユニット間における名前解決処理を、コネクションIDの設定処理を行なう前に、予め各ユニット間同士で事前に行なうようにした。これに対し、この変形例では、ターゲット側の名前解決は、コネクションIDの設定を行なう一連の処理手順の中で行なうようにした。
(0)すなわち、ユーザは、通信設定ツール30を操作し、第1CPUユニット11a用の変数テーブルと、第2CPUユニット11b用の変数テーブルと、第1通信ユニット用のアセンブリテーブルと、第2通信ユニット用のアセンブリテーブルを作成し、それぞれのテーブルを対応するユニットにダウンロードする。さらに、ユーザは、通信設定ツール30を操作し、通信設定情報を作成し、第1通信ユニット12aへ格納する。各テーブルや通信設定情報の内容は、第5実施形態と同様である。
(1)次に、オリジネータ側の第1通信ユニット12aは、通信設定情報に格納された自局変数名について、第1CPUユニット11aへ名前解決要求をする。この名前解決要求は、自局変数名に対応するデータが格納される第1CPUユニット11aにおけるメモリの実アドレスを問い合わせることである。ここでは、Switch1とSwitch2がグループ化されているが、名前解決の問い合わせは、1つずつ順に行なっても良いし、一括して行なっても良い。なお、オリジネータ側の通信ユニットにおける名前解決要求の実行は、このように通信設定情報の中に格納された変数名に基づいて行なうことに代えて、アセンブリテーブル内に記憶された変数名に基づいて行うことも可能である。
(2)第1CPUユニット11aは、受信した名前解決要求に応じて変数テーブルを参照し、対応する実アドレス(メモリアドレス)を返信する。このとき、第1CPUユニット11aは、型も併せて返信する。
(3)オリジネータ側の第1通信ユニット12aは、第1CPUユニット11aから返信されてきた情報(実アドレス,型)と、自己が保有する通信設定情報とに基づいてテンポラリ内部テーブルを作成する。作成されるテンポラリ内部テーブルのデータ構造は、第5実施形態と同様であり、グループ単位で作成される。
(4)通信設定ツール30からの通信確立命令を受けて、オリジネータ側の第1通信ユニット12a(#1)は、通信設定情報に格納されたアセンブリ名について、テンポラリ内部テーブルに基づいて、ターゲット側の第2通信ユニット12b(#2)へ通信確立要求をする。通信確立要求とともに送る情報は、相手局アセンブリ名/サイズ/向き/周期を含む。従って、具体的には、第1通信ユニット12aは、第2通信ユニット12bに対し「T_ASy1/2W/OUT/5ms」を内容とする通信確立要求を発行する。この通信確立要求に自己局の変数名を含めても良い。また、通信確立要求のフレームのヘッダには、自己のノードアドレスと相手のノードアドレスが格納されている。
(5)通信確立要求を受信した第2通信ユニット12bは、第2CPUユニット11bに対し、受信した変数名について名前解決要求をする。このとき、通信確立要求の内容は、グループ単位であるため、アセンブリ名で特定される変数名は複数ある。そこで、アセンブリテーブルを参照し、対応する変数名を取得し、取得した変数名の1個ずつについて、第2CPUユニット11bへ名前解決を要求する。図示の例では、第2通信ユニット12bは、1つめの変数名「READY」についての実アドレスを問い合わせる要求をしている。もちろん、アセンブリ中の全ての変数名について一括して名前解決を要求して良い。
(6)第2CPUユニット11bは、名前解決要求に応じて変数テーブルを参照し、変数名に対応する実アドレスと型(サイズ)とを取得し、第2通信ユニット12bへ返信する。図では、第2CPUユニット11bは、問い合わせのあった「READY」に対し、「DM200/1W(1wordの意味)」を返信している。名前解決の要求を1個ずつ行なう場合には、(5),(6)を所定回数繰り返し実行し、アセンブリ名に属する全ての変数名について名前解決を行なう。
(7)第2通信ユニット12bは、第2CPUユニット11bから取得したメモリアドレスと型(サイズ)に基づき、第1通信ユニット12aから受信した通信確立要求の内容をチェックする。具体的なチェック項目は、第5実施形態と同様であるためここでは省略する。
そして、要求内容が正しく、通信確立要求を許可する場合には、第2通信ユニット12bは、テンポラリ内部テーブルを作成する。このテンポラリ内部テーブルのデータ構造は、第5実施形態と同様である。ここでは、受信した通信確立要求の内容と、名前解決処理で取得した変数名と実アドレスの対応関係から、現在コネクションIDの設定の処理対象となっているアセンブリ名について一度に作成する。あわせて、第2通信ユニット12bは、通信設定ツール30に、「要求条件OK」の旨と「通信確立内容」とをモニタ表示する。
(8)通信確立要求を許可する場合、第2通信ユニット12bは、コネクションIDを特定し、特定したコネクションIDと、「確立要求許可通知」とを第1通信ユニット12aに返信する。このとき、第2通信ユニット12bは、実周期を合わせて送信しても良い。
以下、第5実施形態と同様に、第1通信ユニット12aと第2通信ユニット12bは、ともにコネクションテーブルを作成する。さらに、アセンブリ名が複数存在する場合、上記の(4)から(8)の処理を、各アセンブリ変数名ごとに繰り返し実行し、全てのアセンブリ名についての確立要求を行ない、コネクションIDを設定する。通信確立したのちは、コネクションIDを利用して通信ユニット間で通信することは、第5実施形態と同様であるため、その説明を省略する。
図25は、本発明の第6実施形態を示している。本実施の形態は、第3実施形態と同様に受信側をオリジネータに設定した場合を前提とし、第5実施形態と同様にグループ化に適用したものである。グループ化される条件は、第5実施形態と同様である。ただし、受信側をオリジネータに設定したため、実際には、ターゲットが共通で、周期が同じで「INデータ」同士が、グループ化されることになる。以下、本実施形態の特徴であるグループ化して送信するデータについての名前解決処理とコネクションIDの設定処理について説明する。
(0)ユーザは、通信設定ツール30を操作し、グループ化するデータを管理するためのアセンブリテーブルを作成し、各通信ユニットに格納する。アセンブリテーブルは、第5実施形態と同様のデータ構造をとる。ただし、第5実施形態とはオリジネータとターゲットの関係が逆になるため、アセンブリ名が異なる。つまり、第5実施形態ならびに第6実施形態では、オリジネータとターゲットのアセンブリ名の対応付けが容易に理解しやすくするため、ターゲットのアセンブリ名は、オリジネータのアセンブリ名の前に「T_」を付加したものを用いている。そのため、第2通信ユニット12bのアセンブリテーブルに格納するアセンブリ名は「Asy」の後ろに適当な番号を付加した名称となり、第1通信ユニット12aのアセンブリテーブルに格納するアセンブリ名は、「T_」から始まるようになっている。
ユーザは、通信設定ツール30を操作し、オリジネータである第2通信ユニット12bに格納する通信設定情報も作成し、第2通信ユニット12bに格納する。通信設定情報は、自局アセンブリ名と、相手局を特定するノードアドレスと、相手局アセンブリ名と、データサイズと、向きと、周期と、を関連づけたテーブル構造となる。データサイズは、グループ化する各データのデータサイズの総和となる。なお、この第6実施形態では、受信側をオリジネータとしたため、通信設定情報における向きは、必ず「IN」となる。そこで、第3実施形態と同様に、通信設定情報における向きの欄は、省略しても良い。
もちろん、ユーザは、通信設定ツール30を操作し、各変数テーブルを作成し、対応するCPUユニットに格納するし、グループ化されないデータについての通信バッファテーブルや通信設定情報も作成し、対応する通信ユニットに格納する。
(1)通信ユニットが変数名と、実アドレスの対応付けする名前解決処理は、コネクションIDの設定処理に先立ち実行する。つまり、第5実施形態と同様に、通信ユニットは、アセンブリテーブルに格納された変数名を取得し、接続されたCPUユニットに対し取得した変数名の実アドレスを問い合わせる。この問い合わせる際の変数名の数は、任意であり、1個ずつ問い合わせても良いし、一括して問い合わせても良い。
(2)各CPUユニットは、問い合わせを受けると、変数テーブルを参照し、変数名に対する実アドレス並びに、型(サイズ)を返信する。これら(1),(2)の処理は、各通信ユニットとCPUユニットとの間で適宜のタイミングで実行される。
(3)オリジネータ側の第2通信ユニット12aは、名前解決した情報を記憶しておく。記憶エリアは、例えば、テンポラリ内部テーブルを用いることができる。なお、通信設定情報を備えたオリジネータ側では、通信設定情報中に「向き」まで特定されているため、図25に示すようにテンポラリ内部テーブルは完成する。テンポラリ内部テーブルは、アセンブリテーブルのバッファエリアを特定する情報(図では、Bf11)と、自局アセンブリ名と、グループ全体のデータサイズと、グループ化された変数名と、実アドレスと、向きを関連づけたテーブルとなる。図から明らかなように、グループ単位で1連のテーブルが作成される。
(3)′ターゲット側の第1通信ユニット12aは、名前解決した情報を記憶しておく。記憶エリアは、例えば、テンポラリ内部テーブルを用いることができる。なお、通信設定情報を備えていないターゲット側では、「向き」を直接的に特定できないため、この処理が実行されて作成されるテンポラリ内部テーブルは、「向き」の欄を空欄とする。なお、ターゲット側は送信側であるため、「向き」は「OUT」になる。そこで、第1通信ユニット12aは、テンポラリ内部テーブルを作成する際に、「向き」の欄に「OUT」を格納するようにしても良い。
(4)次に、コネクションIDの設定処理手順について説明する。ノード番号の小さいオリジネータから順番に、ターゲットへ通信確立要求をする。この通信確立要求は、ツール30からの通信確立命令が出されたことに基づき、各通信ユニットが順次処理対象のデータの通信相手となる通信ユニットに対して通信確立要求を発行することになる。この通信確立要求は、グループ化されたものについては、アセンブリ単位で行なう。つまり、通信確立要求は、相手局アセンブリ名,データサイズ,向き並びに周期の情報を相手ノードに送る。もちろん、送信フレームのヘッダには、送信元情報として、自己のノードアドレスが格納されているので、受信した通信ユニットは、どのノードアドレスの通信ユニットから送られてきた通信確立要求かが分かる。
図25の例では、通信設定情報を備えている通信ユニットの最小のノード番号は#2であるので、第2通信ユニット12bが、通信確立要求を実行する。すなわち、第2通信ユニット12bは、第1通信ユニット12aに対し「T_ASy11/2W/IN/5ms」を内容とする通信確立要求を発行する。もちろん、グループ化されていないデータについては、第3実施形態等と同様に変数名ごとに通信確立要求をする。
(5)この通信確立要求を受信したターゲット(第1通信ユニット12a)は、要求内容をチェックする。すなわち、テンポラリ内部テーブルをアクセスし、通信確立要求されたアセンブリ名の有無をチェックする。そして、アセンブリ名が存在している場合には、ターゲットは、サイズが一致するか否かをチェックする。そして、一致する場合には、第1通信ユニット12aは、空欄となっていたテンポラリ内部テーブルの「Switch1」,「Switch2」に対応する「向き」の欄に、受信した向きと逆の「OUT」を入力する。なお、(3)′の処理の際に、「向き」の欄に「OUT」を格納した仮のテンポラリ内部テーブルを作成した場合には、対応する欄が「OUT」になっていることを確認し、内容を確定する。
なお、アセンブリ名の有無のチェックは、上記のようにテンポラリ内部テーブルに基づいて行なっても良いが、本発明はこれに限るものではなく、アセンブリテーブルに基づいて行なっても良い。さらに、テンポラリ内部テーブルとアセンブリテーブルの両方に基づいてアセンブリ名の有無をダブルチェックするようにしてもよい。
(6)さらに、ターゲットは、実周期と要求周期とを比較し、対応可能か否かをチェックする。対応可能な場合には、ターゲットは、コネクションIDを特定し、通信設定ツール30の表示装置に「要求条件OK」の旨と「通信確立内容」とをモニタ表示させる。そして、ターゲットは、通信確立要求の発行元であるオリジネータに対して「要求条件OK」の旨と、コネクションIDを通知する。このとき、実周期を同時に送るようにしても良い。ターゲット側の実周期は、ターゲットのシステムメモリに格納されているため、ターゲットは、それを読み出してコネクションID等と一緒に通知する。なお、ターゲットが、要求された周期では対応できない場合には、第2実施形態と同様の手順で対応する。
コネクションIDは、オリジネータのノードアドレス−ターゲットのアドレスーシリアル番号から構成される。シリアル番号は、処理した順に付与する。従って、例えば上述した「T_Asy11」についての通信確立要求が最初に発行されてきた場合、ターゲットである第1通信ユニット12bは、T_Asy11のデータについて「#2#1−001」というコネクションIDを設定する。
アセンブリテーブルに登録されたアセンブリ名が複数存在する場合、上記のアセンブリ名ごとに(4)から(6)の処理を繰り返し実行し、全てのアセンブリ名について個年ションIDを設定する。
通信確立要求を受けたターゲットからコネクションIDとともに要求許可通知が発行されると、オリジネータとターゲットでは、図26に示すデータ構造からなるコネクションテーブルが作成される。このコネクションテーブルは、1つのコネクションIDが付与されるごとに、逐次作成され、更新される。
全てのデータについてコネクションIDが設定されたならば、第1通信ユニット12aと、第2通信ユニット12bとの間では、コネクションIDを用いてデータの送受を行なう。従って、グループ化されたものについては、一括してデータが送信されることになる。
なお、具体的な図示は省略するが、この第6実施形態においても、第5実施形態の変形例と同様に、ターゲット側の名前解決はコネクションIDの設定処理を行なう途中で実行するようにすることもできる。また、第4実施形態及びその変形例のように、送信側をオリジネータにした場合にも、上述したグループ化の技術を適用できる。
さらにまた、図22,図24,図25では、アセンブリテーブルは、アセンブリ名と、バッファエリアと、対応変数と、を関連づけ立てー部としたが、例えば、アセンブリ名とバッファエリとを対応づけたテーブルと、アセンブリ名と対応変数と対応づけたテーブルのように2つのテーブルに分けて管理しても良い。このように2つのテーブルに分割して管理することは、第2から第4実施形態ならびにその変形例で図示した通信バッファテーブルについても言える。
以上、第5、第6実施形態およびその変形例を説明したが、いずれの実施形態においても次のようにするのが好ましい。まず、オリジネータが発行する通信要求に、自己局ノードアドレス(オリジネータ側ノードアドレス)、自己局のアセンブリ名(オリジネータ側のアセンブリ名)、相手局ノードアドレス(ターゲット側ノードアドレス)、相手局のアセンブリ名(ターゲット側のアセンブリ名),データサイズ(通信対象データのサイズ),向き(送信なのか受信なのか)並びに周期を含めるようにする。
いっぽう、ターゲットがオリジネータに対して送る要求許可通知に、許可通知(OK/NG)、コネクションID、自己局ノードアドレス(ターゲット側ノードアドレス)、相手局ノードアドレス(オリジネータ側ノードアドレス)、周期に加え、自己局のアセンブリ名(ターゲット側のアセンブリ名)、相手局アセンブリ名(ターゲット側のアセンブリ名),データサイズ(通信対象データのサイズ)、向き(送信なのか受信なのか)を含めるようにする。このうち自己局のアセンブリ名(ターゲット側のアセンブリ名)と相手局アセンブリ名(ターゲット側のアセンブリ名)とについては、もともとオリジネータがふたつの関係付けを記憶しているので、どちらかを省略してもよい。また、データサイズ(通信対象データのサイズ)もオリジネータが記憶している情報なので省略してもよい。
そして、オリジネータがターゲットから通信許可を受取れば、通信設定情報のなかの周期を通信許可された周期に上書きして記憶する。こうすることで、ユーザはオリジネータの通信設定情報を確認することで、オリジネータとして関わる通信内容を把握することができる。ここでの通信設定情報にかかるすべての情報をテーブルとして持つようにしてもよい。
また、ターゲットは、オリジネータからの通信要求、ターゲットでの通信確立処理を通じて取得した情報をひとまとめに記憶するのが好ましい。例えば、新たに通信設定情報を記憶できる記憶領域を用意し、そこにコネクションID、自己局ノードアドレス(ターゲット側ノードアドレス)、自己局のアセンブリ名(ターゲット側のアセンブリ名)、相手局ノードアドレス(オリジネータ側ノードアドレス)、相手局アセンブリ名(オリジネータ側のアセンブリ名)、データサイズ(通信対象データのサイズ)、向き(送信なのか受信なのか)、並びに周期(通信許可した周期)の情報を含む情報を別途記憶しておくとよい。こうすると、ユーザはターゲットとして関わる通信設定内容をその記憶情報を確認することで、変数名に基づいて通信内容を知ることができる。
なお、第5、第6の実施形態およびその変化例のように、1つの通信ユニットがオリジネータの立場とターゲットの立場の両方をとることがある。この場合であっても、ひとつの通信ユニットがオリジネータとして通信確立後の通信設定情報と、ターゲットとしての通信確立後の通信設定情報を併せ持つので、ユーザはそれらの記憶することで、アセンブリ名に基づいて通信内容を知ることができる。