(57)【特許請求の範囲】
【請求項１】
複数のプロセッサと、前記複数のプロセッサで制御される少なくとも一つのデバイスと、前記複数のプロセッサ間で制御情報を通信し、前記複数のプロセッサと前記少なくとも一つのデバイス間で入出力情報を通信するための少なくとも一つの情報伝送路とを備えた分散制御システムにおいて、
前記複数のプロセッサのそれぞれがプロセッサ検出手段とプログラムブロック割り当て手段とを有し、前記プロセッサ検出手段は情報伝送路に接続されている前記複数のプロセッサの個数の増減を検出したときまたは複数のプロセッサのいずれかの障害を検出したときに、前記複数のプロセッサの中から使用可能なプロセッサを検出し、前記プログラムブロック割り当て手段は、全てのプログラムブロックの中から使用可能なプロセッサのそれぞれが処理すべきプログラムブロックを選んで割り当て表である分担ユニットリストを作成するとともに、全てのプログラムブロックと割り当て表とを全ての使用可能なプロセッサに配信し、割り当て表を作成するときには各プログラムブロックの１サイクルあたりの平均処理ステップ数または平均処理時間に基づいて全ての使用可能なプロセッサの処理負荷がそれぞれ等しくなるように割り当てることを特徴とする分散制御システム。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、ネットワークに複数の制御用プロセッサとデバイスを接続して構成される分散制御システムに関する。
【０００２】
【従来の技術】
従来の一般的な分散制御システムでは、ネットワークに複数のコントローラが接続され、これらのコントローラのそれぞれに、その制御対象となるデバイスが接続されていた。ここで、各コントローラには個別にプログラムが与えられ、プログラム作成者が各コントローラとデバイスの接続関係を意識しながら、プログラムを作成していた。さらに、これらのプログラムには、各デバイスを制御するための処理を記述するだけでなく、システム全体としてのシーケンスを制御するために、各コントローラの間の同期処理も記述する必要があった。このために、プログラムの記述が複雑になるという問題があった。
【０００３】
また、このように各コントローラに接続されるデバイスが固定され、各コントローラのプログラムの内容も固定されてしまうと、コントローラとデバイスの接続関係が変わったときに、その都度、各コントローラのプログラムを修正しなければならないので、プログラムの修正に要する工数が大きくなり、システム構成の変化に柔軟に対応することが困難であるという問題があった。
【０００４】
このようなネットワークに接続される分散制御システムに関する公知例としては、特開平１０−１７７４９５号公報に記載された分散制御システムが挙げられる。この公知例には、サーバとなるコンピュータが、一つの標準的なプログラミング言語で統一的に記述されたプログラムを、ネットワークに接続された複数のマイクロコンピュータのそれぞれで実行されるプログラムに変換し、これを前記マイクロコンピュータのそれぞれに配信する方法が述べられている。
【０００５】
【発明が解決しようとする課題】
上記公知例では、分散制御システムのプログラムを統一的に記述できるようになるので、プログラムの記述は容易になると考えられる。
【０００６】
しかし、上記公知例では、どのマイクロコンピュータにどのプログラム部分を実行させるかという、個々のプログラム部分の配置関係に関しては、プログラム作成者が予め定義しておく必要があるために、システム構成の変化に柔軟に対応することが困難であるという問題は解決されていない。
【０００７】
そこで、本発明では、ネットワークに接続される分散制御システムにおいて、システム全体のプログラムを一元的に記述し、さらに制御用プロセッサの構成に応じてプログラムの実行分担を自動的に決定することによって、システム構成に依存しない容易なプログラミングを実現し、システム構成の変化にも柔軟に対応できる分散制御システムを提供することを目的とする。
【０００８】
【課題を解決するための手段】
上記目的は、複数のプロセッサと、前記複数のプロセッサで制御される少なくとも一つのデバイスと、前記複数のプロセッサ間で制御情報を通信し、前記複数のプロセッサと前記少なくとも一つのデバイス間で入出力情報を通信するための少なくとも一つの情報伝送路とを備えた分散制御システムにおいて、前記複数のプロセッサのそれぞれがプロセッサ検出手段とプログラムブロック割り当て手段とを有し、前記プロセッサ検出手段は情報伝送路に接続されている前記複数のプロセッサの個数の増減を検出したときまたは複数のプロセッサのいずれかの障害を検出したときに、前記複数のプロセッサの中から使用可能なプロセッサを検出し、前記プログラムブロック割り当て手段は、使用可能なプロセッサのそれぞれが処理すべきプログラムブロックを全てのプログラムブロックの中から選んだ割り当て表を作成するとともに、全てのプログラムブロックと割り当て表とを全ての使用可能なプロセッサに配信し、割り当て表を作成するときには各プログラムブロックの１サイクルあたりの平均処理ステップ数または平均処理時間に基づいて全ての使用可能なプロセッサの処理負荷がそれぞれ等しくなるように割り当てることによって達成される。
【０００９】
【発明の実施の形態】
以下、本発明の実施の形態について、添付図面を参照して説明する。
【００１０】
図１は、本発明を適用した分散制御システムの構成を示すブロック図である。本システムは、複数の制御用プロセッサ１０１を、制御情報伝送路１０２と入出力情報伝送路１０３に接続して構成される。入出力情報伝送路１０３には、本システムの制御対象となるデバイス１０４も接続されており、各デバイス１０４の入出力情報は、入出力情報伝送路１０３を介して、各制御用プロセッサ１０１に伝送される。また、各制御用プロセッサ１０１が共有すべき制御情報は、制御情報伝送路１０２を介して伝送される。さらに、制御情報伝送路１０２には、上位コントローラ１０６も接続され、制御用プロセッサ１０１に対するプログラムのダウンロードや制御情報のモニタを行うことができる。
【００１１】
制御用プロセッサ１０１は、演算手段１０１ａを有し、さらに、これが二つの情報伝送路１０２、１０３を介した通信を行うための制御情報通信手段１０１ｂと入出力情報通信手段１０１ｃを有する。演算手段１０１ａは、制御情報通信手順記憶手段１０１ｆに格納された手順にしたがって、制御情報通信手段１０１ｂを用いた制御情報の送受信を行い、さらに、入出力情報通信手順記憶手段１０１ｇに格納された手順にしたがって、入出力情報通信手段１０１ｃを用いた入出力情報の送受信を行う。また、これらの通信手順によって得られた情報は、制御情報および入出力情報記憶手段１０１ｄに格納される。プログラム記憶手段１０１ｅには、本システムの制御対象となるデバイス１０４の入出力およびシステムのシーケンスを制御するためのプログラムが格納される。
【００１２】
本システムでは、このプログラムを複数の制御用プロセッサ１０１で分担して実行することで、システム全体としての処理能力の向上、信頼性の向上を目的とする。このために、まず、制御用プロセッサ１０１のそれぞれが、有効プロセッサ検出手順記憶手段１０１ｈに格納された手順にしたがって、本システムを構成する有効な制御用プロセッサを検出する。つぎに、ここで検出された有効な制御用プロセッサのいずれか一つが、プログラム実行分担決定手順記憶手段１０１ｉに格納された手順にしたがって、有効な制御用プロセッサのそれぞれのプログラム実行分担を決定し、これをプログラムとともに有効な制御用プロセッサ１０１のそれぞれに対して配信する。さらに、有効な制御用プロセッサのそれぞれが、プログラム実行手順記憶手段１０１ｊに格納された手順にしたがって、配信されたプログラム実行分担に基づいたプログラムの実行を行う。なお、あとで述べるように、本発明におけるプログラムは、相互に並列処理可能な複数のプログラムブロックから構成されており、これらのプログラムブロックの処理を有効な制御用プロセッサのそれぞれに対して割り当てることが、ここで述べたプログラム実行分担を決定することに相当する。
【００１３】
また、本システムでは、制御用プロセッサ１０１とデバイス１０４を、共通の入出力情報制御網１０３に接続することで、制御用プロセッサ１０１とデバイス１０４の接続関係を固定せず、どの制御用プロセッサ１０１からも、すべてのデバイス１０４を制御することができる。このような構成にすることによって、各制御用プロセッサ１０１で実行するプログラムの内容を固定することなく、システム構成の変化に柔軟に対応した処理の配分が可能となる。このとき、各制御用プロセッサ１０１で実行するプログラムがシステム構成を意識することなく一元的に記述できれば、プログラムの記述が容易になる。
【００１４】
さらに、制御用プロセッサ１０１の構成が変化したときに、これを自動的に検出し、各制御用プロセッサ１０１の処理負荷の配分が最適に近いプログラム実行分担を決定できれば、システム構成の静的、動的な変化に柔軟に対応することが可能となる。これによって、システム全体としての処理能力が向上し、故障発生などに対するシステムの信頼性も向上する。
【００１５】
図１のように、共通の入出力情報伝送路１０３に接続される制御用プロセッサ１０１とデバイス１０４は、それぞれ固有のＭＡＣＩＤ（メディア・アクセス・コントロール・アイデンティファイア）と呼ばれる識別番地を有する。また、各デバイス１０４は、複数の入出力ポート１０４ａ、１０４ｂ、１０４ｃを有し、これらは各デバイス１０４内のポート番号で管理される。各制御用プロセッサ１０１は、実際の機器動作に直結する入出力ポートを、各デバイス１０４のＭＡＣＩＤとそのデバイス１０４内のポート番号の組み合わせで識別し、これらを制御するためのメッセージを各デバイスに対して送信する。
【００１６】
図２は、プログラムを記述するときに用いる論理ポート番号２０１と、デバイスの物理ポート番号２０２の対応関係の例を示す。例えば、０番目の論理ポートは、ＭＡＣＩＤが１０のデバイスに備えられた０番目のポートに対応する。このように、各物理ポート２０２に対して一連の論理ポート番号２０１を割り付けることによって、各デバイス固有のＭＡＣＩＤ２０２ａとポート番号２０２ｂを意識することなく、プログラムを記述できる。なお、このプログラムを実行形式に変換する際は、図２のような論理ポート番号と物理ポート番号の対応関係に基づいてポート番号を変換することによって、制御用プロセッサがどの物理ポートを操作するかが特定される。
【００１７】
本発明を適用した分散制御システムにおいては、プログラムを記述する手法として、特開平７−７２９２０号公報に記載のセル制御言語に拡張を加えたものを採用した。セル制御言語では、システムを構成する機器の動作シーケンスをペトリネットで表現し、シーケンスの各ステップの処理をロボット言語風の高級言語で記述する。また、システムを構成する機器のうちで、あるまとまった機能を果たす機器の集合で、互いに並行動作可能なものをユニットと定義し、このようなユニット毎にシーケンスを記述する。ユニットはシステムを構成する機能単位であり、プログラム作成者が定義するものである。
【００１８】
図１に、ユニットの定義の例を示した。ここで、デバイス１０４の入出力ポート（１０４ａ、１０４ｂ、１０４ｃなど）は実際の機器動作に直結し、これらをいくつかまとめたものがユニットと等価なものになる。したがって、図１では入出力ポートをいくつかまとめたグループをユニット１０５と定義し、これを点線で囲んで示した。例えば、デバイス０のポート０、１、２に接続される機器をまとめて、一番目のユニット、ＵＮＩＴ１と定義した。同様に、デバイス２のポート０、１に接続される機器とデバイス３のポート０、１に接続される機器をまとめて４番目のユニット、ＵＮＩＴ４と定義した。このように、機能単位であるユニットの定義は、デバイス１０４そのものの単位に左右されない。なお、以下、ｎ番目のユニットをＵＮＩＴｎと表記する。
【００１９】
図３は、セル制御言語で記述したプログラムの構造の例を示す。この図に示すように、セル制御言語のプログラムは、システム全体の運転モードの遷移を表すペトリネット３０１と、各モードにおけるユニット毎のシーケンスを表すペトリネット３０２の２種類のモジュールで構成される。ここで、前者をＭ−ｎｅｔ（Ｍｏｄｅ−ｎｅｔ）、後者をＳ−ｎｅｔ（Ｓｅｑｕｅｎｃｅ−ｎｅｔ）と呼ぶ。ここで、Ｍ−ｎｅｔ３０１は１個のモジュールであり、これを０番目のユニット（ＵＮＩＴ０）のモジュールとする。Ｍ−ｎｅｔ３０１のプレース（○）には、各モードを区別する記号が記述される。例えば、Ｍ３は３番目のモードを表す。Ｓ−ｎｅｔ３０２は各モードにおいてユニット毎に記述するものであり、図３の例では、ＵＮＩＴ１のＳ−ｎｅｔ３０２ａ、ＵＮＩＴ２のＳ−ｎｅｔ３０２ｂの２個のモジュールが記述されている。これらの２個のＳ−ｎｅｔは、同一モード（Ｍ３）において並行動作するユニットのシーケンスを表し、Ｍ−ｎｅｔ３０１のＭ３の処理として、これらを起動するコマンド３０３を記述する。
【００２０】
Ｓ−ｎｅｔ３０２のプレース（○）３０４は、一連のシーケンスの中の単位動作（ステップ）を表し、各プレース３０４には、各ステップを区別する記号が記述される。例えば、Ｓ１１は１１番目のステップを表す。トランジション（━）３０６は、あるステップからつぎのステップへの状態遷移を表す。アーク（↓）３０５は、プレース３０４とトランジション３０６を接続し、矢印の方向に状態は遷移する。また、各プレース３０４に対しては、そのステップの動作内容を表すコマンド３０７とそのステップの終了条件３０８を記述する。例えば、Ｓ１４のコマンド３０７は、論理入出力ポートＩＯ１をＯＮにして、１秒のタイマＴＤ１をセットする処理を示す。終了条件３０８には、ＯＫ条件とＮＧ条件の２種類があり、ＯＫ条件はＯＫｎ（ｎはＯＫ条件番号）、ＮＧ条件はＮＧｎ（ｎはＮＧ条件番号）と表す。例えば、Ｓ１４の終了条件３０８のＯＫ１条件は、ポートＩＯ０がＯＮかつタイマＴＤ１がＯＦＦであることを示し、ＮＧ１条件は、ポートＩＯ０がＯＦＦかつタイマＴＤ１がＯＮであることを示す。また、プレース３０４の終了条件３０８のうちのいずれかを、そのプレース３０４の出力として接続されるトランジション３０６の付帯条件として記述する。例えば、Ｓ１１の出力トランジションの付帯条件はＳ１１のＯＫ１条件である。これらの基本的な記述方法に関しては、Ｍ−ｎｅｔにおいても全く同様である。
【００２１】
また、図３に示した二つのＳ−ｎｅｔ３０２ａ、３０２ｂは、二重丸で示された同期プレース３０９で接続されている。ここで、同期プレース３０９には、ＲＥＱｎ（ｎは同期プレースの番号）を記述する。同期プレース３０９を一方のＳ−ｎｅｔのトランジションからの出力とし、同時に他方のＳ−ｎｅｔのトランジションの入力とすることにより、二つのＳ−ｎｅｔの間の同期を表現できる。すなわち、同期プレース３０９を出力とするＳ−ｎｅｔは他方に同期のタイミングを通知し、同期プレースを入力とするＳ−ｎｅｔは他方からの同期のタイミングが通知されるのを待つ。図３では、ＵＮＩＴ１のステップＳ１３がＯＫ１条件で終了し、かつＵＮＩＴ２のステップＳ２２がＯＫ１条件で終了したとき、ＵＮＩＴ１のつぎのステップＳ１４への遷移が起こることを示す。なお、このような同期プレース３０９が活性化されているかどうか（ＯＮ／ＯＦＦ）は、システムを構成するユニットの間の同期をとるための制御情報として、各制御用プロセッサで共有する必要がある。
【００２２】
図４は、Ｓ−ｎｅｔを保存した際に生成されるソースモジュールの一部と、それを制御用プロセッサ内で実行される形式に変換した例を示す。ここで、ソースモジュール４０１は、図３に示したＳ−ｎｅｔ３０２ａから生成されたソースモジュールの一部であり、これを実行形式に変換して得られたものが内部コードプログラム４０２である。ソースモジュール４０１は、Ｓ−ｎｅｔ３０２ａの各トランジションに一対一に対応したＩＦ〜ＴＨＥＮ形式のルール４０１ａ、４０１ｂで構成される。例えば、ルール４０１ａは、ステップＳ１３の出力側のトランジションに対応し、Ｓ１３がＯＫ１条件で終了し、かつ同期プレースＲＥＱ１が活性化されれば、Ｓ１４を活性化し、そのコマンドを実行する、というルールを表す。
【００２３】
内部コードプログラム４０２は、ソースモジュール４０１のルール４０１ａ、４０１ｂのそれぞれに一対一に対応したブロック４０２ａ、４０２ｂで構成される。各ブロック４０２ａ、４０２ｂは、内部コードのインストラクション列であり、これらのインストラクションが制御用プロセッサにおいて逐次実行される。ここで、各インストラクションは、１バイトのオペコード（例えば、ＩＮなど）と、それに続く固定長のオペランドで構成される。また、各ブロック４０２ａ、４０２ｂは、共通の構造を有する。すなわち、各ブロックは、「ＳＴＴ  ｎ」（ｎはステップ番号）というインストラクションで始まり、「ＥＯＳ  ｎ」（ｎはステップ番号）というインストラクションで終了する。前者をステップラベル、後者をステップ終了ラベルと呼ぶ。また、これら一対のラベルで囲まれたブロックのことをステップブロックと呼ぶ。なお、このようなブロックの構造は、Ｍ−ｎｅｔの場合も同様であり、Ｍ−ｎｅｔを内部コード化したブロックは、モードラベルとモード終了ラベルで囲まれたモードブロックから構成される。
【００２４】
図５は、Ｓ−ｎｅｔを内部コード化したＳ−ｎｅｔブロック５０１と、それを実行する際に用いるステップラベルテーブル５０２の関係を示す。図４と同様、ステップブロック５０１ａは、ステップラベル５０１ｂで始まる。ステップラベルテーブル５０２には、各ステップ番号５０２ａに対応して、そのステップラベル５０１ｂのプログラム内におけるアドレス５０２ｂが登録されている。プログラムが実行中のとき、各ユニットの実行状態、すなわちＳ−ｎｅｔの実行中のステップは唯一に決まり、このような各ユニットの現在のステップ番号は、制御情報として制御用プロセッサの中に格納されている。プログラムを実行する際は、ここから各ユニットの現在のステップ番号を取得し、これに対応したステップラベルのアドレスをステップラベルテーブル５０２から取得する。さらに、このアドレスをインストラクションポインタに代入し、実行すべきステップブロックにジャンプする。
【００２５】
図６は、Ｍ−ｎｅｔを内部コード化したＭ−ｎｅｔブロック６０１と、それを実行する際に用いるモードラベルテーブル６０２の関係を示す。ここで、モードブロック６０１ａは、モードラベル６０１ｂで始まる。モードラベルテーブル６０２には、各モード番号６０２ａに対応して、そのモードラベル６０１ｂのアドレス６０２ｂが登録されている。プログラムを実行する際、制御情報から現在のモード番号を取得して、これに対応したモードラベルのアドレスをモードラベルテーブル６０２から取得し、このアドレスをインストラクションポインタに代入し、実行すべきモードブロックにジャンプする。
【００２６】
なお、図４ではソースモジュールの一部を変換した例を示したが、実際のプログラムでは、Ｍ−ｎｅｔモジュールとすべてのＳ−ｎｅｔモジュールを結合して変換し、一つの内部コードプログラムを生成する。
【００２７】
図７は、このように生成した最終的な内部コードプログラムの構成を示す。インストラクションコード７０５は、Ｍ−ｎｅｔ、Ｓ−ｎｅｔの内容と一対一に対応する内部コードのインストラクション列であり、Ｍ−ｎｅｔブロック７０６、Ｓ−ｎｅｔブロック７０７から構成される。ここで、Ｍ−ｎｅｔブロック７０６を、ＵＮＩＴ０のブロックとする。Ｓ−ｎｅｔブロック７０７は、各ユニットのＳ−ｎｅｔを内部コード化したブロック、例えば、ＵＮＩＴ１のブロック７０７ａ、ＵＮＩＴ２のブロック７０７ｂなどで構成される。なお、各ユニットの内部コードをまとめたブロックのことをユニットブロックと呼ぶ。モードラベルテーブル７０１とステップラベルテーブル７０２には、それぞれインストラクションコード７０５におけるモードラベルとステップラベルのアドレスが格納される。定数テーブル７０３には、インストラクションコード７０５の中の各種定数に関する情報が格納される。ユニット負荷情報テーブル７０４には、プログラムを実行する際に各ユニットブロックにおいて処理されるインストラクション数の平均値が、ユニット毎に格納されている。
【００２８】
ここで、ユニット負荷情報テーブル７０４は、各制御用プロセッサのプログラム実行分担、すなわち各制御用プロセッサがどのユニットブロックを分担するかを決定するときに利用される。ユニット負荷情報テーブル７０４に格納された各ユニットの平均処理インストラクション数は、プログラムを内部コード化する際に計算されるものである。例えば、図４のステップブロック４０２ａ、４０２ｂは、現在のステップがそれぞれＳ１３、Ｓ１４のときに処理されるインストラクション列であり、それぞれのインストラクション数は、１２、１３である。平均処理インストラクション数を計算する際は、各ユニットブロック内のインストラクション数の合計を、そのユニットブロック内の全ステップブロックの数で割って平均値を求める。
【００２９】
図８は、本発明を適用した分散制御システムの全体としての処理を示すフローチャートである。まず、制御用プロセッサの一つを選択し、そのプログラム記憶手段に実行すべき内部コードプログラムを、制御情報伝送路を介して上位コントローラからダウンロードするか、二次記憶媒体を用いてコピーする（処理８０１）。つぎに、全システムを再起動する（処理８０２）。各制御用プロセッサは起動時に自分の存在を他の制御用プロセッサに知らせるために、制御情報伝送路における自分のＭＡＣＩＤ、プロセッサタイプなどをメッセージとしてブロードキャストし、各制御用プロセッサは、これらのメッセージを受信して制御情報伝送路に接続された有効な制御用プロセッサをまとめたリスト（以下、有効プロセッサリスト）を作成する（処理８０３）。このような有効プロセッサリストを作成するための手順が、図１で示した有効プロセッサ検出手順である。システム再起動時は、最初にプログラムを転送された制御用プロセッサがプログラムの配送元になり、プログラムが未配送の他の制御用プロセッサに対して、同一のプログラムを制御情報伝送路を介して転送する（処理８０４）。つぎに、配送元となった制御用プロセッサの場合（処理８０５）、図１で示したプログラム実行分担決定手順によって、各制御用プロセッサが分担するユニットブロックをまとめたリスト（以下、分担ユニットリスト）を作成する（処理８０６）。配送元は、この分担ユニットリストを他の制御用プロセッサに配送する（処理８０７）。ここで、分担ユニットリストを配送された制御用プロセッサは配送元に対して受信応答を返すので、配送元は他のすべての制御用プロセッサからの応答を受信するまで待つ（処理８０８）。配送元でない制御用プロセッサの場合（処理８０５）、配送元からの送信があるまで待ち（処理８０９）、自分の分担ユニットリストを受信する（処理８１０）。さらに、配送元に対して受信応答を返す（処理８１１）。つぎに、各制御用プロセッサは、プログラム実行手順にしたがって、各自の分担ユニットリストに示されたユニットのプログラムブロックを１サイクル実行する（処理８１２）。プログラムを１サイクル実行したのち、各制御用プロセッサは制御情報伝送路に自存在をブロードキャストし、先と同様に各自有効プロセッサリストを作成する（処理８１３）。このときに作成した有効プロセッサリストと前回作成した有効プロセッサリストを比較した結果、有効な制御用プロセッサの構成に変化がなかった場合（処理８１４）、処理８１２に戻って、プログラムの実行を続ける。有効な制御用プロセッサの構成に変化があった場合（処理８１４）、各制御用プロセッサはプログラムの実行を中断し（処理８１５）、有効プロセッサリストの中から最もＭＡＣＩＤの若い制御用プロセッサを選定して、これを配送元とし（処理８１６）、さらに処理８０４まで戻る。以上に述べた処理を繰り返すことによって、本発明を適用した分散制御システムは、所望の制御処理を実現する。
【００３０】
図９は、有効プロセッサリストの例を示す。ここで、各制御用プロセッサが検出した有効な制御用プロセッサ（自分を含む）は、ＭＡＣＩＤ９０２の若い順にソートされ、それぞれにプロセッサ番号９０１が割り付けられる。また、この有効プロセッサリストには、各制御用プロセッサのタイプ９０３の情報も格納される。なお、ここで示した有効プロセッサリストは、（それ自体が有効な）各制御用プロセッサで作成されるものであるが、別の方法として、配送元となる制御用プロセッサが、他の有効な制御用プロセッサに対して、自分で作成した有効プロセッサリストを配送するようにしても良い。
【００３１】
図１０は、分担ユニットリストを作成する処理を示すフローチャートである。まず、以下の処理で用いる配列変数の値を、すべて０に初期化する（処理１００１）。ここで、ｕｉｎｓ［ｎ］は、ＵＮＩＴｎ（０≦ｎ≦ＵＮ、ＵＮは全ユニット数）の平均処理インストラクション数を格納する変数である。ｕｓｒｔ［ｉ］は、平均処理インストラクション数の大きい順にソートしたユニットブロックのユニット番号の順列であり、ｉ（０≦ｉ≦ＵＮ）はソート後の順位を表す。ｐｃｍｐ［ｊ］は、ｊ番目のプロセッサ（プロセッサ番号がｊのプロセッサ、０≦ｊ≦ＰＮ、ＰＮは全プロセッサ数）へのユニットブロックの振り分けが完了したかどうかを表すフラグであり、その値が０で未完了、１で完了を表す。ｐｓｕｍ［ｊ］は、ｊ番目のプロセッサに含まれるユニットブロックの平均処理インストラクション数を合計した数である。ｐｎｕｍ［ｊ］は、ｊ番目のプロセッサに含まれるユニット数である。ｐ［ｊ］［ｋ］は、ｊ番目のプロセッサに含まれるｋ番目のユニットブロック（０＜ｋ＜ＵＮ）のユニット番号である。変数が初期化されると、ユニット負荷情報テーブルからｕｉｎｓ［ｎ］を入力し、それを大きい順にソートしてｕｓｒｔ［ｉ］を作成する（処理１００２）。つぎに、ｕｉｎｓ［ｎ］の合計をＰＮで割って、ｐｓｕｍ［ｊ］の平均値（ａｖｅとする）を算出する（処理１００３）。さらに、以下の処理で用いる変数、すなわち、ソート後のユニット順位ｉ、プロセッサ番号ｊ、各プロセッサへの振り分け方向ｄｉｒの値を、それぞれ０に初期化する（処理１００４）。以下の処理では、各プロセッサに対して平均処理インストラクション数の大きい順に一つずつユニットブロックを振り分けていく。このとき、最初はプロセッサ番号の小さい順に振り分け、全プロセッサに一つずつ振り分けたのち、つぎは逆にプロセッサ番号の大きい順に振り分けていく。これを繰り返す間に、あるプロセッサの平均処理インストラクション数の合計がａｖｅ以上になれば、このプロセッサへの振り分けを完了して、振り分け対象から除外する。まず、ｊ番目のプロセッサへの振り分けが完了でなければ（処理１００５）、そのプロセッサに順位ｉのユニットブロックを振り分け、順位ｉに１を加算する（処理１００６）。ここで、そのプロセッサの平均処理インストラクション数の合計がａｖｅ以上であれば（処理１００７）、振り分け完了フラグをセットする（処理１００８）。つぎに、振り分け方向が０番目のプロセッサからの場合で（処理１００９）、プロセッサ番号が最大でない場合（処理１０１０）、ｊに１を加算し（処理１０１１）、プロセッサ番号が最大の場合（処理１０１０）、振り分け方向を（ＰＮ−１）番目からに切り替える（処理１０１２）。また、振り分け方向が（ＰＮ−１）番目のプロセッサからの場合で（処理１００９）、プロセッサ番号が０でない場合（処理１０１３）、ｊから１を減算し（処理１０１４）、プロセッサ番号が０の場合（処理１０１３）、振り分け方向を０番目からに切り替える（処理１０１５）。最後に、つぎに振り分けるユニットブロックの順位ｉがＵＮより大きければ振り分けを完了し、そうでなければ処理１００５に戻る（処理１０１６）。以上に述べた手順は、図１に示したプログラム実行分担決定手順の一例であるが、各プロセッサの処理負荷がほぼ均等となるような分担ユニットリストを少ない計算量で作成できる。
【００３２】
図１１は、図１０に示した手順によって作成した分担ユニットリストの例を示す。ユニット負荷情報テーブル１１０１には、全ユニットの平均処理インストラクション数の情報が格納されており、（）内に平均処理インストラクション数を示す。ユニット負荷情報テーブル１１０１に示した１６のユニットブロック、すなわち、Ｍ−ｎｅｔ（ＵＮＩＴ０）ブロックとＵＮＩＴ１〜１５までの１５個のユニットブロックを、３個の制御用プロセッサに振り分けた結果が、プロセッサ１〜３の分担ユニットリスト１１０２、１１０３、１１０４である。各プロセッサの平均処理インストラクション数の合計は、それぞれ１６７、１６２、１７７であり、ほぼ均等に配分されていることが分かる。このような分担ユニットリストを各制御用プロセッサに配送して、各制御用プロセッサが、この分担ユニットリストにしたがって、各自が分担するユニットブロックのみを実行すればよい。このような分散制御を行えば、制御用プロセッサの数を増やすことによって、各制御用プロセッサの処理負荷が減り、システム全体としての処理能力を向上することが可能となる。なお、ここで示した分担ユニットリストは、配送元となった制御用プロセッサによって作成され、他の有効な制御用プロセッサに配信されるものとしたが、別の方法として、有効な制御用プロセッサのそれぞれが、これを作成するようにしても良い。
【００３３】
図１２は、制御情報の例を示す。実行ステップテーブル１２０１は、システムを構成する各ユニットの現在の実行ステップに関する情報であり、ユニット番号１２０１ａに対応して、現在のステップ番号１２０１ｂが格納される。なお、ユニット番号１２０１ａが０に対応するステップ番号１２０１ｂは、現在のモード番号を示す。また、ステップ番号１２０１ｂが０のときは、そのモードで該当ユニットは動作していないことを示す。同期プレース状態テーブル１２０２は、各同期プレースが活性化されているかどうかに関する情報であり、同期プレース番号１２０２ａに対応して、その状態１２０２ｂ（ＯＮ／ＯＦＦ）が格納される。共有変数テーブル１２０３は、システム全体で共有すべき変数に関する情報であり、変数番号１２０３ａに対応して、その値１２０３ｂが格納される。なお、共有変数の型（整数、実数など）に応じて、同様のテーブルを複数用意することも可能である。また、この他に、図９に示したような有効プロセッサリストと、図１１に示したような分担ユニットリストも制御情報の中に含まれる。
【００３４】
図１３は、入出力情報の例を示す。入出力状態テーブル１３０１には、各デバイスのＭＡＣＩＤ１３０１ａとその中のポート番号１３０１ｂに対応して、状態１３０１ｃ（ＯＮ／ＯＦＦ）が格納される。なお、この例では、ＯＮ／ＯＦＦの２値で表される入出力情報を示したが、その他の入出力情報（例えば、モータの回転角度を表すエンコーダパルス数など）を用意することも可能である。
【００３５】
図１２、図１３で示した制御情報および入出力情報は、各制御用プロセッサが更新、参照するものであり、本発明を適用した分散制御システムでは、これらの情報をそれぞれ制御情報伝送路、入出力情報伝送路を介して配送し、常に各制御用プロセッサが同じ情報を共有する仕組みを用意する。すなわち、各制御用プロセッサがプログラムを実行した際に更新された各種の情報は、各伝送路を介して他の制御用プロセッサにもブロードキャストされ、各制御用プロセッサはこれを受信して各自の情報を更新し、プログラムを実行する際に参照する。
【００３６】
図１４は、プログラム実行手順を示すフローチャートである。プログラムを実行する際には、各制御用プロセッサに配送された同一のプログラム（図７に示した内部コードプログラム）、同一の制御情報および入出力情報（図１２、図１３に示した各テーブル）、各制御用プロセッサ毎に作成された分担ユニットリスト（図１１に示したテーブル）が必要である。図１４は、１サイクルのプログラム実行処理を示す。ここで言う１サイクルとは、各制御用プロセッサが自分の分担するユニットブロックのそれぞれを、ユニット番号の若い順に実行して一巡するサイクルのことである。まず、分担ユニットリストの中から最もユニット番号の小さいユニットを選択する（処理１４０１）。ここで、選択したユニットがＵＮＩＴ０の場合（処理１４０２）、実行ステップテーブルから現在のモード番号を取得する（処理１４０３）。さらに、プログラムに付属したモードラベルテーブルから、現在のモード番号に対応するモードラベルのアドレスを取得し、これをインストラクションポインタ（ＣＩＰとする）に代入する（処理１４０４）。選択したユニットがＵＮＩＴ０でない場合（処理１４０２）、実行ステップテーブルから該当ユニットの現在のステップ番号（ＳＮとする）を取得する（処理１４０５）。ここで、ＳＮが０より大きい、すなわち、該当ユニットが活性化されている場合（処理１４０６）、ステップラベルテーブルから現在のステップ番号に対応するステップラベルのアドレスを取得し、これをＣＩＰに代入する（処理１４０７）。つぎに、ＣＩＰの示すインストラクションのオペコードを取得する（処理１４０８）。ここで、オペコードがステップ終了ラベルでもモード終了ラベルでもない場合（処理１４０９）、そのインストラクションを解釈、実行する（処理１４１０）。このとき、インストラクションのサイズ（Ｌとする）を取得し（処理１４１１）、これをＣＩＰに加算して、ＣＩＰを更新する（処理１４１２）。更新されたＣＩＰは、つぎのインストラクションのアドレスを示し、ここで処理１４０８に戻って、つぎのインストラクションの実行を続ける。また、オペコードがステップ終了ラベルまたはモード終了ラベルの場合（処理１４０９）、該当ユニットブロックの現在のステップブロックの最後まで実行したことになるので、分担ユニットリストの中からつぎにユニット番号が小さいユニットを選択する（処理１４１３）。ここで、該当ユニットがあれば、処理１４０５に戻り、該当ユニットがなければ、１サイクルのプログラム実行を完了する（処理１４１４）。
【００３７】
以上に述べた分散制御システムによれば、まず、システム構成、すなわち制御用プロセッサの構成に依存しない一元的なプログラミングが可能となり、プログラムの開発効率が向上する。さらに、制御用プロセッサの構成に応じて、各制御用プロセッサの処理負荷がなるべく均等になるように、プログラム実行分担を自動的に決定するので、システム構成の静的または動的な変化に柔軟に対応でき、システム全体の処理能力と信頼性が向上する。例えば、システム停止中あるいは稼働中に、新たに制御用プロセッサが追加された場合、これを自動的に検出し、新たな制御用プロセッサを含めたシステムにおいて、各制御用プロセッサの処理負荷が均等になるように、プログラム実行分担の再配分が行われ、システム全体としての処理能力を容易に向上させることできる。また、同じくシステム停止中あるいは稼働中に、いずれかの制御用プロセッサに障害が発生した場合、これを自動的に検出し、障害が発生した制御プロセッサを除いたシステムにおけるプログラム実行分担の再配分を行って、プログラムの実行を継続させることができるので、システムの信頼性が向上する。
【００３８】
なお、以上に述べた本発明の一実施形態では、プログラムの記述方法として、図３に示したようなペトリネットに基づいた表現を採用したが、別の実施形態として、これとほぼ等価な表現であるＳＦＣ（シーケンシャル・ファンクション・チャート）を採用することも可能である。また、本発明におけるプログラムが相互に並列処理可能な複数のプロセスから構成されることを考えると、ラダー図のようなプログラミング言語を用いた場合でも、そのプログラムを並列処理可能なブロックに分けて記述できれば、それらのブロックをユニットとして扱い、上記の実施形態と同様に処理することが可能である。
【００３９】
また、本発明の一実施形態では、各制御用プロセッサのプログラム実行分担を決定する方法として、図１０および図１１に示したような各ユニットブロックの１サイクルの平均処理インストラクション数に基づいた方法を採用したが、別の実施形態として、各ユニットの１サイクルの処理時間に基づいた方法を採用することも可能である。すなわち、プログラムに含まれるユニット負荷情報として、各ユニットブロックの１サイクルの平均処理時間を計算して格納しておき、この情報に基づいたユニットブロックの振り分けを行うことも可能である。さらに、このような処理負荷に基づいた分担だけでなく、各制御用プロセッサの内部記憶容量も加味した分担も可能である。
【００４０】
また、本発明の一実施形態では、図８に示したように、有効なすべての制御用プロセッサに同一のプログラムを転送し、各制御用プロセッサは、そのプログラムのうちの各自が分担するユニットブロックのみを実行する方法を採用したが、別の実施形態として、プログラムを転送する段階で各制御用プロセッサが分担するユニットブロックのみを転送しておく方法も可能である。ただし、この場合、全ユニットブロックを含んだプログラムをいくつかの制御用プロセッサに転送しておき、制御用プロセッサの構成が変わったときに、ユニットブロックの再配分が確実に行えるようにしておく必要がある。
【００４１】
また、本発明の一実施形態では、制御用プロセッサに有効プロセッサ検出手順およびプログラム実行分担決定手順を持たせたが、別の実施形態として、図１に示したような制御情報伝送路に接続された上位コントローラに、これらの機能を持たせることも可能である。すなわち、上位コントローラにおいて有効な制御用プロセッサを検出し、これに基づいたプログラム実行分担を決定して、各制御用プロセッサに対して、実行すべきプログラムと各制御用プロセッサのプログラム実行分担に関する情報を転送することも可能である。
【００４２】
また、本発明の一実施形態では、図１に示したように制御情報伝送路と入出力情報伝送路の二系統の情報伝送路を備えるシステムについて述べたが、別の実施形態として、これらの情報伝送路を一系統に集約したシステム、あるいは三系統以上の情報伝送路を備えたシステムも構築可能である。
【００４３】
【発明の効果】
本発明によれば、ネットワークに接続される分散制御システムにおいて、システム構成に依存しない一元的なプログラミングが可能となるので、プログラムの開発効率が向上する。さらに、制御用プロセッサの構成に応じて、各制御用プロセッサの処理負荷がなるべく均等になるように、プログラム実行分担を自動的に決定するので、システム構成の変化に柔軟に対応でき、システム全体の処理能力と信頼性が向上する。
【図面の簡単な説明】
【図１】本発明を適用した分散制御システムの構成を示すブロック図である。
【図２】プログラムを記述するときに用いる論理ポート番号と、デバイスの物理ポート番号の対応関係の例を示す図である。
【図３】セル制御言語で記述したプログラムの構造の例を示す図である。
【図４】Ｓ−ｎｅｔを保存した際に生成されるソースモジュールの一部と、それを実行形式に変換した例を示す図である。
【図５】Ｓ−ｎｅｔを内部コード化したブロックと、それを実行する際に用いるステップラベルテーブルの関係を示す図である。
【図６】Ｍ−ｎｅｔを内部コード化したブロックと、それを実行する際に用いるモードラベルテーブルの関係を示す図である。
【図７】内部コードプログラムの構成を示す図である。
【図８】本発明を適用した分散制御システムの全体としての処理を示すフローチャートである。
【図９】有効プロセッサリストの例を示す図である。
【図１０】分担ユニットリストを作成する処理を示すフローチャートである。
【図１１】図１０の手順によって作成した分担ユニットリストの例を示す図である。
【図１２】制御情報の例を示す図である。
【図１３】入出力情報の例を示す図である。
【図１４】プログラム実行手順を示すフローチャートである。
【符号の説明】
１０１…制御用プロセッサ、１０１ａ…演算手段、１０１ｂ…制御情報通信手段、１０１ｃ…入出力情報通信手段、１０１ｄ…制御情報および入出力情報記憶手段、１０１ｅ…プログラム記憶手段、１０１ｆ…制御情報通信手順記憶手段、１０１ｇ…入出力情報通信手順記憶手段、１０１ｈ…有効プロセッサ検出手順記憶手段、１０１ｉ…プログラム実行分担決定手順記憶手段、１０１ｊ…プログラム実行手順記憶手段、１０２…制御情報伝送路、１０３…入出力情報伝送路、１０４…デバイス、１０４ａ、１０４ｂ、１０４ｃ…入出力ポート、１０５…ユニット、１０６…上位コントローラ、２０１…論理ポート番号、２０２…物理ポート番号、２０２ａ…デバイスのＭＡＣＩＤ、２０２ｂ…デバイス内のポート番号、３０１…Ｍ−ｎｅｔモジュール、３０２…Ｓ−ｎｅｔモジュール、３０２ａ、３０２ｂ…ＵＮＩＴ１、ＵＮＩＴ２のＳ−ｎｅｔ、３０３…Ｍ−ｎｅｔのコマンド、３０４…プレース、３０５…アーク、３０６…トランジション、３０７…コマンド、３０８…終了条件、３０９…同期プレース、４０１…ソースモジュール、４０１ａ、４０１ｂ…ルール、４０２…内部コードプログラム、４０２ａ、４０２ｂ…ステップブロック、５０１…Ｓ−ｎｅｔブロック、５０１ａ…ステップブロック、５０１ｂ…ステップラベル、５０２…ステップラベルテーブル、５０２ａ…ステップ番号、５０２ｂ…アドレス、６０１…Ｍ−ｎｅｔブロック、６０１ａ…モードブロック、６０１ｂ…モードラベル、６０２…モードラベルテーブル、６０２ａ…モード番号、６０２ｂ…アドレス、７０１…モードラベルテーブル、７０２…ステップラベルテーブル、７０３…定数テーブル、７０４…ユニット負荷情報テーブル、７０５…インストラクションコード、７０６…Ｍ−ｎｅｔブロック、７０７…Ｓ−ｎｅｔブロック、７０７ａ、７０７ｂ…ユニットブロック、９０１…プロセッサ番号、９０２…ＭＡＣＩＤ、９０３…プロセッサタイプ、１１０１…ユニット負荷情報テーブル、１１０２、１１０３、１１０４…各プロセッサの分担ユニットリスト、１２０１…実行ステップテーブル、１２０１ａ…ユニット番号、１２０１ｂ…ステップ番号、１２０２…同期プレース状態テーブル、１２０２ａ…同期プレース番号、１２０２ｂ…状態、１２０３…共有変数テーブル、１２０３ａ…変数番号、１２０３ｂ…値、１３０１…入出力状態テーブル、１３０１ａ…ＭＡＣＩＤ、１３０１ｂ…ポート番号、１３０１ｃ…状態。
【図１】
0003780732.tif 000002
【図２】
0003780732.tif 000003
【図３】
0003780732.tif 000004
【図４】
0003780732.tif 000005
【図５】
0003780732.tif 000006
【図６】
0003780732.tif 000007
【図７】
0003780732.tif 000008
【図８】
0003780732.tif 000009
【図９】
0003780732.tif 000010
【図１０】
0003780732.tif 000011
【図１１】
0003780732.tif 000012
【図１２】
0003780732.tif 000013
【図１３】
0003780732.tif 000014
【図１４】
0003780732.tif 000015